Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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]

тфу у тебя оказывается есть код .
а почемы ты все это в хранимую процедуру не завернул ?



Страницы: 1 2 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.014 c
1-37628
race1
2003-12-27 14:22
2004.01.13
winamp plugin & window


3-37560
pavel_guzhanov
2003-12-15 14:47
2004.01.13
как можно изменить запись в БД через SQL запрос


1-37785
Mike_forewer
2003-12-27 19:36
2004.01.13
Фон в MainMenu


1-37720
ikivio
2003-12-30 17:33
2004.01.13
Multilanguage Interface


1-37639
maxfiles
2003-12-23 23:54
2004.01.13
Как правильно узнать размер файла...