Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в SQL запросе?! [D5, IB6.x, dBase, FoxPro]


Страницы:   1 2 3 4

Sava ©   (2002-02-28 10:52:00) 

Уважаемы мастера, помогите всю голову разбил уже!
В кратце описываю что у меня есть:
Есть база (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 недавно осваивать начал, может я что не знаю?
Заранее благодарен!


iva   (2002-03-01 11:23:00) [1]

fishka - молодец


Sava   (2002-03-01 11:20:00) [2]


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

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


Sava   (2002-03-01 11:18:00) [3]

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


Val   (2002-03-01 11:16:00) [4]

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


iva   (2002-03-01 11:12:00) [5]

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


Sava   (2002-03-01 11:10:00) [6]

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


iva   (2002-03-01 11:08:00) [7]


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

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


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

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


Val   (2002-03-01 10:26:00) [9]

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


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

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


iva   (2002-03-01 08:36:00) [11]

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


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

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


Sava   (2002-03-01 08:03:00) [13]

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

try
Open;
...
except
Close
end;

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


iva   (2002-03-01 07:47:00) [14]


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

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


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

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


iva   (2002-03-01 07:24:00) [16]

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;


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

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


Val   (2002-02-28 17:46:00) [18]

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


Johnmen   (2002-02-28 17:32:00) [19]

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

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


asafr   (2002-02-28 17:26:00) [20]

Попробуй так:
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;


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо