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

Вниз

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

Наверх





Память: 0.62 MB
Время: 0.01 c
4-91107
IronHawk
2002-01-28 16:00
2002.03.28
Преобразование String to TCaption и Наоборот ..??


1-90959
Tolstomordik
2002-03-14 14:43
2002.03.28
Преобразование строки типа PChar в строку типа String


7-91089
Dmitry1979
2001-12-26 12:26
2002.03.28
Как послать сообщение во факсу из программы на Delphi?


6-91018
McSimm
2002-01-15 10:35
2002.03.28
TIdHTTP и cookie


3-90758
Ptr
2002-02-27 14:52
2002.03.28
MasterSource... Кто подскажет в чем проблема?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский