Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1166447443
Slimer
2006-12-18 16:10
2007.01.07
Прога с парадокс на чистом ХР


15-1166100665
TIF
2006-12-14 15:51
2007.01.07
Vista Manifest и Vista Style Components


2-1166381023
allrussia
2006-12-17 21:43
2007.01.07
Как и можно ли создать таблицу в таблице?


15-1165998355
infom
2006-12-13 11:25
2007.01.07
Backup Delphi со всеми компонентами


15-1166390678
AntiUser
2006-12-18 00:24
2007.01.07
Системный администратор осужден на 8 лет





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский