![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Загадки Delphi [D7]
MaXie © (2006-12-17 16:44:00)Добрый день!
Окажите, плз, содействие в поиске ответа на следующий вопрос:
Есть компонент ADO_Query, в котором прописан следующий select:
select count(*) as flCount from some_table where flDateTime >= TO_DATE('16.12.2006 12:00:00', 'dd.mm.rrrr hh24:mi:ss')
Из текста запроса видно, что компонент взаимодействует с Оракловой таблицей. Все что необходимо получить, в ходе выполнения этого запроса - так это просто кол-во строк начиная с определенного момента времени. Все очень просто! :)
Выставляю свойство Active данного компонента в True, запускаю компиляцию - все проходит на ура! :)
Теперь меняю текст запроса на следующий:
select count(*) as flCount from some_table where flDateTime >= TO_DATE(:pmDateTime, 'dd.mm.rrrr hh24:mi:ss')
, т.е. заменяю постоянное выражение '16.12.2006 12:00:00' параметром pmDateTime. Далее для этого параметра выставляю дефолтовое значение(Value) 16.12.2006 12:00:00 - по-идее, ничего не изменилось! ;)
Опять выставляю свойство Active данного компонента в True, запускаю компиляцию - и на выходе получаю:
'ORA-00937: not a single-group group function'
Можете объяснить в чем "фокус" Delphi? ;)
MaXie (2006-12-17 18:11:00) [21]Да, делаю в дизайне... спасибо за предупреждение... :(
Попробовал уже явно в коде присвоить TDateTime значение параметру pmDateTime. Оператор ADO_Query.Open все равно не проходит... :(((
Могу жутко тупить...., но до меня и в самом деле не доходит, в чем "грабли"... :(
sniknik (2006-12-17 18:09:00) [22]> что заморочка возникает именно в некорректной настройке механизма динамической фильтрации в Delphi.
чего, чего? переведи со своих "умных" слов на доступный язык.
вот
http://slil.ru/23589808
программка в которой можно протестировать запросы ADO - Дельфи, исключительно на нем и с использованием написана. повтори в ней оба запроса и напиши какие типы параметров для какого конкретно запроса выставлял.
> А где ты видишь, что я "пхию в параметр строку"?
в том то и дело, я не вижу, только словестное описание с общим смыслом "я все делаю правильно", а реального кода нет. а ошибки именно в нем.
> Или Delphi не смотря на явноуказанный тип ftDateTime не понимает
это должен понимать программист, то что он пишет/как, так дельфи и понимает. и если там есть преобразования/приведение типа то это тоже на совести программиста. отсебятину дельфи не добавит.
Desdechado (2006-12-17 18:06:00) [23]> Для параметра pmDateTime выставляю тип ftDateTime. В поле Value вписываю
> значение 16.12.2006 12:00:00(в апострофы не заключаю, т.к. тип не стинговый).
Приведи код. Если делаешь в дизайне, возможны бока...
MaXie (2006-12-17 18:00:00) [24]To Desdechado
Так мной так и было сделано, согласно рекомендаций sniknik. Результат тот же - ORA-00937...
To sniknik
>туп поставил дататайм/или число а пихаеш в параметр строку.
А где ты видишь, что я "пхию в параметр строку"? Я же еще отдельно сделал на этом акцент, что специально выражение не ставлю в апострофы. Или Delphi не смотря на явноуказанный тип ftDateTime не понимает, что значение 16.12.2006 12:00:00 это не String, а DateTime?
MaXie (2006-12-17 17:49:00) [25]To Новичек
Да, Новичек. Пробовал "играть" с этими настройками - к сожалению, ORA-00937, "хоть ты тресни"... :(
Если есть под рукой Оракловая базейка, с таблицей, в которой есть хотя бы одно DateTime поле, попробуй посчитать кол-во строк, но при строковой отсечке по времени.
Я могу ошибаться, и скорее всего это именно так, но пока что, IMHO, все выглядит так, что заморочка возникает именно в некорректной настройке механизма динамической фильтрации в Delphi.
sniknik (2006-12-17 17:48:00) [26]MaXie (17.12.06 17:43) [14]
ошибка в реальных действиях... описано все правильно, так и надо.
(единственное только еще ADO_Query на ADODataSet заменить... для полного счастья. но тут это вряд ли от этого)
Desdechado (2006-12-17 17:48:00) [27]
TO_DATE('16.12.2006 12:00:00', 'dd.mm.rrrr hh24:mi:ss')
Вот это все целиком надо было заменить параметром, а не строку даты.
А то у тебя получается (TO_DATE(:pmDateTime, 'dd.mm.rrrr hh24:mi:ss')), что параметр pmDateTime, уже имеющий тип даты, ты пытаешься привести опять к дате.
sniknik (2006-12-17 17:45:00) [28]чего непонятного в
> ORA-01858: a non-numeric character was foundwhere a numeric was expected
найдены не числовые символы, когда ожидаются исключительно числа...
туп поставил дататайм/или число а пихаеш в параметр строку.
> Какие еще будут рекомендации?
переводи и осмысливай ошибки...
MaXie (2006-12-17 17:43:00) [29]To sniknik
Такой вариант так же не проходит. Могу что то не так делать, поэтому в точности описываю свои действия:
Меняю текст запроса на предложенный:
select count(*) as flCount from some_table where flDateTime >= :pmDateTime
Для параметра pmDateTime выставляю тип ftDateTime. В поле Value вписываю значение 16.12.2006 12:00:00(в апострофы не заключаю, т.к. тип не стинговый). Выставляю Active ADO_Query в True. Запускаю на компиляцию. Опять получаю ошибку ORA-00937.
Новичек (2006-12-17 17:38:00) [30]Есть такая бяка в Query как params. Выставь там DataType и Value.Type ОДИНАКОВЫМИ (я пробовал String и DateTime - оба варианта работают)
MaXie (2006-12-17 17:33:00) [31]Прописал значение параметра pmDateTime следующим образом:
Value := '16.12.2006 12:00:00'
Пытаюсь выставить значение Active компонента ADO_Query в True, на выходе получаю:
ORA-01858: a non-numeric character was found where a numeric was expected
Какие еще будут рекомендации?
sniknik (2006-12-17 17:31:00) [32]> но картина принципиально не изменится
изменится, если правильно сделать, не знаю оракла, может он параметры в функциях не воспринимает, или еще что, но она там и не нужна в любом случае.
select count(*) as flCount from some_table where flDateTime >= :pmDateTime
Value := StrToDateTime('16.12.2006 12:00:00');
Новичек (2006-12-17 17:27:00) [33]Только что пробовал такое:
select count(*) as flCount from alarms where start >= :zhopa
Работает.
MaXie (2006-12-17 17:22:00) [34]To sniknik
Я понял твою мысль, sniknik - несоблюдение типов. Могу добавить знаки апострофов(') и получить:
Value := '16.12.2006 12:00:00'
, но картина принципиально не изменится(перед тем как обратиться на форум, такую процедуру проделывал) - запрос все равно не открывается...
Сейчас еще раз попробую...
sniknik (2006-12-17 17:19:00) [35]> А с чего ты взял, что я не могу Оракловую ошибку от Дельфийской отличить?!
я вижу что идет "гон" на дельфи, при том что ошибка в основном твоя, а возвращается ее описание от оракла... по моему вывод очевиден.
MaXie (2006-12-17 17:17:00) [36]To Новичек
Возможно я не очень силен в SQL, но для того чтобы определить число строк в таблице нет необходимости использовать дополнительно оператор group by. Вполне достаточно просто написать:
select count(*) from table
Во всяком случае в sqlplus такой селект проходит. ;)
Если неправ - просьба меня поправить...
sniknik (2006-12-17 17:17:00) [37]> Ведь текст select-запроса предельно тривиален и в ходе трансформации не претерпевает абсолютно ни каких принципиальных изменений!
procedure MyShow(const s: string);
begin
ShowMessage(s);
end;
...
begin
MyShow('один');
MyShow(1);
тоже процедура без всяких изменений, даже одна на оба вызова, но во втором случае почемуто ошибка... почему?
MaXie (2006-12-17 17:14:00) [38]To sniknik
А с чего ты взял, что я не могу Оракловую ошибку от Дельфийской отличить?! И почему ты считаешь, что если Delphi во втором, приводимом мной, случае некорректно формирует запрос к DB, то это Оракловая, а не Дельфийская ошибка?
Вопрос остается в силе...
Новичек (2006-12-17 17:08:00) [39]То есть, нужно сделать что-то типа:
'...group by first, second, third...';
ADOQuery.Open;
(Перечислить ВСЕ поля).
MaXie (2006-12-17 17:07:00) [40]To Новичек
Спасибо за реакцию на обращение. :)
К сожалению, данное описание ошибки ORA-00937 не дает ясного ответа, в чем возникает проблема. Можно "своими словами" пояснить в чем причина?! Ведь текст select-запроса предельно тривиален и в ходе трансформации не претерпевает абсолютно ни каких принципиальных изменений!