2012-12-06 4 views
0

나는 다음과 같은 속성을 가진 테이블을 만들었습니다. 여기서는 TOTALAMOUNT 열 값이 PAID_TOVEN 열 값에서 뺀 것입니다. 그러나 다음에 TOTALAMOUNT 값을 선택하면 업데이트 된 값이 표시되지 않습니다. 아래 보고서에서 볼 수 있듯이 이전 값이 나에게 표시됩니다. 보고서의업데이트 열

검색어 :

select "VEN_ACCOUNTID", 
     "VEN_REGNO" , 
     "VEN_TXDATE" , 
     "VEN_INVOICE_REFNO" as , 
     "TOTALAMOUNT" as , 
     "PAID_TOVEN" as , 
     TOTALAMOUNT-PAID_TOVEN as "Balance" 
from "VENDORACCOUNT" 

report screenshot

내가 두 번째 항목을 할 때마다 나에게 대신 1800 대신 28004550 즉, 감산 또는 업데이트 된 값을 표시해야합니다 위의 보고서에서 각각 9550입니다. 그래서 다음 번에 금액을 18004550에서 뺄 수 있습니다.


나는이 트리거

create or replace trigger "VENDORACCOUNT_T2" 
BEFORE 
insert or update or delete on "VENDORACCOUNT" 
for each row 
begin 
DECLARE new_balance INT; 
DECLARE new_total INT; 
DECLARE new_paid INT; 

    SELECT balance INTO old_balance, 
    total INTO old_total, 
     PAID_TOVEN INTO new_paid 
    FROM vendoraccount 
    WHERE ven_regno = new.ven_regno 
    AND VEN_INVOICE_REFNO = new.VEN_INVOICE_REFNO; 

    UPDATE vendoraccount SET TOTALAMOUNT = old_total + old_balance - new_paid, 
    balance = TOTALAMOUNT - new_paid 
    WHERE VEN_REGNO= new.VEN_REGNO 
    AND VEN_INVOICE_REFNO = new.VEN_INVOICE_REFNO; 

end; 

을 생성하고이 오류가 무엇입니까 :

ERROR: PLS-00103: 'Encountered the symbol "DECLARE" when expecting one of the following: begin function pragma procedure subtype type current curs'

답변

1

난 당신이 트리거가 필요하지 않습니다 생각합니다. 아래 쿼리를 기반으로보기를 만든 다음 VIEW을 기반으로 LOV에 대한 레코드 그룹을 만들 수 있습니다. 출력은

select accid,regno,inv_refno,LAG(bal,1,totalamount) OVER (PARTITION BY regno ORDER BY accid) "TOTALAMOUNT", paid_toven, bal 
from (with temp_data as 
     (select 2 accid,3 regno, 16 inv_refno, 2800 totalamount, 1000 paid_toven from dual 
     union 
     select 3 accid,3 regno, 16 inv_refno, 2800 totalamount, 2000 paid_toven from dual 
     union 
     select 4 accid,8 regno, 22 inv_refno, 9550 totalamount, 5000 paid_toven from dual 
     union 
     select 5 accid,8 regno, 22 inv_refno, 9550 totalamount, 5000 paid_toven from dual 
     union 
     select 6 accid,8 regno, 22 inv_refno, 9550 totalamount, 8000 paid_toven from dual) 
     select accid,regno,inv_refno,totalamount,paid_toven,totalamount-paid_toven bal  
     from temp_data); 

로 삼았 쿼리가 보일 것이다 - 그래서

ACCID REGNO INV_REFNO TOTALAMOUNT PAID_TOVEN BAL 
----- ----- --------- ----------- ---------- --- 
    2  3  16  2800  1000 1800 
    3  3  16  1800  2000 800 
    4  8  22  9550  5000 4550 
    5  8  22  4550  5000 4550 
    6  8  22  4550  8000 1550 

를 테이블을 기반으로 쿼리가

select accid,regno,inv_refno,LAG(bal,1,totalamount) OVER (PARTITION BY regno ORDER BY accid) "TOTALAMOUNT", paid_toven, bal 
    from (select accid,regno,inv_refno,totalamount,paid_toven,totalamount-paid_toven bal  
      from VENDORACCOUNT); 

쿼리 BE- 것이다 않습니다 꽤 많이 당신이 원하는, 그러나 샘플 데이터가 올바르게 보이지 않습니다. 실제로 누적 합계의 한 예입니다.

+0

위 쿼리에서 직접 데이터를 입력하고 있습니까? 양식에 데이터를 입력하거나 그 사실을 알릴 것입니다. 방아쇠를 당길 수도 있습니다. –

+1

그래서 나는 당신이 내가'언급 한 부분을 읽지 않았다고 생각한다. 그래서 당신의 테이블에 기초하여 질의가 될 것이다 ... ' – Annjawn

+0

나는 그것을 읽는다. 나는 질의를 이해하지만 나는 두 번째 부분을 자세히 이해하지 못한다. .. 내가 그것을 사용하거나 그것을 이해해야합니다 ..? –