Форум: "Начинающим";
Текущий архив: 2007.01.07;
Скачать: [xml.tar.bz2];
ВнизЗагадки 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;
Скачать: [xml.tar.bz2];
Память: 0.56 MB
Время: 0.011 c