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

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

Загадки Delphi [D7]


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

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-запроса предельно тривиален и в ходе трансформации не претерпевает абсолютно ни каких принципиальных изменений!


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

Наверх

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