Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.03.28;
Скачать: CL | DM;

Вниз

Ошибка в SQL запросе?!   Найти похожие ветки 

 
Sava ©   (2002-02-28 10:52) [0]

Уважаемы мастера, помогите всю голову разбил уже!
В кратце описываю что у меня есть:
Есть база (dDase), я пишу запрос чтоб получить записи за определенный период, период задается с помощью компонентов RxLib, а именно DateEdit, происходит следующая вещь, когда в результате запроса есть хоть одна запись, все замечательно, но вот когда результат пустой, т.е. условию не удовлетворяет ни одна запись вылетает ошибка, примерно вот такая: Translate Error. Value out of bounds.
Запрос примерно такой:

Select data, sum(kolvo) from prihod
where data between "22.02.2002" and "25.02.2002"
group by data

у меня два подозрения но что делать незнаю. Первое передаю дату как текс, хотя поле Data имеет тип "дата", и второе подозрение связанное с group by. Подскажите что делать????
Я SQL недавно осваивать начал, может я что не знаю?
Заранее благодарен!


 
Val ©   (2002-02-28 10:55) [1]

запрос написан верно, а дату передаете параметром?


 
Sava ©   (2002-02-28 10:58) [2]

Нет дату передаю следующим образом:

sql.Append("where data between ""+dateedit1.text+"" and ""
+ dateedit2.text+""");

предварительно clear, и тому подобное, а через параметры не пробовал.


 
iva ©   (2002-02-28 11:04) [3]

А возможно ли такое, что ошибка возникает не во время выполнения запроса, а после. Может Вы не учитываете, что запрос вернул нулевое кол-во записей.


 
Shirson ©   (2002-02-28 11:13) [4]

Можно вопрос, а разве SQL подразумевает выделение строк двойными кавычками? Я всегда делал одинарными. Попробуй так:


sql.Append("where data between "+quotedstr(dateedit1.text)+" and "+ quotedstr(dateedit2.text));


 
Val ©   (2002-02-28 11:23) [5]

>Shirson © (28.02.02 11:13)
В Local SQL это неважно.
скорее прав iva, возможно вы пытаетесь затем присвоить результат запроса чему-либо не проверяя, вернул ли он что-нибудь.


 
Sava ©   (2002-02-28 11:35) [6]

>Shirson
Попробовал, пустой запрос выдет, уже хорошо, попутно всыдает странную ошибку Operation not applicable, щас с ней буду разбираться.

>Val
Попробовал через параметры, не помогло та же ошибка.

>iva
Вполне возможно что и не учитываю, а как это учесть?
Да дейстаительно запрос проходит без всяких броблем ExecSQL замечательно срабатывает, а вот что дальше происходит трудно сказать:( И как мне с проблеммой бороться?


 
Sava ©   (2002-02-28 11:39) [7]

>Val
Результат запроса выводится только в DBGrid и больше ничего, щас попробую в этом направлении поискать. Запрос который выдавал пустое значение уже встречался, но такого не было, а тут...


 
iva ©   (2002-02-28 11:42) [8]

Возможно в DBGrid стоит какая-то обработка при прорисовке (например на DrawColumnCell)


 
Sava ©   (2002-02-28 11:50) [9]

>iva
никаких обработчикой нигде не стоит, даже еще в нормальный вид не оформлено, не до этого пока, просто на форму набросано DBGrid, Query, DataSourse и все... Единственное что програмно передается это сам запрос, его вызов, больше никаких обраотчиков нету, обработчики только для самой формы OnClose и все. Я тут еще поэксперементировал, если родной DBGrid, то ошибка выдается один раз ты ее Ок и все, попробовал DBGridEh ошибка вообще не уберается, ее Ок тык а она опять тут как тут. И где предчину искать????


 
Johnmen ©   (2002-02-28 11:51) [10]

Query.Open вместо Query.ExecSQL


 
iva ©   (2002-02-28 11:52) [11]

Тогда еще вариант - ExecSQL замени на Open


 
Sava ©   (2002-02-28 12:01) [12]

Open тоже не помог, но я кажится нашел проблемму, то она породила вторую проблемму, еслия не отбираю дату, т.е. запрос такого вида:

Select mest, sum(kolvo) from prihod
where data between "22.02.2002" and "25.02.2002"
group by mest

Все работает как только мечьтать можно, и если ничего не выбрано без ошибок показывает и когда что-то выбрано тоже без ошибок показывает.
Но мне дату тоже надо выбрать вот в чем беда и как это организовать?


 
Johnmen ©   (2002-02-28 12:16) [13]

даты через параметры


 
Sava ©   (2002-02-28 12:20) [14]

>Johnmen
Я что-то себе это не представляю, как через параметры отобрать даты, а потом по ним еще и сгруперовать?
Если не трудно подскажи?


 
iva ©   (2002-02-28 12:37) [15]

Только что написал все что по твоим словам сделано у тебя. Все работает без проблем. По-правде сказать никак не могу понять что у тебя не так.


 
Val ©   (2002-02-28 12:51) [16]

давайте код


 
iva ©   (2002-02-28 13:06) [17]

да в общем-то и кода то никакого нет

procedure TForm1.Button1Click(Sender: TObject);
begin
Query1.SQL.Clear;
Query1.SQL.Add("select sum(km2-km1),datepl from plist122001 ");
Query1.SQL.Add("where datepl between "+QuotedStr(DateEdit1.Text) +" and "+QuotedStr(DateEdit2.Text));
Query1.SQL.Add(" group by datepl");
Query1.Open;
end;

если поставить даты так, чтобы Query был пустым, никаких ошибок не возникает.



 
Sava ©   (2002-02-28 13:10) [18]

Вот код выдернут:
Если надо пришлю вообще весь проект, ничего не работает!!!

procedure TForm1.Button1Click(Sender: TObject);
begin
with query1 do
begin
Active:=false;
sql.Clear;
sql.Append("select data, mest, kateg, postav, sum(kolvo) from prihod ");
sql.Append("where data between ""+dateedit1.text+"" and "" + dateedit2.text+""");
sql.Append("group by data, mest, kateg, postav");
ExecSQL;
Active:=true;
end;

end;


 
Sava ©   (2002-02-28 13:13) [19]

> iva
Странно, отличий немного а каке разные результаты! Так в чем проблемма?


 
Johnmen ©   (2002-02-28 13:14) [20]

>Sava © : повнимательней ! Open, а не ExecSQL - это во-первых...


 
iva ©   (2002-02-28 13:17) [21]

Давай попробуем. Шли весь проект. Адрес найдешь?


 
Johnmen ©   (2002-02-28 13:17) [22]

Ну причем здесь Active:=false; ... Active:=true; ???!!!
Сначала - Close; потом - см.выше ! это во-вторых...


 
Sava ©   (2002-02-28 13:20) [23]

Open, ExecSQL.....
Эффек один и тот-же. А в чем вообще разница между Open & ExecSQL?


 
iva ©   (2002-02-28 13:21) [24]

ExecSQL для выполнения запроса на изменение базы (update, insert, delete)


 
Johnmen ©   (2002-02-28 13:22) [25]

И если так хочется динамически формировать запрос, то :

sql.Append("select data, mest, kateg, postav, sum(kolvo) from prihod ");
sql.Append("where data between ""+dateedit1.text+"" and "" + dateedit2.text+"" ");
sql.Append("group by data, mest, kateg, postav");

обрати внимание на отсутствующий у тебя пробел во второй строке !
это - в-третьих...


 
Sava ©   (2002-02-28 13:23) [26]

>Johnmen
Close & Open тоже не помогают:)))
> iva
Щас покурю и намылю


 
Val ©   (2002-02-28 13:33) [27]

>iva © (28.02.02 13:06)
Извините, не точно выразился, я обращался Sava © :)
>Sava ©
Закройте сначала квери перед очисткой, потом после добавления текста в SQL сделайте Open и НИКАКИХ ExecSQL,Active:=True;
Я поражаюсь как он вообще работал с ExecSQL.


 
iva ©   (2002-02-28 13:38) [28]

Val, я понял, что влез не вовремя. С кем не бывает. А сейчас стало самому интересно ПОЧЕМУ ?


 
Sava ©   (2002-02-28 13:43) [29]

>Val
Нормально работал:) Ну почти нормально, но и Close & Open не помогают!!!
>iva
Намылил
>Johnmen
Внимание обратил, отсутствие пробелов не обнаружил (если только не считать до и после знака "+", насколько я понимаю это не критично)! Я Почему так динамически делаю, мне все равнокак хоть через параметры, все равно одна байда!!! Это просто первый вариант который я как могу коверкаю и ничего не получается:((


 
Val ©   (2002-02-28 13:48) [30]

а..DBase..помнится, что-то у них не так было с короткми и полными датами..обратите внимание.


 
Sava ©   (2002-02-28 13:56) [31]

> Val
Спасибо обрадовал, но у меня такое ощущенье, что это тут не причем, выборку я получаю, проблеммы начинаются когда записей в выборке ноль.


 
Shirson ©   (2002-02-28 14:00) [32]

>Sava


procedure TForm1.Button1Click(Sender: TObject);
begin
query1.close;
query1.sql.text:="select data, mest, postav, sum(kolvo) "+
"from prihod where data between :Sdate and :Fdate "+
"group by data, mest, kateg, postav";
query1.parambyname("Sdate").asdate:=strtodate(dateedit1.text);
query1.parambyname("Fdate").asdate:=strtodate(dateedit2.text);
query1.Open;
end;


 
Val ©   (2002-02-28 14:09) [33]

>Shirson © (28.02.02 14:00)
вот взял все и рассказал :)


 
Sava ©   (2002-02-28 14:11) [34]

>Shirson
Это уже пройденный этап. Не помогает.....
Если у вас это все работает, то я даже незнаю на что и думать!!!!
>Val
Еслиб это помогдо я бы часа три назад перестал народ напрягать:(((


 
alexts ©   (2002-02-28 14:21) [35]

>Sava ты чисто из-за принципа хочешь разобраться в чем дело?
А то может сначала проверить есть записи или нет, а потом свой запрос


 
Shirson ©   (2002-02-28 14:24) [36]

>Sava

Проверь, есть ли такие записи вообще.
Выведи полностью сформированный sql.text например в кэпшн и посмотри, нет ли там ошибок.
Посмотри в каком виде вводится дата. Вообще даты лучше брать с датапикеров.


 
Val ©   (2002-02-28 14:27) [37]

Sava © (28.02.02 14:11)
это (Shirson © (28.02.02 14:00))должно работать!(попробуйте еще АsDateTime), на какой строке все-таки получаете ошибку?


 
Sava ©   (2002-02-28 14:42) [38]

> Val
Я уже писал, что ошибку получаю в момент перерисовки DBGrid (вобщем далеко от запроса), запрс выдает все нормально пустые записи, это я позже выяснил не с самого начала, но беда в том что если из выборки убрать дату и соответственно по ней не групировать то ошибок не выдает. Если where ... benween... убираю тоже не ругается.
>Shirson
Еще раз повторяю дату я беру из компонента TDateEdit библиотеке RxLib. И никакие комбинации не позволяют справится с ошибкой.
>alexts
Как я посмотрю есть записи или нет до запроса? Вообще они есть но вот удовлетворяющие условию отсутствуют, и что делать, вообще я наверно щас на дату забью, это не дело принципа это пожелание видеть именно такую выборку, причем желане к сожалению не мое.


 
iva ©   (2002-02-28 14:44) [39]

Проблема действительно существует.
Попробовал то же самое на базах Парадокса (DB) ошибка изчезла.


 
iva ©   (2002-02-28 14:44) [40]

Проблема действительно существует.
Попробовал то же самое на базах Парадокса (DB) ошибка исчезла.


 
Val ©   (2002-02-28 14:47) [41]

>Sava © (28.02.02 14:42)
(вобщем далеко от запроса), запрс выдает все нормально пустые записи

Уважаемый, чего тогда мы ваш запрос мусолим?
Вы можете сказать нормально, что у вас не работает?


 
iva ©   (2002-02-28 14:52) [42]

>Val © (28.02.02 14:47)
>Вы можете сказать нормально, что у вас не работает?
У кого это "у вас" ?



 
Sava ©   (2002-02-28 14:54) [43]

> Val
Со всем уважением, но не могу сказать что от запроса работоспособность не зависит напрямую!!!!
Тоесть я убираю кое-что из запроса (смотрите выше) и даже пустые строки выводит замечательно, так что не могу сказать, что проблемма не в запросе, вероятно она и не в запросе, но от именно запрос является возбудителем этой ошибки или не согласны?
>iva
Вот и я говорю, что существует..... А что делать уж больно на парадокс переходить не хочется.....


 
iva ©   (2002-02-28 14:54) [44]

Sava, мне кажется виной всему BDE


 
Sava ©   (2002-02-28 14:57) [45]

> iva
> У кого это "у вас" ?
Это в мой адрес издевка:))
Мда тяжелый случай... водщем проблема осталась нерешенной


 
Val ©   (2002-02-28 15:01) [46]

>Sava
никаких издевок.
если проблема в запросе, то ошибка должна появляться именно на строке Query1.Open


 
Sava ©   (2002-02-28 15:15) [47]

>val
Повторяюсь еще раз есть два запроса:
первый:

with query1 do begin
close;
sql.Clear;
sql.Append("select data, mest, kateg, postav, sum(kolvo) from prihod ");
sql.Append("where data between ""+dateedit1.text+"" and ""+ dateedit2.text+""");
sql.Append("group by data, mest, kateg, postav");

и второй запрос:

with query1 do begin
close;
sql.Clear;
sql.Append("select mest, kateg, postav, sum(kolvo) from prihod ");
sql.Append("where data between ""+dateedit1.text+"" and ""+ dateedit2.text+""");
sql.Append("group by mest, kateg, postav");

Разницы между ними чуть, а вот первый выдает ошибку а второй нет? И кто виноват? И самое главное ЧТО ДЕЛАТЬ????


 
Shirson ©   (2002-02-28 15:20) [48]

Коллега... а в DBGird у вас колонки заранее не определены?


 
Sava ©   (2002-02-28 15:29) [49]

>Shirson
Коллега... К великому сожелению это не имеет значения, и когда определены ошибка и когда не определены тоже ошибка:((( Этот этап был пройден часа два назад :((( У меня идеи кончились подскажите свежую!!!!!!!!!!


 
Shirson ©   (2002-02-28 16:04) [50]

Значит нужно рыть с кореней.
С какой базой вы работаете? Что-нибудь типа кверианалайзера там есть? Как sqlw для MSSQL. Вобщем оболочка, где можно писать запросы для базы.
Загоните свой запрос туда и посмотрите результат.
Еще попробуйте в запросе прописать дату константой и попробуйте сгруппировать по дате - ошибка есть?


 
Sava ©   (2002-02-28 16:18) [51]

>Shirson
Коллега, мне не приятно это напомитать, но, вопервых, с какой базой я работаю написано в самом первом сообении - это dBase. И там, кстати, дата стоит констанотой, ошибка есть.
А вот за "кверианалайзера" спасибо идея новая, щас попробую что нит найти похожее, вот только интересно найду-ли?
Буду признателен за идеи!!!
Проблема то есть кто не верет намылю кусочик проекта.


 
Shirson ©   (2002-02-28 16:46) [52]

Если не секрет и не комерческая тайна, закинте мне свой dbf (в нем храните, если не ошибаюсь?). Посмотреть хоть, что за чудо такое, которое так глючит :)
(мыло под ником)


 
Johnmen ©   (2002-02-28 16:51) [53]

>Sava © : Из области ненаучного тыка - переименуй поле data - что-то оно мне не нравится...
Если по-прежнему будет плохо - намыль...


 
Sava ©   (2002-02-28 17:15) [54]

Жаль что не помогло!!!
Еще идеи есть? Меня сначало это злило, а теперь просто интересно уже!!!


 
asafr ©   (2002-02-28 17:26) [55]

Попробуй так:
With Query1 do begin
try
if active then close;
SQL.Clear;
SQL.Add("Select data, sum(kolvo) from prihod")
SQL.Add("where data between ");
SQL.Add("""+FormatDateTime("dd.mm.yyyy",DateEdit1.Date)+"" and");
SQL.Add("""+FormatDateTime("dd.mm.yyyy",DateEdit2.Date)+""");
SQL.Add("group by data ");
Open;
Finally
Close
end;
end;



 
Johnmen ©   (2002-02-28 17:32) [56]

>asafr © :
...
Open;
Finally
Close
...

- чтобы тутже закрылся ? :)


 
Val ©   (2002-02-28 17:46) [57]

коллеги, тут проблема, похоже, действительно в DBase-тот же Paradox - и все корректно работает (недавно проверил в SQL Explorer один и тот же запрос на таблицах двух форматов):(


 
asafr ©   (2002-02-28 17:50) [58]

Johnmen, согласен. Не внимателен, не заметил, что DBGrid. Конечно, Close не надо
.....
.....
.....
Open;
except
Close
end;


 
iva ©   (2002-03-01 07:24) [59]

Sava, единственное, что у меня получилось - это обойти проблему, но не решить.
Query1.close;
Query1.DisableControls;
with query1 do
begin
sql.Clear;
sql.Append("select data, sum(kolvo), count(*) as Cnt from prihod ");
sql.Append("where data between ""+dateedit1.text+"" and ""
+ dateedit2.text+""");
sql.Append("group by data ");
open;
if Query1.FieldByName("cnt").AsInteger = 0 then
begin
ShowMessage("Данных нет. Пусто");
close;
end;
end;
Query1.EnableControls;


 
gek   (2002-03-01 07:41) [60]

Может поле data переименовать в другое


 
iva ©   (2002-03-01 07:47) [61]


> gek (01.03.02 07:41)
> Может поле data переименовать в другое

Была такая мысль, но не проходит.


 
Sava ©   (2002-03-01 08:03) [62]

Народ iva подсказал дельную мысль, хоть так обойти и то приятно, спасибо ему огромное!!!
А вот

try
Open;
...
except
Close
end;

не поможет, так как ошибка не в самом запросе происходит а позже, в момент перерисовки DBGrid, хотя сам запрос порождает эту ошибку.


 
roottim   (2002-03-01 08:19) [63]

а ты пробовал без грида открывать запрос по батону?
а если дело не в запросе, то чего вы его мусолите?
незнаю имеет ли это смысл но попробуй приписать
sum(..) as sum1


 
iva ©   (2002-03-01 08:36) [64]

Мои предположения:
проблема возникает когда нет информации для заданного периода. Но результат запроса не пустой, в нем содержится только одна запись, в которой вместо значения даты стоит пустота (что это NULL или еще что - я не знаю), при отображении которй и возникает проблема.
Но еще интересней: если все это проделать на базах "Парадокс", проблемы не возникает.


 
roottim   (2002-03-01 08:47) [65]

> проблема возникает когда нет информации для заданного периода
если дело в том что по сумме проскакивает NULL то добавте условие and kolvo is not null


 
Val ©   (2002-03-01 10:26) [66]

>roottim (01.03.02 08:47)
проблема, похоже, именно в датах, когда запрос возвращает null по этому полю


 
fishka   (2002-03-01 10:56) [67]

Запрос верный, но даже если нет записей, то будет одна запись, в которой поле дата пустое и сумма=0.
Чтобы исключить эту запись, необходимо в текст SQL добавить
последнюю строку:
sql.Append("having sum(kolvo)<>0 ");
В данном случае ошибки не будет при отображении с помощью DBGrid.
Если все получится, напишите.


 
iva ©   (2002-03-01 11:08) [68]


> fishka (01.03.02 10:56)
> Запрос верный, но даже если нет записей, то будет одна запись,
> в которой поле дата пустое и сумма=0.
> Чтобы исключить эту запись, необходимо в текст SQL добавить
> последнюю строку:
> sql.Append("having sum(kolvo)<>0 ");

такой подход не совсем верный вот в каком смысле, Нулевая сумма за правильный период будет невидима (т.е. если kolvo везде равно 0), а вот если дописать sql.Append("having count(*)>0 "), то все будет Ok.



 
Sava ©   (2002-03-01 11:10) [69]

>fiska
И в самом делепомогло!!! Я даже своим глазам не поверил, только вот о чем я думаю:
Если сумма на самом деле будет равна нулю? Что тогда делать? Хотя конечно в данных условиях задачи такое маловероятно, но все-же если подойти к решению этой задачи в общих четрах, я так понимаю что такую запись в выборке мы не увидем.


 
iva ©   (2002-03-01 11:12) [70]

sql.Append("having count(*)>0 ")


 
Val ©   (2002-03-01 11:16) [71]

Это все хорошо, но это тот же обход проблемы, только средствами SQL. Если кто-то найдет информацию, почему так себя ведет DBase, поделитесь пожалуйста.


 
Sava ©   (2002-03-01 11:18) [72]

>iva
Решенье найдено УРА!
Работает на все 100% И хотя как многие говорили проблемма не в запросе решается он корректировкой запроса, так в чем всетаки проблемма остается сикретом!


 
Sava ©   (2002-03-01 11:20) [73]


> Val
> Если кто-то найдет информацию, почему так себя ведет DBase,
> поделитесь пожалуйста.

И со мной тоже поделитесь пожалуйста, если найдете.


 
iva ©   (2002-03-01 11:23) [74]

fishka - молодец




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

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

Наверх




Память: 0.66 MB
Время: 0.013 c
3-90807
Зинец Виктор
2002-02-28 18:22
2002.03.28
Выбор схемы работы с удаленной БД и сервера БД


1-90923
Брат
2002-03-13 09:47
2002.03.28
Вопрос по Паскалю: как сделать курсор невидимым?


7-91088
Pat
2001-12-26 21:38
2002.03.28
FAR. Список процессов.


7-91084
WarChilD
2001-12-20 20:43
2002.03.28
Смена яркости на Рабочем столе


6-91028
SemFLY
2002-01-10 04:08
2002.03.28
Компоненты Indy -> TIdTCPServer и TIdTCPClient