Главная страница
    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) ошибка исчезла.



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

Форум: "Базы";
Текущий архив: 2002.03.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.009 c
3-90738
aleks2000
2002-02-24 12:48
2002.03.28
<B>Как открыть ДОС базу данных dBase III в Делфи, так чтобы было написано на нормальном русском</B>


3-90741
Turalyon
2002-03-01 09:31
2002.03.28
InterBase 6


1-90817
vrRaven
2002-03-09 13:40
2002.03.28
Компилятор Delphi


3-90780
Alexander Vasjuk
2002-02-25 16:47
2002.03.28
КРИЗИС ЖАНРА или Настройка ширины колонок подчиненной таблицы


3-90749
Rustik
2002-02-26 15:44
2002.03.28
Репорт вместо 10 таблиц 1 queryзапрос





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