NotesWhat is notes.io?

Notes brand slogan

Notes - notes.io


ALTER PROCEDURE [dbo].[CPM_SP_016]
@SYORIYM VARCHAR(6) --処理対象年月
,@SESSION_USER VARCHAR(90) --ユーザーID
,@MESSAGE VARCHAR(1000) OUTPUT --メッセージ
AS
--------------------------------------------------------------------------------
-- プログラムID:CPM_SP_016
-- 概要:月次契約金額を契約明細に按分し、損益明細集計用のデータを作成する
-- 作成日:2021/03/24
-- 作成者:ISID 田中(英)
-- 更新日:YYYY/MM/DD
-- 更新者:ISID
-- 更新内容:
--------------------------------------------------------------------------------

----------------------------------------------------------------------
--定数宣言
----------------------------------------------------------------------
DECLARE @NOITEM NVARCHAR(13) = '#############';
DECLARE @CHR NVARCHAR(1) = '';
DECLARE @NUM_0 INT = 0;
DECLARE @NUM_1 INT = 1;
----------------------------------------------------------------------
--変数宣言
----------------------------------------------------------------------
DECLARE @OP_ID VARCHAR(100); -- 処理識別(ログ表示用)
DECLARE @OP_ROW INTEGER; -- 行番号 (ログ表示用)
DECLARE @LV_PROVENIENZA VARCHAR(30) = 'CPM_SP_016'
DECLARE @LV_MESSAGE VARCHAR(1000); --メッセージ
DECLARE @LV_SUBJECT NVARCHAR(1000); --メッセージ件名
DECLARE @LV_BODY NVARCHAR(1000); --メッセージ本体
DECLARE @LI_INS_CNT INTEGER; --挿入件数
DECLARE @LI_UPD_CNT INTEGER; --更新件数
DECLARE @LI_DEL_CNT INTEGER; --削除件数
DECLARE @ROW_CNT INTEGER; --SQL処理件数
DECLARE @RETRY_CNT INTEGER; --デッドロックリトライ回数
DECLARE @ERROR_NO INTEGER; --エラー番号
DECLARE @LV_CONTENTS VARCHAR(1000); --ログ表示用
-- DECLARE @LOG UTYP_LOG; --ログテーブル(ユーザー型)


DECLARE @C_KAISHA_CD NVARCHAR(3); --会社コード
DECLARE @C_KEIYAKU_JISSEKI_DT NVARCHAR(6); --契約実績発生年月
DECLARE @N_KEI_URI_FURI_SEQ DECIMAL(27,9); --契約売上振替店SEQ
DECLARE @N_KEI_KANRI_KOKYAKU_SEQ DECIMAL(27,9); --契約先管理顧客SEQ
DECLARE @C_TEKIYO_FROM_DT NVARCHAR(8); --適用開始年月日
DECLARE @C_SEIKYU_FROM_DT NVARCHAR(6); --請求対象年月FR
DECLARE @C_KEI_URI_ST NVARCHAR(1); --契約売上種別ST
DECLARE @N_KIKI_JYOHO_SEQ DECIMAL(27,9); --機器情報SEQ
DECLARE @N_GIJYUTU_URI_SEQ DECIMAL(27,9); --技術売上NO
DECLARE @C_KEI_ST NVARCHAR(2); --契約種別ST
DECLARE @C_GIJYUTU_URI_BUMON_ST NVARCHAR(2); --技術売上部門種別ST
DECLARE @N_KANKATSU_SHITEN_SEQ DECIMAL(27,9); --管轄支店SEQ
DECLARE @C_KANKATSU_SHITEN_CD NVARCHAR(5); --管轄支店CD
DECLARE @N_KANKATSU_EIGYOTEN_SEQ DECIMAL(27,9); --管轄営業店SEQ
DECLARE @C_KANKATSU_EIGYOTEN_CD NVARCHAR(5); --管轄営業店CD
DECLARE @C_URIAGE_DT NVARCHAR(6); --売上年月
DECLARE @N_MIKEIKA_MISEIKYU_TAN_KIN DECIMAL(27,9); --未経過/未請求単月金額
DECLARE @N_MIKEIKA_SEIKYUSUMI_TAN_KIN DECIMAL(27,9); --未経過/請求済単月金額
DECLARE @N_KEIKASUMI_MISEIKYU_TAN_KIN DECIMAL(27,9); --経過済/未請求単月金額 ※按分元金額
DECLARE @N_KEIKASUMI_SEIKYUSUMI_TAN_KIN DECIMAL(27,9); --経過済/請求済単月金額 ※按分元金額
DECLARE @N_MIKEIKA_MISEIKYU_TAN_ZEI DECIMAL(27,9); --未経過/未請求単月税額
DECLARE @N_MIKEIKA_SEIKYUSUMI_TAN_ZEI DECIMAL(27,9); --未経過/請求済単月税額
DECLARE @N_KEIKASUMI_MISEIKYU_TAN_ZEI DECIMAL(27,9); --経過済/未請求単月税額
DECLARE @N_KEIKASUMI_SEIKYUSUMI_TAN_ZEI DECIMAL(27,9); --経過済/請求済単月税額
DECLARE @N_MIKEIKA_MISEIKYU_RUI_KIN DECIMAL(27,9); --未経過/未請求累積金額
DECLARE @N_MIKEIKA_SEIKYUSUMI_RUI_KIN DECIMAL(27,9); --未経過/請求済累積金額
DECLARE @N_KEIKASUMI_MISEIKYU_RUI_KIN DECIMAL(27,9); --経過済/未請求累積金額
DECLARE @N_KEIKASUMI_SEIKYUSUMI_RUI_KIN DECIMAL(27,9); --経過済/請求済累積金額
DECLARE @N_MIKEIKA_MISEIKYU_RUI_ZEI DECIMAL(27,9); --未経過/未請求累積税額
DECLARE @N_MIKEIKA_SEIKYUSUMI_RUI_ZEI DECIMAL(27,9); --未経過/請求済累積税額
DECLARE @N_KEIKASUMI_MISEIKYU_RUI_ZEI DECIMAL(27,9); --経過済/未請求累積税額
DECLARE @N_KEIKASUMI_SEIKYUSUMI_RUI_ZEI DECIMAL(27,9); --経過済/請求済累積税額
DECLARE @C_KEIYAKU_ST_NM NVARCHAR(255); --契約種別ST名
DECLARE @C_KEISAN_HANBAI_BETSU_KJ NVARCHAR(255); --計算機/販売機種別名KJ
DECLARE @C_KEI_URI_FURI_BMN_CD NVARCHAR(5); --契約売上振替会計部門CD
DECLARE @C_KEI_URI_FURI_CD NVARCHAR(5); --契約売上振替店CD
DECLARE @C_KEI_URI_FURI_RKJ NVARCHAR(255); --契約売上振替略式店名KJ
DECLARE @N_KEIYAKU_KANRI_TOKU_CD DECIMAL(27,9); --契約先管理得意先CD
DECLARE @C_KEIYAKU_KOKYAKU01_KJ NVARCHAR(255); --契約先顧客名KJ01
DECLARE @C_KEIYAKU_KOKYAKU02_KJ NVARCHAR(255); --契約先顧客名KJ02
DECLARE @C_GYOSHU_CD NVARCHAR(3); --業種CD
DECLARE @C_GYOSHU_RKS NVARCHAR(255); --業種略称
DECLARE @C_GYOTAI_CD NVARCHAR(3); --業態CD
DECLARE @C_GYOTAI_RKS NVARCHAR(255); --業態略称

DECLARE @C_KEIYAKUNO NVARCHAR(12); --契約NO
DECLARE @C_TEKIYOKAISHIYMD NVARCHAR(8); --適用開始年月日

DECLARE @C_KATASHIKI_CD13 NVARCHAR(13); --型式13
DECLARE @N_URIAGEGAKU DECIMAL(27,9); --売上金額
DECLARE @C_URIAGETAISHOYM NVARCHAR(6); --売上対象年月
DECLARE @C_TAISHOKIKAN_FROM NVARCHAR(6); --請求対象期間(From)
DECLARE @C_TAISHOKIKAN_TO NVARCHAR(6); --請求対象期間(To)
DECLARE @N_DAISU DECIMAL(27,9); --数量
DECLARE @N_HOSHUKEIYAKU_RYOKIN DECIMAL(27,9); --保守契約料金

DECLARE @ROW_SUM DECIMAL(27,9); --明細合計(契約NO単位)
DECLARE @ROW_RATE DECIMAL(27,9); --明細按分率(契約NO単位)

DECLARE @C_KEIYAKUNO_KEY NVARCHAR(12); --契約NO(丸め対象)
DECLARE @C_KATASHIKI_CD13_KEY NVARCHAR(13); --型式13(丸め対象)
DECLARE @SEIKYUSUMI_TAN_KIN INT; --按分元金額
DECLARE @SKIP_KEY NVARCHAR(12); --丸め処理スキップ判断キー
DECLARE @ROWSUM INT; --売上額合計
DECLARE @BALANCE INT; --差(丸め値)


--------------------------------------------------------------------------------
-- STEP_01:前回の作成データを削除する
-- STEP_02:月次契約売上と契約明細の結合データを作成する
-- STEP_03:STEP_02で作成したデータの按分結果で端数があれば最大値の明細に丸める
--------------------------------------------------------------------------------

--------------------------------------------------------------------
-- 開始処理
--------------------------------------------------------------------
-- 一時ログテーブル作成
-- SELECT * INTO #LOG FROM UT_LOG WHERE OP_ID = 'X';

--デッドロック時リトライ
RETRY:

BEGIN TRY
BEGIN TRANSACTION;

SET @OP_ID = CONVERT(VARCHAR, GETDATE(), 121) + ' ' + @LV_PROVENIENZA;
SET @OP_ROW = 0;
SET @LV_MESSAGE = NULL;
SET @LI_INS_CNT = 0;
SET @LI_UPD_CNT = 0;
SET @LI_DEL_CNT = 0;
SET @LV_CONTENTS = NULL;

--開始ログ書き込み
-- EXEC UP_LOG 0, 'START : CPM_SP_016', 'LOG', @OP_ID,@OP_ROW OUTPUT, @LV_PROVENIENZA, NULL,NULL,NULL,@LV_CONTENTS,@SESSION_USER;

--------------------------------------------------------------------
-- STEP_01:前回の作成データを削除する
--------------------------------------------------------------------
--挿入先テーブルのレコード全件削除
DELETE FROM AW_001_000065_000001
WHERE C_KEIYAKU_JISSEKI_DT = @SYORIYM; --★要確認

--STEP_01の実行ログ書き込み
SET @ROW_CNT = @@ROWCOUNT;
SET @LI_DEL_CNT = @LI_DEL_CNT + @ROW_CNT;
SET @LV_MESSAGE = 'DELETE FROM AW_001_000065_000001 DEL_COUNT=' + CONVERT(VARCHAR,@LI_DEL_CNT);
-- EXEC UP_LOG 0, @LV_MESSAGE, 'LOG', @OP_ID,@OP_ROW OUTPUT, @LV_PROVENIENZA, NULL,NULL,NULL,@LV_CONTENTS,@SESSION_USER;

--カーソル処理で使う主表として「契約NO単位で集計した一時表」を作成
SELECT
C_KEIYAKUNO --契約NO
,C_TEKIYOKAISHIYMD --契約適用開始日
,C_KEIYAKU_JISSEKI_DT --契約実績発生年月
,SUM(N_KEIKASUMI_MISEIKYU_TAN_KIN) AS N_KEIKASUMI_MISEIKYU_TAN_KIN
,SUM(N_KEIKASUMI_SEIKYUSUMI_TAN_KIN) AS N_KEIKASUMI_SEIKYUSUMI_TAN_KIN
INTO #TEMP1
FROM AW_001_000066_000001
WHERE C_KEIYAKU_JISSEKI_DT = @SYORIYM --★要確認
GROUP BY C_KEIYAKUNO,C_TEKIYOKAISHIYMD,C_KEIYAKU_JISSEKI_DT;

--------------------------------------------------------------------
-- STEP_02:月次契約売上と契約明細の結合データを作成する
-- ※この段階で「型式無し」明細も作成
--------------------------------------------------------------------
DECLARE CURSOR1 cursor FOR
----型式ありレコードの生成
SELECT tmp.C_KEIYAKUNO --契約NO
,tmp.C_TEKIYOKAISHIYMD --適用開始年月日
,tmp.C_KEIYAKU_JISSEKI_DT --契約実績発生年月

,a66.N_KEI_URI_FURI_SEQ --契約売上振替店SEQ
,a66.N_KEI_KANRI_KOKYAKU_SEQ --契約先管理顧客SEQ
,a66.C_TEKIYO_FROM_DT --適用開始年月日
,a66.C_SEIKYU_FROM_DT --請求対象年月FR
,a66.C_KEI_URI_ST --契約売上種別ST
,a66.N_KIKI_JYOHO_SEQ --機器情報SEQ
,a66.N_GIJYUTU_URI_SEQ --技術売上NO
,a66.C_KEI_ST --契約種別ST
,a66.C_GIJYUTU_URI_BUMON_ST --技術売上部門種別ST
,a66.N_KANKATSU_SHITEN_SEQ --管轄支店SEQ
,a66.C_KANKATSU_SHITEN_CD --管轄支店CD
,a66.N_KANKATSU_EIGYOTEN_SEQ --管轄営業店SEQ
,a66.C_KANKATSU_EIGYOTEN_CD --管轄営業店CD
,a66.C_URIAGE_DT --売上年月
,a66.N_MIKEIKA_MISEIKYU_TAN_KIN --未経過/未請求単月金額
,a66.N_MIKEIKA_SEIKYUSUMI_TAN_KIN --未経過/請求済単月金額

,@NUM_0 --経過済/未請求単月金額(契約NO合計)※ゼロにする
,tmp.N_KEIKASUMI_SEIKYUSUMI_TAN_KIN --経過済/請求済単月金額(契約NO合計)

,a66.N_MIKEIKA_MISEIKYU_TAN_ZEI --未経過/未請求単月税額
,a66.N_MIKEIKA_SEIKYUSUMI_TAN_ZEI --未経過/請求済単月税額
,a66.N_KEIKASUMI_MISEIKYU_TAN_ZEI --経過済/未請求単月税額
,a66.N_KEIKASUMI_SEIKYUSUMI_TAN_ZEI --経過済/請求済単月税額
,a66.N_MIKEIKA_MISEIKYU_RUI_KIN --未経過/未請求累積金額
,a66.N_MIKEIKA_SEIKYUSUMI_RUI_KIN --未経過/請求済累積金額
,a66.N_KEIKASUMI_MISEIKYU_RUI_KIN --経過済/未請求累積金額
,a66.N_KEIKASUMI_SEIKYUSUMI_RUI_KIN --経過済/請求済累積金額
,a66.N_MIKEIKA_MISEIKYU_RUI_ZEI --未経過/未請求累積税額
,a66.N_MIKEIKA_SEIKYUSUMI_RUI_ZEI --未経過/請求済累積税額
,a66.N_KEIKASUMI_MISEIKYU_RUI_ZEI --経過済/未請求累積税額
,a66.N_KEIKASUMI_SEIKYUSUMI_RUI_ZEI --経過済/請求済累積税額
,a66.C_KEIYAKU_ST_NM --契約種別ST名
,a66.C_KEISAN_HANBAI_BETSU_KJ --計算機/販売機種別名KJ
,a66.C_KEI_URI_FURI_BMN_CD --契約売上振替会計部門CD
,a66.C_KEI_URI_FURI_CD --契約売上振替店CD
,a66.C_KEI_URI_FURI_RKJ --契約売上振替略式店名KJ
,a66.N_KEIYAKU_KANRI_TOKU_CD --契約先管理得意先CD
,a66.C_KEIYAKU_KOKYAKU01_KJ --契約先顧客名KJ01
,a66.C_KEIYAKU_KOKYAKU02_KJ --契約先顧客名KJ02
,a66.C_GYOSHU_CD --業種CD
,a66.C_GYOSHU_RKS --業種略称
,a66.C_GYOTAI_CD --業態CD
,a66.C_GYOTAI_RKS --業態略称

,a67.C_KATASHIKI_CD13 --型式13
,@NUM_0 AS N_URIAGEGAKU --売上金額
,a67.C_URIAGETAISHOYM --売上対象年月
,a67.C_TAISHOKIKAN_FROM --請求対象期間(From)
,a67.C_TAISHOKIKAN_TO --請求対象期間(To)
,a67.N_DAISU --数量
,a67.N_HOSHUKEIYAKU_RYOKIN --保守契約料金

,ISNULL(s67.ROW_SUM,0) AS ROW_SUM --明細金額の合計
,ISNULL(ROUND(a67.N_HOSHUKEIYAKU_RYOKIN / NULLIF(s67.ROW_SUM,0),9),1) AS ROW_RATE --按分率

FROM #TEMP1 AS tmp

INNER JOIN --結合1:AW66のTOP1(※赤黒データで金額以外は同値との大前提)
(SELECT TOP (1) * FROM AW_001_000066_000001
WHERE C_KEIYAKU_JISSEKI_DT = @SYORIYM --★要確認
) AS a66
ON tmp.C_KEIYAKUNO = a66.C_KEIYAKUNO
AND tmp.C_TEKIYOKAISHIYMD = a66.C_TEKIYOKAISHIYMD

INNER JOIN AW_001_000067_000001 AS a67 --結合2:明細テーブル
ON tmp.C_KEIYAKUNO = a67.C_KEIYAKUNO
AND tmp.C_TEKIYOKAISHIYMD = a67.C_TEKIYOKAISHIYMD
AND a67.C_URIAGETAISHOYM = @SYORIYM --★要確認

INNER JOIN --結合3:明細テーブル(契約NO合計)
(SELECT C_KEIYAKUNO
,C_TEKIYOKAISHIYMD
,SUM(N_HOSHUKEIYAKU_RYOKIN) AS ROW_SUM
FROM AW_001_000067_000001
WHERE C_URIAGETAISHOYM = @SYORIYM --★要確認
GROUP BY C_KEIYAKUNO,C_TEKIYOKAISHIYMD
) AS s67
ON tmp.C_KEIYAKUNO = s67.C_KEIYAKUNO
AND tmp.C_TEKIYOKAISHIYMD = s67.C_TEKIYOKAISHIYMD


UNION --型式あり・無しレコードを統合

----型式無しレコードの生成
SELECT tmp.C_KEIYAKUNO --契約NO
,tmp.C_TEKIYOKAISHIYMD --適用開始年月日
,tmp.C_KEIYAKU_JISSEKI_DT --契約実績発生年月

,a66.N_KEI_URI_FURI_SEQ --契約売上振替店SEQ
,a66.N_KEI_KANRI_KOKYAKU_SEQ --契約先管理顧客SEQ
,a66.C_TEKIYO_FROM_DT --適用開始年月日
,a66.C_SEIKYU_FROM_DT --請求対象年月FR
,a66.C_KEI_URI_ST --契約売上種別ST
,a66.N_KIKI_JYOHO_SEQ --機器情報SEQ
,a66.N_GIJYUTU_URI_SEQ --技術売上NO
,a66.C_KEI_ST --契約種別ST
,a66.C_GIJYUTU_URI_BUMON_ST --技術売上部門種別ST
,a66.N_KANKATSU_SHITEN_SEQ --管轄支店SEQ
,a66.C_KANKATSU_SHITEN_CD --管轄支店CD
,a66.N_KANKATSU_EIGYOTEN_SEQ --管轄営業店SEQ
,a66.C_KANKATSU_EIGYOTEN_CD --管轄営業店CD
,a66.C_URIAGE_DT --売上年月
,a66.N_MIKEIKA_MISEIKYU_TAN_KIN --未経過/未請求単月金額
,a66.N_MIKEIKA_SEIKYUSUMI_TAN_KIN --未経過/請求済単月金額

,@NUM_0 --経過済/未請求単月金額(契約NO合計) ※ゼロにする(未請求額を請求済額にセット)
,tmp.N_KEIKASUMI_MISEIKYU_TAN_KIN --経過済/請求済単月金額(契約NO合計) ※カーソル処理時の簡潔化(同一項目で計算)のため、未請求額をセット

,a66.N_MIKEIKA_MISEIKYU_TAN_ZEI --未経過/未請求単月税額
,a66.N_MIKEIKA_SEIKYUSUMI_TAN_ZEI --未経過/請求済単月税額
,a66.N_KEIKASUMI_MISEIKYU_TAN_ZEI --経過済/未請求単月税額
,a66.N_KEIKASUMI_SEIKYUSUMI_TAN_ZEI --経過済/請求済単月税額
,a66.N_MIKEIKA_MISEIKYU_RUI_KIN --未経過/未請求累積金額
,a66.N_MIKEIKA_SEIKYUSUMI_RUI_KIN --未経過/請求済累積金額
,a66.N_KEIKASUMI_MISEIKYU_RUI_KIN --経過済/未請求累積金額
,a66.N_KEIKASUMI_SEIKYUSUMI_RUI_KIN --経過済/請求済累積金額
,a66.N_MIKEIKA_MISEIKYU_RUI_ZEI --未経過/未請求累積税額
,a66.N_MIKEIKA_SEIKYUSUMI_RUI_ZEI --未経過/請求済累積税額
,a66.N_KEIKASUMI_MISEIKYU_RUI_ZEI --経過済/未請求累積税額
,a66.N_KEIKASUMI_SEIKYUSUMI_RUI_ZEI --経過済/請求済累積税額
,a66.C_KEIYAKU_ST_NM --契約種別ST名
,a66.C_KEISAN_HANBAI_BETSU_KJ --計算機/販売機種別名KJ
,a66.C_KEI_URI_FURI_BMN_CD --契約売上振替会計部門CD
,a66.C_KEI_URI_FURI_CD --契約売上振替店CD
,a66.C_KEI_URI_FURI_RKJ --契約売上振替略式店名KJ
,a66.N_KEIYAKU_KANRI_TOKU_CD --契約先管理得意先CD
,a66.C_KEIYAKU_KOKYAKU01_KJ --契約先顧客名KJ01
,a66.C_KEIYAKU_KOKYAKU02_KJ --契約先顧客名KJ02
,a66.C_GYOSHU_CD --業種CD
,a66.C_GYOSHU_RKS --業種略称
,a66.C_GYOTAI_CD --業態CD
,a66.C_GYOTAI_RKS --業態略称

,@NOITEM AS C_KATASHIKI_CD13 --型式13
,@NUM_0 AS N_URIAGEGAKU --売上金額
,tmp.C_KEIYAKU_JISSEKI_DT --売上対象年月
,@CHR --請求対象期間(From)
,@CHR --請求対象期間(To)
,@NUM_0 --数量
,tmp.N_KEIKASUMI_MISEIKYU_TAN_KIN --保守契約料金(=未請求金額)

,tmp.N_KEIKASUMI_MISEIKYU_TAN_KIN AS ROW_SUM --明細金額の合計(=未請求金額)
,@NUM_1 AS ROW_RATE --按分率(=1固定)

FROM #TEMP1 AS tmp
INNER JOIN --結合1:AW66のTOP1(※赤黒データで金額以外は同値との大前提)
(SELECT TOP (1) * FROM AW_001_000066_000001
WHERE C_KEIYAKU_JISSEKI_DT = @SYORIYM --★要確認
) AS a66
ON tmp.C_KEIYAKUNO = a66.C_KEIYAKUNO
AND tmp.C_TEKIYOKAISHIYMD = a66.C_TEKIYOKAISHIYMD
WHERE tmp.N_KEIKASUMI_MISEIKYU_TAN_KIN <> 0

ORDER BY C_KEIYAKUNO,C_KATASHIKI_CD13 ASC
;
--------------------------------------------------------------------
--更新処理
--------------------------------------------------------------------
--カーソルオープン
OPEN CURSOR1
FETCH NEXT FROM CURSOR1
--最初の1行目の値を変数に格納
INTO @C_KEIYAKUNO
,@C_TEKIYOKAISHIYMD
,@C_KEIYAKU_JISSEKI_DT

,@N_KEI_URI_FURI_SEQ
,@N_KEI_KANRI_KOKYAKU_SEQ
,@C_TEKIYO_FROM_DT
,@C_SEIKYU_FROM_DT
,@C_KEI_URI_ST
,@N_KIKI_JYOHO_SEQ
,@N_GIJYUTU_URI_SEQ
,@C_KEI_ST
,@C_GIJYUTU_URI_BUMON_ST
,@N_KANKATSU_SHITEN_SEQ
,@C_KANKATSU_SHITEN_CD
,@N_KANKATSU_EIGYOTEN_SEQ
,@C_KANKATSU_EIGYOTEN_CD
,@C_URIAGE_DT
,@N_MIKEIKA_MISEIKYU_TAN_KIN
,@N_MIKEIKA_SEIKYUSUMI_TAN_KIN
,@N_KEIKASUMI_MISEIKYU_TAN_KIN
,@N_KEIKASUMI_SEIKYUSUMI_TAN_KIN
,@N_MIKEIKA_MISEIKYU_TAN_ZEI
,@N_MIKEIKA_SEIKYUSUMI_TAN_ZEI
,@N_KEIKASUMI_MISEIKYU_TAN_ZEI
,@N_KEIKASUMI_SEIKYUSUMI_TAN_ZEI
,@N_MIKEIKA_MISEIKYU_RUI_KIN
,@N_MIKEIKA_SEIKYUSUMI_RUI_KIN
,@N_KEIKASUMI_MISEIKYU_RUI_KIN
,@N_KEIKASUMI_SEIKYUSUMI_RUI_KIN
,@N_MIKEIKA_MISEIKYU_RUI_ZEI
,@N_MIKEIKA_SEIKYUSUMI_RUI_ZEI
,@N_KEIKASUMI_MISEIKYU_RUI_ZEI
,@N_KEIKASUMI_SEIKYUSUMI_RUI_ZEI
,@C_KEIYAKU_ST_NM
,@C_KEISAN_HANBAI_BETSU_KJ
,@C_KEI_URI_FURI_BMN_CD
,@C_KEI_URI_FURI_CD
,@C_KEI_URI_FURI_RKJ
,@N_KEIYAKU_KANRI_TOKU_CD
,@C_KEIYAKU_KOKYAKU01_KJ
,@C_KEIYAKU_KOKYAKU02_KJ
,@C_GYOSHU_CD
,@C_GYOSHU_RKS
,@C_GYOTAI_CD
,@C_GYOTAI_RKS

,@C_KATASHIKI_CD13
,@N_URIAGEGAKU
,@C_URIAGETAISHOYM
,@C_TAISHOKIKAN_FROM
,@C_TAISHOKIKAN_TO
,@N_DAISU
,@N_HOSHUKEIYAKU_RYOKIN

,@ROW_SUM
,@ROW_RATE
;
----レコードの取得行数分、ループ処理を実行
WHILE @@FETCH_STATUS = 0
BEGIN
--AW65_月次契約売上(按分)テーブルにレコード挿入 ※按分端数丸めは次ステップで実施
---------------------------------------------------------
INSERT INTO AW_001_000065_000001
VALUES (
@C_KAISHA_CD --初期処理で共通関数から設定
,@C_KEIYAKU_JISSEKI_DT
,@N_KEI_URI_FURI_SEQ
,@N_KEI_KANRI_KOKYAKU_SEQ
,@C_TEKIYO_FROM_DT
,@C_SEIKYU_FROM_DT
,@C_KEI_URI_ST
,@N_KIKI_JYOHO_SEQ
,@N_GIJYUTU_URI_SEQ
,@C_KEI_ST
,@C_GIJYUTU_URI_BUMON_ST
,@N_KANKATSU_SHITEN_SEQ
,@C_KANKATSU_SHITEN_CD
,@N_KANKATSU_EIGYOTEN_SEQ
,@C_KANKATSU_EIGYOTEN_CD
,@C_URIAGE_DT
,@N_MIKEIKA_MISEIKYU_TAN_KIN
,@N_MIKEIKA_SEIKYUSUMI_TAN_KIN
,@N_KEIKASUMI_MISEIKYU_TAN_KIN
,@N_KEIKASUMI_SEIKYUSUMI_TAN_KIN
,@N_MIKEIKA_MISEIKYU_TAN_ZEI
,@N_MIKEIKA_SEIKYUSUMI_TAN_ZEI
,@N_KEIKASUMI_MISEIKYU_TAN_ZEI
,@N_KEIKASUMI_SEIKYUSUMI_TAN_ZEI
,@N_MIKEIKA_MISEIKYU_RUI_KIN
,@N_MIKEIKA_SEIKYUSUMI_RUI_KIN
,@N_KEIKASUMI_MISEIKYU_RUI_KIN
,@N_KEIKASUMI_SEIKYUSUMI_RUI_KIN
,@N_MIKEIKA_MISEIKYU_RUI_ZEI
,@N_MIKEIKA_SEIKYUSUMI_RUI_ZEI
,@N_KEIKASUMI_MISEIKYU_RUI_ZEI
,@N_KEIKASUMI_SEIKYUSUMI_RUI_ZEI
,@C_KEIYAKU_ST_NM
,@C_KEISAN_HANBAI_BETSU_KJ
,@C_KEI_URI_FURI_BMN_CD
,@C_KEI_URI_FURI_CD
,@C_KEI_URI_FURI_RKJ
,@N_KEIYAKU_KANRI_TOKU_CD
,@C_KEIYAKU_KOKYAKU01_KJ
,@C_KEIYAKU_KOKYAKU02_KJ
,@C_GYOSHU_CD
,@C_GYOSHU_RKS
,@C_GYOTAI_CD
,@C_GYOTAI_RKS

,@C_KEIYAKUNO
,@C_TEKIYOKAISHIYMD

,@C_KATASHIKI_CD13
,CASE --按分元金額金額×按分率(切り捨て)=明細の売上金額
--按分元金額がマイナスの場合を考慮
WHEN @N_KEIKASUMI_SEIKYUSUMI_TAN_KIN < 0 THEN FLOOR(ABS(@N_KEIKASUMI_SEIKYUSUMI_TAN_KIN) * @ROW_RATE) * -1
--按分元金額がプラスの場合
ELSE FLOOR(@N_KEIKASUMI_SEIKYUSUMI_TAN_KIN * @ROW_RATE)
END
,@C_URIAGETAISHOYM
,@C_TAISHOKIKAN_FROM
,@C_TAISHOKIKAN_TO
,@N_DAISU --未使用項目(数量)に按分率をセット
,@N_HOSHUKEIYAKU_RYOKIN
)
;
SET @LI_INS_CNT = @LI_INS_CNT + 1;
---------------------------------------------------------

--次の行の値を変数に格納
FETCH NEXT FROM CURSOR1
INTO @C_KEIYAKUNO
,@C_TEKIYOKAISHIYMD
,@C_KEIYAKU_JISSEKI_DT

,@N_KEI_URI_FURI_SEQ
,@N_KEI_KANRI_KOKYAKU_SEQ
,@C_TEKIYO_FROM_DT
,@C_SEIKYU_FROM_DT
,@C_KEI_URI_ST
,@N_KIKI_JYOHO_SEQ
,@N_GIJYUTU_URI_SEQ
,@C_KEI_ST
,@C_GIJYUTU_URI_BUMON_ST
,@N_KANKATSU_SHITEN_SEQ
,@C_KANKATSU_SHITEN_CD
,@N_KANKATSU_EIGYOTEN_SEQ
,@C_KANKATSU_EIGYOTEN_CD
,@C_URIAGE_DT
,@N_MIKEIKA_MISEIKYU_TAN_KIN
,@N_MIKEIKA_SEIKYUSUMI_TAN_KIN
,@N_KEIKASUMI_MISEIKYU_TAN_KIN
,@N_KEIKASUMI_SEIKYUSUMI_TAN_KIN
,@N_MIKEIKA_MISEIKYU_TAN_ZEI
,@N_MIKEIKA_SEIKYUSUMI_TAN_ZEI
,@N_KEIKASUMI_MISEIKYU_TAN_ZEI
,@N_KEIKASUMI_SEIKYUSUMI_TAN_ZEI
,@N_MIKEIKA_MISEIKYU_RUI_KIN
,@N_MIKEIKA_SEIKYUSUMI_RUI_KIN
,@N_KEIKASUMI_MISEIKYU_RUI_KIN
,@N_KEIKASUMI_SEIKYUSUMI_RUI_KIN
,@N_MIKEIKA_MISEIKYU_RUI_ZEI
,@N_MIKEIKA_SEIKYUSUMI_RUI_ZEI
,@N_KEIKASUMI_MISEIKYU_RUI_ZEI
,@N_KEIKASUMI_SEIKYUSUMI_RUI_ZEI
,@C_KEIYAKU_ST_NM
,@C_KEISAN_HANBAI_BETSU_KJ
,@C_KEI_URI_FURI_BMN_CD
,@C_KEI_URI_FURI_CD
,@C_KEI_URI_FURI_RKJ
,@N_KEIYAKU_KANRI_TOKU_CD
,@C_KEIYAKU_KOKYAKU01_KJ
,@C_KEIYAKU_KOKYAKU02_KJ
,@C_GYOSHU_CD
,@C_GYOSHU_RKS
,@C_GYOTAI_CD
,@C_GYOTAI_RKS

,@C_KATASHIKI_CD13
,@N_URIAGEGAKU
,@C_URIAGETAISHOYM
,@C_TAISHOKIKAN_FROM
,@C_TAISHOKIKAN_TO
,@N_DAISU
,@N_HOSHUKEIYAKU_RYOKIN

,@ROW_SUM
,@ROW_RATE
;
END;

--------------------------------------------------------------------
-- カーソル1処理を終了
--------------------------------------------------------------------
CLOSE CURSOR1;
DEALLOCATE CURSOR1;
DROP TABLE #TEMP1;
--STEP_02の実行ログ書き込み
SET @LV_MESSAGE = 'INSERT AW_001_000065_000001 INS_COUNT=' + CONVERT(VARCHAR,@LI_INS_CNT);
-- EXEC UP_LOG 0, @LV_MESSAGE, 'LOG', @OP_ID, @OP_ROW OUTPUT, @LV_PROVENIENZA, NULL,NULL,NULL,@LV_CONTENTS,@SESSION_USER;

--------------------------------------------------------------------
-- STEP_03:STEP_02で作成したデータの按分結果端数丸め
--------------------------------------------------------------------
DECLARE CURSOR2 cursor FOR
--挿入した売上テーブルから、契約No単位に最大金額の明細のキー(型式コード)を取得
--※同一契約Noで同一最大値の明細が複数存在すると、結果が2件以上になる点に留意
SELECT
C_KEIYAKUNO
,C_KATASHIKI_CD13
,N_KEIKASUMI_SEIKYUSUMI_TAN_KIN
FROM AW_001_000065_000001 AS A65
WHERE N_URIAGEGAKU = (
SELECT MAX(ABS(N_URIAGEGAKU)) --※絶対値で最大を判断
FROM AW_001_000065_000001 AS M65
WHERE A65.C_KEIYAKUNO = M65.C_KEIYAKUNO
AND M65.C_KATASHIKI_CD13 <> @NOITEM --「型式なし」明細は丸め不要なので除外
) ORDER BY C_KEIYAKUNO, C_KATASHIKI_CD13 ASC
;

--カーソルオープン
OPEN CURSOR2
FETCH NEXT FROM CURSOR2
--最初の1行目の値を変数に格納
INTO @C_KEIYAKUNO_KEY
,@C_KATASHIKI_CD13_KEY
,@SEIKYUSUMI_TAN_KIN
;

SET @SKIP_KEY = @CHR; --丸め処理スキップ判断キーのクリア

----レコードの取得行数分、ループ処理を実行する
WHILE @@FETCH_STATUS = 0
BEGIN
------★更新処理ここから★------
IF @C_KEIYAKUNO_KEY <> @SKIP_KEY
--最大金額の明細が複数件存在するケースを考慮し、最初の1件目だけを丸め対象にする
BEGIN
PRINT '端数丸めの対象:' + convert(varchar,@C_KATASHIKI_CD13_KEY)
PRINT '@SKIP_KEYの内容:' + convert(varchar,@SKIP_KEY)

--明細の按分金額の合計を取得(型式無しは合計から除外)
SELECT @ROWSUM = SUM(N_URIAGEGAKU)
FROM AW_001_000065_000001
WHERE C_KEIYAKUNO = @C_KEIYAKUNO_KEY
AND C_KATASHIKI_CD13 <> @NOITEM
GROUP BY C_KEIYAKUNO;

--按分元金額と明細按分金額合計の差額を求める
SET @BALANCE = @SEIKYUSUMI_TAN_KIN - @ROWSUM;
PRINT '端数丸めの値:' + convert(varchar,@BALANCE)

--按分額が最大値の明細を対象に、端数丸め更新
UPDATE AW_001_000065_000001
SET N_URIAGEGAKU =
CASE
----------按分元金額が負の場合
WHEN @SEIKYUSUMI_TAN_KIN < 0 THEN (ABS(N_URIAGEGAKU) + ABS(@BALANCE)) * -1
----------按分元金額が正の場合
ELSE N_URIAGEGAKU + @BALANCE
END
WHERE C_KEIYAKUNO = @C_KEIYAKUNO_KEY
AND C_KATASHIKI_CD13 = @C_KATASHIKI_CD13_KEY
;

--丸め処理スキップ判断キーの更新
SET @SKIP_KEY = @C_KEIYAKUNO_KEY;

SET @LI_UPD_CNT = @LI_UPD_CNT + 1;
END;
ELSE
--同一金額の明細2件以上が存在すればスキップ
BEGIN
PRINT '端数丸めの対象からスキップ:' + convert(varchar,@C_KATASHIKI_CD13_KEY)
PRINT '@SKIP_KEYの内容:' + convert(varchar,@SKIP_KEY)

--丸め処理スキップ判断キーの更新
SET @SKIP_KEY = @C_KEIYAKUNO_KEY;
END;
------★更新処理ここまで★------

--次の行の値を変数に格納
FETCH NEXT FROM CURSOR2
INTO @C_KEIYAKUNO_KEY
,@C_KATASHIKI_CD13_KEY
,@SEIKYUSUMI_TAN_KIN
;
END;

--------------------------------------------------------------------
-- カーソル2処理を終了
--------------------------------------------------------------------
CLOSE CURSOR2;
DEALLOCATE CURSOR2;
--STEP_03の実行ログ書き込み
SET @LV_MESSAGE = 'INSERT AW_001_000065_000001 UPD_COUNT=' + CONVERT(VARCHAR,@LI_UPD_CNT);
-- EXEC UP_LOG 0, @LV_MESSAGE, 'LOG', @OP_ID, @OP_ROW OUTPUT, @LV_PROVENIENZA, NULL,NULL,NULL,@LV_CONTENTS,@SESSION_USER;

--------------------------------------------------------------------
-- 終了処理
--------------------------------------------------------------------
--終了ログ書き込み
-- EXEC UP_LOG 0, 'END : CPM_SP_016', 'LOG', @OP_ID, @OP_ROW OUTPUT, @LV_PROVENIENZA, NULL,NULL,NULL,@LV_CONTENTS,@SESSION_USER;

COMMIT TRANSACTION;

-- INSERT INTO UT_LOG SELECT * FROM #LOG;

TRUNCATE TABLE #LOG;
RETURN 0;

END TRY

--------------------------------------------------------------------
-- エラー時
--------------------------------------------------------------------
BEGIN CATCH
SET @ERROR_NO = ERROR_NUMBER();
SET @LV_BODY = 'ERROR_NUMBER:' + CONVERT(VARCHAR,@ERROR_NO)
+ ',ERROR_MESSAGE:' + ERROR_MESSAGE()
+ ',ERROR_PROCEDURE():' + ERROR_PROCEDURE()
+ ',ERROR_LINE:' + CONVERT(VARCHAR,ERROR_LINE());

--エラーの場合ロールバックして終了
IF @@TRANCOUNT > 0
BEGIN
--ログを退避する
-- INSERT INTO @LOG SELECT * FROM #LOG;
ROLLBACK TRANSACTION;
END;
--エラーログは出力する
-- EXEC UP_LOG 0, @LV_BODY, 'ERR', @OP_ID, @OP_ROW OUTPUT, @LV_PROVENIENZA,NULL,NULL,NULL,@LV_CONTENTS,@SESSION_USER;

--デッドロック対策
SET @RETRY_CNT = @RETRY_CNT + 1;
IF @ERROR_NO = 1205 AND @RETRY_CNT < 10
BEGIN
-- INSERT INTO UT_LOG SELECT * FROM @LOG;
TRUNCATE TABLE #LOG;
-- DELETE FROM @LOG;
WAITFOR DELAY '00:00:30'; --強制的にスリープさせる。
GOTO RETRY;
END;
--メールを送信する
SET @LV_SUBJECT = N'月次契約売上按分データ作成処理で異常が発生しました。';
-- EXEC UP_SEND_MAIL @LV_SUBJECT,@LV_BODY,0,@SESSION_USER;
-- INSERT INTO @LOG SELECT * FROM #LOG;
-- INSERT INTO UT_LOG SELECT * FROM @LOG;
TRUNCATE TABLE #LOG;
THROW;
END CATCH;

     
 
what is notes.io
 

Notes.io is a web-based application for taking notes. You can take your notes and share with others people. If you like taking long notes, notes.io is designed for you. To date, over 8,000,000,000 notes created and continuing...

With notes.io;

  • * You can take a note from anywhere and any device with internet connection.
  • * You can share the notes in social platforms (YouTube, Facebook, Twitter, instagram etc.).
  • * You can quickly share your contents without website, blog and e-mail.
  • * You don't need to create any Account to share a note. As you wish you can use quick, easy and best shortened notes with sms, websites, e-mail, or messaging services (WhatsApp, iMessage, Telegram, Signal).
  • * Notes.io has fabulous infrastructure design for a short link and allows you to share the note as an easy and understandable link.

Fast: Notes.io is built for speed and performance. You can take a notes quickly and browse your archive.

Easy: Notes.io doesn’t require installation. Just write and share note!

Short: Notes.io’s url just 8 character. You’ll get shorten link of your note when you want to share. (Ex: notes.io/q )

Free: Notes.io works for 12 years and has been free since the day it was started.


You immediately create your first note and start sharing with the ones you wish. If you want to contact us, you can use the following communication channels;


Email: [email protected]

Twitter: http://twitter.com/notesio

Instagram: http://instagram.com/notes.io

Facebook: http://facebook.com/notesio



Regards;
Notes.io Team

     
 
Shortened Note Link
 
 
Looding Image
 
     
 
Long File
 
 

For written notes was greater than 18KB Unable to shorten.

To be smaller than 18KB, please organize your notes, or sign in.