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

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

Странная работа 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, но в заголовке вветки это почему-то не показано...


Наверх

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