Текущий архив: 2004.01.13;
Скачать: CL | DM;
ВнизADOQuery Подсчет кол-ва значений Найти похожие ветки
← →
My (2003-12-16 14:44) [0]Работаю с ADO. У меня есть пустая таблица. Начинаю ее заполнять, и между єтим подсчитываю число записей с определенным значением поля. С пом-ю другого запроса:
select Count (поле1) as Рез-т
from Табл
where поле2=:поле2
and Поле3="значение"
св-во DataSource заполнено и имеются совпадающие значения, но все время, до окончания работы, в рез-те запроса возвращается 0.
← →
sniknik (2003-12-16 15:02) [1]where поле2=:поле2 and Поле3="значение"
если совпадающие значения в условии (по обоим и одновременно т.к. and) есть то результат должен быть не 0, однозначно .
открой базу access-ом и проверь может ты туда ничего не записал.
← →
My (2003-12-16 15:35) [2]Таблицу проверяю, прохожу пошагово, в таблице при прохождении записи появляются, но результат запроса все-равно 0, может табл нужно как-то обновлять? Значение появляется только после окончания цикла, когда записей допустим 5, а мне нужно тормозить после 3.
← →
KSergey (2003-12-16 15:53) [3]А БД какая?
А то может это все в транзакции делается, а уровень изоляции высоковатым выбран (св-ство IsolationLevel).
Да и внимательно бы надо еще раз посмотреть что там формируется, не забываем ли заполнять параметры, тем ли они заполняются (внутри цикла).
← →
sniknik (2003-12-16 16:01) [4]My (16.12.03 15:35) [2]
понятно, раз они всетаки появляются то дело ясное. ложиш небось так ADOTable1/ADOQuery1.Append/Insert ? нет?
если так то переходи на запросы. (insert into ...), или проверяй у ADOTable1.RecordCount... без доп. запроса. (записи просто кешируются)
и также проверь что у тебя все ADO компоненты к одному конекту привязаны а не к разным.
← →
My (2003-12-16 16:15) [5]Без транзакций, обычный запрос, запись в таблице заполнена полностью - все поля как нужно.
Вставка как-раз через Insert Into, привязка одинакова,
RecordCount до окончания цикла=1, а в конце, при переходе на нужную запись =5.
У меня нет ключевого поля, не может быть из-за этого проблем?
← →
Reindeer Moss Eater (2003-12-16 16:15) [6]либо условию WHERE не удовлетворяет ни одна запись, либо в тех записях, что удовлетворяют условию WHERE в поле "поле1" содержится NULL
← →
sniknik (2003-12-16 16:21) [7]My (16.12.03 16:15) [5]
покажи как ложиш (полностью а не только запрос на количество) и что ложиш, 5 записей особенно значения что попадают в поле2=:поле2 and Поле3. .
← →
KSergey (2003-12-16 16:22) [8]А [6] Reindeer Moss Eater © (16.12.03 16:15) - молодец! Про null я не подумал. Может на звездочку поменять? Для эксперимента хотя бы?
Впрочем, похоже - отладка, отладка и еще раз отладка. Врятли по этому куску что-то скажешь.
← →
Reindeer Moss Eater (2003-12-16 16:25) [9]sniknik © (16.12.03 15:02) [1]
where поле2=:поле2 and Поле3="значение"
если совпадающие значения в условии (по обоим и одновременно т.к. and) есть то результат должен быть не 0, однозначно .
открой базу access-ом и проверь может ты туда ничего не записал.
Ничего подобного.
Даже если есть записи, удовлетворяющие where поле2=:поле2 and Поле3="значение".
У автора вопроса COUNT( поле1), а не count(*).
Если в поле1 лежит NULL, то count(поле1) вернет 0.
← →
sniknik (2003-12-16 16:29) [10]а как тогда обьяснить что в конце цикла все видно?
> Значение появляется только после окончания цикла, когда записей допустим 5...
← →
sniknik (2003-12-16 16:30) [11]т.е. там явно не NULL
← →
Reindeer Moss Eater (2003-12-16 16:37) [12]Кроме тумана здесь ничего не видно.
Есть цикл вставки и запрос на count.
Нет никакого упоминания о вторичных потоках, необходимых в этом случае (что бы результаты count были видны еще до окончания цикла).
Нет упоминания о транзакциях и их количестве и т.д.
Сплошная кофейная гуща.
← →
My (2003-12-16 16:40) [13]Заполняю табл
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:42) [14]Ну и где здесь цикл?
← →
My (2003-12-16 16:47) [15]Пусть будет полностью:
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:54) [16]Замечательно.
И где в этой мешанине запрос на "select count....." ?
← →
My (2003-12-16 17:00) [17]Прошу прощения, не закончил. Потом проблемы со связью.
Переменные lek, pr2,pr3 получаю описанным вначале запросом
(для каждой отдельно):
select Count (Gruppa) as Par
from Promej
where Gruppa=:Gruppa
and Tip="Лек"
← →
Reindeer Moss Eater (2003-12-16 17:01) [18]Если текс этого запроса записан в DFM и поэтому не виден в приведенном коде, то где же в приведенном коде присвоение значений параметрам этого запроса?
Или сюда просто рыбу заворачивали?
← →
Reindeer Moss Eater (2003-12-16 17:03) [19]Короче : к терапевту.
← →
My (2003-12-16 17:07) [20]Так в DFM, в DataSource устанавливаются ссылка На табл Группы, которые перебираются по очереди.
И я, конечно извиняюсь, но я только учусь.
Только сейчас пробую работать с запросами.
← →
Reindeer Moss Eater (2003-12-16 17:09) [21]Единственная найденная мной строчка в твоем коде про датасорс:
DataSource:=nil;
← →
My (2003-12-16 17:16) [22]Есть 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;
Или мне может поместить эту проверку в прцедуру?
← →
JibSkeart (2003-12-16 17:20) [23]Всмысле везде true
тоесть без
ADOQueryKolPar->Active = false;
lek:=ADOQueryKolPar.FieldByName("Par").AsInteger;
pr2:=ADOQueryKolPar1.FieldByName("Par").AsInteger;
pr3:=ADOQueryKolPar2.FieldByName("Par").AsInteger;
ADOQueryKolPar->Active = true;
не так чтоль ?
← →
sniknik (2003-12-16 17:24) [24]явно отсутствие ключа это не та причина, хотя его тоже неплохо бы завести.
сделай для примера, попроще
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;
ну как бегут каунты :) ?
после паратры добавиш и в цикле их устанавливать будеш.
← →
My (2003-12-16 17:43) [25]True выставлен на форме в ADOQuery и я его нигде не изменяю.
← →
JibSkeart (2003-12-16 17:45) [26]нука покажика код ...
если он не секретный :)
← →
My (2003-12-16 17:48) [27]Попробовал 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:49) [28]ADODataSet.Open; -> ADODataSet.ExecSQL;
← →
JibSkeart (2003-12-16 17:50) [29]True выставлен на форме в ADOQuery и я его нигде не изменяю.
Всмысле ты не делаешь Close,Open
чтоль вообще ?
или я не так понял ?
← →
sniknik (2003-12-16 17:53) [30]My (16.12.03 17:48) [27]
ты внимательней внимательней, на инсерт у меня ADOCommand1.CommandText, не видиш разницы? и не опен а ехекют.
← →
My (2003-12-16 17:54) [31]ADODataSet.Open;
ADODataSet.ExecSQL; - ошибка
← →
JibSkeart (2003-12-16 17:55) [32][b]ADOCommand1[/b].CommandText:= "Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena) Values ("1","1","1","1","1","1")";
Видишь ???
← →
sniknik (2003-12-16 17:56) [33]кстати раз уж Para у тебя числовое (смотрю скобки убрал) то и в ставнении с числом сравнивай
"...where Para = 1";
← →
JibSkeart (2003-12-16 17:57) [34]тфу
Вообщето sniknik
тебе пример дал не с TADOQuery а с TADOCommand
← →
My (2003-12-16 18:01) [35]ADOCommand1 нужно как-то открыть, на open и ExecSQL не реаг-т?
← →
JibSkeart (2003-12-16 18:03) [36]ну ты покажи точный код как ты это делаешь..
← →
My (2003-12-16 18:04) [37]Со скобками не принимал.
← →
sniknik (2003-12-16 18:07) [38]> Со скобками не принимал.
правильно это я ошибся, надо по 2 вместо одной (тогда в строку/запрос одна попадет)
Values (""1"",""1"",""1"",""1"",""1"",""1"")"; (а вот последняя одно это завершаюшая а не внутри строки)
← →
My (2003-12-16 18:07) [39]procedure TForm1.Button1Click(Sender: TObject);
begin
//ADODataSet.Close;
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";
ADODataSet.Open;
//Showmessage()
end;
← →
JibSkeart (2003-12-16 18:08) [40]тфу у тебя оказывается есть код .
а почемы ты все это в хранимую процедуру не завернул ?
← →
JibSkeart (2003-12-16 18:09) [41]ADOCommand1.Execute :)
← →
My (2003-12-16 18:11) [42]Я только учусь и не знаю как это сделать.
В результате при выполнении не вставляется запись.
нужно как-то активировать ADOCommand1.
← →
JibSkeart (2003-12-16 18:13) [43]with ADOQueryKolPar do
begin
Close;
lek:=ADOQueryKolPar.FieldByName("Par").AsInteger;
pr2:=ADOQueryKolPar1.FieldByName("Par").AsInteger;
pr3:=ADOQueryKolPar2.FieldByName("Par").AsInteger;
Open;
end;
Что то этого я утебя там не увидел
← →
My (2003-12-16 18:16) [44]Сейчас немного по другому
with ADOQueryKolPar do
begin
//////////
ADOQueryKolPar.Close;
SQL.Clear;
SQL.Add("select Count (Gruppa) as Par from Promej where Gruppa=:Gruppa and Tip="+QuotedStr("Лек"));
ADOQueryKolPar.Open;
//////////
lek:=ADOQueryKolPar.FieldByName("Par").AsInteger;
pr2:=ADOQueryKolPar1.FieldByName("Par").AsInteger;
pr3:=ADOQueryKolPar2.FieldByName("Par").AsInteger;
//--------------
end;
ShowMessage(Inttostr(ADOQueryKolPar.RecordCount));
но в ShowMessage всеравно вечная 1.
← →
JibSkeart (2003-12-16 18:17) [45]Да добавить запись можно и через TADOQuery
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add("Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena) Values (1,1,1,1,1,1)");
ADOQuery.ExecSQL; -- так как возрашяет 0 записей :)
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add("Select Count(*) as cnt from Promej where Para = 1");
ADOQuery.Open;
ShowMessage(ADOQuery.FieldByName("cnt").AsString);
попробуй так хотябы .
← →
My (2003-12-16 18:26) [46]с небольшой модификацией пошло
procedure TForm1.Button2Click(Sender: TObject);
begin
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add("Insert into Promej (Prepod,Para,Gruppa,Aud,Tip,Smena) Values (1,1,1,1,1,1)");
ADOQuery.ExecSQL;// -- так как возрашяет 0 записей :)
ADOQuery.Close;
ADOQuery.SQL.Clear;
ADOQuery.SQL.Add("Select Count(*) as cnt from Promej where Para ="+Quotedstr("1"));
ADOQuery.Open;
ShowMessage(ADOQuery.FieldByName("cnt").AsString);
end;
Спасибо БОЛЬШОЕ,ВСЕм за помощь, завтра доразберу, вахта уже приходит 3 раз.
← →
JibSkeart (2003-12-16 18:30) [47]точно насчет этого топика JibSkeart © (16.12.03 18:13) [43]
я действительно ошибся :)
← →
My (2003-12-17 10:01) [48]Уважаемые Мастера, большое спасибо, но все равно не понимаю, когда перенес в процедуру код
{ADOQueryKolPar.Close;
SQL.Clear;
SQL.Add("select Count (Gruppa) as Par from Promej where Gruppa=:Gruppa and Tip="+QuotedStr("Лек"));
ADOQueryKolPar.Open;}
то работает
но когда на форме в ADOQueryKolPar.SQL пишу запрос
select Count (Gruppa) as Par
from Promej
where Gruppa=:Gruppa
and Tip="Лек"
Active=True
то в ShowMessage(IntToStr(ADOQueryPromej.RecordCount));
всегда 0.
Получается, ему надо было просто перенести в процедуру, но ведь это должно быть без разницы.
← →
sniknik (2003-12-17 10:32) [49]> {ADOQueryKolPar.Close;
SQL.Clear;
SQL.Add("select Count (Gruppa) as Par from Promej where Gruppa=: Gruppa and Tip="+QuotedStr("Лек"));
ADOQueryKolPar.Open;}
параметр не задаеш? работает, понятно. что возвращает? (только не RecordCount тут 1 должна быть а значение поля Par)
(неважно где запрос задан (место) результат одинаков если условия одинаковы (и данные, естественно))
← →
JibSkeart (2003-12-17 11:54) [50]ADOQueryKolPar.ParamByName("Gruppa").Value = xxx;
ADOQueryKolPar.Open;
может быть так ?
Страницы: 1 2 вся ветка
Текущий архив: 2004.01.13;
Скачать: CL | DM;
Память: 0.58 MB
Время: 0.009 c