Конференция "Начинающим" » Странная работа ADOQuery [D7]
 
  • pavel_guzhanov © (06.01.10 22:35) [0]
    делаю запрос к базе данных

           
    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 © (06.01.10 22:39) [1]
    При создании ветки поставил галку, что база данных - Oracle, но в заголовке вветки это почему-то не показано...
  • Anatoly Podgoretsky © (06.01.10 23:20) [2]
    Ну и какой текст?
    Кроме того нельзя такой запрос назвать правильным, когда в нем используются литералы в виде дат.
  • Anatoly Podgoretsky © (06.01.10 23:21) [3]
    И что дает выполнение каждого из четырех запросов по отдельности?
  • Palladin © (06.01.10 23:24) [4]
    какого типа tr_sum и как ты его получаешь?
  • pavel_guzhanov © (07.01.10 11:02) [5]
    Запрос исправил следующим образом:
           
    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');



    Вот так все работает!

    Спасибо за помощь всем, особенно дяде Толе вот за эту фразу:


    > нельзя такой запрос назвать правильным, когда в нем используются
    > литералы в виде дат.
 
Конференция "Начинающим" » Странная работа ADOQuery [D7]
Есть новые Нет новых   [134435   +35][b:0][p:0.001]