2013-04-17 5 views
0

У меня возникли проблемы с преобразованием инструкции SQL в FoxPro. У меня проблема в том, что я получаю код ошибки «Имя функции отсутствует». », Но я просто не могу понять, что и где проблема. Проблема в строке ниже. Любая помощь приветствуется.Сообщение об ошибке «Имя функции отсутствует». » in visual foxpro 9.0

NVL(select sum(amount) from tpaymentitem where tpaymentitem.invoiceid = 0 and tpaymentitem.programid = (select max(tinvoiceitem.programid) FROM tinvoiceitem),0) as prepay,;

Весь код FoxPro ниже.

Select acc.accountid,; 
ti.invoiceid,; 
ti.invoicedate,; 
DATE() - ti.invoicedate as invage,; 
sum(NVL([subtotalregular],0) + NVL([fedtaxregular],0) + NVL([statetaxregular],0) + NVL([localtaxregular],0)) as invamount, ; 
NVL((select sum(amount) from tpaymentitem where invoiceid = ti.invoiceid),0) as paidamt,; 
(sum(NVL([subtotalregular],0) + NVL([fedtaxregular],0) + NVL([statetaxregular],0) + NVL([localtaxregular],0)) - NVL((select sum(amount) from tpaymentitem where invoiceid = ti.invoiceid),0)) as invbalance,; 
max(tii.programid) as programid,; 
NVL(select sum(amount) from tpaymentitem where tpaymentitem.invoiceid = 0 and tpaymentitem.programid = (select max(tinvoiceitem.programid) FROM tinvoiceitem),0) as prepay,; 
do while com.stchargeinterest = 1 AND acc.nofincharge = 0 ; 
    if DATE() - ti.invoicedate >= com.stmindaysforinterest ; 
    ROUND((sum(NVL([subtotalregular],0) + NVL([fedtaxregular],0) + NVL([statetaxregular],0) + NVL([localtaxregular],0)) - NVL((select sum(amount) from tpaymentitem where invoiceid = ti.invoiceid),0)) * ((com.stinterestrate/365) * DATE() - ti.invoicedate)),2); 
    ENDif ; 
ENDdo as financecharge,; 
com.stchargeinterest,; 
com.stinterestrate,; 
acc.nofincharge,; 
com.stmindaysforinterest,; 
com.stinterval; 
INTO cursor tmpbalance; 
FROM taccount acc; 
INNER JOIN tcompany com ON com.companyid=acc.companyid; 
LEFT JOIN tinvoice ti ON ti.accountid=acc.accountid; 
LEFT JOIN tinvoiceitem tii ON ti.invoiceid=tii.invoiceid; 
WHERE acc.accountid = m.cust_no AND acc.companyid = 1; 
GROUP BY acc.accountid,ti.invoiceid,ti.invoicedate,com.stinterval,com.stchargeinterest ,; 
com.stinterestrate,acc.nofincharge,com.stmindaysforinterest,acc.companyid 

Код SQL, с которого я конвертирую, находится ниже и был первоначально зафиксирован из хранимой процедуры.

Select acc.accountid,ti.invoiceid,ti.invoicedate,DateDiff(d,ti.invoicedate,getdate()) as invage, 
sum(isnull([subtotalregular],0)+isnull([fedtaxregular],0)+isnull([statetaxregular],0) 
    +isnull([localtaxregular],0)) as invamount, 
ISNULL((select sum(amount) from tpaymentitem where invoiceid=ti.invoiceid),0) as paidamt, 
(sum(isnull([subtotalregular],0)+isnull([fedtaxregular],0)+isnull([statetaxregular],0) 
    +isnull([localtaxregular],0)) - 
ISNULL((select sum(amount) from tpaymentitem where invoiceid=ti.invoiceid),0)) as invbalance, 
max(tii.programid) as programid, 
ISNULL((select sum(amount) from tpaymentitem where invoiceid=0 and programid = max(tii.programid)),0) as prepay, 
CASE WHEN (com.stchargeinterest = 1) AND (acc.nofincharge=0) THEN 
    CASE WHEN DateDiff(d,ti.invoicedate,getdate()) >= com.stmindaysforinterest THEN 
     ROUND((sum(isnull([subtotalregular],0)+isnull([fedtaxregular],0)+isnull([statetaxregular],0)+isnull([localtaxregular],0)) 
      -ISNULL((select sum(amount) from tpaymentitem where invoiceid=ti.invoiceid),0)) 
      * ((com.stinterestrate/365) * DateDiff(d,ti.invoicedate,getdate())),2) 
    ELSE 0 END 
ELSE 0 END as financecharge,com.stchargeinterest ,com.stinterestrate, 
acc.nofincharge,com.stmindaysforinterest,com.stinterval 
INTO #tmpbalance 
FROM taccount acc 
INNER JOIN tcompany com ON com.companyid=acc.companyid 
LEFT JOIN tinvoice ti ON ti.accountid=acc.accountid 
LEFT JOIN tinvoiceitem tii ON ti.invoiceid=tii.invoiceid 
WHERE acc.accountid= @accountid AND acc.companyid = @companyid 
GROUP BY acc.accountid,ti.invoiceid,ti.invoicedate,com.stinterval,com.stchargeinterest , 
com.stinterestrate,acc.nofincharge,com.stmindaysforinterest,acc.companyid 
+0

Я удалил свой ответ, потому что не знаю, что я делаю с 'foxpro' или тем, что должен делать запрос. Однако проверьте свою скобку. Сообщение об ошибке указывает, что в данной строке отсутствует закрывающая скобка. – showdev

+0

Благодарим за помощь в любом случае. – BryansDriving

ответ

0

Я хотел бы перевести это:

ISNULL((select sum(amount) from tpaymentitem where invoiceid=0 and programid = max(tii.programid)),0) as prepay 

как это:

NVL((select sum(amount) from tpaymentitem where invoiceid=0 and programid = max(tii.programid)) ,0) as prepay 

EDIT:

Как об этом:

(sum(NVL(amount,0)) from tpaymentitem where invoiceid=0 and programid = max(tii.programid)) as prepay 

К сожалению, это не сработает. Это отдельный оператор выбора из основного.

EDIT 2:

(select sum(NVL(amount,0)) from tpaymentitem where invoiceid=0 and programid = max(tii.programid)) as prepay 

Может попытаться упростить это, просто устранить:

(select sum(amount) from tpaymentitem where 1) as prepay 

Мои извинения за колоть в темноте.

+0

По-прежнему получают ту же ошибку. – BryansDriving

+0

Такая же ошибка, и когда я пытаюсь выполнить SELECT sum (NVL (количество, 0)) из tpaymentitem, где invoiceid = 0 и programid = max (tii.programid) в качестве предоплаты, '' Я получаю новую ошибку 'command, содержит нераспознанную фразу \ keyword', что из-за 'и' в 'where' статье – BryansDriving

+0

Я думал, что вам не нужен' SELECT'. У вас уже есть один в начале запроса. Вы говорите, что без него вы получаете ту же исходную ошибку? – showdev

Смежные вопросы