Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.011 c
14-37929
ZDima
2003-12-19 23:05
2004.01.13
Народ, помогите решить тест Айзенка.


3-37548
SergP
2003-12-17 12:53
2004.01.13
Проблема с вычисляемыми полями в SQL запросе


14-37941
zzet
2003-12-19 22:54
2004.01.13
Share It - кто пользуется сервисом?


1-37763
miracle_fox
2003-12-29 17:00
2004.01.13
клавиша <enter> в Edit - как придать ей особое значение?


11-37599
help
2003-04-26 06:59
2004.01.13
TKOLListView





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский