Текущий архив: 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) ошибка исчезла.
Страницы: 1 2 вся ветка
Текущий архив: 2002.03.28;
Скачать: CL | DM;
Память: 0.53 MB
Время: 0.007 c