Запрос исправил следующим образом:
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');
Вот так все работает!
Спасибо за помощь всем, особенно дяде Толе вот за эту фразу:
> нельзя такой запрос назвать правильным, когда в нем используются
> литералы в виде дат.