Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.07;
Скачать: CL | DM;

Вниз

Загадки Delphi   Найти похожие ветки 

 
MaXie   (2006-12-17 16:44) [0]

Добрый день!

Окажите, плз, содействие в поиске ответа на следующий вопрос:

Есть компонент 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? ;)


 
Новичек ©   (2006-12-17 16:53) [1]

Все очень просто (выдрал, как есть, лень самому набирать :-):

Cause:  A SELECT list cannot include both a group function, such as AVG, COUNT, MAX, MIN, SUM, STDDEV, or VARIANCE, and an individual column expression, unless the individual column expression is included in a GROUP BY clause.

Action: Drop either the group function or the individual column expression from the SELECT list or add a GROUP BY clause that includes all individual column expressions listed.


 
sniknik ©   (2006-12-17 17:03) [2]

> Можете объяснить в чем "фокус" Delphi? ;)
в тебе. ну и возможно чуточку в оракле ошибку которого ты от дельфевой отличить не можеш. (надо бы ему чуток подружелюбнее интерфейс...)


 
MaXie   (2006-12-17 17:07) [3]

To Новичек
Спасибо за реакцию на обращение. :)

К сожалению, данное описание ошибки ORA-00937 не дает ясного ответа, в чем возникает проблема. Можно "своими словами" пояснить в чем причина?! Ведь текст select-запроса предельно тривиален и в ходе трансформации не претерпевает абсолютно ни каких принципиальных изменений!


 
Новичек ©   (2006-12-17 17:08) [4]

То есть, нужно сделать что-то типа:
"...group by first, second, third...";
ADOQuery.Open;
(Перечислить ВСЕ поля).


 
MaXie   (2006-12-17 17:14) [5]

To sniknik
А с чего ты взял, что я не могу Оракловую ошибку от Дельфийской отличить?! И почему ты считаешь, что если Delphi во втором, приводимом мной, случае некорректно формирует запрос к DB, то это Оракловая, а не Дельфийская ошибка?
Вопрос остается в силе...


 
sniknik ©   (2006-12-17 17:17) [6]

> Ведь текст select-запроса предельно тривиален и в ходе трансформации не претерпевает абсолютно ни каких принципиальных изменений!

procedure MyShow(const s: string);
begin
 ShowMessage(s);
end;

...
begin
 MyShow("один");

 MyShow(1);

тоже процедура без всяких изменений, даже одна на оба вызова, но во втором случае почемуто ошибка... почему?


 
MaXie   (2006-12-17 17:17) [7]

To Новичек
Возможно я не очень силен в SQL, но для того чтобы определить число строк в таблице нет необходимости использовать дополнительно оператор group by. Вполне достаточно просто написать:

select count(*) from table

Во всяком случае в sqlplus такой селект проходит. ;)
Если неправ - просьба меня поправить...


 
sniknik ©   (2006-12-17 17:19) [8]

> А с чего ты взял, что я не могу Оракловую ошибку от Дельфийской отличить?!
я вижу что идет "гон" на дельфи, при том что ошибка в основном твоя, а возвращается ее описание от оракла... по моему вывод очевиден.


 
MaXie   (2006-12-17 17:22) [9]

To sniknik
Я понял твою мысль, sniknik - несоблюдение типов. Могу добавить знаки апострофов(") и получить:

Value := "16.12.2006 12:00:00"

, но картина принципиально не изменится(перед тем как обратиться на форум, такую процедуру проделывал) - запрос все равно не открывается...

Сейчас еще раз попробую...


 
Новичек ©   (2006-12-17 17:27) [10]

Только что пробовал такое:

select count(*) as flCount from alarms where start  >= :zhopa

Работает.


 
sniknik ©   (2006-12-17 17:31) [11]

> но картина принципиально не изменится
изменится, если правильно сделать, не знаю оракла, может он параметры в функциях не воспринимает, или еще что, но она там и не нужна в любом случае.

select count(*) as flCount from some_table where flDateTime >= :pmDateTime

Value := StrToDateTime("16.12.2006 12:00:00");


 
MaXie   (2006-12-17 17:33) [12]

Прописал значение параметра 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

Какие еще будут рекомендации?


 
Новичек ©   (2006-12-17 17:38) [13]

Есть такая бяка в Query как params. Выставь там DataType и Value.Type ОДИНАКОВЫМИ (я пробовал String и DateTime - оба варианта работают)


 
MaXie   (2006-12-17 17:43) [14]

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.


 
sniknik ©   (2006-12-17 17:45) [15]

чего непонятного в
> ORA-01858: a non-numeric character was found where a numeric was expected
найдены не числовые символы, когда ожидаются исключительно числа...
туп поставил дататайм/или число а пихаеш в параметр строку.

> Какие еще будут рекомендации?
переводи и осмысливай ошибки...


 
Desdechado ©   (2006-12-17 17:48) [16]

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:48) [17]

MaXie   (17.12.06 17:43) [14]
ошибка в реальных действиях... описано все правильно, так и надо.

(единственное только еще ADO_Query на ADODataSet заменить... для полного счастья. но тут это вряд ли от этого)


 
MaXie   (2006-12-17 17:49) [18]

To Новичек
Да, Новичек. Пробовал "играть" с этими настройками - к сожалению, ORA-00937, "хоть ты тресни"... :(

Если есть под рукой Оракловая базейка, с таблицей, в которой есть хотя бы одно DateTime поле, попробуй посчитать кол-во строк, но при строковой отсечке по времени.

Я могу ошибаться, и скорее всего это именно так, но пока что, IMHO, все выглядит так, что заморочка возникает именно в некорректной настройке механизма динамической фильтрации в Delphi.


 
MaXie   (2006-12-17 18:00) [19]

To Desdechado
Так мной так и было сделано, согласно рекомендаций sniknik. Результат тот же - ORA-00937...

To sniknik
>туп поставил дататайм/или число а пихаеш в параметр строку.
А где ты видишь, что я "пхию в параметр строку"? Я же еще отдельно сделал на этом акцент, что специально выражение не ставлю в апострофы. Или Delphi не смотря на явноуказанный тип ftDateTime не понимает, что значение 16.12.2006 12:00:00 это не String, а DateTime?


 
Desdechado ©   (2006-12-17 18:06) [20]

> Для параметра pmDateTime выставляю тип ftDateTime. В поле Value вписываю
> значение 16.12.2006 12:00:00(в апострофы не заключаю, т.к. тип не стинговый).
Приведи код. Если делаешь в дизайне, возможны бока...


 
sniknik ©   (2006-12-17 18:09) [21]

> что заморочка возникает именно в некорректной настройке механизма динамической фильтрации в Delphi.
чего, чего? переведи со своих "умных" слов на доступный язык.

вот
http://slil.ru/23589808
программка в которой можно протестировать запросы ADO - Дельфи, исключительно на нем и с использованием написана. повтори в ней оба запроса и напиши какие типы параметров для какого конкретно запроса выставлял.

> А где ты видишь, что я "пхию в параметр строку"?
в том то и дело, я не вижу, только словестное описание с общим смыслом "я все делаю правильно", а реального кода нет. а ошибки именно в нем.

> Или Delphi не смотря на явноуказанный тип ftDateTime не понимает
это должен понимать программист, то что он пишет/как, так дельфи и понимает. и если там есть преобразования/приведение типа то это тоже на совести программиста. отсебятину дельфи не добавит.


 
MaXie   (2006-12-17 18:11) [22]

Да, делаю в дизайне... спасибо за предупреждение... :(

Попробовал уже явно в коде присвоить TDateTime значение параметру pmDateTime. Оператор ADO_Query.Open все равно не проходит... :(((

Могу жутко тупить...., но до меня и в самом деле не доходит, в чем "грабли"... :(


 
Anatoly Podgoretsky ©   (2006-12-17 18:12) [23]

> MaXie  (17.12.2006 18:00:19)  [19]

С чего бы это Дельфи должна это понимать, это литерал и он должен соответсвовать синтаксису по литералам и региональным настройкам.


 
MaXie   (2006-12-17 18:20) [24]

To Anatoly Podgoretsky
Проверил - региональным настройкам ОС введенные мной через пробел дата и время соответствуют.


 
Новичек ©   (2006-12-17 18:40) [25]

Странно, у меня все работает... Что-то у Вас, сударь, не то с ADO...


 
MaXie   (2006-12-17 18:44) [26]

А есть возможность привести фрагмент кода?


 
Desdechado ©   (2006-12-17 18:47) [27]

MaXie   (17.12.06 18:44) [26]
> А есть возможность привести фрагмент кода?
тебе уже 20 постов об этом говорят


 
Новичек ©   (2006-12-17 18:50) [28]

Если это вопрос ко мне, то мой код ничем не отличается от Вашего, за исключением имен переменных.


 
sniknik ©   (2006-12-17 18:55) [29]

> А есть возможность привести фрагмент кода?
я б не стал... после того как ты усиленно скрывал свой, у меня начались подозрения что это незаконно, код приводить, еще неприятности будут...
;)

да и попросту из любопытства.... т.к. как только тебе дадут "готовый рецепт" ты "смоешься" и мы не узнаем в чем же там тебя "глючило".

Новичек ©   (17.12.06 18:50) [28]
это ты описательные часть сравниваешь? ;о)) они никогда не отличаются и всегда все все делают правильно, но вот только у когото не работает... и естественно виноват другой, дельфи например, только не автор.


 
MaXie   (2006-12-17 19:09) [30]

Копирую значение поля SQL объекта TADOQuery из Object Inspector:

select count(*) as flCount from cpa_cdr where strt >= :pmDateTime

В том же самом Object Inspector для параметра pmDateTime выставляю значение поля DateType в ftDateTime.

Далее, перегружаю конструктор модуля:

constructor TDM_Oracle.Create(AOwner: TComponent);
begin
 Inherited Create(AOwner);
 quGetCount_ADO.Parameters.FindParam("pmDateTime").Value := StrToDateTime("12.12.2006 12:00:00");
 quGetCount_ADO.Active := True;
end;

Запускаю на компиляцию и получаю Debugger Exception Notification уже всем известную ошибку.

Что еще необходимо для более точного описания проблемы/ситуации?


 
Desdechado ©   (2006-12-17 19:21) [31]

зачем конструктор перегружать, не проще ли событие создания отработать?
может, стоит попробовать не ftDateTime, а ftSQLTimeStamp?
твой вариант преобразования строки в дату может вызвать ошибку на других локалях...


 
Новичек ©   (2006-12-17 19:21) [32]

Что-то не догоняю: TDM_Oracle - это DataModule?


 
MaXie   (2006-12-17 19:24) [33]

To Desdechado
Согласен, но сейчас уже "не суть вопроса" - лишь бы заработало.
Сейчас попробую поменять тип параметра.

To Новичек
Да, верно. Это класс потомок от класса TDataModule.


 
Новичек ©   (2006-12-17 19:28) [34]

Тогда, наверное, в этом модуле лежит TADOQuery. А где он создается?


 
MaXie   (2006-12-17 19:34) [35]

To Desdechado
Сразу оговорюсь - все ниже сказанное относится к действиям в Object Inspector.
К сожалению, в списке доступных типов поля DateType параметра pmDateTime нет указанного тобой типа ftSQLTimeStamp. Есть ftORATimeStamp(догадываюсь, что это связано с выбором типа Provider"а). Пробую указать данный тип. Получаю ошибку:

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.


 
Новичек ©   (2006-12-17 19:36) [36]

Вопрос снят. Думаю дальше.


 
MaXie   (2006-12-17 19:40) [37]

type
 TDM_Oracle = class(TDataModule)
   oraConnection_ADO: TADOConnection;
   quGetCount_ADO: TADOQuery;
   ...
   constructor Create(AOwner: TComponent); override;

ну и т.д.


 
sniknik ©   (2006-12-17 20:00) [38]

> Что еще необходимо для более точного описания проблемы/ситуации?
достаточно, а тепер без извратов, создай приложение в нем пустую форму с единственной кнопкой, датамодуль (или просто на форму кинь) с TADOConnection и (да черт сним) с TADOQuery БЕЗ ВСЯКИХ ПЕРЕКРЫТИЙ в событии по кнопке пропиши свои показанные действия (можно даже запрос присваивать тут же, перед внесением параметра)...

procedure TForm1.onButton1Click(sender: TComponent);
begin
  TADODataSet(quGetCount_ADO).CommandText:= "select count(*) as flCount from some_table where flDateTime>=:pmDateTime";

  quGetCount_ADO.Parameters.FindParam("pmDateTime").Value := StrToDateTime("12.12.2006 12:00:00");
 quGetCount_ADO.Open;
end;


ошибка есть?


 
sniknik ©   (2006-12-17 20:02) [39]

блин, FindParam замени на ParamByName, а то будет ошибка и даже не узнаеш о ней.


 
MaXie   (2006-12-17 20:43) [40]

Создал форму. Кинул на нее два компонента ADOConnection и ADOQuery. Плюс кнопка. Для кнопки прописал событие:

procedure TForm3.Button1Click(Sender: TObject);
begin
 try
   TADODataSet(quGetCount_ADO).CommandText:= "select count(*) as flCount from cpa_cdr where strt >= :pmDateTime";
   quGetCount_ADO.Parameters.ParamByName("pmDateTime").Value := StrToDateTime("12.12.2006 12:00:00");
   quGetCount_ADO.Open;
 except
   ShowMessage("Не проходит!");
 end;
end;

Результат: ORA-00937...



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

Текущий архив: 2007.01.07;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.043 c
2-1166208053
FIL-23
2006-12-15 21:40
2007.01.07
как вставить строку в memo


2-1166219308
antonn
2006-12-16 00:48
2007.01.07
TCheckBox, TRadioBox - caption


2-1166598801
vitv
2006-12-20 10:13
2007.01.07
Запрос


2-1166099460
kukuikar
2006-12-14 15:31
2007.01.07
Результаты работы функций (работа с файлами и каталогами)


4-1156689426
FUH
2006-08-27 18:37
2007.01.07
Извлечь таблицу из MSI-инсталлятора