2011-12-14 16 views
0

レポートに追加した条件に基づいて必要なレコードを返すCrystalレポートがあります。また、このレポートを実行すると、データベースのレコードを更新する必要があります。これを行うには、以下の手順を(Oracleで)作成しました。これをどのように動かすのですか?私は実際には、プロシージャ内でレコードを更新する部分だけが必要です。これは可能ですか?つまり、私が通常行っているのと同じレポート(選択エキスパートを使用して作成する)から手順を実行できますか?私は、私の研究が私がクリスタルから更新部分を実行するだけではないことを示すので、レコードを返すステートメントの間に更新ステートメントを挟み込んでいます。以下のプロシージャを使用しようとすると、クリスタルが無効な引数を指定したエラーをスローします。は、Crystalレポートでレコードを更新する必要があります

create or replace Procedure   "P_UPDATE_REPORT_DATE_2" (

N_BEGIN IN date, 

N_END IN date) 

is 

CUS_ID NUMBER; 

cursor c1 is select customer_id FROM customer; 

begin 

--real begining 

update dbo.customer set REPORT_DATE= sysdate 

where customer.customer_id in 

(SELECT customer.custoemr_id 

    FROM dbo.CUS_ADDRESS CUS_ADDRESS INNER JOIN (((dbo.CUS_ASSOC_V 
CUS_ASSOC_V INNER JOIN dbo.customer customer ON 
CUS_ASSOC_V.ASSOC_ID=customer.ASSOC_ID) INNER JOIN dbo.ITEM ITEM ON 
CUSTOMER.ITEM_NUMBER=ITEM.ITEM_NUMBER) LEFT OUTER JOIN 
dbo.PAY_TYPE_CODE PAY_TYPE_CODE ON 
CUSTOMER.PRIM_PAY=PAY_TYPE_CODE.CODE) ON 
ITEM_ADDRESS.ADDRESS_ID=ITEM.ITEM_ADDRESS_ID 

    WHERE CUSTOMER.FACILITY='CHI' 

    AND CUSTOMER.START_DATE<= N_END 

    AND CUSTOMER.END_DATE>= N_BEGIN 

    AND CUSTOMER.CUSTOMER_TYPE_CODE='O'); 

    commit; 

--fake to create sandwich 

OPEN c1; 

    LOOP 

     FETCH c1 INTO CUS_ID; 

     EXIT WHEN c1%NOTFOUND; 

     DBMS_OUTPUT.PUT_LINE(CUS_ID); 

    END LOOP; 


end "P_UPDATE_REPORT_DATE_2"; 
+2

レポートでデータを更新したいのはなぜですか? – craig

答えて

1

自律型トランザクションで関数を作成します:

create or replace function my_function return number is 
    pragma autonomous_transaction; 
begin 
    --Perform DML here 
    insert into my_table values(1); 

    --You must commit or rollback within an autonomous transaction 
    commit; 

    --Return any dummy value 
    return 1; 
end; 
/

は次に、このようなSQLでそれを呼び出す:

select my_function from dual; 

SELECT文の一部としてDMLを実行するには、一般的に恐ろしいことですあなたは避けてください。 SQLはの処理がどのように実行されるかを保証するものではありません。Crystal Reportsでは、レポート内のすべてのクエリが必ずしも実行されるわけではありません。十分に慎重にテストしてください。それ以上に、これを達成するための他の方法を見つけること。

関連する問題