ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文

  メンテナンス 前画面に戻る

対象スレッド 件名: 集計更新
名前: lightbox
処理選択
パスワード

件名 集計更新
名前 lightbox
コメント
↓日次更新セット
http://lightbox.on.coocan.jp/download/PLSQL_01.lzh

@DIV
/*
/*==========================================================
 日次更新処理
===========================================================*/
CREATE or REPLACE PROCEDURE 日次更新
	(
	PM_DATE	IN	DATE
	)
	AS

	FLD_ROWID	ROWID;
	FLD_取引先	VARCHAR2(4);
	FLD_商品	VARCHAR2(4);
	FLD_数量	NUMBER;
	FLD_金額	NUMBER;
	FLD_日付	DATE;

	ERROR_FLG	NUMBER(1,0);

/*==========================================================
 カーソル
===========================================================*/
CURSOR cur_main is
	select ROWID
		,取引先コード
		,商品コード
		,数量
		,金額 
		,取引日付
	 from 取引データ
	 where 取引日付 = PM_DATE
	 and 更新済 is NULL;
 
BEGIN
/*==========================================================
 初期処理
===========================================================*/
DBMS_OUTPUT.PUT_LINE('日次更新 START');
SAVEPOINT UPD_START;
ERROR_FLG := 0;


/*==========================================================
 主処理
===========================================================*/
OPEN cur_main;

LOOP
	FETCH cur_main INTO
		FLD_ROWID,
		FLD_取引先,
		FLD_商品,
		FLD_数量,
		FLD_金額,
		FLD_日付;
	if cur_main%NOTFOUND then
		EXIT;
	end if;

	LOOP
		UPDATE 得意先集計
			set
				更新日 = SYSDATE
				,当月売上金額 = 当月売上金額 + FLD_金額
			where 
				請求先 = FLD_取引先
			and	経過月 = EXTRACT(month from FLD_日付)
			;
		IF SQL%NOTFOUND THEN
			INSERT INTO 得意先集計
			(請求先,経過月,当月売上金額,更新日)
			VALUES(FLD_取引先,EXTRACT(month from FLD_日付),0,SYSDATE);
		ELSE
			EXIT;
		END IF;
	END LOOP;

	LOOP
		UPDATE 商品集計
			set
				更新日 = SYSDATE
				,当月売上数量 = 当月売上数量 + FLD_数量
				,当月売上金額 = 当月売上金額 + FLD_金額
			where 
				商品コード = FLD_商品
			and	経過月 = EXTRACT(month from FLD_日付)
			;
		IF SQL%NOTFOUND THEN
			INSERT INTO 商品集計
			(商品コード,経過月,当月売上数量,当月売上金額,更新日)
			VALUES(FLD_商品,EXTRACT(month from FLD_日付),0,0,SYSDATE);
		ELSE
			EXIT;
		END IF;
	END LOOP;

	UPDATE 取引データ
		SET "更新済" = '1'
	WHERE	ROWID = FLD_ROWID;

END LOOP;

CLOSE cur_main;

/*==========================================================
 終了処理
===========================================================*/
if ERROR_FLG != 0 then
	ROLLBACK TO UPD_START;
	DBMS_OUTPUT.PUT_LINE('異常終了');
else
	DBMS_OUTPUT.PUT_LINE('正常終了');
end if;

EXCEPTION
	WHEN OTHERS THEN
		DBMS_OUTPUT.PUT_LINE('例外発生');
		ROLLBACK TO UPD_START;
END 日次更新;

/
@END