Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

ADOQuery Подсчет кол-ва значений [D5, Access]


Страницы:   1 2 3

My ©   (2003-12-16 14:44:00) 

Работаю с ADO. У меня есть пустая таблица. Начинаю ее заполнять, и между єтим подсчитываю число записей с определенным значением поля. С пом-ю другого запроса:
select Count (поле1) as Рез-т
from Табл
where поле2=:поле2
and Поле3="значение"

св-во DataSource заполнено и имеются совпадающие значения, но все время, до окончания работы, в рез-те запроса возвращается 0.


sniknik   (2003-12-16 17:53:00) [21]

My (16.12.03 17:48) [27]
ты внимательней внимательней, на инсерт у меня ADOCommand1.CommandText, не видиш разницы? и не опен а ехекют.


JibSkeart   (2003-12-16 17:50:00) [22]

True выставлен на форме в ADOQuery и я его нигде не изменяю.


Всмысле ты не делаешь Close,Open
чтоль вообще ?
или я не так понял ?


JibSkeart   (2003-12-16 17:49:00) [23]

ADODataSet.Open; -> ADODataSet.ExecSQL;


My   (2003-12-16 17:48:00) [24]

Попробовал ADODataSet
ADODataSet.CommandText:= "Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena) Values (1,1,1,1,1,1)";
ADODataSet.Open;

В этом месте получаю ошибку:
ADODAtaSet% CommandText does not return a result Set

ADODataSet.Close;
ADODataSet.CommandText:= "Select Count(*) from Promej where Para = ""1""";
ADODataSet.Open;


JibSkeart   (2003-12-16 17:45:00) [25]

нука покажика код ...
если он не секретный :)


My   (2003-12-16 17:43:00) [26]

True выставлен на форме в ADOQuery и я его нигде не изменяю.


sniknik   (2003-12-16 17:24:00) [27]

явно отсутствие ключа это не та причина, хотя его тоже неплохо бы завести.

сделай для примера, попроще

ADOCommand1.CommandText:= "Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena) Values ("1","1","1","1","1","1")";
ADODataSet.Close;
ADODataSet.CommandText:= "Select Count(*) from Promej where Para = ""1""";

//это можно и в цикле
for i:= 1 to 5000 do begin
ADOCommand.Execute;
ADODataSet.Close;
ADODataSet.Open;
Label1.Caption:= ADODataSet.Fields[0].AsString;
Application.ProcessMessages;
end;

ну как бегут каунты :) ?

после паратры добавиш и в цикле их устанавливать будеш.


JibSkeart   (2003-12-16 17:20:00) [28]

Всмысле везде true
тоесть без

ADOQueryKolPar->Active = false;
lek:=ADOQueryKolPar.FieldByName("Par").AsInteger;
pr2:=ADOQueryKolPar1.FieldByName("Par").AsInteger;
pr3:=ADOQueryKolPar2.FieldByName("Par").AsInteger;
ADOQueryKolPar->Active = true;

не так чтоль ?


My   (2003-12-16 17:16:00) [29]

Есть 3 ADOQuery на форме(ADOQueryKolPar), в каждой запрос типа:
select Count (Gruppa) as Par
from Promej
where Gruppa=:Gruppa
and Tip="Лек"
везде Active True

затем в проц-ре для каждого значения перед вставкой новой записи
lek:=ADOQueryKolPar.FieldByName("Par").AsInteger;
pr2:=ADOQueryKolPar1.FieldByName("Par").AsInteger;
pr3:=ADOQueryKolPar2.FieldByName("Par").AsInteger;
Или мне может поместить эту проверку в прцедуру?


Reindeer Moss Eater   (2003-12-16 17:09:00) [30]

Единственная найденная мной строчка в твоем коде про датасорс:

DataSource:=nil;


My   (2003-12-16 17:07:00) [31]

Так в DFM, в DataSource устанавливаются ссылка На табл Группы, которые перебираются по очереди.
И я, конечно извиняюсь, но я только учусь.
Только сейчас пробую работать с запросами.


Reindeer Moss Eater   (2003-12-16 17:03:00) [32]

Короче : к терапевту.


Reindeer Moss Eater   (2003-12-16 17:01:00) [33]

Если текс этого запроса записан в DFM и поэтому не виден в приведенном коде, то где же в приведенном коде присвоение значений параметрам этого запроса?

Или сюда просто рыбу заворачивали?


My   (2003-12-16 17:00:00) [34]

Прошу прощения, не закончил. Потом проблемы со связью.
Переменные lek, pr2,pr3 получаю описанным вначале запросом
(для каждой отдельно):

select Count (Gruppa) as Par
from Promej
where Gruppa=:Gruppa
and Tip="Лек"


Reindeer Moss Eater   (2003-12-16 16:54:00) [35]

Замечательно.

И где в этой мешанине запрос на "select count....." ?


My   (2003-12-16 16:47:00) [36]

Пусть будет полностью:
procedure TForm1.OkonchButtonClick(Sender: TObject);
var j:integer;lek,pr2,pr3,max_par:byte;
begin
max_par:=4;
j:=0;
with ADOQueryUdalen.SQL do
begin
Clear;
Add("delete from Raspis");
ADOQueryUdalen.ExecSQL;
Clear;
end;
for j:=1 to ADOTableUchProc.FieldByName("Uch_Dney").AsInteger do {в неделе 5 рабочих дней}
{1} begin
// if j>5 then if (j div 5) =0 then
with ADOQueryUdalen.SQL do
begin
Clear;
Add("insert into Raspis (Prepod)");
Add("values ("+IntToStr(j)+")");
ADOQueryUdalen.ExecSQL;
end;
///////////
with ADOQueryUdalen.SQL do
begin
Clear;
Add("delete from Promej");
ADOQueryUdalen.ExecSQL;
Clear;
end;
///////////

with ADOQueryGruppa do
begin
Close;
DataSource:=nil;
with SQL do
begin
Clear;
Add(" select * from Gruppa ");
Add("where Smena="+CBox1.Items.Strings[CBox1.ItemIndex]);
end;
Open;
First;
end;
while not ADOQueryGruppa.EOF do
{3} begin
with ADOQuery_PrepodiChasPromej do
{4} begin
Open;
First;
while not EOF do
{5} begin
with ADOQueryKolPar do
begin
lek:=ADOQueryKolPar.FieldByName("Par").AsInteger;
pr2:=ADOQueryKolPar1.FieldByName("Par").AsInteger;
pr3:=ADOQueryKolPar2.FieldByName("Par").AsInteger;
//--------------
end;
ShowMessage(Inttostr(ADOQueryKolPar.RecordCount));
if (lek<max_par){and(pr2<((max_par-lek)*2))
and(pr3<((max_par-lek)*3))} then

begin
if FieldByName("Lectio").AsInteger<>0 then
{6} begin
with ADOQueryUpdate.SQL do
begin
Clear;
Add("Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena)");
Add("values ("
+QuotedStr(ADOQuery_PrepodiChasPromej.FieldByName("Prepod").AsString)+","
+QuotedStr(ADOQuery_PrepodiChasPromej.FieldByName("Predm").AsString)+","
+QuotedStr(ADOQuery_PrepodiChasPromej.FieldByName("Gruppa").AsString)+","
+IntToStr(ADOQueryGruppa.FieldByName("Aud").AsInteger)+","
+QuotedStr("Лек")+","
+QuotedStr(CBox1.Items.Strings[CBox1.ItemIndex])+")");
ADOQueryUpdate.ExecSQL;
end;
ADOQuery_PrepodiChasPromej.Edit;
FieldByName("Lectio").AsInteger:=FieldByName("Lectio").AsInteger-1;
ADOQuery_PrepodiChasPromej.Post;
ADOQuery_PrepodiChasPromej.Next;
end
else
if FieldByName("pr2").AsInteger<>0 then
begin

end
else ADOQuery_PrepodiChasPromej.Next;
end//--------
else ADOQueryGruppa.Next;
//ADOQuery_PrepodiChasPromej.Next;

{5} end;
//Next;
{4} end ;
ADOQueryGruppa.Next;
{3} end;
{2} // end;
////////////////////////
with ADOQueryUpdate do
begin
with SQL do
begin
Clear;
Add("insert into Raspis (Prepod,Para,Gruppa,Aud,Tip,Smena)");
Add("select * from Promej");
end;
ExecSQL;
end;
///////////////////////
{1} end;
end;


Reindeer Moss Eater   (2003-12-16 16:42:00) [37]

Ну и где здесь цикл?


My   (2003-12-16 16:40:00) [38]

Заполняю табл
with ADOQueryUpdate.SQL do
begin
Clear;
Add("Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena)");
Add("values ("
+QuotedStr(ADOQuery_PrepodiChasPromej.FieldByName("Prepod").AsString)+","
+QuotedStr(ADOQuery_PrepodiChasPromej.FieldByName("Predm").AsString)+","
+QuotedStr(ADOQuery_PrepodiChasPromej.FieldByName("Gruppa").AsString)+","
+IntToStr(ADOQueryGruppa.FieldByName("Aud").AsInteger)+","
+QuotedStr("Лек")+","
+QuotedStr(CBox1.Items.Strings[CBox1.ItemIndex])+")");
ADOQueryUpdate.ExecSQL;
end;

Рез-т в табл Promej:
Prepod Para Gruppa Aud Tip Smena
Бочкарева Химия Ф -11 111 Лек 1
Литвинова Математика Ф -21 112 Лек 1
Наумова Хирургия Ф -11 111 Лек 1
Норкіна Педиатрия Ф -11 111 Лек 1
Руденко Математика Ф -11 111 Лек 1
Руденко Математика Ф-31 113 Лек 1
Шевченко Физика Ф -11 111 Лек 1

Мне нужно не больше 3 пар, я перед вставкой записи проверяю число записей для данной группы (where), и проверяю тип, допустим Лек.


Reindeer Moss Eater   (2003-12-16 16:37:00) [39]

Кроме тумана здесь ничего не видно.
Есть цикл вставки и запрос на count.
Нет никакого упоминания о вторичных потоках, необходимых в этом случае (что бы результаты count были видны еще до окончания цикла).
Нет упоминания о транзакциях и их количестве и т.д.
Сплошная кофейная гуща.


sniknik   (2003-12-16 16:30:00) [40]

т.е. там явно не NULL


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо