![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Странная работа ADOQuery [D7]
pavel_guzhanov © (2010-01-06 22:35:00)делаю запрос к базе данных
ADOQOPSMoney.Close;
ADOQOpsMoney.SQL.Clear;
ADOQOPSMoney.SQL.Add('select sum(tr_sum) as summa1 from npf_transaction where tr_doc_nnn in (');
ADOQOPSMoney.SQL.Add('select doc_nnn from npf_document where');
ADOQOPSMoney.SQL.Add('tr_acc_nnn=(');
ADOQOPSMoney.SQL.Add('select acc_nnn from npf_account where acc_cli_nnn= (');
ADOQOPSMoney.SQL.Add('select con_cli_nnn from npf_contract where con_number='''+sn+''')))');
ADOQOPSMoney.SQL.Add('and tr_date<''01.01.2009''');
ADOQOPSMoney.Open;
Перед тем, как сделать подобное, sn передавал как параметр, но результат тот же. Запрс возвращает 0, хотя, если я выполняю этот же запрос в SQLDeveloper, подставляя значение параметра тоже самое, которое вижу в Delphi при отладке, то запрос возвращает ненулевое значение. При просмотре свойства SQL.Text вижу правильный запрос.
От чего еще может быть такое, что результат получается нулевой?
pavel_guzhanov (2010-01-07 11:02:00) [1]Запрос исправил следующим образом:
ADOQOPSMoney.SQL.Add('select sum(tr_sum) as summa1 from npf_transaction where ');
ADOQOPSMoney.SQL.Add('tr_acc_nnn=(');
ADOQOPSMoney.SQL.Add('select acc_nnn from npf_account where acc_cli_nnn= (');
ADOQOPSMoney.SQL.Add('select con_cli_nnn from npf_contract where con_number='''+sn+'''))');
ADOQOPSMoney.SQL.Add('and tr_date<''01.01.2009''');
По частям:
select con_cli_nnn from npf_contract where con_number='''+sn+''' - возвращает ID клиента, связаного с договором sn
select acc_nnn from npf_account where acc_cli_nnn= - возвращает ID счета выбранного клиента
select sum(tr_sum) from npf_transaction where tr_acc_nnn= - возвращает сумму по всем транзакциям по данному счету. Дата в конце общего запроса ограничивает количество суммируемых транзакций
Тип поля tr_sum - number
Это ответы на наводящие вопросы :о))
Теперь как решилась проблема:
ADOQOPSMoney.SQL.Add('select sum(tr_sum) as summa1 from npf_transaction where ');
ADOQOPSMoney.SQL.Add('tr_acc_nnn=(');
ADOQOPSMoney.SQL.Add('select acc_nnn from npf_account where acc_cli_nnn= (');
ADOQOPSMoney.SQL.Add('select con_cli_nnn from npf_contract where con_number=:s))');
ADOQOPSMoney.SQL.Add('and tr_date<:d');
ADOQOPSMoney.Parameters[1].Value:=StrToDate('01.01.2009');
Вот так все работает!
Спасибо за помощь всем, особенно дяде Толе вот за эту фразу:
> нельзя такой запрос назвать правильным, когда в нем используются
> литералы в виде дат.
Palladin (2010-01-06 23:24:00) [2]какого типа tr_sum и как ты его получаешь?
Anatoly Podgoretsky (2010-01-06 23:21:00) [3]И что дает выполнение каждого из четырех запросов по отдельности?
Anatoly Podgoretsky (2010-01-06 23:20:00) [4]Ну и какой текст?
Кроме того нельзя такой запрос назвать правильным, когда в нем используются литералы в виде дат.
pavel_guzhanov (2010-01-06 22:39:00) [5]При создании ветки поставил галку, что база данных - Oracle, но в заголовке вветки это почему-то не показано...