diff --git a/production/.gitignore b/production/.gitignore new file mode 100644 index 0000000..f51d212 --- /dev/null +++ b/production/.gitignore @@ -0,0 +1,11 @@ +# バックアップディレクトリ(push対象外) +old/ + +# コンパイル中間ファイル +*.o +*.obj + +# データ・ログファイル +*.log +*.DAT +*.dat \ No newline at end of file diff --git a/production/README.md b/production/README.md new file mode 100644 index 0000000..4293c0f --- /dev/null +++ b/production/README.md @@ -0,0 +1,56 @@ +# 勤怠管理システム - 生产环境资源 + +本リポジトリは勤怠管理システム(サブシステムA:勤怠休暇管理、サブシステムB:残業統計管理、サブシステムC:給与計算)の生产环境リソースを管理する。 + +## 目录结构 + +``` +production/ +├── src/ # 主プログラムソース(COBOL) +├── sub/ # 共通サブプログラム +├── cpy/ # COPY書式ファイル(レコード定義・連絡領域) +├── bin/ # 実行ファイル(.exe)+サブプログラムDLL(.dll) +├── ddl/ # DB2スキーマ定義(DDL) +├── design/ # サブシステム全体設計書 +├── 詳細設計書/ # 詳細設計ドキュメント +└── 使用資源一覧/ # 使用資源一覧(COPY・CALL・I/Oファイル・DBテーブル) +``` + +## サブシステム構成 + +| サブシステム | 役割 | COBOLプログラム | +|-------------|------|----------------| +| A: 勤怠休暇管理 | 休暇申請取込・打刻照合・DB更新・エクスポート | KIN01INP/KIN02UPD/KIN03EXP(3本) | +| B: 残業統計管理 | 加班申請取込・重複チェック・照合・集計・DB更新 | ZAN01CHK~ZAN06UPD(6本) | +| C: 給与計算 | 欠勤統計取込・給与計算・明細出力 | 後続追加予定 | + +## 构建与运行 + +### 编译 + +ソースコードはCOBOL + DB2向けに実装されている。 +開発環境(Windows + GnuCOBOL 3.2.0)にはDB2がないため、プリプロセッサ`convert-sql.mjs`が`EXEC SQL`をSQLite3用の`CALL 'br_exec'`に変換し、SQLite3で動作させる。 + +```batch +rem プロジェクトルートで実行 +tools\build.bat src\.cbl +``` + +### 実行 + +```batch +set COB_CONFIG_DIR=C:\mingw64\share\gnucobol\config +set COB_LIBRARY_PATH=bin +cd +bin\.exe +``` + +### サブシステムB テスト実行順序 + +```batch +ZAN01CHK → ZAN02CHK → ZAN03CHK → ZAN04MAT → ZAN05CAL → ZAN06UPD +``` + +## 编码 + +源文件使用 ASCII/JIS 编码保存。COPYファイルは元の命名を維持する。 \ No newline at end of file diff --git a/production/bin/KIN01INP.exe b/production/bin/KIN01INP.exe new file mode 100644 index 0000000..2a96690 Binary files /dev/null and b/production/bin/KIN01INP.exe differ diff --git a/production/bin/KIN02UPD.exe b/production/bin/KIN02UPD.exe new file mode 100644 index 0000000..d5f9fff Binary files /dev/null and b/production/bin/KIN02UPD.exe differ diff --git a/production/bin/KIN03EXP.exe b/production/bin/KIN03EXP.exe new file mode 100644 index 0000000..9b1fc64 Binary files /dev/null and b/production/bin/KIN03EXP.exe differ diff --git a/production/bin/SUB01DAT.dll b/production/bin/SUB01DAT.dll new file mode 100644 index 0000000..b1a6de7 Binary files /dev/null and b/production/bin/SUB01DAT.dll differ diff --git a/production/bin/SUB02MSG.dll b/production/bin/SUB02MSG.dll new file mode 100644 index 0000000..ebb8af9 Binary files /dev/null and b/production/bin/SUB02MSG.dll differ diff --git a/production/bin/SUB03END.dll b/production/bin/SUB03END.dll new file mode 100644 index 0000000..8db2143 Binary files /dev/null and b/production/bin/SUB03END.dll differ diff --git a/production/bin/SUB04CHK.dll b/production/bin/SUB04CHK.dll new file mode 100644 index 0000000..bff4aaa Binary files /dev/null and b/production/bin/SUB04CHK.dll differ diff --git a/production/bin/SUB05TIM.dll b/production/bin/SUB05TIM.dll new file mode 100644 index 0000000..0bde1dc Binary files /dev/null and b/production/bin/SUB05TIM.dll differ diff --git a/production/bin/ZAN01CHK.exe b/production/bin/ZAN01CHK.exe new file mode 100644 index 0000000..6bd3d5a Binary files /dev/null and b/production/bin/ZAN01CHK.exe differ diff --git a/production/bin/ZAN02CHK.exe b/production/bin/ZAN02CHK.exe new file mode 100644 index 0000000..f8aa465 Binary files /dev/null and b/production/bin/ZAN02CHK.exe differ diff --git a/production/bin/ZAN03CHK.exe b/production/bin/ZAN03CHK.exe new file mode 100644 index 0000000..b213b52 Binary files /dev/null and b/production/bin/ZAN03CHK.exe differ diff --git a/production/bin/ZAN04MAT.exe b/production/bin/ZAN04MAT.exe new file mode 100644 index 0000000..4d12394 Binary files /dev/null and b/production/bin/ZAN04MAT.exe differ diff --git a/production/bin/ZAN05CAL.exe b/production/bin/ZAN05CAL.exe new file mode 100644 index 0000000..bdebe7d Binary files /dev/null and b/production/bin/ZAN05CAL.exe differ diff --git a/production/bin/ZAN06UPD.exe b/production/bin/ZAN06UPD.exe new file mode 100644 index 0000000..d2ddbaf Binary files /dev/null and b/production/bin/ZAN06UPD.exe differ diff --git a/production/cpy/ZAN01REC.cpy b/production/cpy/ZAN01REC.cpy new file mode 100644 index 0000000..18e3282 --- /dev/null +++ b/production/cpy/ZAN01REC.cpy @@ -0,0 +1,11 @@ + * + * 加班申請レコード 80B + * + 03 (A)APPL-ID PIC X(008). + 03 (A)EMP-ID PIC 9(008). + 03 (A)APPL-DATE PIC 9(008). + 03 (A)START-TIME PIC 9(004). + 03 (A)END-TIME PIC 9(004). + 03 (A)STATUS PIC X(001). + 03 (A)OVT-TYPE PIC X(001). + 03 (A)FILLER PIC X(046). diff --git a/production/cpy/ZAN02REC.cpy b/production/cpy/ZAN02REC.cpy new file mode 100644 index 0000000..7cca953 --- /dev/null +++ b/production/cpy/ZAN02REC.cpy @@ -0,0 +1,12 @@ + * + * マッチング結果レコード 80B + * + 03 (A)APPL-ID PIC X(008). + 03 (A)EMP-ID PIC 9(008). + 03 (A)APPL-DATE PIC 9(008). + 03 (A)START-TIME PIC 9(004). + 03 (A)END-TIME PIC 9(004). + 03 (A)STATUS PIC X(001). + 03 (A)OVT-TYPE PIC X(001). + 03 (A)PROC-SEQ PIC 9(002). + 03 (A)FILLER PIC X(044). diff --git a/production/cpy/ZAN03REC.cpy b/production/cpy/ZAN03REC.cpy new file mode 100644 index 0000000..4febbd4 --- /dev/null +++ b/production/cpy/ZAN03REC.cpy @@ -0,0 +1,11 @@ + * + * 集約結果レコード 80B + * + 03 (A)APPL-ID PIC X(008). + 03 (A)EMP-ID PIC 9(008). + 03 (A)APPL-DATE PIC 9(008). + 03 (A)START-TIME PIC 9(004). + 03 (A)END-TIME PIC 9(004). + 03 (A)OVT-HOURS PIC 9(004)V9(001). + 03 (A)OVT-TYPE PIC X(001). + 03 (A)FILLER PIC X(042). diff --git a/production/cpy/ZAN04REC.cpy b/production/cpy/ZAN04REC.cpy new file mode 100644 index 0000000..f466156 --- /dev/null +++ b/production/cpy/ZAN04REC.cpy @@ -0,0 +1,5 @@ + * + * DBCLEAN対象レコード 80B + * + 03 (A)APPL-ID PIC X(008). + 03 (A)FILLER PIC X(072). diff --git a/production/cpy/ZAN05REC.cpy b/production/cpy/ZAN05REC.cpy new file mode 100644 index 0000000..807cd1a --- /dev/null +++ b/production/cpy/ZAN05REC.cpy @@ -0,0 +1,5 @@ + * + * エラーログレコード VB可変長 + * + 03 (A)ERR-CATEGORY PIC 9(002). + 03 (A)ERR-DETAIL PIC X(198). diff --git a/production/cpy/ZANCHKAC.cpy b/production/cpy/ZANCHKAC.cpy new file mode 100644 index 0000000..cfea712 --- /dev/null +++ b/production/cpy/ZANCHKAC.cpy @@ -0,0 +1,5 @@ + * SUB04CHK 項目チェック用連絡領域 + 01 C01CHKPAR. + 03 C01CHKTYP PIC X(008). + 03 C01CHKDAT PIC X(080). + 03 C01CHKRRC PIC 9(004). diff --git a/production/cpy/ZANDATAC.cpy b/production/cpy/ZANDATAC.cpy new file mode 100644 index 0000000..5ab2681 --- /dev/null +++ b/production/cpy/ZANDATAC.cpy @@ -0,0 +1,4 @@ + * SUB01DAT 運用日付取得用連絡領域 + 01 D01UBSPAR. + 03 D01FKICOD PIC S9(004) COMP. + 03 D01UBSUDATE PIC 9(008). diff --git a/production/cpy/ZANENDAC.cpy b/production/cpy/ZANENDAC.cpy new file mode 100644 index 0000000..a8031fd --- /dev/null +++ b/production/cpy/ZANENDAC.cpy @@ -0,0 +1,3 @@ + * SUB03END ABEND処理用連絡領域 + 01 E01ABDPAR. + 03 E01ABDCOD PIC 9(003). diff --git a/production/cpy/ZANMSGAC.cpy b/production/cpy/ZANMSGAC.cpy new file mode 100644 index 0000000..9f5ac0d --- /dev/null +++ b/production/cpy/ZANMSGAC.cpy @@ -0,0 +1,13 @@ + * SUB02MSG メッセージ出力用連絡領域 + 01 M00MHOPAR. + 03 M00MSGCOD PIC 9(003). + 03 M00UMKDATS22-01 PIC X(030). + 03 M00UMKDATS22-02 PIC X(030). + 03 M00UMKDATS22-03 PIC X(030). + 03 M00UMKDATS22-04 PIC X(030). + 03 M00UMKDATS22-05 PIC X(030). + 03 M00UMKDATS22-06 PIC X(030). + 03 M00UMKDATS22-07 PIC X(030). + 03 M00UMKDATS22-08 PIC X(030). + 03 M00UMKDATS22-09 PIC X(030). + 03 M00UMKDATS22-10 PIC X(030). diff --git a/production/cpy/ZANTIMAC.cpy b/production/cpy/ZANTIMAC.cpy new file mode 100644 index 0000000..105c65c --- /dev/null +++ b/production/cpy/ZANTIMAC.cpy @@ -0,0 +1,5 @@ + * SUB05TIM 時刻丸め用連絡領域 + 01 T01TIMPAR. + 03 T01TIMHRS PIC 9(004)V9(001). + 03 T01TIMOUT PIC 9(004)V9(001). + 03 T01TIMRRC PIC 9(004). diff --git a/production/ddl/schema_kin.sql b/production/ddl/schema_kin.sql new file mode 100644 index 0000000..bece146 --- /dev/null +++ b/production/ddl/schema_kin.sql @@ -0,0 +1,97 @@ +-- ============================================================================= +-- 勤怠休暇管理システム(サブシステムA)DBスキーマ +-- 対象DB2: DB2 for z/OS +-- ローカル開発: SQLite(型宣言はDB2準拠、SQLiteが許容する範囲で記述) +-- ============================================================================= + +-- 1. EMP_MASTER(社員マスタ) +-- 全社員の基本情報。サブシステムAでは参照のみ。 +CREATE TABLE EMP_MASTER ( + EMP_ID CHAR(8) NOT NULL PRIMARY KEY, + DEPT_ID CHAR(4) NOT NULL, + EMP_NAME VARCHAR(50) NOT NULL, + STATUS CHAR(1) NOT NULL +); + +INSERT INTO EMP_MASTER VALUES ('EMP00001', 'D001', '山田太郎', '1'); +INSERT INTO EMP_MASTER VALUES ('EMP00002', 'D002', '鈴木花子', '1'); +INSERT INTO EMP_MASTER VALUES ('EMP00009', 'D003', '佐藤健一', '9'); +INSERT INTO EMP_MASTER VALUES ('EMP00010', 'D001', '田中実', '1'); + +-- 2. LEAVE_RECORDS(休暇申請記録) +-- 休暇申請の生データ。取消はDELETEで物理削除。 +CREATE TABLE LEAVE_RECORDS ( + APPLICATION_ID INTEGER NOT NULL PRIMARY KEY, + EMP_ID CHAR(8) NOT NULL, + LEAVE_TYPE CHAR(2) NOT NULL, + START_DATE CHAR(8) NOT NULL, + START_TIME CHAR(4) NOT NULL, + END_DATE CHAR(8) NOT NULL, + END_TIME CHAR(4) NOT NULL, + STATUS CHAR(1) NOT NULL +); + +INSERT INTO LEAVE_RECORDS VALUES (1, 'EMP00001', '01', '20260615', '0900', '20260616', '1800', '1'); +INSERT INTO LEAVE_RECORDS VALUES (2, 'EMP00002', '02', '20260617', '0900', '20260617', '1200', '1'); +INSERT INTO LEAVE_RECORDS VALUES (3, 'EMP00001', '04', '20260620', '0900', '20260620', '1800', '9'); + +-- 3. HOLIDAY_CALENDAR(休日カレンダー) +-- 祝日のみ列挙。土日は曜日判定で処理。 +CREATE TABLE HOLIDAY_CALENDAR ( + HOLIDAY_DATE CHAR(8) NOT NULL PRIMARY KEY, + DESCRIPTION VARCHAR(50) +); + +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260101', '元日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260112', '成人の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260211', '建国記念の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260320', '春分の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260429', '昭和の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260503', '憲法記念日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260504', 'みどりの日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260505', 'こどもの日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260720', '海の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260811', '山の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260921', '敬老の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260922', '国民の休日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20260923', '秋分の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20261012', '体育の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20261103', '文化の日'); +INSERT INTO HOLIDAY_CALENDAR VALUES ('20261123', '勤労感謝の日'); + +-- 4. SICK_LEAVE_RATE(病欠控除率) +-- 全社員共通の病欠控除率。 +CREATE TABLE SICK_LEAVE_RATE ( + LEAVE_TYPE CHAR(2) NOT NULL PRIMARY KEY, + DEDUCTION_RATE DECIMAL(3,2) NOT NULL +); + +-- 5. DAILY_RECORDS(日別勤怠記録) +-- 1社員1日の勤怠情報。出勤日のみレコード存在。 +CREATE TABLE DAILY_RECORDS ( + EMP_ID CHAR(8) NOT NULL, + TARGET_DATE CHAR(8) NOT NULL, + TIME_IN CHAR(4) NOT NULL, + TIME_OUT CHAR(4) NOT NULL, + ANNUAL_LEAVE_H DECIMAL(6,1) NOT NULL, + PERSONAL_LEAVE_H DECIMAL(6,1) NOT NULL, + OFFICIAL_LEAVE_H DECIMAL(6,1) NOT NULL, + SICK_LEAVE_H DECIMAL(6,1) NOT NULL, + UNAPPROVED_ABSENT_H DECIMAL(6,1) NOT NULL, + UPDATED_AT TIMESTAMP NOT NULL, + PRIMARY KEY (EMP_ID, TARGET_DATE) +); + +-- 6. MONTHLY_ABSENCE(月次統計) +-- DAILY_RECORDSの月次集計サマリ。 +CREATE TABLE MONTHLY_ABSENCE ( + EMP_ID CHAR(8) NOT NULL, + YEAR_MONTH CHAR(6) NOT NULL, + ANNUAL_LEAVE_H DECIMAL(6,1) NOT NULL, + PERSONAL_LEAVE_H DECIMAL(6,1) NOT NULL, + OFFICIAL_LEAVE_H DECIMAL(6,1) NOT NULL, + SICK_LEAVE_H DECIMAL(6,1) NOT NULL, + UNAPPROVED_ABSENT_H DECIMAL(6,1) NOT NULL, + UPDATED_AT TIMESTAMP NOT NULL, + PRIMARY KEY (EMP_ID, YEAR_MONTH) +); diff --git a/production/ddl/schema_zan.sql b/production/ddl/schema_zan.sql new file mode 100644 index 0000000..13ab519 --- /dev/null +++ b/production/ddl/schema_zan.sql @@ -0,0 +1,31 @@ +-- ============================================================================= +-- 残業統計管理システム(サブシステムB)DBスキーマ +-- 対象DB2: DB2 for z/OS +-- ローカル開発: SQLite(型宣言はDB2準拠、SQLiteが許容する範囲で記述) +-- ============================================================================= + +-- 1. OVT_APPLICATIONS(個別加班申請テーブル) +-- 1件=1回の残業申請。STATUS=9で取消。 +CREATE TABLE OVT_APPLICATIONS ( + APPL_ID CHAR(8) NOT NULL PRIMARY KEY, + EMP_ID CHAR(8) NOT NULL, + APPL_DATE CHAR(8) NOT NULL, + OVT_TYPE CHAR(1) NOT NULL, + START_TIME CHAR(4) NOT NULL, + END_TIME CHAR(4) NOT NULL, + OVT_HOURS DECIMAL(4,1) NOT NULL, + STATUS CHAR(1) NOT NULL, + UPDATED_AT TIMESTAMP NOT NULL +); + +-- 2. OVT_MONTHLY(月次集計テーブル) +-- 社員別・年月別・種別別の残業時間集計。 +CREATE TABLE OVT_MONTHLY ( + EMP_ID CHAR(8) NOT NULL, + YEAR_MONTH CHAR(6) NOT NULL, + OVT_TYPE CHAR(1) NOT NULL, + OVT_HOURS DECIMAL(6,1) NOT NULL, + OVT_COUNT INTEGER NOT NULL, + UPDATED_AT TIMESTAMP NOT NULL, + PRIMARY KEY (EMP_ID, YEAR_MONTH, OVT_TYPE) +); diff --git a/production/design/01_勤怠休暇管理システム_設計書(サブシステムA).md b/production/design/01_勤怠休暇管理システム_設計書(サブシステムA).md new file mode 100644 index 0000000..4b144bb --- /dev/null +++ b/production/design/01_勤怠休暇管理システム_設計書(サブシステムA).md @@ -0,0 +1,787 @@ +# 勤怠休暇管理システム 設計書(サブシステムA) + +## 概要 + +休暇申請データと打刻データを処理し、日別勤怠記録(DAILY_RECORDS)および月次統計(MONTHLY_ABSENCE)を生成する。 + +9本のCOBOLプログラムで構成される。 + +拠点間SORTやCSV変換などはCOBOLではなくJCL SORTで処理する方針とし、COBOLプログラムは純粋なビジネスロジックに専念する。 + +### 設計方針(カバレッジ拡大) + +本設計は、サブシステムBで未カバーのプログラムタイプ・ステートメントを積極的にカバーするため、以下の方針でプログラム分割・構文選定を行う。 + +| 項目 | Bの状況 | Aで狙う追加カバレッジ | +|------|---------|---------------------| +| プログラムタイプ | 6パターン◎ | 未カバー5パターン + **SYSIN(P28)** を追加 | +| ステートメント | 主要構文は網羅済 | SEARCH非ALL, DELETE, EVALUATE(4分岐), PERFORM THRU, WRITE FROM, WRITE AFTER ADVANCING, **MULTIPLY, SUBTRACT, ACCEPT, DISPLAY, INSPECT** | +| DB操作 | INSERT/UPDATE/SELECT/COMMIT/ROLLBACK | 上記に加え **DELETE FROM** を追加 | + +--- + +## システム定数 + +全てのプログラムで共通の前提値。COBOLのCNS-定数として保持する(DBは持たない)。 + +| 定数 | 値 | 説明 | +|------|-----|------| +| WORK-START | 0900 | 所定労働開始時刻 | +| WORK-END | 1800 | 所定労働終了時刻 | +| LUNCH-START | 1200 | ランチ開始時刻 | +| LUNCH-END | 1300 | ランチ終了時刻 | +| DAILY-HOURS | 8.0 | 1日の所定労働時間(9h実働 − 1hランチ) | + +--- + +## 休暇種別 + +| コード | 名称 | 給与への影響 | 備考 | +|--------|------|------------|------| +| 01 | 年休(年假) | 控除なし | 有給年次休暇 | +| 02 | 事假(事假) | 全額控除 | 私事欠勤 | +| 03 | 因公特批假(因公特批假) | 控除なし | 公務特認欠勤 | +| 04 | 病欠(病欠) | 一部控除 | 控除率はSICK_LEAVE_RATEテーブル参照 | + +**休暇種別は上記4種で固定。勤怠ルールはこの4種を基準とする。** + +--- + +## DBテーブル一覧 + +全テーブルはDB2で管理する。COBOLからは埋め込みSQL(`EXEC SQL`)で直接アクセスする。 + +### 1. EMP_MASTER(社員マスタ) + +全社員の基本情報を保持する。サブシステムAでは参照のみ。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | EMP_ID | CHAR | 8 | NOT NULL | ✓ | 社員番号 | +| 2 | DEPT_ID | CHAR | 4 | NOT NULL | — | 部署ID | +| 3 | EMP_NAME | VARCHAR | 50 | NOT NULL | — | 氏名 | +| 4 | STATUS | CHAR | 1 | NOT NULL | — | '1'=在籍, '9'=退職 | + +### 2. ABSENCE_SUMMARY(欠勤集計中間ファイル) + +サブシステムA→Cの連携用。KIN08DBUが月次集計後に出力する。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | EMP_ID | CHAR | 8 | NOT NULL | ✓ | 社員番号 | +| 2 | YEAR_MONTH | CHAR | 6 | NOT NULL | ✓ | YYYYMM | +| 3 | ANNUAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 年休使用合計 | +| 4 | PERSONAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 事假合計 | +| 5 | OFFICIAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 因公特批假合計 | +| 6 | SICK_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 病欠合計 | +| 7 | UNAPPROVED_ABSENT_H | DECIMAL | 6,1 | NOT NULL | — | 未申請欠勤合計 | + +### 3. HOLIDAY_CALENDAR(休日カレンダー) + +祝日(曜日判定で休日にならない日)のみを列挙する。 +土曜・日曜は曜日判定で休日とするため、このテーブルには含めない。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | HOLIDAY_DATE | CHAR | 8 | NOT NULL | ✓ | YYYYMMDD | +| 2 | DESCRIPTION | VARCHAR | 50 | OK | — | 任意(例:「建国記念の日」) | + +**出勤日判定ロジック(全PGM共通):** +``` +1. HOLIDAY_CALENDARに日付が存在する → 休日 +2. 曜日が土曜(6)または日曜(INTEGER-OF-DATE MOD 7 = 0) → 休日 +3. 上記以外 → 出勤日(WORK-START=0900, WORK-END=1800) +``` + +### 4. SICK_LEAVE_RATE(病欠控除率) + +全社員共通の病欠控除率を保持する。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | LEAVE_TYPE | CHAR | 2 | NOT NULL | ✓ | '04'固定 | +| 2 | DEDUCTION_RATE | DECIMAL | 3,2 | NOT NULL | — | 例:0.50(50%控除) | + +### 5. LEAVE_RECORDS(休暇申請記録) + +休暇申請の生データを保持する。取消は**DELETE FROM**で行い、レコードを物理削除する。 +期間は開始日〜終了日で表現され、日別展開は行わない。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | APPLICATION_ID | INTEGER | — | NOT NULL | ✓ | 自動採番 | +| 2 | EMP_ID | CHAR | 8 | NOT NULL | — | 社員番号 | +| 3 | LEAVE_TYPE | CHAR | 2 | NOT NULL | — | '01'〜'04' | +| 4 | START_DATE | CHAR | 8 | NOT NULL | — | YYYYMMDD(出勤日) | +| 5 | START_TIME | CHAR | 4 | NOT NULL | — | HHMM(所定労働時間内) | +| 6 | END_DATE | CHAR | 8 | NOT NULL | — | YYYYMMDD(出勤日) | +| 7 | END_TIME | CHAR | 4 | NOT NULL | — | HHMM(所定労働時間内) | +| 8 | STATUS | CHAR | 1 | NOT NULL | — | '1'=有効, '9'=取消 | + +### 6. DAILY_RECORDS(日別勤怠記録) + +1社員1日の勤怠情報。出勤日のみレコードが存在する。 +打刻がない日でも休暇または未申請欠勤の情報を持つ。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | EMP_ID | CHAR | 8 | NOT NULL | ✓ | | +| 2 | TARGET_DATE | CHAR | 8 | NOT NULL | ✓ | YYYYMMDD | +| 3 | TIME_IN | CHAR | 4 | NOT NULL | — | 出勤時刻、'0000'=打刻なし | +| 4 | TIME_OUT | CHAR | 4 | NOT NULL | — | 退勤時刻、'0000'=打刻なし | +| 5 | ANNUAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 年休使用時間 | +| 6 | PERSONAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 事假時間 | +| 7 | OFFICIAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 因公特批假時間 | +| 8 | SICK_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 病欠時間 | +| 9 | UNAPPROVED_ABSENT_H | DECIMAL | 6,1 | NOT NULL | — | 未申請欠勤時間 | +| 10 | UPDATED_AT | TIMESTAMP | — | NOT NULL | — | DEFAULT CURRENT_TIMESTAMP | + +### 7. MONTHLY_ABSENCE(月次統計) + +DAILY_RECORDSを月次で集計したサマリ。 + +| No | カラム名 | 型 | 長さ | NULL | PK | 備考 | +|----|---------|---|------|------|----|------| +| 1 | EMP_ID | CHAR | 8 | NOT NULL | ✓ | | +| 2 | YEAR_MONTH | CHAR | 6 | NOT NULL | ✓ | YYYYMM | +| 3 | ANNUAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 年休使用合計 | +| 4 | PERSONAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 事假合計 | +| 5 | OFFICIAL_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 因公特批假合計 | +| 6 | SICK_LEAVE_H | DECIMAL | 6,1 | NOT NULL | — | 病欠合計 | +| 7 | UNAPPROVED_ABSENT_H | DECIMAL | 6,1 | NOT NULL | — | 未申請欠勤合計 | +| 8 | UPDATED_AT | TIMESTAMP | — | NOT NULL | — | DEFAULT CURRENT_TIMESTAMP | + +--- + +## ファイル一覧 + +| # | ファイル名 | DD名 | 編成 | RECM | サイズ | 生成元 | 消費先 | 備考 | +|---|-----------|------|------|------|--------|--------|--------|------| +| 1 | RAW-LEAVE | KIN01R01 | SEQUENTIAL | FB | 80 | 外部システム | KIN01INP | 休暇申請CSV | +| 2 | WORK-LEAVE | KIN01W01 | SEQUENTIAL | FB | 80 | KIN01INP | SORT→KIN02UPD | 検証済休暇申請(中間) | +| 3 | RAW-PUNCH | KIN04R01 | SEQUENTIAL | FB | 80 | 打刻システム | KIN04CHK | 生打刻データ | +| 4 | EDITED-PUNCH | KIN04W01 | SEQUENTIAL | FB | 80 | KIN04CHK | KIN05MAT/B-サブシステム | 項目チェック通過打刻 | +| 5 | LEAVE-DAILY | KIN02W01 | SEQUENTIAL | FB | 80 | KIN03EXP | KIN05MAT / KIN07DAI | 日別展開済休暇 | +| 6 | KIN-LEAVE | KIN05W01 | SEQUENTIAL | FB | 160 | KIN05MAT | KIN07DAI | 打刻+休暇照合結果 | +| 7 | WORK-DAY-FILE | KIN06W01 | SEQUENTIAL | FB | 80 | KIN06CLD | KIN07DAI | 出勤日カレンダー | +| 8 | DAILY-RECORD | KIN07W01 | SEQUENTIAL | FB | 200 | KIN07DAI | KIN08DBU | 日別勤怠計算結果 | +| 9 | ERROR-LOG | KIN01E01 | SEQUENTIAL | VB | 200 | KIN01INP / KIN04CHK | — | エラーレコード退避 | +| 10 | ABSENCE-SUMMARY | KIN08W01 | SEQUENTIAL | FB | 80 | KIN08DBU | C-サブシステム | 月次欠勤集計(Cへ連携) | +| 11 | CSV-OUTPUT | KIN09W01 | SEQUENTIAL | FB | 200 | KIN09CSV | — | 社員確認用CSV | + +--- + +## 処理フロー + +``` +休暇申請(RAW-LEAVE / CSV) + │ + │ [KINJ010] KIN01INP — 休暇申請CSV取込・検証処理 + │ UNSTRINGでCSV分解 → IF/ELSE chain(新規/取消/変更) + │ SEARCH(非ALL)で休暇種別テーブル検索 + │ SUB04CHKで日付/時刻/数値チェック + ├──正常 → WORK-LEAVE-file + └──異常 → ERROR-LOG + │ + │ [KINJ011] SORT(WORK-LEAVE → APPLICATION_ID昇順) + │ + │ [KINJ012] KIN02UPD — 休暇申請DB更新処理 + │ 新規: EXEC SQL INSERT + │ 取消: EXEC SQL DELETE FROM ← 新カバレッジ + │ 変更: EXEC SQL DELETE + INSERT + │ → DB:LEAVE_RECORDS + │ + │ [KINJ015] KIN03EXP — 休暇日別展開処理 + │ DB(SELECT/CURSOR) → PERFORM THRU(日付範囲) + │ キーブレイク(社員番号切替) → HEADER処理 + │ 休日除外 → CONTINUE + │ → LEAVE-DAILY-file + ▼ +LEAVE-DAILY-file(日別休暇) + │ + +打刻生データ(RAW-PUNCH / CSV) + │ + │ [KINJ020] KIN04CHK — 打刻項目チェック処理 + │ UNSTRING + SUB04CHK(日付/時刻/数値) + │ IF多重ネスト(必須→日付→時刻→数値の4段階) + ├──正常 → EDITED-PUNCH + └──異常 → ERROR-LOG + │ + │ [KINJ022] SORT(EDITED-PUNCH → 社員番号+日付昇順) + │ + │ [KINJ025] KIN05MAT — 打刻休暇照合処理 + │ マッチング(1:N) EDITED-PUNCH × LEAVE-DAILY + │ 休暇種別優先順位(01/02連動, 03/04独立) + │ → KIN-LEAVE + ▼ +KIN-LEAVE(照合結果) + │ + │ [KINJ030] KIN06CLD — 出勤日カレンダー生成処理 + │ DB SELECT(CURSOR) + PERFORM VARYING + │ SEARCH ALL(休日判定) / WRITE FROM ← 新カバレッジ + │ → WORK-DAY-FILE + ▼ +WORK-DAY-FILE(出勤日カレンダー) + │ + │ [KINJ033] KIN07DAI — 日別勤怠計算処理 + │ マッチング(1:N) + EVALUATE分岐 ← MULTIPLY/SUBTRACT新カバレッジ + │ WORK-DAY(主駆動) × KIN-LEAVE(N側) + │ 4パターン(A/B/C/D)をEVALUATE + PERFORMで分岐 + │ 休暇時間計算(ランチ除外) + SUB05TIM丸め(0.1h切上) + │ → DAILY-RECORD + ▼ +DAILY-RECORD(日別計算結果) + │ + │ [KINJ036] KIN08DBU — 勤怠DB更新処理 + │ DAILY-RECORD → DAILY_RECORDS INSERT + │ 社員別月次集計 → MONTHLY_ABSENCE UPSERT + │ ABSENCE_SUMMARYファイル出力(Cへ連携) + ▼ +DB: DAILY_RECORDS + DB: MONTHLY_ABSENCE + │ ABSENCE-SUMMARY-file + ▼ +C:給与計算システム(KYU01CAL) + │ + │ [KINJ040] KIN09CSV — 勤怠CSV出力処理 + │ DB SELECT → STRING → WRITE AFTER ADVANCING ← 新カバレッジ + ▼ +CSV(社員確認用) +``` + +--- + +## プログラム詳細 + +### STEP010: KIN01INP — 休暇申請CSV取込・検証処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | **振り分け** | +| **JCL前処理** | なし | +| **入力** | RAW-LEAVE(80B / CSV形式)| +| **出力** | WORK-LEAVE(80B)/ ERROR-LOG(VB)| + +**機能:** + +1. READ RAW-LEAVE → CSVレコード1行を取得 +2. **UNSTRING** でCSV分解(申請番号,社員番号,日付,開始時刻,終了時刻,休暇種別,ステータス)+ **TALLYING** でフィールド数カウント(項目数チェック) +4. **SEARCH(非ALL)** でWORKING-STORAGE上の休暇種別テーブルを線形探索 → 該当種別の存在確認 ← **新カバレッジ** +5. **IF/ELSE chain** でステータス判定(新規/取消/変更) ← **新カバレッジ(振り分けIF文)** +6. SUB04CHKで日付・時刻・数値の各項目検証 + - IF多重ネスト:必須チェック → 日付形式 → 時刻範囲 → 数値 +7. 通過 → WORK-LEAVEに出力(検証済みレコード) +8. エラー → ERROR-LOGに出力 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| UNSTRING | CSVレコードの項目分解 | +| INSPECT TALLYING | カンマ区切り数カウント | +| **SEARCH(非ALL)** | 休暇種別テーブル線形探索 ← 新規 | +| IF/ELSE chain | ステータス別の振り分け処理(EVALUATE不使用) | + +--- + +### STEP020: KIN02UPD — 休暇申請DB更新処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | **DB更新** | +| **JCL前処理** | WORK-LEAVE → APPLICATION_ID昇順SORT | +| **入力** | WORK-LEAVE(80B)| +| **出力** | LEAVE_RECORDS(DB2)| + +**機能:** + +1. READ WORK-LEAVE → 検証済みレコード1件 +2. レコード種別に応じたDB操作: + - 新規申請(ステータス='1') → **EXEC SQL INSERT** + - 取消申請(ステータス='9') → **EXEC SQL DELETE FROM** WHERE APPLICATION_ID = :id ← **新カバレッジ** + - 変更申請(ステータス='1', APPLICATION_ID指定済) → **DELETE + INSERT** +3. IF SQLCODE NOT = 0 → エラーハンドリング + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| EXEC SQL INSERT | DB登録 | +| **EXEC SQL DELETE FROM** | DB削除(物理削除による取消)← 新規 | +| IF | SQLCODE判定 | + +--- + +### STEP030: KIN03EXP — 休暇日別展開処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | **キーブレイク** | +| **JCL前処理** | なし | +| **入力** | LEAVE_RECORDS(DB2 SELECT / CURSOR) | +| **出力** | LEAVE-DAILY-file(80B)| + +**機能:** + +1. LEAVE_RECORDSからSTATUS='1'(有効)の全レコードをCURSOR SELECTする(ORDER BY EMP_ID, START_DATE)。 +2. **PERFORM THRU** で処理範囲を指定 ← **新カバレッジ** + - 2100-PROCESS-EMP THRU 2100-PROCESS-EMP-EXIT:1社員分の処理 + - 2200-EXPAND-DATE THRU 2200-EXPAND-DATE-EXIT:日付展開処理 +3. キーブレイク(社員番号切替)時に社員別小計を出力 ← **キーブレイク(その他)** +4. 各申請の開始日〜終了日をループ(PERFORM VARYING): + - 休日判定:HOLIDAY_CALENDARに存在 or 土日 → **CONTINUE** でスキップ + - 出勤日 → LEAVE-DAILY-fileに出力 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| **PERFORM THRU** | 段落範囲指定による構造化処理 ← 新規 | +| PERFORM UNTIL | 日付ループ(開始日〜終了日)| +| CONTINUE | 休日スキップ時の空処理 | +| EXEC SQL SELECT(CURSOR) | DB読込(FETCH) | +| SET | キーブレイクフラグ操作 | + +--- + +### STEP040: KIN04CHK — 打刻項目チェック処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | 項目チェック(重複なし) | +| **JCL前処理** | なし | +| **入力** | RAW-PUNCH(80B / CSV形式)| +| **出力** | EDITED-PUNCH(80B)/ ERROR-LOG(VB)| + +**機能:** + +1. READ RAW-PUNCH → CSVレコード +2. **UNSTRING** で分解 +3. **IF多重ネスト** で4段階チェック: + ``` + IF 社員番号 NOT = SPACE THEN + IF 日付が有効形式 THEN + IF 時刻が有効範囲 THEN + IF 出勤 < 退勤 THEN + 正常出力 + ELSE → エラー + ELSE → エラー + ELSE → エラー + ELSE → エラー + END-IF + ``` +4. 各チェックは SUB04CHK を呼出 +5. 正常 → EDITED-PUNCHに出力(**WRITE FROM** 使用) +6. 異常 → ERROR-LOGに出力(**STRING** で編集) + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| UNSTRING | CSV分解 | +| **IF多重ネスト(THEN句)** | 必須→日付→時刻→数値の4段階チェック ← 新規(深度) | +| WRITE FROM | 出力レコードの一括書出 | +| STRING | エラーメッセージ編集 | + +--- + +### STEP050: KIN05MAT — 打刻休暇照合処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | **マッチング(1:N)** | +| **JCL前処理** | EDITED-PUNCH → 社員番号+日付昇順SORT(KINJ022)| +| **入力R01** | EDITED-PUNCH(80B、打刻側)| +| **入力R02** | LEAVE-DAILY-file(80B、休暇側、N件あり得る)| +| **出力** | KIN-LEAVE(160B)| + +**機能:** + +EDITED-PUNCH(打刻)とLEAVE-DAILY-file(日別休暇)を社員番号+日付で照合する。 + +1. **マッチング制御**(EVALUATE TRUE): + - R01キー < R02キー → 打刻のみ(休暇なし)→ 休暇='99'+0hで出力 + - R01キー = R02キー → マッチ → 休暇情報マージ + - 同一キーにN件のR02がある場合は全件読み、休暇種別優先順位で1件選定 + - R01キー > R02キー → R02次へ(R01側に該当なしの休暇 → この後のR01読込で拾う) + +2. **休暇種別優先順位**: + - 01(年休)と02(事假)は連動:年休残あり→01, なし→02 + - 03(因公特批假)と04(病欠)は独立 + - 複数種別混在時はAPPLICATION_ID基準で時刻範囲判定 + +3. 出力:打刻情報(80B)+休暇情報(80B)=160BのKIN-LEAVE + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| EVALUATE TRUE | マッチング3分岐制御 | +| STRING | 出力レコード編集 | +| CONTINUE | 空分岐処理 | + +--- + +### STEP060: KIN06CLD — 出勤日カレンダー生成処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | **GETPUT** | +| **JCL前処理** | なし | +| **入力** | EMP_MASTER(DB2 SELECT / CURSOR)、HOLIDAY_CALENDAR(DB2 SELECT) | +| **出力** | WORK-DAY-FILE(80B FB)| + +**PARM解析:** +- `YEARMONTH=202605` — 必須。対象年月。 + +**機能:** + +1. PARMから対象年月を取得 +2. EMP_MASTERテーブルからSTATUS='1'(在籍)の社員一覧をSELECT(CURSOR, ORDER BY EMP_ID) +3. HOLIDAY_CALENDARテーブルから該当月の祝日一覧をSELECT(WORKING-STORAGEのテーブルに格納) +4. 各社員について、当月1日〜月末日まで **PERFORM VARYING** でループ: + - **SEARCH ALL** でHOLIDAY-CALENDARテーブルを二分探索 + - 土曜(6) or 日曜(7) → 休日 + - その他 → 出勤日として **WRITE FROM** で出力 ← **新カバレッジ** +5. 出力レコードは社員番号+日付の昇順に保証(ORDER BY + ループ順) + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| **WRITE FROM** | MOVE + WRITEを1文で記述 ← 新規 | +| PERFORM VARYING | 日付ループ | +| SEARCH ALL | 休日テーブル二分探索 | +| EXEC SQL SELECT(CURSOR) | DB読込 | + +--- + +### STEP070: KIN07DAI — 日別勤怠計算処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | **マッチング(1:N)** | +| **JCL前処理** | なし(WORK-DAY-FILE / KIN-LEAVE / LEAVE-DAILYともソート済み前提) | +| **入力R01** | WORK-DAY-FILE(80B、主駆動、1社員1日=1件) | +| **入力R02** | KIN-LEAVE(160B、N側、1日0〜N件) | +| **副参照** | LEAVE-DAILY-file(80B、ファイル併走読込) | +| **出力** | DAILY-RECORD(200B FB)| + +**機能:** + +WORK-DAY-FILE(出勤日カレンダー)を主駆動とし、社員番号+日付をキーにKIN-LEAVE(打刻+休暇)とLEAVE-DAILY-file(日別休暇)を照合する。 + +**EVALUATEによる4パターン分岐:** + +マッチング結果に応じてPATTERN-NUM(1〜4)を設定し、**EVALUATE** で処理分岐(実装時にGO TO DEPENDING ONのフォールスルー問題を確認したため、EVALUATE + PERFORMに変更): + +``` +01 PATTERN-NUM PIC 9(1). + 88 PATTERN-A VALUE 1. + 88 PATTERN-B VALUE 2. + 88 PATTERN-C VALUE 3. + 88 PATTERN-D VALUE 4. + + EVALUATE PATTERN-NUM + WHEN 1 PERFORM 6100-PATTERN-A + WHEN 2 PERFORM 6200-PATTERN-B + WHEN 3 PERFORM 6300-PATTERN-C + WHEN 4 PERFORM 6400-PATTERN-D + END-EVALUATE. +``` + +| パターン | R01(WORK-DAY) | R02(KIN-LEAVE) | LEAVE-DAILY | 処理 | +|---------|--------------|----------------|-------------|------| +| A=1 | あり | あり | あり | 打刻情報設定+休暇時間計算(ランチ除外、0.1h切上丸め) | +| B=2 | あり | あり | なし | 打刻情報設定のみ、休暇=0 | +| C=3 | あり | なし | あり | 打刻=0000、休暇時間計算(所定労働時間8h上限、ランチ除外) | +| D=4 | あり | なし | なし | 打刻=0000、休暇=0、未申請欠勤=8.0h | + +**休暇時間計算(ランチ考慮):** + +``` +例:終日休暇申請 0900〜1800 + 0900-1200 = 3h(午前) + 1200-1300 = ランチ(除外) + 1300-1800 = 5h(午後) + 合計休暇時間 = 8h + +例:午後休暇申請 1300〜1800 + 1300-1800 = 5h(午後、ランチ除外済み) + 合計休暇時間 = 5h +``` + +丸め:SUB05TIM(0.1h単位切上)を呼出。 + +**バリエーション構文(MULTIPLY / SUBTRACT):** + +COMPUTEのみに依存せず、MULTIPLYとSUBTRACTも併用して時間計算のバリエーションを確保する。 + +``` +* 例:時間(hhmm)を分(minutes)に変換 → ランチ除外 +MULTIPLY WRK-HOURS BY 60 GIVING WRK-MINUTES ← MULTIPLY +SUBTRACT LUNCH-MINUTES FROM WRK-MINUTES ← SUBTRACT +``` + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| **GO TO ... DEPENDING ON** | 4パターンの処理分岐 ← 新規 | +| **PERFORM THRU** | 各パターン内の段落範囲処理 | +| COMPUTE ROUNDED ON SIZE ERROR | 時間計算のエラー処理 | +| **MULTIPLY** | 時間→分単位変換 ← 新規 | +| **SUBTRACT** | ランチ時間除外 ← 新規 | +| STRING | エラーメッセージ編集 | +| CALL 'SUB05TIM' | 時刻丸め計算 | + +--- + +### STEP080: KIN08DBU — 勤怠DB更新処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | DB更新 + **SYSIN読込(P28)** | +| **JCL前処理** | なし | +| **入力** | DAILY-RECORD(200B)、**SYSIN(集計対象社員指定)** | +| **出力** | DAILY_RECORDS / MONTHLY_ABSENCE(DB2)、ABSENCE_SUMMARY(80B)| + +**機能:** + +1. **SYSIN読込(パターン28)**:集計対象の社員番号一覧をSYSINから読み込む(省略時は全社員が対象)。 +2. DAILY-RECORDを1レコードずつ読込み、DAILY_RECORDSに**EXEC SQL INSERT** +3. 社員別・月別の集計値を**PERFORM VARYING**で積算(全社員ループ) +4. 全件処理後、MONTHLY_ABSENCEを**EXEC SQL UPDATE / INSERT**(UPSERT) +5. **INSPECT TALLYING**で社員番号の有効性チェック → 空または無効値は**DISPLAY**で警告表示 +6. 病欠時間はSICK_LEAVE_RATEテーブルを参照し、控除前時間として保持 +7. 集計後データをABSENCE_SUMMARYファイルに出力 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| **READ SYSIN**(パターン28) | 対象社員一覧の読込 ← 新規パターン | +| DISPLAY | 警告メッセージ表示 ← 新規 | +| INSPECT TALLYING | 社員番号の空チェック ← 新規 | +| PERFORM VARYING | 社員別月次集計ループ | +| EXEC SQL INSERT / UPDATE | DB更新(INSERT+UPDATEでUPSERT) | + +--- + +### STEP090: KIN09CSV — 勤怠CSV出力処理 + +| 項目 | 内容 | +|------|------| +| **PGMパターン** | GETPUT | +| **JCL前処理** | なし | +| **入力** | DAILY_RECORDS / MONTHLY_ABSENCE(DB2)、**COMMAND-LINE PARM** | +| **出力** | CSVファイル(社員確認用)| + +**PARM解析:** +- `YEARMONTH=202605` — 必須。対象年月。 +- `MODE=FULL` — オプション。`FULL`=全項目出力, `SUMMARY`=集計のみ。 + +**機能:** + +1. **ACCEPT FROM COMMAND-LINE** でPARM解析(対象年月・出力モード) +2. DAILY_RECORDSから当月の全レコードをCURSOR SELECT +3. **STRING** でCSV行を編集(DELIMITED BY SIZE) +4. **WRITE AFTER ADVANCING PAGE** でページヘッダー制御 ← **新カバレッジ** + - 100行ごとにヘッダー行を出力 + - WRITE header-record AFTER ADVANCING PAGE +5. CSVフォーマット: + +``` +社員番号,日付,出勤時刻,退勤時刻,休暇種別,年休時間,事假時間,因公特批假時間,病欠時間,未申請欠勤時間 +00000101,20260501,0900,1800,99,0.0,0.0,0.0,0.0,0.0 +00000101,20260502,0900,1300,02,0.0,4.0,0.0,0.0,4.0 +00000101,20260503,0000,0000,01,8.0,0.0,0.0,0.0,0.0 +00000101,20260504,0000,0000,99,0.0,0.0,0.0,0.0,8.0 +``` + +6. 休暇種別は該当日に休暇がある場合は最初に該当した休暇種別コード、ない場合は'99' + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| **ACCEPT FROM COMMAND-LINE** | PARM解析(対象年月・出力モード)← 新規 | +| **WRITE AFTER ADVANCING PAGE** | ページ制御出力 ← 新規 | +| STRING | CSV行編集(DELIMITED BY SIZE) | +| EXEC SQL SELECT(CURSOR) | DB読込 | + +--- + +## 共通関数(サブプログラム) + +サブシステムAの全プログラムで使用する共通関数。SUB06DBUは使用せず、全DB操作はEXEC SQLで直接記述する。 + +| サブプログラム | I/Fコピー句 | 用途 | 使用プログラム | +|---|---|---|---| +| SUB01DAT | D01010AC | 運用日付取得 | KIN01INP, KIN04CHK, KIN08DBU, KIN09CSV | +| SUB02MSG | MSG000AC | メッセージ編集出力 | 全プログラム | +| SUB03END | MSG000AC | ABEND終了 | KIN02UPD, KIN04CHK, KIN07DAI | +| SUB04CHK | SUB04CHK | 項目チェック(日付/時刻/数値) | KIN01INP, KIN04CHK | +| SUB05TIM | TIME010AC | 時刻丸め計算(分→時間) | KIN07DAI | + +--- + +## JCL構成概要 + +9本のJOB。拠点間ソートはJCL SORTで処理し、COBOLプログラムはビジネスロジックに専念する。 + +| JOB名 | 実行PGM | 処理概要 | SORT | +|-------|--------|---------|------| +| KINJ010 | KIN01INP | 休暇申請CSV取込・検証 | 不要 | +| KINJ011 | SORT | WORK-LEAVE → APPLICATION_ID昇順 | 必須 | +| KINJ012 | KIN02UPD | 休暇申請DB更新(INSERT/DELETE) | 不要 | +| KINJ015 | KIN03EXP | 休暇日別展開(キーブレイク) | 不要 | +| KINJ020 | KIN04CHK | 打刻項目チェック | 不要 | +| KINJ022 | SORT | EDITED-PUNCH → 社員番号+日付昇順 | 必須 | +| KINJ025 | KIN05MAT | 打刻休暇照合(1:N) | 不要 | +| KINJ030 | KIN06CLD | 出勤日カレンダー生成(GETPUT) | 不要 | +| KINJ033 | KIN07DAI | 日別計算(EVALUATE / MULTIPLY / SUBTRACT) | 不要 | +| KINJ036 | KIN08DBU | 勤怠DB更新(集計) | 不要 | +| KINJ040 | KIN09CSV | 勤怠CSV出力 | 不要 | + +--- + +## 丸めルール一覧 + +| 項目 | 最小単位 | 超過後丸め | 適用プログラム | +|------|---------|-----------|--------------| +| 休暇時間(全種別) | 1.0h | 0.1h単位切上 | KIN07DAI(SUB05TIM) | +| 未申請欠勤時間 | 8.0h/日 | 切捨 | KIN07DAI | + +サブシステムB(残業計算)の丸めルールとは独立して管理する。 + +--- + +## 期待される新規カバレッジ + +### プログラムタイプ(未カバー → Aで追加) + +| No | パターン | 状態 | A該当プログラム | A状態 | +|----|----------|:----:|----------------|:-----:| +| 2 | マッチング処理(1:N) | × | KIN05MAT | ◎ | +| 11 | キーブレイク処理(その他) | × | KIN03EXP | ◎ | +| 12 | レイアウト編集のみ(GETPUT) | × | KIN06CLD | ◎ | +| 15 | 振り分け(IF文) | × | KIN01INP | ◎ | +| 17 | 内部テーブル検索 | ○ | KIN01INP(SEARCH非ALL) | ◎ | +| 19 | CSV→FB変換(改行なし) | ○ | KIN01INP | ◎ | +| **28** | **SYSIN読込・チェック** | **×** | **KIN08DBU** | **新規◎** | + +### ステートメント(未カバー → Aで追加) + +| ステートメント | 状態 | A該当プログラム | +|---------------|:----:|----------------| +| SEARCH(非ALL) | × | KIN01INP | +| DELETE FROM(DB2) | × | KIN02UPD | +| GO TO DEPENDING ON | × | — (KIN07DAIはフォールスルー問題のためEVALUATE+PERFORMに変更) | +| PERFORM THRU | × | KIN03EXP | +| WRITE FROM | × | KIN04CHK, KIN06CLD | +| WRITE AFTER ADVANCING PAGE | × | KIN09CSV | +| **MULTIPLY** | **○(ZAN06UPDのみ)** | **KIN07DAI** | +| **SUBTRACT** | **○(ZAN06UPDのみ)** | **KIN07DAI** | +| **ACCEPT FROM COMMAND-LINE** | **◎(ZAN05CAL,KIN06CLD)** | **KIN09CSV** | +| **DISPLAY** | **△(SUB02MSG,SUB03ENDのみ)** | **KIN08DBU** | +| **INSPECT** | **◎** | **KIN08DBU** | + +--- + +## レコード構成 + +EDITED-PUNCHはBサブシステムのZAN03CHKが入力として使用するため、互換性を維持する。 + +### EDITED-PUNCH(80B) + +Bサブシステムとの連携インターフェース。 + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | 社員番号 | SI-EMP-ID | 9(8) | 1 | | +| 2 | 日付 | SI-DATE | 9(8) | 9 | YYYYMMDD | +| 3 | 出勤時刻 | SI-TIME-IN | 9(4) | 17 | HHMM | +| 4 | 退勤時刻 | SI-TIME-OUT | 9(4) | 21 | HHMM | +| 5 | 部署ID | SI-DEPT-ID | 9(4) | 25 | | +| 6 | 端末ID | SI-TERMINAL | X(6) | 29 | | +| 7 | 予備 | FILLER | X(46) | 35 | | + +### WORK-LEAVE(80B) — 新規(KIN01INP→KIN02UPD中間) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | 申請ID | WL-APPLICATION-ID | 9(9) | 1 | 新規=0, 取消/変更=APPLICATION_ID | +| 2 | 社員番号 | WL-EMP-ID | X(8) | 10 | | +| 3 | 休暇種別 | WL-LEAVE-TYPE | X(2) | 18 | '01'〜'04' | +| 4 | 開始日 | WL-START-DATE | 9(8) | 20 | YYYYMMDD | +| 5 | 開始時刻 | WL-START-TIME | 9(4) | 28 | HHMM | +| 6 | 終了日 | WL-END-DATE | 9(8) | 32 | YYYYMMDD | +| 7 | 終了時刻 | WL-END-TIME | 9(4) | 40 | HHMM | +| 8 | ステータス | WL-STATUS | X(1) | 44 | '1'=新規/変更, '9'=取消 | +| 9 | 予備 | FILLER | X(36) | 45 | | + +### LEAVE-DAILY(80B) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | 社員番号 | SL-EMP-ID | X(8) | 1 | | +| 2 | 日付 | SL-DATE | 9(8) | 9 | YYYYMMDD | +| 3 | 休暇種別 | SL-LEAVE-TYPE | X(2) | 17 | '01'〜'04' | +| 4 | 開始時刻 | SL-START-TIME | 9(4) | 19 | HHMM(元申請の開始時刻) | +| 5 | 終了時刻 | SL-END-TIME | 9(4) | 23 | HHMM(元申請の終了時刻) | +| 6 | 申請ID | SL-APPLICATION-ID | 9(9) | 27 | LEAVE_RECORDSのAPPLICATION_ID | +| 7 | 予備 | FILLER | X(45) | 36 | | + +### KIN-LEAVE(160B) — EDITED-PUNCH(80B)+休暇情報(80B) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1-7 | 打刻情報 | — | — | 1 | EDITED-PUNCHと同一 | +| 8 | 休暇種別 | SR-LEAVE-TYPE | X(2) | 81 | '01'〜'04' or '99' | +| 9 | 開始時刻 | SR-LEAVE-START-TIME | 9(4) | 83 | 該当休暇の申請開始時刻 | +| 10 | 終了時刻 | SR-LEAVE-END-TIME | 9(4) | 87 | 該当休暇の申請終了時刻 | +| 11 | 休暇時間 | SR-LEAVE-HOURS | 9(4)V9(1) | 91 | KIN07DAIが再計算(ランチ除外・丸め適用) | +| 12 | 申請ID | SR-APPLICATION-ID | 9(9) | 96 | LEAVE_RECORDSのAPPLICATION_ID | +| 13 | 予備 | FILLER | X(56) | 105 | | + +### WORK-DAY-FILE(80B) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | 社員番号 | SW-EMP-ID | 9(8) | 1 | | +| 2 | 日付 | SW-DATE | 9(8) | 9 | YYYYMMDD | +| 3 | 曜日 | SW-DAY-OF-WEEK | 9(1) | 17 | 1=月…7=日 | +| 4 | 予備 | FILLER | X(63) | 18 | | + +### DAILY-RECORD(200B) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | 社員番号 | SD-EMP-ID | 9(8) | 1 | | +| 2 | 日付 | SD-DATE | 9(8) | 9 | YYYYMMDD | +| 3 | 出勤時刻 | SD-TIME-IN | 9(4) | 17 | '0000'=打刻なし | +| 4 | 退勤時刻 | SD-TIME-OUT | 9(4) | 21 | '0000'=打刻なし | +| 5 | 年休時間 | SD-ANNUAL-H | 9(4)V9(1) | 25 | | +| 6 | 事假時間 | SD-PERSONAL-H | 9(4)V9(1) | 30 | | +| 7 | 因公特批假時間 | SD-OFFICIAL-H | 9(4)V9(1) | 35 | | +| 8 | 病欠時間 | SD-SICK-H | 9(4)V9(1) | 40 | | +| 9 | 未申請欠勤時間 | SD-ABSENT-H | 9(4)V9(1) | 45 | | +| 10 | 予備 | FILLER | X(151) | 50 | | + +### CSV-OUTPUT(200B) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | CSV行データ | SC-CSV-LINE | X(200) | 1 | STRING編集済みCSV1行 | + +### ERROR-LOG(VB 200B) + +| # | 項目 | 名称 | 属性 | 開始 | 備考 | +|---|------|------|------|------|------| +| 1 | エラー区分 | ER-CATEGORY | 9(2) | 1 | 01=休暇エラー, 02=打刻エラー | +| 2 | 発生日時 | ER-DATETIME | X(16) | 3 | | +| 3 | プログラムID | ER-PGM-ID | X(8) | 19 | | +| 4 | エラー内容 | ER-MESSAGE | X(100) | 27 | | +| 5 | 原データ | ER-RAW-DATA | X(80) | 127 | エラー原因となった入力レコード | + diff --git a/production/design/02_残業統計管理システム_設計書(サブシステムB).md b/production/design/02_残業統計管理システム_設計書(サブシステムB).md new file mode 100644 index 0000000..299846c --- /dev/null +++ b/production/design/02_残業統計管理システム_設計書(サブシステムB).md @@ -0,0 +1,817 @@ +# 残業統計管理システム 設計書(サブシステムB) + +## システム概要 + +本サブシステムは、社員からの加班申請データを元に、振り分け・重複チェック・打刻照合・取消マッチング・キーブレイク集約を行い、月次の加班統計データをDBに保存する。 + +### サブシステム情報 + +| 項目 | 内容 | +|------|------| +| サブシステムID | ZAN(残業→ZANgyo) | +| COBOLプログラム数 | 6 | +| JCL数 | 6 | +| DB | 1(OVERTIME-DB / DB2、2テーブル) | + +### システム定数 + +| 定数 | 値 | 説明 | +|------|-----|------| +| WORK-START | 0900 | 所定労働開始時刻 | +| WORK-END | 1800 | 所定労働終了時刻 | +| DINNER-START | 1830 | 食事時間開始(1830以前は加班不可) | +| MIN-OVT-HOURS | 0.5 | 加班最小単位 | + +### 入力CSV形式(OVT-APPLY) + +各レコードはCSV形式。 + +| 項目 | 内容 | +|------|------| +| フォーマット | `申請番号,社員番号,日付(YYYYMMDD),開始時刻(HHMM),終了時刻(HHMM),ステータス` | +| ステータス 0 | 申請(新規) | +| ステータス 1 | 承認済(後続処理で状態更新) | +| ステータス 9 | 取消 | + +--- + +## ファイル一覧 + +| # | ファイル名 | 編成 | RECM | サイズ | 用途 | 区分 | +|---|-----------|------|------|-------|------|------| +| 1 | OVT-APPLY | SEQUENTIAL | FB | 80 | 加班申請CSV(入力) | 新規 | +| 2 | OVT-VALID | SEQUENTIAL | FB | 80 | 振り分け通過(有効申請) | 新規 | +| 3 | OVT-CANCEL | SEQUENTIAL | FB | 80 | 振り分け通過(取消) | 新規 | +| 4 | OVT-NODUP | SEQUENTIAL | FB | 80 | 重複チェック通過データ | 新規 | +| 5 | OVT-CHECKED | SEQUENTIAL | FB | 80 | 打刻照合通過(OVT-TYPE付加) | 新規 | +| 6 | OVT-MATCHED | SEQUENTIAL | FB | 80 | マッチング通過(処理番号付加) | 新規 | +| 7 | OVT-DBCLEAN | SEQUENTIAL | FB | 80 | 孤立取消(DB削除対象) | 新規 | +| 8 | OVT-SUMMARY | SEQUENTIAL | FB | 80 | 集約結果 | 新規 | +| 9 | ERROR-LOG | SEQUENTIAL | VB | 200 | エラーレコード退避 | Aと共用 | +| 10 | EDITED-PUNCH | SEQUENTIAL | FB | 80 | 打刻データ(Aシステム出力) | Aから連携 | +| 11 | HOLIDAY-FILE | SEQUENTIAL | FB | 80 | 休日マスタファイル(Aシステム提供) | Aから連携 | + +### DBテーブル管理方針 + +DB2インスタンスは全サブシステムで共有するが、テーブルはサブシステム別に機能分割する。 +BサブシステムのテーブルはOVT-APPLICATIONS, OVT-MONTHLYの2つであり、これらの管理・更新はBのみが行う。 +Aサブシステムのテーブル(DAILY_RECORDS, LEAVE_RECORDS等)は参照せず、A→Bの連携はEDITED-PUNCHファイル経由に限定する。 +HOLIDAY_CALENDARテーブルについては、Aサブシステムによって提供されるHOLIDAY-FILEを使用することで参照を代替する。 + +### DB二重対応 + +本サブシステムのDB操作はDB2の埋め込みSQL(`EXEC SQL`)で直接記述する。 +ただし、休日マスタに関するDBアクセスはファイルベースで処理するため、 +ZAN06UPD以外の全プログラムはDBアクセスを伴わない。 +各プログラム内でEXEC SQL INSERT/UPDATE/SELECTを発行する。 + +### 共通関数利用方針 + +Aサブシステムの共通関数のうち、安定した汎用API(SUB01DAT, SUB02MSG, SUB03END, SUB04CHK, SUB05TIM)はBでも利用する。 +SUB06DBUはサブシステムAで使用するDB更新用サブプログラムであり、Bでは使用しない(EXEC SQLを直接記述)。 + +--- + +## DB構成 + +### DB名称:残業統計データベース(OVERTIME-DB) + +#### テーブル1:OVT-APPLICATIONS(個別加班申請テーブル) + +| カラム | 型 | 内容 | +|--------|---|------| +| APPL-ID | CHAR(8) | 申請番号(PK) | +| EMP-ID | CHAR(8) | 社員番号 | +| APPL-DATE | CHAR(8) | 申請日 YYYYMMDD | +| OVT-TYPE | CHAR(1) | W=平日 / H=休日 | +| START-TIME | CHAR(4) | 開始時刻 HHMM | +| END-TIME | CHAR(4) | 終了時刻 HHMM | +| OVT-HOURS | DECIMAL(4,1) | 加班時間 | +| STATUS | CHAR(1) | 0=有効 / 9=取消 | +| UPDATED-AT | TIMESTAMP | 更新日時 | + +#### テーブル2:OVT-MONTHLY(月次集計テーブル) + +| カラム | 型 | 内容 | +|--------|---|------| +| EMP-ID | CHAR(8) | 社員番号(PK) | +| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMM(PK) | +| OVT-TYPE | CHAR(1) | W=平日 / H=休日(PK) | +| OVT-HOURS | DECIMAL(6,1) | 加班時間合計 | +| OVT-COUNT | INTEGER | 加班回数 | +| UPDATED-AT | TIMESTAMP | 更新日時 | + +--- + +## 処理フロー + +``` +OVT-APPLY(CSV、任意順) + レコード: 申請番号,社員番号,日付,開始時刻,終了時刻,ステータス(0/1/9) + │ + ╞══ ZANJ010 ═══════════════════════════════════╡ + │ ZAN01CHK(残業申請振分処理)— 振り分け + │ UNSTRINGでCSV分解 / EVALUATEでステータス判定 + │ SUB04CHKで日付/時刻/数値チェック / 0.5h未満チェック + ├── ステータス=0,1 → OVT-VALID + ├── ステータス=9 → OVT-CANCEL + └── 異常 → ERROR-LOG + │ + ╞══ ZANJ012 ═══════════════════════════════════╡ + │ SORT(OVT-VALID → 社員番号+日付+開始時刻昇順) + │ + │ ZAN02CHK(時間帯重複チェック処理)— 項目チェック + │ 同社員+同日の前レコード終了時刻 > 現レコード開始時刻 + │ → 重複(境界接続は重複としない) + ├── 通過 → OVT-NODUP + └── 重複 → ERROR-LOG + │ + ╞══ ZANJ013 ═══════════════════════════════════╡ + │ SORT(EDITED-PUNCH → 社員番号+日付昇順) + │ + │ ZAN03CHK(打刻時間照合処理)— マッチング(N:1) + │ OVT-NODUP + PUNCH-SORTED を社員番号+日付で突合 + │ 申請時間帯が出勤〜退勤の範囲内か確認 + │ HOLIDAY_CALENDAR検索+曜日関数で休日判定→OVT-TYPE(W/H)設定 + ├── 通過 → OVT-CHECKED + └── 異常 → ERROR-LOG + │ + ╞══ ZANJ015 ═══════════════════════════════════╡ + │ SORT(OVT-CHECKED → 申請番号昇順) + │ SORT(OVT-CANCEL → 申請番号昇順) + │ + │ ZAN04MAT(取消マッチング処理)— マッチング1:1 + │ キー=申請番号で VALID vs CANCEL を突合 + ├── VALID有 + CANCEL無 → OVT-MATCHED + ├── VALID有 + CANCEL有 → 消滅 + └── VALID無 + CANCEL有 → OVT-DBCLEAN + │ + ╞══ ZANJ020 ═══════════════════════════════════╡ + │ SORT(OVT-MATCHED → 申請番号+処理番号昇順) + │ + │ ZAN05CAL(残業時間集計処理)— キーブレイク集計 + │ 同一申請番号内の最終レコードを集計 + │ DIVIDE 分→時間変換 / SUB05TIMで丸め + │ COMPUTE ROUNDED ON SIZE ERROR + │ → OVT-SUMMARY + │ + ╞══ ZANJ025 ═══════════════════════════════════╡ + │ ZAN06UPD(残業統計DB更新処理)— DB更新 + ├── OVT-SUMMARY → OVT-APPLICATIONS INSERT/UPDATE + │ → OVT-MONTHLY UPSERT(平日/休日別) + └── OVT-DBCLEAN → OVT-APPLICATIONS STATUS='9' UPDATE + → OVT-MONTHLY 減算UPDATE + → 該当なし → ERROR-LOG +``` + +--- + +## JCL + +### ZANJ010 — 残業申請振分 + +```jcl +//ZANJ010 JOB (ACCT),'残業申請振分',CLASS=A +//* +//*--- パラメータ定義 --- +//SETPARM SET YEARMONTH=202605 +//* +//*===================================================================== +//* STEP010: 振り分け(SORT不要) +//* 注:YEARMONTH PARMは他プログラムとの一貫性のため渡すが、ZAN01CHK内では未使用 +//*===================================================================== +//STEP010 EXEC PGM=ZAN01CHK +//ZAN01R01 DD DSN=OVT-APPLY.DAT,DISP=SHR +//ZAN01W01 DD DSN=OVT-VALID.DAT,DISP=(NEW,PASS) +//ZAN01W02 DD DSN=OVT-CANCEL.DAT,DISP=(NEW,PASS) +//ZAN01W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS) +``` + +### ZANJ012 — 時間帯重複チェック + +```jcl +//ZANJ012 JOB (ACCT),'時間帯重複チェック',CLASS=A +//* +//*--- パラメータ定義 --- +//SETPARM SET YEARMONTH=202605 +//* +//*===================================================================== +//* STEP012S: 有効申請 SORT +//*===================================================================== +//STEP012S EXEC PGM=SORT +//SORTIN DD DSN=OVT-VALID.DAT,DISP=(OLD,DELETE) +//SORTOUT DD DSN=OVT-VSORT.DAT,DISP=(NEW,PASS) +//SYSIN DD * + SORT FIELDS=(9,8,CH,A,17,8,CH,A,25,4,CH,A),EQUALS +/* +//* +//*===================================================================== +//* STEP012: 重複チェック +//*===================================================================== +//STEP012 EXEC PGM=ZAN02CHK,PARM='YEARMONTH=&YEARMONTH' +//ZAN02R01 DD DSN=OVT-VSORT.DAT,DISP=(OLD,DELETE) +//ZAN02W01 DD DSN=OVT-NODUP.DAT,DISP=(NEW,PASS) +//ZAN02W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS) +``` + +### ZANJ013 — 打刻時間照合 + +```jcl +//ZANJ013 JOB (ACCT),'打刻時間照合',CLASS=A +//* +//*--- パラメータ定義 --- +//SETPARM SET YEARMONTH=202605 +//* +//*===================================================================== +//* STEP013S: 打刻データ SORT +//*===================================================================== +//STEP013S EXEC PGM=SORT +//SORTIN DD DSN=EDITED-PUNCH.DAT,DISP=SHR +//SORTOUT DD DSN=PUNCH-SORTED.DAT,DISP=(NEW,PASS) +//SYSIN DD * + SORT FIELDS=(1,8,CH,A,9,8,CH,A),EQUALS +/* +//* +//*===================================================================== +//* STEP013: 打刻照合 + 曜日判定 +//*===================================================================== +//STEP013 EXEC PGM=ZAN03CHK,PARM='YEARMONTH=&YEARMONTH' +//ZAN03R01 DD DSN=OVT-NODUP.DAT,DISP=(OLD,DELETE) +//ZAN03R02 DD DSN=PUNCH-SORTED.DAT,DISP=(OLD,DELETE) +//ZAN03R03 DD DSN=HOLIDAY-FILE.DAT,DISP=SHR +//ZAN03W01 DD DSN=OVT-CHECKED.DAT,DISP=(NEW,PASS) +//ZAN03W02 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS) +``` + +### ZANJ015 — 取消マッチング + +```jcl +//ZANJ015 JOB (ACCT),'取消マッチング',CLASS=A +//* +//*--- パラメータ定義 --- +//SETPARM SET YEARMONTH=202605 +//* +//*===================================================================== +//* STEP015S1: チェック済データ SORT +//*===================================================================== +//STEP015SA EXEC PGM=SORT +//SORTIN DD DSN=OVT-CHECKED.DAT,DISP=(OLD,DELETE) +//SORTOUT DD DSN=OVT-SORTED.DAT,DISP=(NEW,PASS) +//SYSIN DD * + SORT FIELDS=(1,8,CH,A),EQUALS +/* +//* +//*===================================================================== +//* STEP015S2: 取消データ SORT +//*===================================================================== +//STEP015SB EXEC PGM=SORT +//SORTIN DD DSN=OVT-CANCEL.DAT,DISP=(OLD,DELETE) +//SORTOUT DD DSN=OVT-CSORT.DAT,DISP=(NEW,PASS) +//SYSIN DD * + SORT FIELDS=(1,8,CH,A),EQUALS +/* +//* +//*===================================================================== +//* STEP015: マッチング +//*===================================================================== +//STEP015 EXEC PGM=ZAN04MAT,PARM='YEARMONTH=&YEARMONTH' +//ZAN04R01 DD DSN=OVT-SORTED.DAT,DISP=(OLD,DELETE) +//ZAN04R02 DD DSN=OVT-CSORT.DAT,DISP=(OLD,DELETE) +//ZAN04W01 DD DSN=OVT-MATCHED.DAT,DISP=(NEW,PASS) +//ZAN04W02 DD DSN=OVT-DBCLEAN.DAT,DISP=(NEW,PASS) +//ZAN04W03 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS) +``` + +### ZANJ020 — 残業時間集計 + +```jcl +//ZANJ020 JOB (ACCT),'残業時間集計',CLASS=A +//* +//*--- パラメータ定義 --- +//SETPARM SET YEARMONTH=202605 +//* +//*===================================================================== +//* STEP020S: マッチング済データ SORT +//*===================================================================== +//STEP020S EXEC PGM=SORT +//SORTIN DD DSN=OVT-MATCHED.DAT,DISP=(OLD,DELETE) +//SORTOUT DD DSN=OVT-SORTED2.DAT,DISP=(NEW,PASS) +//SYSIN DD * + SORT FIELDS=(1,8,CH,A,35,2,CH,A),EQUALS +/* +//* +//*===================================================================== +//* STEP020: キーブレイク集計 +//*===================================================================== +//STEP020 EXEC PGM=ZAN05CAL,PARM='YEARMONTH=&YEARMONTH' +//ZAN05R01 DD DSN=OVT-SORTED2.DAT,DISP=(OLD,DELETE) +//ZAN05W01 DD DSN=OVT-SUMMARY.DAT,DISP=(NEW,PASS) +``` + +### ZANJ025 — 残業統計DB更新 + +```jcl +//ZANJ025 JOB (ACCT),'残業統計DB更新',CLASS=A +//* +//*--- パラメータ定義 --- +//SETPARM SET YEARMONTH=202605 +//* +//*===================================================================== +//* STEP025: DB更新(SORT不要) +//*===================================================================== +//STEP025 EXEC PGM=ZAN06UPD,PARM='YEARMONTH=&YEARMONTH' +//ZAN06R01 DD DSN=OVT-SUMMARY.DAT,DISP=(OLD,DELETE) +//ZAN06R02 DD DSN=OVT-DBCLEAN.DAT,DISP=(OLD,DELETE) +//ZAN06W01 DD DSN=ERROR-LOG.DAT,DISP=(NEW,PASS) +``` + +### 実行順序 + +BサブシステムのJOBは、AサブシステムのKINJ020(打刻チェック)出力を入力とする。 +そのためJCL起動時は以下の順序を保証すること。 + +1. Aサブシステム KINJ020(KIN03PCK)→ EDITED-PUNCH生成 +2. Bサブシステム ZANJ010〜ZANJ025(必要時順次実行) + +KINJ030(日別計算)は各打刻確定後であればいつでも実行可能で、ZANJ系列との依存関係はない。 + +--- + +## プログラム詳細 + +### STEP010: ZAN01CHK(残業申請振分処理) — 振り分け + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 残業申請振分処理 | +| **PGMパターン** | 振り分け | +| **SORT前処理** | 不要 | +| **入力ファイル** | OVT-APPLY(80B / CSV形式) | +| **出力ファイル** | OVT-VALID(80B)/ OVT-CANCEL(80B)/ ERROR-LOG(VB) | +| **件数変化** | N件 → 有効M件 + 取消K件 + 異常L件(M+K+L=N) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND), SUB04CHK(項目チェック) | + +**入力CSVレコード例:** `A001,EMP001,20260610,1800,2000,0` + +**機能:** + +1. READ OVT-APPLY +2. **UNSTRING** でCSVレコードを各項目に分解 +3. **UNSTRING TALLYING** でカンマ区切り数をカウント(項目数妥当性確認) +4. **EVALUATE** でステータスを判定 + - 0 or 1 → 有効申請として次へ + - 9 → OVT-CANCEL に書出し + - その他 → エラーとして処理 +5. SUB04CHK で日付(DATE8)・時刻(TIME4)・社員番号(NUMERIC)を検証 +6. 加班時間計算(時刻はHHMM形式のため分単位に変換してから減算) + ``` + 開始分 = (開始時刻 / 100) * 60 + (開始時刻 - (開始時刻 / 100) * 100) + 終了分 = (終了時刻 / 100) * 60 + (終了時刻 - (終了時刻 / 100) * 100) + 加班時間(分) = 終了分 - 開始分 + ``` + - 開始時刻 < DINNER-START(1830) → エラー(18:30以前は食事時間のため加班不可) + - 加班時間 < 30分 → エラー(0.5h未満) + - 開始時刻 ≧ 終了時刻 → エラー +7. 通過 → OVT-VALID に書出し +8. エラー → 該当レコードをERROR-LOG用01レコードにMOVEしてWRITE出力 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| UNSTRING | CSVレコードの項目分解(TALLYING句で区切り数カウント) | +| STRING | エラーレコード編集 | + +--- + +### STEP012: ZAN02CHK(時間帯重複チェック処理) — 項目チェック + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 時間帯重複チェック処理 | +| **PGMパターン** | 項目チェック | +| **SORT前処理** | OVT-VALID → 社員番号+日付+開始時刻昇順 | +| **入力ファイル** | OVT-VSORT(80B) | +| **出力ファイル** | OVT-NODUP(80B)/ ERROR-LOG(VB) | +| **件数変化** | M件 → 通過K件 + 重複エラー(M-K)件 | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +OVT-VSORT は既に社員番号+日付+開始時刻でソート済。順次READしながら直前レコードと比較する。 + +1. READ OVT-VSORT → 現レコード取得成功 +2. 直前レコードと同一社員番号+日付 かつ 前終了時刻 > 現開始時刻 の場合 → **時間帯重複** + - 境界接続(前終了時刻 = 現開始時刻)は重複としない +3. 重複 → ERROR-LOG へ +4. 重複なし → OVT-NODUP へ書出し +5. 社員番号 or 日付が変わったら直前レコードをリセット +6. **SET** で重複有無フラグを設定 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| SET | 重複有無フラグ設定 | +| CONTINUE | リセット時の空処理 | + +--- + +### STEP013: ZAN03CHK(打刻時間照合処理) — マッチング(N:1) + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 打刻時間照合処理 | +| **PGMパターン** | マッチング(N:1) | +| **SORT前処理** | EDITED-PUNCH → 社員番号+日付昇順 | +| **入力ファイル** | OVT-NODUP(80B)/ PUNCH-SORTED(80B) | +| **出力ファイル** | OVT-CHECKED(80B)/ ERROR-LOG(VB) | +| **件数変化** | K件 → 通過P件 + エラー(K-P)件 | +| **使用共通関数** | SUB02MSG(メッセージ) | + +**機能:** + +#### Step1:打刻時間内チェック + +OVT-NODUP と PUNCH-SORTED を社員番号+日付で突合(共にソート済のため順次READで処理可)。 + +1. READ OVT-NODUP → 現レコード +2. 該当社員番号+日付の打刻レコードを PUNCH-SORTED から READ +3. 打刻データあり かつ 以下を両方満たすことを確認: + - 申請開始時刻 ≧ 出勤時刻 + - 申請終了時刻 ≦ 退勤時刻 +4. 範囲外 または 打刻データなし → ERROR-LOG + +#### Step2:曜日判定 + +**SEARCH ALL** で休日マスタファイル(WORKING-STORAGE)を検索し、申請日の種別を判定。 +Aサブシステムと同一の休日定義に従う(HOLIDAY-FILEファイル相当のデータを保持)。 + +##### 休日ファイル初期化手順 + +初期処理(1000ITTSOR)でHOLIDAY-FILEを全件READし、WORKING-STORAGEのHOLIDAY-TABLEに格納する。 + +``` +* 休日データ取得(ファイル読込み) + OPEN INPUT HOLIDAY-FILE + READ HOLIDAY-FILE + ... 逐次処理 + CLOSE HOLIDAY-FILE +``` + +``` +01 HOLIDAY-TABLE. + 05 HOLIDAY-CNT PIC 9(004). + 05 HOLIDAY-DATA OCCURS 1 TO 366 TIMES + DEPENDING ON HOLIDAY-CNT + INDEXED BY HD-IDX. + 10 HD-DATE PIC 9(008). + 10 HD-TYPE PIC X(001). + 88 HD-HOLIDAY VALUE 'H'. +``` + +``` +SET HD-IDX TO 1 +SEARCH ALL HOLIDAY-DATA + AT END + SET OVT-TYPE TO 'W' + WHEN HD-DATE(HD-IDX) = APPL-DATE + IF HD-HOLIDAY(HD-IDX) + SET OVT-TYPE TO 'H' + ELSE + SET OVT-TYPE TO 'W' + END-IF +END-SEARCH +``` + +- HOLIDAY-FILE該当 → OVT-TYPE='H' +- 該当なし → OVT-TYPE='W' + +**MOVE** で OVT-TYPE を設定。 + +全通過レコードは OVT-TYPE を付加して OVT-CHECKED に書出し。 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| SEARCH ALL | 休日マスタテーブル二分探索 | +| SET | テーブル添字操作 | + +--- + +### STEP015: ZAN04MAT(取消マッチング処理) — マッチング1:1 + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 取消マッチング処理 | +| **PGMパターン** | マッチング(1:1) | +| **SORT前処理** | OVT-CHECKED → 申請番号昇順 | +| | OVT-CANCEL → 申請番号昇順 | +| **入力ファイル** | OVT-SORTED(80B)/ OVT-CSORT(80B) | +| **出力ファイル** | OVT-MATCHED(80B)/ OVT-DBCLEAN(80B)/ ERROR-LOG(VB) | +| **件数変化** | 有効P件 + 取消R件 → 通過Q件 + 消滅S件 + DB削除T件(P=Q+S, R=S+T) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +キー=**申請番号(APPL-ID)** で OVT-SORTED(有効申請)と OVT-CSORT(取消)をマッチング1:1。 + +マッチング制御の分岐: + +| 条件 | 結果 | 処理 | +|------|------|------| +| SORTED.APPL-ID < CSORT.APPL-ID | 申請のみ(取消なし) | OVT-MATCHEDへ | +| SORTED.APPL-ID = CSORT.APPL-ID | 両方あり(取消済) | 消滅(出力なし)。ただし監査のため取消情報をERROR-LOGに記録(エラー区分=03、取消申請番号+原本データ) | +| SORTED.APPL-ID > CSORT.APPL-ID | 取消のみ(既DB登録済) | OVT-DBCLEANへ | + +同一申請番号グループ内の出力順に **処理番号(OA-PROC-SEQ)** を1から付与する。 + +**STRING** で申請情報を編集して OVT-MATCHED に書出す。 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| STRING | 申請情報編集出力 | + +--- + +### STEP020: ZAN05CAL(残業時間集計処理) — キーブレイク集計 + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 残業時間集計処理 | +| **PGMパターン** | キーブレイク(集計) | +| **SORT前処理** | OVT-MATCHED → 申請番号+処理番号昇順 | +| **入力ファイル** | OVT-SORTED2(80B) | +| **出力ファイル** | OVT-SUMMARY(80B) | +| **件数変化** | Q件 → 申請番号ユニーク数(L件、L≦Q) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND), SUB05TIM(時刻丸め) | + +**機能:** + +#### Step1:キーブレイク制御 + +同一申請番号内に複数レコード(例:申請(0) + 承認済(1))がある場合、グループ内の**最終レコード**を集約結果として採用する。 + +``` +入力(申請番号+処理番号昇順): +A001,EMP01,6/10,1800,2000,0 ← 申請(処理番号1) +A001,EMP01,6/10,1800,2000,1 ← 承認済(処理番号2 → 最新) + +集約結果: 承認済(1) を採用、申請(0) は捨てる +``` + +- READ → 申請番号が変わるまで読み進める +- ブレイク(申請番号切替)時に、**直前に保持していたレコード**を出力 +- グループ内の途中レコードは **CONTINUE** で読み飛ばす +- **SET** で集約結果の有無フラグを設定 + +#### Step2:加班時間計算 + +終了時刻 - 開始時刻 を分数で計算 → **DIVIDE** で時間に変換。 + +``` +DIVIDE 分 BY 60 GIVING 時間 REMAINDER 剰余 +``` + +**SUB05TIM(mode 2:0.1h単位切捨)** を呼び出して丸め処理。加班の丸めは0.1h単位切捨が正となる。 + +**COMPUTE ROUNDED ON SIZE ERROR** で内部計算のエラー処理。 + +``` +COMPUTE WRK-OVT-HOURS ROUNDED = WRK-MINUTES / 60 + ON SIZE ERROR + CONTINUE + MOVE ZERO TO WRK-OVT-HOURS +END-COMPUTE +``` + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| COMPUTE ROUNDED ON SIZE ERROR | 丸め計算+エラー処理 | +| DIVIDE | 分→時間変換 | +| CONTINUE | キーブレイク制御の空分岐 | +| SET | 集計結果フラグ設定 | +| ACCEPT FROM DATE | 処理日付取得 | + +--- + +### STEP025: ZAN06UPD(残業統計DB更新処理) — DB更新 + +| 項目 | 内容 | +|------|------| +| **プログラム名称** | 残業統計DB更新処理 | +| **PGMパターン** | DB更新 | +| **SORT前処理** | 不要 | +| **入力ファイル** | OVT-SUMMARY(80B)/ OVT-DBCLEAN(80B) | +| **出力ファイル** | OVERTIME-DB(DB2)/ ERROR-LOG(VB) | +| **使用共通関数** | SUB01DAT(運用日付), SUB02MSG(メッセージ), SUB03END(ABEND) | + +**機能:** + +全DB操作は埋め込みSQL(`EXEC SQL`)で直接記述する。 + +#### 処理1:OVT-SUMMARY → DB登録 + +**EXEC SQL** でDB2にINSERT/UPDATEを発行する。 + +``` + EXEC SQL + INSERT INTO OVT-APPLICATIONS + (APPL-ID, EMP-ID, APPL-DATE, OVT-TYPE, + START-TIME, END-TIME, OVT-HOURS, STATUS) + VALUES + (:WRK-APPL-ID, :WRK-EMP-ID, :WRK-APPL-DATE, + :WRK-OVT-TYPE, :WRK-START-TIME, :WRK-END-TIME, + :WRK-OVT-HOURS, :WRK-STATUS) + END-EXEC. + + IF SQLCODE NOT = 0 + * 同一APPL-ID存在 → UPDATEに変更 + EXEC SQL + UPDATE OVT-APPLICATIONS SET + STATUS = :WRK-STATUS, + UPDATED-AT = CURRENT TIMESTAMP + WHERE APPL-ID = :WRK-APPL-ID + END-EXEC + END-IF. +``` + +OVT-MONTHLY のUPSERTも同様。 + +``` + EXEC SQL + SELECT OVT-HOURS, OVT-COUNT + INTO :DB-OVT-HOURS, :DB-OVT-COUNT + FROM OVT-MONTHLY + WHERE EMP-ID = :WRK-EMP-ID + AND YEAR-MONTH = :WRK-YEAR-MONTH + AND OVT-TYPE = :WRK-OVT-TYPE + END-EXEC. + + IF SQLCODE = 0 + * UPDATE(加算) + EXEC SQL + UPDATE OVT-MONTHLY SET + OVT-HOURS = OVT-HOURS + :WRK-OVT-HOURS, + OVT-COUNT = OVT-COUNT + 1, + UPDATED-AT = CURRENT TIMESTAMP + WHERE EMP-ID = :WRK-EMP-ID + AND YEAR-MONTH = :WRK-YEAR-MONTH + AND OVT-TYPE = :WRK-OVT-TYPE + END-EXEC + ELSE + * INSERT(新規) + EXEC SQL + INSERT INTO OVT-MONTHLY + (EMP-ID, YEAR-MONTH, OVT-TYPE, + OVT-HOURS, OVT-COUNT, UPDATED-AT) + VALUES + (:WRK-EMP-ID, :WRK-YEAR-MONTH, :WRK-OVT-TYPE, + :WRK-OVT-HOURS, 1, CURRENT TIMESTAMP) + END-EXEC + END-IF. +``` + +#### 処理2:OVT-DBCLEAN → DB取消 + +``` + EXEC SQL + UPDATE OVT-APPLICATIONS SET + STATUS = '9', + UPDATED-AT = CURRENT TIMESTAMP + WHERE APPL-ID = :WRK-APPL-ID + END-EXEC. + + IF SQLCODE NOT = 0 + 該当なし → ERROR-LOG に書出し + PERFORM 9999ABDSOR + END-IF. +``` + +OVT-MONTHLY の減算UPDATE: + +``` + EXEC SQL + UPDATE OVT-MONTHLY SET + OVT-HOURS = OVT-HOURS - :WRK-OVT-HOURS, + OVT-COUNT = OVT-COUNT - 1, + UPDATED-AT = CURRENT TIMESTAMP + WHERE EMP-ID = :WRK-EMP-ID + AND YEAR-MONTH = :WRK-YEAR-MONTH + AND OVT-TYPE = :WRK-OVT-TYPE + END-EXEC. + + IF SQLCODE NOT = 0 + * OVT-MONTHLYレコード不存在 → データ不整合の可能性 + 該当エラー → ERROR-LOG に書出し + PERFORM 9999ABDSOR + END-IF. +``` + +**注意**: OVT-MONTHLY減算UPDATEの失敗時は、OVT-MONTHLYに対応レコードが存在しないことを意味する。 +ファイルとDBの不整合としてエラーログに記録した上でABENDさせる。 + +**SQLCODE** でDB操作の成否を確認し、異常時は ERROR-LOG に出力。 + +**新規カバレッジ構文:** + +| 構文 | 用途 | +|------|------| +| EXEC SQL | DB2埋め込みSQLによるDB操作 | +| IF | SQLCODE判定による分岐 | +| PERFORM VARYING | 月バリデーションループ(1〜12月) | +| PERFORM TEST AFTER | OVT-MONTHLY減算リトライ制御 | +| MULTIPLY | 時間→分変換(MULTIPLY BY 60 GIVING) | +| SUBTRACT | 残容量検証(SUBTRACT FROM GIVING) | + +--- + +## レコード構成 + +### OVT-VALID / OVT-CANCEL / OVT-NODUP / OVT-CHECKED(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 | +|---|------|------|------|------|------|------| +| 1 | 申請番号 | OA-APPL-ID | 1 | 8 | X(8) | | +| 2 | 社員番号 | OA-EMP-ID | 9 | 8 | 9(8) | | +| 3 | 申請日 | OA-APPL-DATE | 17 | 8 | 9(8) | YYYYMMDD | +| 4 | 開始時刻 | OA-START-TIME | 25 | 4 | 9(4) | HHMM | +| 5 | 終了時刻 | OA-END-TIME | 29 | 4 | 9(4) | HHMM | +| 6 | ステータス | OA-STATUS | 33 | 1 | X(1) | 0/1/9 | +| 7 | OVT-TYPE | OA-OVT-TYPE | 34 | 1 | X(1) | W/H(OVT-CHECKED以降のみ有効) | +| 8 | 予備 | OA-FILLER | 35 | 46 | X(46) | | + +### OVT-MATCHED(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 | +|---|------|------|------|------|------|------| +| 1 | 申請番号 | OA-APPL-ID | 1 | 8 | X(8) | | +| 2 | 社員番号 | OA-EMP-ID | 9 | 8 | 9(8) | | +| 3 | 申請日 | OA-APPL-DATE | 17 | 8 | 9(8) | YYYYMMDD | +| 4 | 開始時刻 | OA-START-TIME | 25 | 4 | 9(4) | HHMM | +| 5 | 終了時刻 | OA-END-TIME | 29 | 4 | 9(4) | HHMM | +| 6 | ステータス | OA-STATUS | 33 | 1 | X(1) | 0/1 | +| 7 | OVT-TYPE | OA-OVT-TYPE | 34 | 1 | X(1) | W/H | +| 8 | 処理番号 | OA-PROC-SEQ | 35 | 2 | 9(2) | 同申請内連番 | +| 9 | 予備 | OA-FILLER | 37 | 44 | X(44) | | + +社員名・部署コードは DB2(OVT-APPLICATIONSテーブル)側で保持する。 + +### OVT-SUMMARY(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | 備考 | +|---|------|------|------|------|------|------| +| 1 | 申請番号 | OS-APPL-ID | 1 | 8 | X(8) | | +| 2 | 社員番号 | OS-EMP-ID | 9 | 8 | 9(8) | | +| 3 | 申請日 | OS-APPL-DATE | 17 | 8 | 9(8) | YYYYMMDD | +| 4 | 開始時刻 | OS-START-TIME | 25 | 4 | 9(4) | HHMM | +| 5 | 終了時刻 | OS-END-TIME | 29 | 4 | 9(4) | HHMM | +| 6 | 加班時間 | OS-OVT-HOURS | 33 | 5 | 9(4)V9(1) | SUB05TIM丸め後 | +| 7 | OVT-TYPE | OS-OVT-TYPE | 38 | 1 | X(1) | W/H | +| 8 | 予備 | OS-FILLER | 39 | 42 | X(42) | | + +### OVT-DBCLEAN(80B) + +| # | 項目 | 名称 | 開始 | 長さ | 属性 | +|---|------|------|------|------|------| +| 1 | 申請番号 | OD-APPL-ID | 1 | 8 | X(8) | +| 2 | 予備 | OD-FILLER | 9 | 72 | X(72) | + +--- + +## 新規COBOL構文カバレッジ一覧(14種) + +| # | 構文 | ZAN01CHK | ZAN02CHK | ZAN03CHK | ZAN04MAT | ZAN05CAL | ZAN06UPD | +|---|------|:--------:|:--------:|:--------:|:--------:|:--------:|:--------:| +| 1 | UNSTRING | ● | | | | | | +| 2 | STRING | ● | | | ● | | | +| 3 | SEARCH ALL | | | ● | | | | +| 4 | SET | | ● | ● | | ● | | +| 5 | COMPUTE ROUNDED ON SIZE ERROR | | | | | ● | | +| 6 | DIVIDE | ● | | | | ● | | +| 7 | CONTINUE | | ● | | | ● | | +| 8 | ACCEPT FROM DATE | | | | | ● | | +| 9 | EXEC SQL(INSERT/UPDATE/SELECT/COMMIT/ROLLBACK) | | | | | | ● | +|10 | IF(SQLCODE分岐) | | | | | | ● | +|11 | PERFORM VARYING | | | | | | ● | +|12 | PERFORM TEST AFTER | | | | | | ● | +|13 | MULTIPLY | | | | | | ● | +|14 | SUBTRACT | | | | | | ● | + +--- + +## 丸めルール + +| 条件 | ルール | +|------|--------| +| 加班開始時刻 < DINNER-START(1830) | エラー(申請不可、食事時間のため) | +| 加班時間 < 30分 | エラー(申請不可) | +| 加班時間 ≧ 30分 かつ < 0.5h換算 | 0.5hに切上 | +| 加班時間 ≧ 0.5h | 0.1h単位切捨(SUB05TIM mode 2) | + +例:0.5h→0.5, 0.7h→0.7, 1.55h→1.5(切捨のため1.5、切上なら1.6) diff --git a/production/src/KIN01INP.cbl b/production/src/KIN01INP.cbl new file mode 100644 index 0000000..f59308e --- /dev/null +++ b/production/src/KIN01INP.cbl @@ -0,0 +1,594 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN01INP. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN01INP * + * プログラム名 : 休暇申請CSV取込・検証処理 * + * 作成日 : 2026-06-17 * + * 処理概要 : CSV形式の休暇申請ファイルを読み込み、 * + * 休暇種別テーブル検索と項目チェックを行い、 * + * ステータスによってWORK-LEAVEまたは * + * ERROR-LOGへ振り分ける。 * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-17 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO KIN01R01. + SELECT W01OUTFIL ASSIGN TO KIN01W01. + SELECT W02OUTFIL ASSIGN TO KIN01W02. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + 03 R01LINE PIC X(80). + * + ***************************************************************** + * ##W01## * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY KIN01REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * ##W02## * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W02OUTREC. + COPY KIN05REC REPLACING ==(A)== BY ==W02==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN01INP'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 03 CNS-STAT-1 PIC X(001) VALUE '1'. + 03 CNS-STAT-9 PIC X(001) VALUE '9'. + 03 CNS-LEAVE-01 PIC X(002) VALUE '01'. + 03 CNS-LEAVE-02 PIC X(002) VALUE '02'. + 03 CNS-LEAVE-03 PIC X(002) VALUE '03'. + 03 CNS-LEAVE-04 PIC X(002) VALUE '04'. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 運用日付 + 03 WRK-U06 PIC 9(008). + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + *** CSV分解用 + 03 WRK-COMMA-CNT PIC 9(002) COMP. + 03 WRK-COMMA-DISP PIC 9(002). + 03 WRK-LT-FOUND PIC X(001). + 03 WRK-ERR-TYPE PIC X(001). + 03 WRK-CSV-APPL-ID PIC X(009). + 03 WRK-CSV-EMP-ID PIC X(008). + 03 WRK-CSV-START-DATE PIC X(008). + 03 WRK-CSV-START-TIME PIC X(004). + 03 WRK-CSV-END-DATE PIC X(008). + 03 WRK-CSV-END-TIME PIC X(004). + 03 WRK-CSV-LEAVE-TYPE PIC X(002). + 03 WRK-CSV-STATUS PIC X(001). + *** ステータス再定義(数値+88条件) + 03 WRK-STATUS-NUM REDEFINES WRK-CSV-STATUS + PIC 9(001). + 88 WRK-STATUS-ACTIVE VALUE 1. + 88 WRK-STATUS-CANCEL VALUE 9. + *** 休暇種別内部テーブル(4件) + 03 WRK-LEAVE-TYPE-TABLE. + 05 WRK-LT-ENTRY OCCURS 4 TIMES + INDEXED BY WRK-LT-IDX. + 07 WRK-LT-CODE PIC X(002). + *** REDEFINESデモ(同一領域 複数型 来回代入) + 03 WRK-DEMO-AREA PIC 9(008). + 03 WRK-DEMO-ALPHA REDEFINES WRK-DEMO-AREA + PIC X(008). + 03 WRK-DEMO-GRP REDEFINES WRK-DEMO-AREA. + 05 WRK-DEMO-TYPE PIC 9(004). + 05 WRK-DEMO-VALUE PIC 9(004). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + *** 項目チェックSR用 + COPY ZANCHKAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF = '1'. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 休暇種別テーブル設定 + MOVE '01' TO WRK-LT-CODE(1). + MOVE '02' TO WRK-LT-CODE(2). + MOVE '03' TO WRK-LT-CODE(3). + MOVE '04' TO WRK-LT-CODE(4). + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD = ZERO + MOVE D01UBSUDATE TO WRK-U06 + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + OUTPUT W01OUTFIL + W02OUTFIL. + * + *** #R01#を読み込み + PERFORM 1100R01INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:##R01##読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : CSV分解・休暇種別検索・ステータス振分 * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** CSV分解 + PERFORM 2010CSVSOR. + * + *** 休暇種別テーブル検索 + PERFORM 2020LEAVSERSOR. + * + *** エラー判定(フィールド数/休暇種別) + IF WRK-COMMA-CNT NOT = 8 + MOVE 'F' TO WRK-ERR-TYPE + PERFORM 2050ERRORSOR + ELSE IF WRK-LT-FOUND NOT = '1' + MOVE 'L' TO WRK-ERR-TYPE + PERFORM 2050ERRORSOR + ELSE + *** ステータス判定(IF/ELSE連鎖) + IF WRK-STATUS-ACTIVE + PERFORM 2030VALIDATESOR + ELSE IF WRK-STATUS-CANCEL + PERFORM 2040CANCELSOR + ELSE + MOVE 'S' TO WRK-ERR-TYPE + PERFORM 2050ERRORSOR + END-IF + END-IF. + * + *** 次のレコード読込 + PERFORM 1100R01INNSOR. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: CSV分解処理 * + * 処理概要 : UNSTRINGでCSVを8項目に分解する * + ***************************************************************** + 2010CSVSOR SECTION. + * + MOVE ZERO TO WRK-COMMA-CNT. + INITIALIZE WRK-CSV-APPL-ID + WRK-CSV-EMP-ID + WRK-CSV-START-DATE + WRK-CSV-START-TIME + WRK-CSV-END-DATE + WRK-CSV-END-TIME + WRK-CSV-LEAVE-TYPE + WRK-CSV-STATUS. + UNSTRING R01INNREC + DELIMITED BY ',' + INTO WRK-CSV-APPL-ID + WRK-CSV-EMP-ID + WRK-CSV-START-DATE + WRK-CSV-START-TIME + WRK-CSV-END-DATE + WRK-CSV-END-TIME + WRK-CSV-LEAVE-TYPE + WRK-CSV-STATUS + TALLYING IN WRK-COMMA-CNT + END-UNSTRING. + * + 2010CSVSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: 休暇種別テーブル検索処理 * + * 処理概要 : SEARCH(非ALL)で休暇種別の妥当性を検証 * + ***************************************************************** + 2020LEAVSERSOR SECTION. + * + MOVE '0' TO WRK-LT-FOUND. + SET WRK-LT-IDX TO 1. + SEARCH WRK-LT-ENTRY + VARYING WRK-LT-IDX + AT END + CONTINUE + WHEN WRK-LT-CODE(WRK-LT-IDX) + = WRK-CSV-LEAVE-TYPE + MOVE '1' TO WRK-LT-FOUND + END-SEARCH. + * + 2020LEAVSERSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名: 有効申請処理 * + * 処理概要 : SUB04CHKで日付/時刻チェックしW01出力 * + ***************************************************************** + 2030VALIDATESOR SECTION. + * + *** W01レコード初期化 + INITIALIZE W01OUTREC. + * + *** SUB04CHKで社員番号チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-EMP-ID TO C01CHKDAT. + MOVE 'EMPID' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W02ERR-CATEGORY + STRING 'EMP-ID ERROR EMP=' + WRK-CSV-EMP-ID + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WRITE W02OUTREC + ADD 1 TO CUN-W02OUT + GO TO 2030VALIDATESOR-EXT + END-IF. + * + *** SUB04CHKで開始日付チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-START-DATE TO C01CHKDAT. + MOVE 'DATE' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W02ERR-CATEGORY + STRING 'START-DATE ERROR EMP=' + WRK-CSV-EMP-ID + ' DATE=' + WRK-CSV-START-DATE + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WRITE W02OUTREC + ADD 1 TO CUN-W02OUT + GO TO 2030VALIDATESOR-EXT + END-IF. + * + *** SUB04CHKで開始時刻チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-START-TIME TO C01CHKDAT. + MOVE 'TIME' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W02ERR-CATEGORY + STRING 'START-TIME ERROR EMP=' + WRK-CSV-EMP-ID + ' TIME=' + WRK-CSV-START-TIME + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WRITE W02OUTREC + ADD 1 TO CUN-W02OUT + GO TO 2030VALIDATESOR-EXT + END-IF. + * + *** SUB04CHKで終了日付チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-END-DATE TO C01CHKDAT. + MOVE 'DATE' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W02ERR-CATEGORY + STRING 'END-DATE ERROR EMP=' + WRK-CSV-EMP-ID + ' DATE=' + WRK-CSV-END-DATE + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WRITE W02OUTREC + ADD 1 TO CUN-W02OUT + GO TO 2030VALIDATESOR-EXT + END-IF. + * + *** SUB04CHKで終了時刻チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-END-TIME TO C01CHKDAT. + MOVE 'TIME' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W02ERR-CATEGORY + STRING 'END-TIME ERROR EMP=' + WRK-CSV-EMP-ID + ' TIME=' + WRK-CSV-END-TIME + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WRITE W02OUTREC + ADD 1 TO CUN-W02OUT + GO TO 2030VALIDATESOR-EXT + END-IF. + * + *** 複合条件デモ(AND+OR+3段ネスト) + IF W01START-DATE NOT = ZERO + AND W01END-DATE NOT = ZERO + AND W01START-TIME NOT = ZERO + IF W01START-DATE > W01END-DATE + OR (W01START-DATE = W01END-DATE + AND W01START-TIME >= W01END-TIME) + MOVE 10 TO WRK-DEMO-TYPE + ELSE + MOVE 20 TO WRK-DEMO-TYPE + END-IF + END-IF. + * + *** W01出力(新規/変更: APPL-ID=CSV値, STATUS='1') + MOVE WRK-CSV-APPL-ID TO W01APPL-ID. + MOVE WRK-CSV-EMP-ID TO W01EMP-ID. + MOVE WRK-CSV-LEAVE-TYPE TO W01LEAVE-TYPE. + MOVE WRK-CSV-START-DATE TO W01START-DATE. + MOVE WRK-CSV-START-TIME TO W01START-TIME. + MOVE WRK-CSV-END-DATE TO W01END-DATE. + MOVE WRK-CSV-END-TIME TO W01END-TIME. + MOVE WRK-CSV-STATUS TO W01STATUS. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 2030VALIDATESOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.4) * + * サブモジュール名: 取消申請処理 * + * 処理概要 : 取消レコードをW01出力(検証は行わない) * + ***************************************************************** + 2040CANCELSOR SECTION. + * + *** W01レコード初期化 + INITIALIZE W01OUTREC. + * + *** W01出力(取消: APPL-ID=CSV値, STATUS='9') + MOVE WRK-CSV-APPL-ID TO W01APPL-ID. + MOVE WRK-CSV-EMP-ID TO W01EMP-ID. + MOVE WRK-CSV-LEAVE-TYPE TO W01LEAVE-TYPE. + MOVE WRK-CSV-START-DATE TO W01START-DATE. + MOVE WRK-CSV-START-TIME TO W01START-TIME. + MOVE WRK-CSV-END-DATE TO W01END-DATE. + MOVE WRK-CSV-END-TIME TO W01END-TIME. + MOVE WRK-CSV-STATUS TO W01STATUS. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 2040CANCELSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.5) * + * サブモジュール名: エラー処理 * + * 処理概要 : エラーレコードをW02出力 * + ***************************************************************** + 2050ERRORSOR SECTION. + * + *** W02レコード初期化 + INITIALIZE W02OUTREC. + MOVE '01' TO W02ERR-CATEGORY. + * + *** エラー種別判定 + EVALUATE WRK-ERR-TYPE + WHEN 'F' + MOVE 1 TO WRK-DEMO-TYPE + MOVE WRK-COMMA-CNT TO WRK-DEMO-VALUE + STRING 'FIELD COUNT ERROR CNT=' + WRK-DEMO-ALPHA + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WHEN 'L' + MOVE 2 TO WRK-DEMO-TYPE + MOVE 0 TO WRK-DEMO-VALUE + STRING 'INVALID LEAVE TYPE=' + WRK-CSV-LEAVE-TYPE + ' EMP=' + WRK-CSV-EMP-ID + ' ERR=' + WRK-DEMO-ALPHA + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WHEN 'S' + MOVE 3 TO WRK-DEMO-TYPE + MOVE 0 TO WRK-DEMO-VALUE + STRING 'INVALID STATUS=' + WRK-CSV-STATUS + ' EMP=' + WRK-CSV-EMP-ID + ' ERR=' + WRK-DEMO-ALPHA + DELIMITED BY SIZE + INTO W02ERR-DETAIL + WHEN OTHER + MOVE 9 TO WRK-DEMO-TYPE + MOVE 0 TO WRK-DEMO-VALUE + STRING 'UNKNOWN ERROR EMP=' + WRK-CSV-EMP-ID + ' ERR=' + WRK-DEMO-ALPHA + DELIMITED BY SIZE + INTO W02ERR-DETAIL + END-EVALUATE. + * + WRITE W02OUTREC. + ADD 1 TO CUN-W02OUT. + * + 2050ERRORSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL + W02OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN01R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN01W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN01W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名: ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/src/KIN02UPD.cbl b/production/src/KIN02UPD.cbl new file mode 100644 index 0000000..7feb5ee --- /dev/null +++ b/production/src/KIN02UPD.cbl @@ -0,0 +1,439 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN02UPD. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN02UPD * + * プログラム名 : 休暇申請DB更新処理 * + * 作成日 : 2026-06-17 * + * 処理概要 : WORK-LEAVEの各レコードをDB2テーブル * + * LEAVE_RECORDSに反映する。 * + * ステータスに応じて新規登録(INSERT)、 * + * 変更(DELETE+INSERT)、取消(DELETE)を行う。 * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-17 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO KIN01W01. + SELECT W01OUTFIL ASSIGN TO KIN02W01. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * R01 (WORK-LEAVE) 80B FB * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY KIN01REC REPLACING ==(A)== BY ==R01==. + * + * + ***************************************************************** + * W01 (ERROR-LOG) 200B VB * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W01OUTREC. + COPY KIN05REC REPLACING ==(A)== BY ==W01==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * SQLCA * + ***************************************************************** + EXEC SQL INCLUDE SQLCA END-EXEC. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN02UPD'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-DBXINS PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-DBXDEL PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-DBXUPD PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** EOF判定 + 03 WRK-R01EOF PIC X(001). + 88 WRK-R01-EOF VALUE '1'. + *** SQL用ホスト変数 + 03 WS-APPL-ID PIC 9(009). + 03 WS-EMP-ID PIC X(008). + 03 WS-LEAVE-TYPE PIC X(002). + 03 WS-START-DATE PIC X(008). + 03 WS-START-TIME PIC X(004). + 03 WS-END-DATE PIC X(008). + 03 WS-END-TIME PIC X(004). + 03 WS-STATUS PIC X(001). + *** SQLCODE表示用 + 03 WRK-SQLCODE-DISP PIC +9(009). + *** エラーログ編集領域 + 03 WRK-ERR-CATEGORY PIC 9(002). + 03 WRK-ERR-DETAIL PIC X(198). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01-EOF. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** DB接続 + EXEC SQL CONNECT TO 'data/kin.db' END-EXEC. + * + *** R01ファイルOPEN + OPEN INPUT R01INNFIL. + *** W01ファイルOPEN + OPEN OUTPUT W01OUTFIL. + * + *** R01を初回読込 + PERFORM 1100R01INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : WORK-LEAVE読込 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名:主処理 * + * 処理概要 : R01(WORK-LEAVE)→DB更新処理 * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** レコード処理 + PERFORM 2100PROCSOR. + * + *** 次レコード読込 + PERFORM 1100R01INNSOR. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名:レコード判定処理 * + * 処理概要 : ステータス判定→各DB更新処理分岐 * + ***************************************************************** + 2100PROCSOR SECTION. + * + MOVE R01APPL-ID TO WS-APPL-ID. + MOVE R01EMP-ID TO WS-EMP-ID. + MOVE R01LEAVE-TYPE TO WS-LEAVE-TYPE. + MOVE R01START-DATE TO WS-START-DATE. + MOVE R01START-TIME TO WS-START-TIME. + MOVE R01END-DATE TO WS-END-DATE. + MOVE R01END-TIME TO WS-END-TIME. + MOVE R01STATUS TO WS-STATUS. + * + EVALUATE TRUE + WHEN WS-STATUS = '1' + AND WS-APPL-ID = 0 + PERFORM 2110INSERTSOR + WHEN WS-STATUS = '1' + AND WS-APPL-ID > 0 + PERFORM 2120UPDATESOR + WHEN WS-STATUS = '9' + PERFORM 2130DELETESOR + WHEN OTHER + CONTINUE + END-EVALUATE. + * + 2100PROCSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1.1) * + * サブモジュール名:INSERT処理(新規登録) * + * 処理概要 : LEAVE_RECORDSに新規レコード追加 * + ***************************************************************** + 2110INSERTSOR SECTION. + * + EXEC SQL + INSERT INTO LEAVE_RECORDS + (EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, + END_DATE, END_TIME, + STATUS) + VALUES + (:WS-EMP-ID, :WS-LEAVE-TYPE, + :WS-START-DATE, :WS-START-TIME, + :WS-END-DATE, :WS-END-TIME, + :WS-STATUS) + END-EXEC. + * + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. + * + ADD 1 TO CUN-DBXINS. + * + 2110INSERTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1.2) * + * サブモジュール名:UPDATE処理(変更) * + * 処理概要 : DELETE(旧レコード)→INSERT(新レコード) * + ***************************************************************** + 2120UPDATESOR SECTION. + * + EXEC SQL + DELETE FROM LEAVE_RECORDS + WHERE APPLICATION_ID = :WS-APPL-ID + END-EXEC. + * + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. + * + EXEC SQL + INSERT INTO LEAVE_RECORDS + (EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, + END_DATE, END_TIME, + STATUS) + VALUES + (:WS-EMP-ID, :WS-LEAVE-TYPE, + :WS-START-DATE, :WS-START-TIME, + :WS-END-DATE, :WS-END-TIME, + :WS-STATUS) + END-EXEC. + * + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. + * + ADD 1 TO CUN-DBXUPD. + * + 2120UPDATESOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1.3) * + * サブモジュール名:DELETE処理(取消) * + * 処理概要 : APPL-ID一致レコードをDELETE * + ***************************************************************** + 2130DELETESOR SECTION. + * + EXEC SQL + DELETE FROM LEAVE_RECORDS + WHERE APPLICATION_ID = :WS-APPL-ID + END-EXEC. + * + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. + * + ADD 1 TO CUN-DBXDEL. + * + 2130DELETESOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名:終了処理 * + * 処理概要 : COMMIT・ファイルクローズ・件数出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** COMMIT + EXEC SQL + COMMIT WORK + END-EXEC. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL. + * + *** 件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'KIN01W01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'INS' TO M00UMKDATS22-01. + MOVE CUN-DBXINS TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'UPD' TO M00UMKDATS22-01. + MOVE CUN-DBXUPD TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'DEL' TO M00UMKDATS22-01. + MOVE CUN-DBXDEL TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN02W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名:メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.1) * + * サブモジュール名:DBエラー処理 * + * 処理概要 : SQLエラー→ROLLBACK+メッセージ出力+ABEND * + ***************************************************************** + 9100DBERRSOR SECTION. + * + *** ROLLBACK + EXEC SQL + ROLLBACK WORK + END-EXEC. + * + *** エラーログ出力 + INITIALIZE W01OUTREC. + MOVE '01' TO W01ERR-CATEGORY. + MOVE SQLCODE TO WRK-SQLCODE-DISP. + STRING 'KIN02UPD SQLCODE=' + WRK-SQLCODE-DISP DELIMITED BY SIZE + ' APPL-ID=' + WS-APPL-ID DELIMITED BY SIZE + INTO W01ERR-DETAIL + END-STRING. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + *** エラーメッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSUBEEK TO M00MSGCOD. + MOVE 'KIN02UPD SQL ERROR' TO M00UMKDATS22-01. + MOVE WRK-SQLCODE-DISP TO M00UMKDATS22-02. + MOVE WS-APPL-ID TO M00UMKDATS22-03. + PERFORM 4000MSGOUTSOR. + * + PERFORM 9999ABDSOR. + * + 9100DBERRSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名:ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/src/KIN03EXP.cbl b/production/src/KIN03EXP.cbl new file mode 100644 index 0000000..8c92299 --- /dev/null +++ b/production/src/KIN03EXP.cbl @@ -0,0 +1,511 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. KIN03EXP. + ***************************************************************** + * システム名 : 勤怠休暇管理システム * + * プログラムID : KIN03EXP * + * プログラム名 : 休暇日別展開処理 * + * 作成日 : 2026-06-17 * + * 処理概要 : LEAVE_RECORDS(DB2)より有効申請を読込み、 * + * 開始日〜終了日の期間を日別に展開し、 * + * 休日・週末を除外してLEAVE-DAILY-fileを出力 * + * する。社員番号キーブレイクで小計出力を行う。* + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-17 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT W01OUTFIL ASSIGN TO "KIN02W01.DAT". + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * W01 (LEAVE-DAILY) 80B FB * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY KIN02REC REPLACING ==(A)== BY ==W01==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * SQLCA * + ***************************************************************** + EXEC SQL INCLUDE SQLCA END-EXEC. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'KIN03EXP'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * DBホスト変数(DISPLAY形式:bridgeテキストI/F対応) * + ***************************************************************** + 01 SQL-HOST-VARS. + 03 SQL-APPL-ID PIC X(009). + 03 SQL-EMP-ID PIC X(008). + 03 SQL-LEAVE-TYPE PIC X(002). + 03 SQL-START-DATE PIC X(008). + 03 SQL-START-TIME PIC X(004). + 03 SQL-END-DATE PIC X(008). + 03 SQL-END-TIME PIC X(004). + 03 SQL-HD-DATE PIC X(008). + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** EOF判定 + 03 WRK-R01EOF PIC X(001). + 88 WRK-R01-EOF VALUE '1'. + *** キーブレイク用 + 03 WRK-BFR-EMP-ID PIC X(008). + *** 社員別小計カウンタ + 03 CUN-EMP-SUB PIC S9(009) COMP-3 + VALUE ZERO. + *** 日付展開用 + 03 WRK-DATE-CURRENT PIC 9(008). + 03 WRK-DATE-ALPHA REDEFINES WRK-DATE-CURRENT + PIC X(008). + 03 WRK-DATE-NUM REDEFINES WRK-DATE-CURRENT. + 05 WRK-DATE-YEAR PIC 9(004). + 05 WRK-DATE-MONTH PIC 9(002). + 05 WRK-DATE-DAY PIC 9(002). + 03 WRK-DATE-END PIC 9(008). + *** 曜日判定用 + 03 WRK-DAY-OF-WEEK PIC 9(001). + *** 休日テーブル件数(ODO前に定義) + 03 WRK-HD-COUNT PIC 9(004) COMP + VALUE ZERO. + *** 休日テーブル存在フラグ + 03 WRK-HD-FOUND PIC X(001). + *** 休日テーブル(ODOは末尾に配置) + 03 WRK-HOLIDAY-TABLE. + 05 WRK-HD-ENTRY OCCURS 1 TO 366 TIMES + DEPENDING ON WRK-HD-COUNT + ASCENDING KEY IS WRK-HD-DATE + INDEXED BY WRK-HD-IDX. + 07 WRK-HD-DATE PIC 9(008). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF = '1'. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** DB接続 + EXEC SQL CONNECT TO 'data/kin.db' END-EXEC. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD = ZERO + MOVE D01UBSUDATE TO WRK-DATE-CURRENT + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 休日カレンダーテーブル読込 + PERFORM 1200HDINNSOR. + * + *** 出力ファイルOPEN + OPEN OUTPUT W01OUTFIL. + * + *** C1カーソル初回FETCH(SELECT INTO) + PERFORM 1100C1INITSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:C1初回FETCH処理 * + * 処理概要 : LEAVE_RECORDSをSELECT INTO(初回のみ) * + ***************************************************************** + 1100C1INITSOR SECTION. + * + MOVE SPACES TO SQL-APPL-ID. + EXEC SQL + SELECT APPLICATION_ID, EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, + END_DATE, END_TIME + FROM LEAVE_RECORDS + WHERE STATUS = '1' + ORDER BY EMP_ID, START_DATE + INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE, + :SQL-START-DATE, :SQL-START-TIME, + :SQL-END-DATE, :SQL-END-TIME + END-EXEC. + * + IF SQLCODE = 0 + ADD 1 TO CUN-R01INN + ELSE + MOVE '1' TO WRK-R01EOF + END-IF. + * + 1100C1INITSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名:C1次回FETCH処理 * + * 処理概要 : br_fetch_nextで次行を読込(2回目以降) * + ***************************************************************** + 1100C1FETCHSOR SECTION. + * + CALL 'br_fetch_next' USING SQLCODE. + * + IF SQLCODE = 0 + MOVE SPACES TO SQL-APPL-ID + MOVE 0 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-APPL-ID, WS-COL-LEN + MOVE 1 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-EMP-ID, WS-COL-LEN + MOVE 2 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-LEAVE-TYPE, WS-COL-LEN + MOVE 3 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-START-DATE, WS-COL-LEN + MOVE 4 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-START-TIME, WS-COL-LEN + MOVE 5 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-END-DATE, WS-COL-LEN + MOVE 6 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-END-TIME, WS-COL-LEN + ADD 1 TO CUN-R01INN + ELSE + MOVE '1' TO WRK-R01EOF + END-IF. + * + 1100C1FETCHSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.3) * + * サブモジュール名: 休日カレンダー読込処理 * + * 処理概要 : HOLIDAY_CALENDARをWORKING-STORAGEに格納 * + ***************************************************************** + 1200HDINNSOR SECTION. + * + *** C2初回FETCH(SELECT INTO) + EXEC SQL + SELECT HOLIDAY_DATE + FROM HOLIDAY_CALENDAR + ORDER BY HOLIDAY_DATE + INTO :SQL-HD-DATE + END-EXEC. + * + *** 休日テーブルに全件読込 + PERFORM UNTIL SQLCODE NOT = 0 + ADD 1 TO WRK-HD-COUNT + MOVE SQL-HD-DATE TO WRK-HD-DATE(WRK-HD-COUNT) + CALL 'br_fetch_next' USING SQLCODE + IF SQLCODE = 0 + MOVE 0 TO WS-COL-IDX + MOVE 256 TO WS-COL-LEN + CALL 'br_get_col' USING + WS-COL-IDX, SQL-HD-DATE, WS-COL-LEN + END-IF + END-PERFORM. + * + 1200HDINNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : キーブレイク(社員番号)毎の処理を行う * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** 社員番号キー保存 + MOVE SQL-EMP-ID TO WRK-BFR-EMP-ID. + * + *** 1社員分処理(キーブレイク範囲) + PERFORM 2100-PROCESS-EMP + THRU 2100-PROCESS-EMP-EXIT. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (2.1) * + * サブモジュール名: 社員別処理 * + * 処理概要 : 1社員の全申請を処理(PERFORM THRU対象) * + ***************************************************************** + 2100-PROCESS-EMP SECTION. + * + MOVE ZERO TO CUN-EMP-SUB. + * + PERFORM UNTIL WRK-R01EOF = '1' + OR SQL-EMP-ID NOT = WRK-BFR-EMP-ID + PERFORM 2200-EXPAND-DATE + THRU 2200-EXPAND-DATE-EXIT + PERFORM 1100C1FETCHSOR + END-PERFORM. + * + *** 社員別小計出力(キーブレイク) + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE WRK-BFR-EMP-ID TO M00UMKDATS22-01. + MOVE CUN-EMP-SUB TO M00UMKDATS22-02. + MOVE 'EMP SUB' TO M00UMKDATS22-03. + PERFORM 4000MSGOUTSOR. + * + 2100-PROCESS-EMP-EXIT. + EXIT. + ***************************************************************** + * サブモジュールNO: (2.2) * + * サブモジュール名: 日付展開処理 * + * 処理概要 : 開始日〜終了日をループ(PERFORM THRU対象) * + * 休日/週末を除外してLEAVE-DAILYを出力 * + ***************************************************************** + 2200-EXPAND-DATE SECTION. + * + MOVE SQL-START-DATE TO WRK-DATE-CURRENT. + MOVE SQL-END-DATE TO WRK-DATE-END. + * + PERFORM UNTIL WRK-DATE-CURRENT > WRK-DATE-END + COMPUTE WRK-DAY-OF-WEEK = + FUNCTION MOD( + FUNCTION INTEGER-OF-DATE(WRK-DATE-CURRENT), 7) + IF WRK-DAY-OF-WEEK = 0 + OR WRK-DAY-OF-WEEK = 6 + IF WRK-HD-COUNT > 0 + AND WRK-DATE-CURRENT NOT = ZERO + CONTINUE + ELSE + CONTINUE + END-IF + ELSE + *** 休日テーブル検索 + MOVE '0' TO WRK-HD-FOUND + IF WRK-HD-COUNT > 0 + SET WRK-HD-IDX TO 1 + SEARCH ALL WRK-HD-ENTRY + AT END + CONTINUE + WHEN WRK-HD-DATE(WRK-HD-IDX) + = WRK-DATE-CURRENT + MOVE '1' TO WRK-HD-FOUND + END-SEARCH + END-IF + IF WRK-HD-FOUND = '0' + INITIALIZE W01OUTREC + MOVE FUNCTION NUMVAL(SQL-APPL-ID) + TO W01APPL-ID + MOVE WRK-BFR-EMP-ID TO W01EMP-ID + MOVE SQL-LEAVE-TYPE TO W01LEAVE-TYPE + MOVE SQL-START-TIME TO W01START-TIME + MOVE SQL-END-TIME TO W01END-TIME + MOVE WRK-DATE-ALPHA + TO W01DATE + WRITE W01OUTREC + ADD 1 TO CUN-W01OUT + ADD 1 TO CUN-EMP-SUB + END-IF + END-IF + *** 日付加算 + PERFORM 2300-DATE-ADD-1 + END-PERFORM. + * + 2200-EXPAND-DATE-EXIT. + EXIT. + ***************************************************************** + * サブモジュールNO: (2.3) * + * サブモジュール名: 日付加算処理 * + * 処理概要 : 日付を1日進める(月/年跨ぎ対応) * + ***************************************************************** + 2300-DATE-ADD-1 SECTION. + * + ADD 1 TO WRK-DATE-DAY. + * + EVALUATE WRK-DATE-MONTH + WHEN 1 WHEN 3 WHEN 5 WHEN 7 + WHEN 8 WHEN 10 WHEN 12 + IF WRK-DATE-DAY > 31 + MOVE 1 TO WRK-DATE-DAY + ADD 1 TO WRK-DATE-MONTH + IF WRK-DATE-MONTH > 12 + MOVE 1 TO WRK-DATE-MONTH + ADD 1 TO WRK-DATE-YEAR + END-IF + END-IF + WHEN 4 WHEN 6 WHEN 9 WHEN 11 + IF WRK-DATE-DAY > 30 + MOVE 1 TO WRK-DATE-DAY + ADD 1 TO WRK-DATE-MONTH + END-IF + WHEN 2 + IF (FUNCTION MOD(WRK-DATE-YEAR, 400) = 0) + OR (FUNCTION MOD(WRK-DATE-YEAR, 4) = 0 + AND FUNCTION MOD(WRK-DATE-YEAR, 100) + NOT = 0) + IF WRK-DATE-DAY > 29 + MOVE 1 TO WRK-DATE-DAY + ADD 1 TO WRK-DATE-MONTH + END-IF + ELSE + IF WRK-DATE-DAY > 28 + MOVE 1 TO WRK-DATE-DAY + ADD 1 TO WRK-DATE-MONTH + END-IF + END-IF + END-EVALUATE. + * + 2300-DATE-ADD-1-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 出力ファイルCLOSE + CLOSE W01OUTFIL. + * + *** 入力件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'LEAVE_RECORDS' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 出力件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'KIN02W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 休日テーブル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE 'HOLIDAYS LOADED' TO M00UMKDATS22-01. + MOVE WRK-HD-COUNT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名: ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/src/ZAN01CHK.cbl b/production/src/ZAN01CHK.cbl new file mode 100644 index 0000000..3c93663 --- /dev/null +++ b/production/src/ZAN01CHK.cbl @@ -0,0 +1,499 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. ZAN01CHK. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : ZAN01CHK * + * プログラム名 : 残業申請振分処理 * + * 作成日 : 2026-06-14 * + * 処理概要 : CSV形式の残業申請ファイルを読み込み、 * + * ステータスによって適切に振り分ける。 * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO ZAN01R01. + SELECT W01OUTFIL ASSIGN TO ZAN01W01. + SELECT W02OUTFIL ASSIGN TO ZAN01W02. + SELECT W03OUTFIL ASSIGN TO ZAN01W03. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + 03 R01LINE PIC X(80). + * + ***************************************************************** + * ##W01## * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY ZAN01REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * ##W02## * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W02OUTREC. + COPY ZAN01REC REPLACING ==(A)== BY ==W02==. + * + ***************************************************************** + * ##W03## * + ***************************************************************** + FD W03OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W03OUTREC. + COPY ZAN05REC REPLACING ==(A)== BY ==W03==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'ZAN01CHK'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 01 CNS-STAT-0 PIC X(001) VALUE '0'. + 01 CNS-STAT-1 PIC X(001) VALUE '1'. + 01 CNS-STAT-9 PIC X(001) VALUE '9'. + 01 CNS-TIME-1830 PIC 9(004) VALUE 1830. + 01 CNS-DIFF-30 PIC 9(004) VALUE 30. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W03OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 運用日付 + 03 WRK-U06 PIC 9(008). + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + *** CSV分解用 + 03 WRK-COMMA-CNT PIC 9(002) COMP. + 03 WRK-CSV-APPL-ID PIC X(008). + 03 WRK-CSV-EMP-ID PIC X(008). + 03 WRK-CSV-APPL-DATE PIC X(008). + 03 WRK-CSV-START-TIME PIC X(004). + 03 WRK-CSV-END-TIME PIC X(004). + 03 WRK-CSV-STATUS PIC X(001). + 03 WRK-CSV-OVT-TYPE PIC X(001). + 03 WRK-CSV-FILLER PIC X(046). + *** 時間計算用 + 03 WRK-START-NUM PIC 9(004). + 03 WRK-END-NUM PIC 9(004). + 03 WRK-DIFF-HH PIC 9(002). + 03 WRK-DIFF-MM PIC 9(002). + 03 WRK-DIFF-MIN PIC 9(004). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + *** 項目チェックSR用 + COPY ZANCHKAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF = '1'. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD = ZERO + MOVE D01UBSUDATE TO WRK-U06 + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + OUTPUT W01OUTFIL + W02OUTFIL + W03OUTFIL. + * + *** #R01#を読み込み + PERFORM 1100R01INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:##R01##読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : CSV分解・ステータス判定・振り分け処理 * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** CSV分解 + PERFORM 2010CSVSOR. + * + *** ステータス判定 + EVALUATE TRUE + WHEN WRK-CSV-STATUS = CNS-STAT-0 + OR WRK-CSV-STATUS = CNS-STAT-1 + *** 有効申請処理 + PERFORM 2020VALIDATESOR + WHEN WRK-CSV-STATUS = CNS-STAT-9 + *** 取消申請処理 + PERFORM 2030CANCELSOR + WHEN OTHER + *** エラー処理 + PERFORM 2040ERRORSOR + END-EVALUATE. + * + *** 次のレコード読込 + PERFORM 1100R01INNSOR. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: CSV分解処理 * + * 処理概要 : UNSTRINGでCSVを分解する * + ***************************************************************** + 2010CSVSOR SECTION. + * + INITIALIZE WRK-CSV-APPL-ID + WRK-CSV-EMP-ID + WRK-CSV-APPL-DATE + WRK-CSV-START-TIME + WRK-CSV-END-TIME + WRK-CSV-STATUS + WRK-CSV-OVT-TYPE + WRK-CSV-FILLER. + UNSTRING R01INNREC + DELIMITED BY ',' + INTO WRK-CSV-APPL-ID + WRK-CSV-EMP-ID + WRK-CSV-APPL-DATE + WRK-CSV-START-TIME + WRK-CSV-END-TIME + WRK-CSV-STATUS + WRK-CSV-OVT-TYPE + WRK-CSV-FILLER + TALLYING IN WRK-COMMA-CNT + END-UNSTRING. + * + 2010CSVSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: 有効申請処理 * + * 処理概要 : 項目チェックしW01出力またはW03出力 * + ***************************************************************** + 2020VALIDATESOR SECTION. + * + *** W01/W03レコード初期化 + INITIALIZE W01OUTREC + W03OUTREC. + * + *** SUB04CHKで社員番号チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-EMP-ID TO C01CHKDAT. + MOVE 'EMPID' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W03ERR-CATEGORY + STRING 'EMP-ID ERROR:' + WRK-CSV-EMP-ID + DELIMITED BY SIZE + INTO W03ERR-DETAIL + WRITE W03OUTREC + ADD 1 TO CUN-W03OUT + GO TO 2020VALIDATESOR-EXT + END-IF. + * + *** SUB04CHKで日付チェック + INITIALIZE C01CHKPAR. + MOVE WRK-CSV-APPL-DATE TO C01CHKDAT. + MOVE 'DATE' TO C01CHKTYP. + CALL 'SUB04CHK' USING C01CHKPAR. + IF C01CHKRRC NOT = ZERO + MOVE '01' TO W03ERR-CATEGORY + STRING 'DATE ERROR:' + WRK-CSV-EMP-ID + DELIMITED BY SIZE + INTO W03ERR-DETAIL + WRITE W03OUTREC + ADD 1 TO CUN-W03OUT + GO TO 2020VALIDATESOR-EXT + END-IF. + * + *** 開始時刻チェック(1830以降) + MOVE WRK-CSV-START-TIME TO WRK-START-NUM. + IF WRK-START-NUM < CNS-TIME-1830 + MOVE '01' TO W03ERR-CATEGORY + STRING 'START TIME < 1830' + DELIMITED BY SIZE + INTO W03ERR-DETAIL + WRITE W03OUTREC + ADD 1 TO CUN-W03OUT + GO TO 2020VALIDATESOR-EXT + END-IF. + * + *** 開始時刻 < 終了時刻チェック + MOVE WRK-CSV-END-TIME TO WRK-END-NUM. + IF WRK-START-NUM >= WRK-END-NUM + MOVE '01' TO W03ERR-CATEGORY + STRING 'START >= END' + DELIMITED BY SIZE + INTO W03ERR-DETAIL + WRITE W03OUTREC + ADD 1 TO CUN-W03OUT + GO TO 2020VALIDATESOR-EXT + END-IF. + * + *** 時間差30分以上チェック + DIVIDE WRK-START-NUM BY 100 + GIVING WRK-DIFF-HH + REMAINDER WRK-DIFF-MM. + COMPUTE WRK-DIFF-MIN = + WRK-DIFF-MM. + DIVIDE WRK-END-NUM BY 100 + GIVING WRK-START-NUM + REMAINDER WRK-END-NUM. + COMPUTE WRK-DIFF-MIN = + (WRK-START-NUM - WRK-DIFF-HH) * 60 + + (WRK-END-NUM - WRK-DIFF-MM). + IF WRK-DIFF-MIN < CNS-DIFF-30 + MOVE '01' TO W03ERR-CATEGORY + STRING 'DIFF < 30MIN' + DELIMITED BY SIZE + INTO W03ERR-DETAIL + WRITE W03OUTREC + ADD 1 TO CUN-W03OUT + GO TO 2020VALIDATESOR-EXT + END-IF. + * + *** W01出力 + MOVE WRK-CSV-APPL-ID TO W01APPL-ID. + MOVE WRK-CSV-EMP-ID TO W01EMP-ID. + MOVE WRK-CSV-APPL-DATE TO W01APPL-DATE. + MOVE WRK-CSV-START-TIME TO W01START-TIME. + MOVE WRK-CSV-END-TIME TO W01END-TIME. + MOVE WRK-CSV-STATUS TO W01STATUS. + MOVE WRK-CSV-OVT-TYPE TO W01OVT-TYPE. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 2020VALIDATESOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名: 取消申請処理 * + * 処理概要 : 取消レコードをW02出力する * + ***************************************************************** + 2030CANCELSOR SECTION. + * + *** W02レコード初期化 + INITIALIZE W02OUTREC. + MOVE WRK-CSV-APPL-ID TO W02APPL-ID. + MOVE WRK-CSV-EMP-ID TO W02EMP-ID. + MOVE WRK-CSV-APPL-DATE TO W02APPL-DATE. + MOVE WRK-CSV-START-TIME TO W02START-TIME. + MOVE WRK-CSV-END-TIME TO W02END-TIME. + MOVE WRK-CSV-STATUS TO W02STATUS. + MOVE WRK-CSV-OVT-TYPE TO W02OVT-TYPE. + WRITE W02OUTREC. + ADD 1 TO CUN-W02OUT. + * + 2030CANCELSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.4) * + * サブモジュール名: エラー処理 * + * 処理概要 : 不明ステータスをW03出力する * + ***************************************************************** + 2040ERRORSOR SECTION. + * + *** W03レコード初期化 + INITIALIZE W03OUTREC. + MOVE '01' TO W03ERR-CATEGORY. + STRING 'INVALID STATUS:' + WRK-CSV-STATUS + DELIMITED BY SIZE + INTO W03ERR-DETAIL. + WRITE W03OUTREC. + ADD 1 TO CUN-W03OUT. + * + 2040ERRORSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL + W02OUTFIL + W03OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN01R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN01W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN01W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN01W03' TO M00UMKDATS22-01. + MOVE CUN-W03OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名: ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/src/ZAN02CHK.cbl b/production/src/ZAN02CHK.cbl new file mode 100644 index 0000000..73868b8 --- /dev/null +++ b/production/src/ZAN02CHK.cbl @@ -0,0 +1,360 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. ZAN02CHK. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : ZAN02CHK * + * プログラム名 : 時間帯重複チェック処理 * + * 作成日 : 2026-06-14 * + * 処理概要 : OVT-VSORTファイルの同一社員・同一日付内の * + * 開始時刻と終了時刻の重複をチェックする。 * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO ZAN02R01. + SELECT W01OUTFIL ASSIGN TO ZAN02W01. + SELECT W02OUTFIL ASSIGN TO ZAN02W02. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY ZAN01REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * ##W01## * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY ZAN01REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * ##W02## * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W02OUTREC. + COPY ZAN05REC REPLACING ==(A)== BY ==W02==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'ZAN02CHK'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 01 CNS-ERR-CAT02 PIC 9(002) VALUE 02. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 運用日付 + 03 WRK-U06 PIC 9(008). + *** 読込フラグ + 03 WRK-R01EOF PIC X(001). + *** 前レコード保持 + 03 WRK-PREV-REC. + 05 FILLER PIC X(008). + 05 WRK-PREV-EMP-ID PIC 9(008). + 05 WRK-PREV-APPL-DATE PIC 9(008). + 05 FILLER PIC 9(004). + 05 WRK-PREV-END-TIME PIC 9(004). + 05 FILLER PIC X(001). + 05 FILLER PIC X(001). + 05 FILLER PIC X(046). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF = '1'. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD = ZERO + MOVE D01UBSUDATE TO WRK-U06 + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + OUTPUT W01OUTFIL + W02OUTFIL. + * + *** #R01#を読み込み + PERFORM 1100R01INNSOR. + * + *** 1件目W01出力(前レコード初期化) + IF WRK-R01EOF NOT = '1' + MOVE R01INNREC TO WRK-PREV-REC + MOVE R01INNREC TO W01OUTREC + WRITE W01OUTREC + ADD 1 TO CUN-W01OUT + PERFORM 1100R01INNSOR + END-IF. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:##R01##読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : 時間帯重複チェック処理 * + ***************************************************************** + 2000MAJSOR SECTION. + * + IF WRK-R01EOF NOT = '1' + *** 重複チェック + PERFORM 2010CHECKDUPSOR + *** 次のレコード読込 + PERFORM 1100R01INNSOR + END-IF. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: 重複チェック処理 * + * 処理概要 : 前レコードとの重複判定 * + ***************************************************************** + 2010CHECKDUPSOR SECTION. + * + *** 同一社員番号かつ同一日付の判定 + IF WRK-PREV-EMP-ID = R01EMP-ID + AND WRK-PREV-APPL-DATE = R01APPL-DATE + *** 前終了時刻 > 現開始時刻 → 重複 + IF WRK-PREV-END-TIME > R01START-TIME + PERFORM 2011OVERLAPERRSOR + ELSE + PERFORM 2012NORMALOUTSOR + END-IF + ELSE + *** キーブレイク + PERFORM 2013KEYBRSOR + END-IF. + * + 2010CHECKDUPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1-1) * + * サブモジュール名: 重複エラー処理 * + * 処理概要 : エラーログW02出力 * + ***************************************************************** + 2011OVERLAPERRSOR SECTION. + * + INITIALIZE W02OUTREC. + MOVE CNS-ERR-CAT02 TO W02ERR-CATEGORY. + STRING 'OVERLAP: ' + WRK-PREV-EMP-ID ',' + WRK-PREV-APPL-DATE + DELIMITED BY SIZE + INTO W02ERR-DETAIL. + WRITE W02OUTREC. + ADD 1 TO CUN-W02OUT. + * + 2011OVERLAPERRSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1-2) * + * サブモジュール名: 通常出力処理 * + * 処理概要 : W01ファイル出力 * + ***************************************************************** + 2012NORMALOUTSOR SECTION. + * + MOVE R01INNREC TO W01OUTREC. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + *** 前レコード更新 + MOVE R01INNREC TO WRK-PREV-REC. + * + 2012NORMALOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1-3) * + * サブモジュール名: キーブレイク処理 * + * 処理概要 : 前レコード更新 * + ***************************************************************** + 2013KEYBRSOR SECTION. + * + MOVE R01INNREC TO WRK-PREV-REC. + PERFORM 2012NORMALOUTSOR. + * + 2013KEYBRSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL + W02OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN02R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN02W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN02W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名: ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. \ No newline at end of file diff --git a/production/src/ZAN03CHK.cbl b/production/src/ZAN03CHK.cbl new file mode 100644 index 0000000..ed61835 --- /dev/null +++ b/production/src/ZAN03CHK.cbl @@ -0,0 +1,466 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. ZAN03CHK. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : ZAN03CHK * + * プログラム名 : 打刻時間照合処理 * + * 作成日 : 2026-06-14 * + * 処理概要 : OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の * + * 照合を行う。 * + * 申請時間帯が出勤〜退勤の範囲内かを確認する。* + * 申請日が休日かを判定しOVT-TYPEを付加する。 * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO ZAN03R01. + SELECT R02INNFIL ASSIGN TO ZAN03R02. + SELECT R03INNFIL ASSIGN TO ZAN03R03. + SELECT W01OUTFIL ASSIGN TO ZAN03W01. + SELECT W02OUTFIL ASSIGN TO ZAN03W02. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * ##R01## * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY ZAN01REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * ##R02## * + ***************************************************************** + FD R02INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R02INNREC. + 03 R02EMP-ID PIC 9(008). + 03 R02DATE PIC 9(008). + 03 R02TIME-IN PIC 9(004). + 03 R02TIME-OUT PIC 9(004). + 03 R02FILLER PIC X(056). + * + ***************************************************************** + * ##R03## * + ***************************************************************** + FD R03INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R03INNREC. + 03 R03HOLIDAY-DATE PIC 9(008). + 03 R03HOLIDAY-FLG PIC X(001). + 03 R03FILLER PIC X(071). + * + ***************************************************************** + * ##W01## * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY ZAN01REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * ##W02## * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W02OUTREC. + COPY ZAN05REC REPLACING ==(A)== BY ==W02==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'ZAN03CHK'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + + 03 CNS-ERR-CAT03 PIC 9(002) VALUE 03. + 03 CNS-OVT-W PIC X(001) VALUE 'W'. + 03 CNS-OVT-H PIC X(001) VALUE 'H'. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R02INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R03INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** 読込フラグ(R01) + 03 WRK-R01EOF PIC X(001). + *** 読込フラグ(R02) + 03 WRK-R02EOF PIC X(001). + *** 読込フラグ(R03) + 03 WRK-R03EOF PIC X(001). + *** R01キー + 03 WRK-R01KEY. + 05 WRK-R01KEY001 PIC 9(008). + 05 WRK-R01KEY002 PIC 9(008). + *** R02キー + 03 WRK-R02KEY. + 05 WRK-R02KEY001 PIC 9(008). + 05 WRK-R02KEY002 PIC 9(008). + *** OVT-TYPE設定用 + 03 WRK-OVT-TYPE-SET PIC X(001). + *** 休日テーブル + 03 WRK-HOLIDAY-CNT PIC 9(004) COMP. + 03 WRK-HOLIDAY-TABLE OCCURS 1 TO 366 TIMES + DEPENDING ON WRK-HOLIDAY-CNT + ASCENDING KEY IS WRK-HD-DATE + INDEXED BY WRK-HD-IDX. + 05 WRK-HD-DATE PIC 9(008). + 05 WRK-HD-FLG PIC X(001). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01EOF = '1'. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + R02INNFIL + R03INNFIL + OUTPUT W01OUTFIL + W02OUTFIL. + * + *** 休日ファイル読込 + PERFORM 1300HOLIDAYSOR. + * + *** #R01#を読み込み + PERFORM 1100R01INNSOR. + * + *** #R02#を読み込み + PERFORM 1200R02INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (1.1) * + * サブモジュール名:##R01##読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + MOVE R01EMP-ID TO WRK-R01KEY001 + MOVE R01APPL-DATE TO WRK-R01KEY002 + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名:##R02##読込処理 * + * 処理概要 : レコード読込・EOF判定処理 * + ***************************************************************** + 1200R02INNSOR SECTION. + * + READ R02INNFIL + AT END + MOVE '1' TO WRK-R02EOF + MOVE HIGH-VALUES TO WRK-R02KEY + NOT AT END + ADD 1 TO CUN-R02INN + MOVE R02EMP-ID TO WRK-R02KEY001 + MOVE R02DATE TO WRK-R02KEY002 + END-READ. + * + 1200R02INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.3) * + * サブモジュール名:##R03##読込処理 * + * 処理概要 : 休日ファイル読込・HOLIDAY-TABLE設定 * + ***************************************************************** + 1300HOLIDAYSOR SECTION. + * + INITIALIZE WRK-HOLIDAY-CNT. + * + PERFORM UNTIL WRK-R03EOF = '1' + READ R03INNFIL + AT END + MOVE '1' TO WRK-R03EOF + NOT AT END + ADD 1 TO WRK-HOLIDAY-CNT + ADD 1 TO CUN-R03INN + MOVE R03HOLIDAY-DATE TO + WRK-HD-DATE(WRK-HOLIDAY-CNT) + MOVE R03HOLIDAY-FLG TO + WRK-HD-FLG(WRK-HOLIDAY-CNT) + END-READ + END-PERFORM. + * + 1300HOLIDAYSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名: 主処理 * + * 処理概要 : R01とR02のキー比較・時間範囲チェック * + ***************************************************************** + 2000MAJSOR SECTION. + * + *** R01とR02のキー比較 + EVALUATE TRUE + WHEN WRK-R01KEY < WRK-R02KEY + *** R01キー < R02キー(打刻データなし) + PERFORM 2010NOMATCHSOR + WHEN WRK-R01KEY = WRK-R02KEY + *** R01キー = R02キー(マッチ) + PERFORM 2020MATCHSOR + WHEN WRK-R01KEY > WRK-R02KEY + *** R01キー > R02キー(R02スキップ) + PERFORM 1200R02INNSOR + END-EVALUATE. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名: 不一致処理 * + * 処理概要 : 打刻データなしエラー出力 * + ***************************************************************** + 2010NOMATCHSOR SECTION. + * + *** W02レコード初期化 + INITIALIZE W02OUTREC. + * + *** ERROR-LOGに出力 + MOVE CNS-ERR-CAT03 TO W02ERR-CATEGORY. + STRING R01EMP-ID DELIMITED BY SIZE + '/' DELIMITED BY SIZE + R01APPL-DATE DELIMITED BY SIZE + INTO W02ERR-DETAIL + END-STRING. + WRITE W02OUTREC. + ADD 1 TO CUN-W02OUT. + * + *** #R01#を読み込む + PERFORM 1100R01INNSOR. + * + 2010NOMATCHSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名: 一致処理 * + * 処理概要 : 時間範囲チェック * + ***************************************************************** + 2020MATCHSOR SECTION. + * + *** 時間範囲チェック + IF R01START-TIME >= R02TIME-IN + AND R01END-TIME <= R02TIME-OUT + *** 通過→OVT-TYPE設定+W01出力 + PERFORM 2200SETOVTSOR + WRITE W01OUTREC + ADD 1 TO CUN-W01OUT + ELSE + *** エラー→W02出力 + INITIALIZE W02OUTREC + MOVE CNS-ERR-CAT03 TO W02ERR-CATEGORY + STRING R01EMP-ID DELIMITED BY SIZE + '/' DELIMITED BY SIZE + R01APPL-DATE DELIMITED BY SIZE + '/' DELIMITED BY SIZE + R01START-TIME DELIMITED BY SIZE + '-' DELIMITED BY SIZE + R01END-TIME DELIMITED BY SIZE + INTO W02ERR-DETAIL + END-STRING + WRITE W02OUTREC + ADD 1 TO CUN-W02OUT + END-IF. + * + *** #R01#を読み込む + PERFORM 1100R01INNSOR. + * + 2020MATCHSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名: OVT-TYPE設定処理 * + * 処理概要 : 申請日が休日か判定しOVT-TYPEを設定 * + ***************************************************************** + 2200SETOVTSOR SECTION. + * + *** 初期設定(平日) + MOVE CNS-OVT-W TO WRK-OVT-TYPE-SET. + *** 休日判定(SEARCH ALL) + SET WRK-HD-IDX TO 1. + SEARCH ALL WRK-HOLIDAY-TABLE + AT END + CONTINUE + WHEN WRK-HD-DATE(WRK-HD-IDX) = R01APPL-DATE + IF WRK-HD-FLG(WRK-HD-IDX) = '1' + MOVE CNS-OVT-H TO WRK-OVT-TYPE-SET + END-IF + END-SEARCH. + * + *** レコード編集 + MOVE R01INNREC TO W01OUTREC. + MOVE WRK-OVT-TYPE-SET TO W01OVT-TYPE. + * + 2200SETOVTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名: 終了処理 * + * 処理概要 : ファイルクローズ・件数出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + R02INNFIL + R03INNFIL + W01OUTFIL + W02OUTFIL. + * + *** 入力件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN03R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 入力件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN03R02' TO M00UMKDATS22-01. + MOVE CUN-R02INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 入力件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN03R03' TO M00UMKDATS22-01. + MOVE CUN-R03INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 出力件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN03W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 出力件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN03W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名: メッセージ出力処理 * + * 処理概要 : メッセージ編集・出力 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + diff --git a/production/src/ZAN04MAT.cbl b/production/src/ZAN04MAT.cbl new file mode 100644 index 0000000..d745930 --- /dev/null +++ b/production/src/ZAN04MAT.cbl @@ -0,0 +1,403 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. ZAN04MAT. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : ZAN04MAT * + * プログラム名 : 取消マッチング処理 * + * 作成日 : 2026-06-15 * + * 処理概要 : OVT-SORTED(有効申請)とOVT-CSORT * + * (取消申請)を申請番号で1:1マッチングし、 * + * 結果を振り分ける。 * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-15 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO ZAN04R01. + SELECT R02INNFIL ASSIGN TO ZAN04R02. + SELECT W01OUTFIL ASSIGN TO ZAN04W01. + SELECT W02OUTFIL ASSIGN TO ZAN04W02. + SELECT W03OUTFIL ASSIGN TO ZAN04W03. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * R01 (OVT-SORTED) * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY ZAN01REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * R02 (OVT-CSORT) * + ***************************************************************** + FD R02INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R02INNREC. + COPY ZAN01REC REPLACING ==(A)== BY ==R02==. + * + ***************************************************************** + * W01 (OVT-MATCHED) * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY ZAN02REC REPLACING ==(A)== BY ==W01==. + * + ***************************************************************** + * W02 (OVT-DBCLEAN) * + ***************************************************************** + FD W02OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W02OUTREC. + COPY ZAN04REC REPLACING ==(A)== BY ==W02==. + * + ***************************************************************** + * W03 (ERROR-LOG) * + ***************************************************************** + FD W03OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS V. + 01 W03OUTREC. + COPY ZAN05REC REPLACING ==(A)== BY ==W03==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'ZAN04MAT'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 01 CNS-ERR-CAT04 PIC 9(002) VALUE 04. + 01 CNS-PROC-SEQ01 PIC 9(002) VALUE 01. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R02INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W02OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W03OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** マッチングキー + 03 WRK-R01KEY PIC X(008). + 03 WRK-R02KEY PIC X(008). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01KEY = HIGH-VALUE + AND WRK-R02KEY = HIGH-VALUE. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD NOT = ZERO + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + R02INNFIL + OUTPUT W01OUTFIL + W02OUTFIL + W03OUTFIL. + * + *** R01を読み込み + PERFORM 1100R01INNSOR. + *** R02を読み込み + PERFORM 1200R02INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : レコード読込・キー設定 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE HIGH-VALUE TO WRK-R01KEY + NOT AT END + ADD 1 TO CUN-R01INN + MOVE R01APPL-ID TO WRK-R01KEY + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名:R02読込処理 * + * 処理概要 : レコード読込・キー設定 * + ***************************************************************** + 1200R02INNSOR SECTION. + * + READ R02INNFIL + AT END + MOVE HIGH-VALUE TO WRK-R02KEY + NOT AT END + ADD 1 TO CUN-R02INN + MOVE R02APPL-ID TO WRK-R02KEY + END-READ. + * + 1200R02INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名:主処理 * + * 処理概要 : マッチング(1:1)を行う * + ***************************************************************** + 2000MAJSOR SECTION. + * + EVALUATE TRUE + *** マッチ + WHEN WRK-R01KEY = WRK-R02KEY + PERFORM 2100MATCHSOR + PERFORM 1100R01INNSOR + PERFORM 1200R02INNSOR + *** R01のみ + WHEN WRK-R01KEY < WRK-R02KEY + PERFORM 2200R01OUTSOR + PERFORM 1100R01INNSOR + *** R02のみ + WHEN WRK-R01KEY > WRK-R02KEY + PERFORM 2300R02OUTSOR + PERFORM 1200R02INNSOR + END-EVALUATE. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名:マッチ時処理 * + * 処理概要 : 取消済み申請をERROR-LOGに出力 * + ***************************************************************** + 2100MATCHSOR SECTION. + * + *** ERROR-LOG出力(監査証跡) + INITIALIZE W03OUTREC. + MOVE CNS-ERR-CAT04 TO W03ERR-CATEGORY. + STRING 'CANCEL-MATCH: ' + R01APPL-ID ' ' + R01EMP-ID ' ' + R01APPL-DATE ' ' + R01START-TIME ' ' + R01END-TIME + DELIMITED BY SIZE + INTO W03ERR-DETAIL. + WRITE W03OUTREC. + ADD 1 TO CUN-W03OUT. + * + 2100MATCHSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名:R01のみ処理 * + * 処理概要 : 有効申請をOVT-MATCHEDに出力 * + ***************************************************************** + 2200R01OUTSOR SECTION. + * + *** OVT-MATCHED出力(STRING編集) + INITIALIZE W01OUTREC. + STRING R01APPL-ID DELIMITED BY SIZE + R01EMP-ID DELIMITED BY SIZE + R01APPL-DATE DELIMITED BY SIZE + R01START-TIME DELIMITED BY SIZE + R01END-TIME DELIMITED BY SIZE + R01STATUS DELIMITED BY SIZE + R01OVT-TYPE DELIMITED BY SIZE + CNS-PROC-SEQ01 DELIMITED BY SIZE + INTO W01OUTREC. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + 2200R01OUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名:R02のみ処理 * + * 処理概要 : 取消申請をOVT-DBCLEANに出力 * + ***************************************************************** + 2300R02OUTSOR SECTION. + * + *** OVT-DBCLEAN出力 + INITIALIZE W02OUTREC. + MOVE R02APPL-ID TO W02APPL-ID. + WRITE W02OUTREC. + ADD 1 TO CUN-W02OUT. + * + 2300R02OUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名:終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + R02INNFIL + W01OUTFIL + W02OUTFIL + W03OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN04R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN04R02' TO M00UMKDATS22-01. + MOVE CUN-R02INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN04W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN04W02' TO M00UMKDATS22-01. + MOVE CUN-W02OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN04W03' TO M00UMKDATS22-01. + MOVE CUN-W03OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名:メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名:ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/src/ZAN05CAL.cbl b/production/src/ZAN05CAL.cbl new file mode 100644 index 0000000..9674094 --- /dev/null +++ b/production/src/ZAN05CAL.cbl @@ -0,0 +1,390 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. ZAN05CAL. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : ZAN05CAL * + * プログラム名 : 残業時間集計処理 * + * 作成日 : 2026-06-15 * + * 処理概要 : OVT-SORTED2(申請番号+処理番号昇順)を * + * キーブレイク集計し、同一APPL-ID内の全明細の * + * 加班時間を積算してOVT-SUMMARYに1レコード出力。* + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-15 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO ZAN05R01. + SELECT W01OUTFIL ASSIGN TO ZAN05W01. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * R01 (OVT-SORTED2) * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY ZAN02REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * W01 (OVT-SUMMARY) * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 W01OUTREC. + COPY ZAN03REC REPLACING ==(A)== BY ==W01==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'ZAN05CAL'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-TIMMODE02 PIC 9(001) VALUE 2. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** キーブレイク制御 + 03 WRK-R01KEY PIC X(008). + 03 WRK-PREV-APPL-ID PIC X(008). + 03 WRK-GROUP-ACTIVE PIC X(001). + 88 WRK-GROUP-IS-ACTIVE VALUE '1'. + 88 WRK-GROUP-NOT-ACTIVE VALUE '0'. + *** 集約用最終レコード保持 + 03 WRK-LAST-REC PIC X(080). + 03 WRK-LAST-REC-REDEF REDEFINES WRK-LAST-REC. + 05 WRK-LAST-APPL-ID PIC X(008). + 05 WRK-LAST-EMP-ID PIC 9(008). + 05 WRK-LAST-APPL-DATE PIC 9(008). + 05 FILLER PIC 9(004). + 05 WRK-LAST-END PIC 9(004). + 05 FILLER PIC X(001). + 05 WRK-LAST-OVT-TYPE PIC X(001). + 05 FILLER PIC 9(002). + 05 FILLER PIC X(044). + *** 集計用グループ先頭START保持 + 03 WRK-GROUP-START PIC 9(004). + *** 集計用積算分領域 + 03 WRK-ACCUM-MIN PIC S9(009) COMP-3. + *** 時刻計算領域 + 03 WRK-START-HOUR PIC 9(004). + 03 WRK-START-MIN PIC 9(004). + 03 WRK-END-HOUR PIC 9(004). + 03 WRK-END-MIN PIC 9(004). + 03 WRK-START-TOTAL PIC 9(005). + 03 WRK-END-TOTAL PIC 9(005). + 03 WRK-DIFF-MIN PIC 9(005). + 03 WRK-INT-HOURS PIC 9(004). + 03 WRK-REMAIN-MIN PIC 9(004). + 03 WRK-OVT-HOURS PIC 9(004)V9(001). + 03 WRK-TEMP-HOURS PIC 9(004)V9(001). + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + *** 時刻丸め計算SR用 + COPY ZANTIMAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理 + PERFORM 2000MAJSOR + UNTIL WRK-R01KEY = HIGH-VALUE + AND WRK-GROUP-NOT-ACTIVE. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + MOVE '0' TO WRK-GROUP-ACTIVE. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD NOT = ZERO + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + OUTPUT W01OUTFIL. + * + *** R01を読み込み + PERFORM 1100R01INNSOR. + * + *** 初回レコード設定 + IF WRK-R01KEY NOT = HIGH-VALUE + MOVE R01APPL-ID TO WRK-PREV-APPL-ID + MOVE R01INNREC TO WRK-LAST-REC + MOVE R01START-TIME TO WRK-GROUP-START + SET WRK-GROUP-IS-ACTIVE TO TRUE + END-IF. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : レコード読込・キー設定 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE HIGH-VALUE TO WRK-R01KEY + NOT AT END + ADD 1 TO CUN-R01INN + MOVE R01APPL-ID TO WRK-R01KEY + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名:主処理 * + * 処理概要 : キーブレイク集計制御を行う * + ***************************************************************** + 2000MAJSOR SECTION. + * + EVALUATE TRUE + *** EOF時:最終グループを出力 + WHEN WRK-R01KEY = HIGH-VALUE + IF WRK-GROUP-IS-ACTIVE + PERFORM 2100OUTSOR + SET WRK-GROUP-NOT-ACTIVE TO TRUE + END-IF + *** キーブレイク:前グループ出力→新グループ開始 + WHEN WRK-R01KEY NOT = WRK-PREV-APPL-ID + IF WRK-GROUP-IS-ACTIVE + PERFORM 2100OUTSOR + END-IF + MOVE R01APPL-ID TO WRK-PREV-APPL-ID + MOVE R01INNREC TO WRK-LAST-REC + MOVE R01START-TIME TO WRK-GROUP-START + SET WRK-GROUP-IS-ACTIVE TO TRUE + PERFORM 2200ACCUMSOR + PERFORM 1100R01INNSOR + *** 同一グループ:現レコード積算→最新レコードで上書き保持 + WHEN OTHER + PERFORM 2200ACCUMSOR + MOVE R01INNREC TO WRK-LAST-REC + PERFORM 1100R01INNSOR + END-EVALUATE. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名:集計計算出力処理 * + * 処理概要 : WRK-ACCUM-MIN→SUB05TIM丸め・OVT-SUMMARY出力* + ***************************************************************** + 2100OUTSOR SECTION. + * + *** 累積分→時間変換(DIVIDE REMAINDER) + DIVIDE WRK-ACCUM-MIN BY 60 + GIVING WRK-INT-HOURS + REMAINDER WRK-REMAIN-MIN. + * + *** COMPUTE ROUNDED ON SIZE ERROR(カバレッジ用) + COMPUTE WRK-OVT-HOURS ROUNDED = + WRK-ACCUM-MIN / 60 + ON SIZE ERROR + CONTINUE + MOVE ZERO TO WRK-OVT-HOURS + END-COMPUTE. + * + *** SUB05TIM呼出(mode 2:0.1h単位切捨) + COMPUTE WRK-TEMP-HOURS = + WRK-ACCUM-MIN / 60 + END-COMPUTE. + MOVE WRK-TEMP-HOURS TO T01TIMHRS. + MOVE CNS-TIMMODE02 TO T01TIMRRC. + CALL 'SUB05TIM' USING T01TIMPAR. + * + *** OVT-SUMMARY出力 + INITIALIZE W01OUTREC. + MOVE WRK-LAST-APPL-ID TO W01APPL-ID. + MOVE WRK-LAST-EMP-ID TO W01EMP-ID. + MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE. + MOVE WRK-GROUP-START TO W01START-TIME. + MOVE WRK-LAST-END TO W01END-TIME. + MOVE T01TIMOUT TO W01OVT-HOURS. + MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + *** 累積分リセット(次グループ用) + MOVE ZERO TO WRK-ACCUM-MIN. + * + 2100OUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名:積算処理 * + * 処理概要 : 現レコードの時間差分をWRK-ACCUM-MINに加算 * + ***************************************************************** + 2200ACCUMSOR SECTION. + * + *** 開始時刻→分変換 + DIVIDE R01START-TIME BY 100 + GIVING WRK-START-HOUR + REMAINDER WRK-START-MIN. + COMPUTE WRK-START-TOTAL = + WRK-START-HOUR * 60 + WRK-START-MIN + END-COMPUTE. + * + *** 終了時刻→分変換 + DIVIDE R01END-TIME BY 100 + GIVING WRK-END-HOUR + REMAINDER WRK-END-MIN. + COMPUTE WRK-END-TOTAL = + WRK-END-HOUR * 60 + WRK-END-MIN + END-COMPUTE. + * + *** 差分計算 + COMPUTE WRK-DIFF-MIN = + WRK-END-TOTAL - WRK-START-TOTAL + END-COMPUTE. + * + *** 積算 + COMPUTE WRK-ACCUM-MIN = + WRK-ACCUM-MIN + WRK-DIFF-MIN + END-COMPUTE. + * + 2200ACCUMSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名:終了処理 * + * 処理概要 : ファイルクローズ・件数と終了メッセージ出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + W01OUTFIL. + * + *** 入出力ファイル件数出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN05R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN05W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名:メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名:ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/src/ZAN06UPD.cbl b/production/src/ZAN06UPD.cbl new file mode 100644 index 0000000..a0860b0 --- /dev/null +++ b/production/src/ZAN06UPD.cbl @@ -0,0 +1,683 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. ZAN06UPD. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : ZAN06UPD * + * プログラム名 : 残業統計DB更新処理 * + * 作成日 : 2026-06-16 * + * 処理概要 : OVT-SUMMARYの各レコードをDB2テーブル * + * OVT-APPLICATIONSにINSERT/UPSERTし、 * + * OVT-MONTHLYに月次集計を反映する。 * + * またOVT-DBCLEANの各レコードについて、 * + * 該当申請を取消状態に更新し、 * + * OVT-MONTHLYから該当加班時間を減算する。 * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-16 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + INPUT-OUTPUT SECTION. + FILE-CONTROL. + SELECT R01INNFIL ASSIGN TO ZAN06R01. + SELECT R02INNFIL ASSIGN TO ZAN06R02. + SELECT W01OUTFIL ASSIGN TO ZAN06W01. + * + DATA DIVISION. + FILE SECTION. + * + ***************************************************************** + * R01 (OVT-SUMMARY) 80B FB * + ***************************************************************** + FD R01INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R01INNREC. + COPY ZAN03REC REPLACING ==(A)== BY ==R01==. + * + ***************************************************************** + * R02 (OVT-DBCLEAN) 80B FB * + ***************************************************************** + FD R02INNFIL + LABEL RECORD IS STANDARD + BLOCK CONTAINS 0 + RECORDING MODE IS F. + 01 R02INNREC. + COPY ZAN04REC REPLACING ==(A)== BY ==R02==. + * + ***************************************************************** + * W01 (ERROR-LOG) VB 200B * + ***************************************************************** + FD W01OUTFIL + LABEL RECORD IS STANDARD + RECORDING MODE IS V. + 01 W01OUTREC. + COPY ZAN05REC REPLACING ==(A)== BY ==W01==. + * + WORKING-STORAGE SECTION. + * + ***************************************************************** + * SQLCA * + ***************************************************************** + EXEC SQL INCLUDE SQLCA END-EXEC. + * + ***************************************************************** + * コンスタント領域 * + ***************************************************************** + 01 CNSARA. + 03 CNS-PRGIDX PIC X(008) VALUE 'ZAN06UPD'. + 03 CNS-MSGSTR PIC 9(003) VALUE 001. + 03 CNS-MSGFIN PIC 9(003) VALUE 002. + 03 CNS-MSGSUBEEK PIC 9(003) VALUE 005. + 03 CNS-MSGIINKES PIC 9(003) VALUE 006. + 03 CNS-MSGOUTKES PIC 9(003) VALUE 007. + 03 CNS-MSGKEYINF PIC 9(003) VALUE 033. + 03 CNS-ABD999 PIC 9(003) VALUE 999. + 03 CNS-KN0002 PIC 9(001) VALUE 2. + 03 CNS-COMMIT-CNT PIC 9(003) VALUE 050. + 03 CNS-STATUS-ACTIVE PIC X(001) VALUE '0'. + 03 CNS-STATUS-CANCEL PIC X(001) VALUE '9'. + * + ***************************************************************** + * カウンタ領域 * + ***************************************************************** + 01 CUNARA. + 03 CUN-R01INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-R02INN PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-W01OUT PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-DBXINS PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-DBXUPD PIC S9(009) COMP-3 + VALUE ZERO. + 03 CUN-COMMIT PIC S9(009) COMP-3 + VALUE ZERO. + * + ***************************************************************** + * 作業領域 * + ***************************************************************** + 01 WRKARA. + *** EOF判定 + 03 WRK-R01EOF PIC X(001). + 88 WRK-R01-EOF VALUE '1'. + 03 WRK-R02EOF PIC X(001). + 88 WRK-R02-EOF VALUE '1'. + *** 日付分解領域 + 03 WRK-APPL-DATE-N PIC 9(008). + 03 WRK-YEAR-MONTH PIC 9(006). + 03 WRK-MONTH PIC 9(002). + 03 WRK-MONTH-VALID PIC 9(001). + *** ループ制御 + 03 WRK-IDX PIC 9(004). + 03 WRK-RETRY-CNT PIC 9(001). + *** 加班時間変換領域 + 03 WRK-OVT-HOURS-EDITED PIC 9(004).9(001). + 03 WRK-OVT-HOURS-NUM PIC 9(004)V9(001). + 03 WRK-OVT-MINUTES PIC 9(006). + *** SQL用ホスト変数(全DISPLAY) + 03 WRK-SQL-APPL-ID PIC X(008). + 03 WRK-SQL-EMP-ID PIC X(008). + 03 WRK-SQL-APPL-DATE PIC X(008). + 03 WRK-SQL-YEAR-MONTH PIC X(006). + 03 WRK-SQL-START-TIME PIC X(004). + 03 WRK-SQL-END-TIME PIC X(004). + 03 WRK-SQL-OVT-HOURS PIC X(006). + 03 WRK-SQL-OVT-TYPE PIC X(001). + 03 WRK-SQL-STATUS PIC X(001). + *** SQLCODE表示用(COMP-5から編集変換) + 03 WRK-SQLCODE-DISP PIC +9(009). + *** エラーログ編集領域 + 03 WRK-ERR-CATEGORY PIC 9(002). + 03 WRK-ERR-DETAIL PIC X(198). + * + ***************************************************************** + * DBホスト変数(COMP-3、bridge compVarsマップ対応) * + ***************************************************************** + 01 DB-OVT-HOURS PIC S9(007)V9(001) COMP-3. + 01 DB-OVT-COUNT PIC S9(009) COMP-3. + * + ***************************************************************** + * サブプログラム連絡領域 * + ***************************************************************** + *** 運用日付取得 + COPY ZANDATAC. + *** メッセージ編集出力SR用 + COPY ZANMSGAC. + *** ABEND処理SR用 + COPY ZANENDAC. + * + PROCEDURE DIVISION. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAJCOLSOR SECTION. + * + *** 初期処理 + PERFORM 1000ITTSOR. + * + *** メイン処理(R01→R02順に処理) + PERFORM 2000MAJSOR + UNTIL WRK-R01-EOF + AND WRK-R02-EOF. + * + *** 終了処理 + PERFORM 3000STPSOR. + * + 0000MAJCOLSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 初期処理 * + * 処理概要 : 開始メッセージ出力・各種初期化処理 * + ***************************************************************** + 1000ITTSOR SECTION. + * + *** 開始メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGSTR TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + *** コンパイル日時出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGKEYINF TO M00MSGCOD. + MOVE FUNCTION WHEN-COMPILED TO M00UMKDATS22-01. + MOVE 'COMPILED' TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** ワークエリア初期化 + INITIALIZE WRKARA. + * + *** 運用日付取得 + INITIALIZE D01UBSPAR. + CALL 'SUB01DAT' USING D01UBSPAR. + IF D01FKICOD = ZERO + MOVE D01UBSUDATE TO WRK-APPL-DATE-N + ELSE + INITIALIZE M00MHOPAR + MOVE CNS-MSGSUBEEK TO M00MSGCOD + MOVE 'SUB01DAT' TO M00UMKDATS22-01 + MOVE D01FKICOD TO M00UMKDATS22-02 + PERFORM 4000MSGOUTSOR + PERFORM 9999ABDSOR + END-IF. + * + *** 入出力ファイルOPEN + OPEN INPUT R01INNFIL + R02INNFIL + OUTPUT W01OUTFIL. + * + *** DB接続 + EXEC SQL + CONNECT TO 'data\OVERTIME.DB' + END-EXEC. + * + *** R01を初回読込 + PERFORM 1100R01INNSOR. + * + *** R02を初回読込 + PERFORM 1200R02INNSOR. + * + 1000ITTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.1) * + * サブモジュール名:R01読込処理 * + * 処理概要 : OVT-SUMMARY読込 * + ***************************************************************** + 1100R01INNSOR SECTION. + * + READ R01INNFIL + AT END + MOVE '1' TO WRK-R01EOF + NOT AT END + ADD 1 TO CUN-R01INN + END-READ. + * + 1100R01INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(1.2) * + * サブモジュール名:R02読込処理 * + * 処理概要 : OVT-DBCLEAN読込 * + ***************************************************************** + 1200R02INNSOR SECTION. + * + READ R02INNFIL + AT END + MOVE '1' TO WRK-R02EOF + NOT AT END + ADD 1 TO CUN-R02INN + END-READ. + * + 1200R02INNSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.0) * + * サブモジュール名:主処理 * + * 処理概要 : R01(OVT-SUMMARY)→R02(OVT-DBCLEAN)処理 * + ***************************************************************** + 2000MAJSOR SECTION. + * + EVALUATE TRUE + *** フェーズ1:OVT-SUMMARY処理 + WHEN NOT WRK-R01-EOF + PERFORM 2100SUMMARYSOR + PERFORM 1100R01INNSOR + *** フェーズ2:OVT-DBCLEAN処理 + WHEN NOT WRK-R02-EOF + PERFORM 2200DBCLEANSOR + PERFORM 1200R02INNSOR + WHEN OTHER + CONTINUE + END-EVALUATE. + * + 2000MAJSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1) * + * サブモジュール名:OVT-SUMMARY→DB登録処理 * + * 処理概要 : OVT-APPLICATIONS INSERT/UPSERT * + ***************************************************************** + 2100SUMMARYSOR SECTION. + * + *** SQLホスト変数設定 + MOVE R01APPL-ID TO WRK-SQL-APPL-ID. + MOVE R01EMP-ID TO WRK-SQL-EMP-ID. + MOVE R01APPL-DATE TO WRK-SQL-APPL-DATE. + MOVE R01APPL-DATE TO WRK-APPL-DATE-N. + MOVE WRK-APPL-DATE-N(5:2) TO WRK-MONTH. + * + *** 月バリデーション(PERFORM VARYING カバレッジ用) + MOVE ZERO TO WRK-MONTH-VALID. + PERFORM VARYING WRK-IDX + FROM 1 BY 1 + UNTIL WRK-IDX > 12 + OR WRK-MONTH-VALID = 1 + IF WRK-MONTH = WRK-IDX + MOVE 1 TO WRK-MONTH-VALID + END-IF + END-PERFORM. + * + *** 月異常時はエラー + IF WRK-MONTH-VALID = ZERO + MOVE 10 TO WRK-ERR-CATEGORY + STRING 'INVALID MONTH APPL-ID=' + WRK-SQL-APPL-ID DELIMITED BY SIZE + INTO WRK-ERR-DETAIL + END-STRING + MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY + MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL + WRITE W01OUTREC + ADD 1 TO CUN-W01OUT + PERFORM 9999ABDSOR + END-IF. + * + *** 年月抽出 + MOVE WRK-APPL-DATE-N(1:6) TO WRK-YEAR-MONTH. + MOVE WRK-YEAR-MONTH TO WRK-SQL-YEAR-MONTH. + * + *** 開始/終了時刻設定 + MOVE R01START-TIME TO WRK-SQL-START-TIME. + MOVE R01END-TIME TO WRK-SQL-END-TIME. + * + *** 加班時間 → SQL形式変換(小数点付加) + MOVE R01OVT-HOURS TO WRK-OVT-HOURS-NUM. + MOVE R01OVT-HOURS TO WRK-OVT-HOURS-EDITED. + MOVE WRK-OVT-HOURS-EDITED TO WRK-SQL-OVT-HOURS. + * + *** MULTIPLY カバレッジ:時間→分変換 + MULTIPLY WRK-OVT-HOURS-NUM + BY 60 GIVING WRK-OVT-MINUTES. + * + *** 種別・ステータス設定 + MOVE R01OVT-TYPE TO WRK-SQL-OVT-TYPE. + MOVE CNS-STATUS-ACTIVE TO WRK-SQL-STATUS. + * + *** OVT-APPLICATIONSにINSERT + EXEC SQL + INSERT INTO OVT_APPLICATIONS + (APPL_ID, EMP_ID, APPL_DATE, OVT_TYPE, + START_TIME, END_TIME, OVT_HOURS, STATUS, + UPDATED_AT) + VALUES + (:WRK-SQL-APPL-ID, :WRK-SQL-EMP-ID, + :WRK-SQL-APPL-DATE, :WRK-SQL-OVT-TYPE, + :WRK-SQL-START-TIME, :WRK-SQL-END-TIME, + :WRK-SQL-OVT-HOURS, :WRK-SQL-STATUS, + CURRENT_TIMESTAMP) + END-EXEC. + * + IF SQLCODE NOT = 0 + *** 重複 → UPDATE + EXEC SQL + UPDATE OVT_APPLICATIONS SET + STATUS = :WRK-SQL-STATUS, + UPDATED_AT = CURRENT_TIMESTAMP + WHERE APPL_ID = :WRK-SQL-APPL-ID + END-EXEC + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF + ADD 1 TO CUN-DBXUPD + ELSE + ADD 1 TO CUN-DBXINS + END-IF. + * + ADD 1 TO CUN-COMMIT. + * + *** OVT-MONTHLY UPSERT + PERFORM 2110MONTHLYUPSOR. + * + *** COMMIT判定 + IF CUN-COMMIT >= CNS-COMMIT-CNT + PERFORM 2300COMMITDBX + END-IF. + * + 2100SUMMARYSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.1.1) * + * サブモジュール名:OVT-MONTHLY UPSERT処理 * + * 処理概要 : 月次集計テーブルへの追加/更新 * + ***************************************************************** + 2110MONTHLYUPSOR SECTION. + * + *** OVT-MONTHLY存在確認 + EXEC SQL + SELECT OVT_HOURS, OVT_COUNT + INTO :DB-OVT-HOURS, :DB-OVT-COUNT + FROM OVT_MONTHLY + WHERE EMP_ID = :WRK-SQL-EMP-ID + AND YEAR_MONTH = :WRK-SQL-YEAR-MONTH + AND OVT_TYPE = :WRK-SQL-OVT-TYPE + END-EXEC. + * + IF SQLCODE = 0 + *** 既存レコードあり → 加算UPDATE + EXEC SQL + UPDATE OVT_MONTHLY SET + OVT_HOURS = OVT_HOURS + :WRK-SQL-OVT-HOURS, + OVT_COUNT = OVT_COUNT + 1, + UPDATED_AT = CURRENT_TIMESTAMP + WHERE EMP_ID = :WRK-SQL-EMP-ID + AND YEAR_MONTH = :WRK-SQL-YEAR-MONTH + AND OVT_TYPE = :WRK-SQL-OVT-TYPE + END-EXEC + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF + ELSE + *** 新規 → INSERT + EXEC SQL + INSERT INTO OVT_MONTHLY + (EMP_ID, YEAR_MONTH, OVT_TYPE, + OVT_HOURS, OVT_COUNT, UPDATED_AT) + VALUES + (:WRK-SQL-EMP-ID, :WRK-SQL-YEAR-MONTH, + :WRK-SQL-OVT-TYPE, :WRK-SQL-OVT-HOURS, + 1, CURRENT_TIMESTAMP) + END-EXEC + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF + END-IF. + * + 2110MONTHLYUPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2) * + * サブモジュール名:OVT-DBCLEAN→取消処理 * + * 処理概要 : OVT-APPLICATIONS取消+OVT-MONTHLY減算 * + ***************************************************************** + 2200DBCLEANSOR SECTION. + * + *** SQLホスト変数設定 + MOVE R02APPL-ID TO WRK-SQL-APPL-ID. + * + *** OVT-APPLICATIONSから既存データ取得 + EXEC SQL + SELECT EMP_ID, APPL_DATE, OVT_TYPE, OVT_HOURS + INTO :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE, + :WRK-SQL-OVT-TYPE, :WRK-SQL-OVT-HOURS + FROM OVT_APPLICATIONS + WHERE APPL_ID = :WRK-SQL-APPL-ID + END-EXEC. + * + IF SQLCODE NOT = 0 + *** 該当なし(孤立取消)→ ERROR-LOG + ABEND + MOVE 20 TO WRK-ERR-CATEGORY + STRING 'ORPHAN CANCEL APPL-ID=' + WRK-SQL-APPL-ID DELIMITED BY SIZE + INTO WRK-ERR-DETAIL + END-STRING + MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY + MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL + WRITE W01OUTREC + ADD 1 TO CUN-W01OUT + PERFORM 9999ABDSOR + END-IF. + * + *** 年月抽出 + MOVE WRK-SQL-APPL-DATE TO WRK-APPL-DATE-N. + MOVE WRK-APPL-DATE-N(1:6) TO WRK-YEAR-MONTH. + MOVE WRK-YEAR-MONTH TO WRK-SQL-YEAR-MONTH. + * + *** OVT-APPLICATIONSステータス更新(取消) + EXEC SQL + UPDATE OVT_APPLICATIONS SET + STATUS = :CNS-STATUS-CANCEL, + UPDATED_AT = CURRENT_TIMESTAMP + WHERE APPL_ID = :WRK-SQL-APPL-ID + END-EXEC. + * + IF SQLCODE NOT = 0 + PERFORM 9100DBERRSOR + END-IF. + * + ADD 1 TO CUN-DBXUPD. + ADD 1 TO CUN-COMMIT. + * + *** OVT-MONTHLY減算 + PERFORM 2210MONTHLYSUBSOR. + * + 2200DBCLEANSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.2.1) * + * サブモジュール名:OVT-MONTHLY減算処理 * + * 処理概要 : 月次集計テーブルからの減算 * + ***************************************************************** + 2210MONTHLYSUBSOR SECTION. + * + *** リトライカウンタ設定 + MOVE 3 TO WRK-RETRY-CNT. + * + *** PERFORM TEST AFTER カバレッジ + PERFORM TEST AFTER + VARYING WRK-IDX + FROM 1 BY 1 + UNTIL WRK-IDX > WRK-RETRY-CNT + OR SQLCODE = 0 + EXEC SQL + UPDATE OVT_MONTHLY SET + OVT_HOURS = OVT_HOURS + - :WRK-SQL-OVT-HOURS, + OVT_COUNT = OVT_COUNT - 1, + UPDATED_AT = CURRENT_TIMESTAMP + WHERE EMP_ID = :WRK-SQL-EMP-ID + AND YEAR_MONTH = :WRK-SQL-YEAR-MONTH + AND OVT_TYPE = :WRK-SQL-OVT-TYPE + END-EXEC + IF SQLCODE NOT = 0 + EXEC SQL + ROLLBACK WORK + END-EXEC + END-IF + END-PERFORM. + * + IF SQLCODE NOT = 0 + *** 減算失敗 → データ不整合 + MOVE 21 TO WRK-ERR-CATEGORY + STRING 'MONTHLY SUBTRACT FAIL APPL-ID=' + WRK-SQL-APPL-ID DELIMITED BY SIZE + INTO WRK-ERR-DETAIL + END-STRING + MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY + MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL + WRITE W01OUTREC + ADD 1 TO CUN-W01OUT + PERFORM 9999ABDSOR + END-IF. + * + ADD 1 TO CUN-DBXUPD. + ADD 1 TO CUN-COMMIT. + * + *** COMMIT判定 + IF CUN-COMMIT >= CNS-COMMIT-CNT + PERFORM 2300COMMITDBX + END-IF. + * + 2210MONTHLYSUBSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(2.3) * + * サブモジュール名:COMMIT処理 * + * 処理概要 : DB COMMIT発行 * + ***************************************************************** + 2300COMMITDBX SECTION. + * + *** COMMIT + EXEC SQL + COMMIT WORK + END-EXEC. + * + MOVE ZERO TO CUN-COMMIT. + * + 2300COMMITDBX-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(3.0) * + * サブモジュール名:終了処理 * + * 処理概要 : 最終COMMIT・ファイルクローズ・件数出力 * + ***************************************************************** + 3000STPSOR SECTION. + * + *** 最終COMMIT + IF CUN-COMMIT > ZERO + PERFORM 2300COMMITDBX + END-IF. + * + *** 入出力ファイルCLOSE + CLOSE R01INNFIL + R02INNFIL + W01OUTFIL. + * + *** 件数メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN06R01' TO M00UMKDATS22-01. + MOVE CUN-R01INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'ZAN06R02' TO M00UMKDATS22-01. + MOVE CUN-R02INN TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'INS' TO M00UMKDATS22-01. + MOVE CUN-DBXINS TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGIINKES TO M00MSGCOD. + MOVE 'UPD' TO M00UMKDATS22-01. + MOVE CUN-DBXUPD TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + INITIALIZE M00MHOPAR. + MOVE CNS-MSGOUTKES TO M00MSGCOD. + MOVE 'ZAN06W01' TO M00UMKDATS22-01. + MOVE CUN-W01OUT TO M00UMKDATS22-02. + PERFORM 4000MSGOUTSOR. + * + *** 終了メッセージ出力 + INITIALIZE M00MHOPAR. + MOVE CNS-MSGFIN TO M00MSGCOD. + PERFORM 4000MSGOUTSOR. + * + 3000STPSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(4.0) * + * サブモジュール名:メッセージ編集出力処理 * + * 処理概要 : メッセージ編集出力サブPGM呼出 * + ***************************************************************** + 4000MSGOUTSOR SECTION. + * + MOVE CNS-KN0002 TO M00UMKDATS22-03(1:1). + MOVE CNS-KN0002 TO M00UMKDATS22-04(1:1). + MOVE CNS-PRGIDX TO M00UMKDATS22-05. + CALL 'SUB02MSG' USING M00MHOPAR. + * + 4000MSGOUTSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.1) * + * サブモジュール名:DBエラー処理 * + * 処理概要 : DBエラー→ERROR-LOG出力+ROLLBACK+ABEND * + ***************************************************************** + 9100DBERRSOR SECTION. + * + *** ERROR-LOG出力 + MOVE 30 TO WRK-ERR-CATEGORY. + MOVE SQLCODE TO WRK-SQLCODE-DISP. + STRING 'DB ERROR SQLCODE=' + WRK-SQLCODE-DISP DELIMITED BY SIZE + ' APPL-ID=' + WRK-SQL-APPL-ID DELIMITED BY SIZE + INTO WRK-ERR-DETAIL + END-STRING. + MOVE WRK-ERR-CATEGORY TO W01ERR-CATEGORY. + MOVE WRK-ERR-DETAIL TO W01ERR-DETAIL. + WRITE W01OUTREC. + ADD 1 TO CUN-W01OUT. + * + *** ROLLBACK + EXEC SQL + ROLLBACK WORK + END-EXEC. + * + MOVE ZERO TO CUN-COMMIT. + * + PERFORM 9999ABDSOR. + * + 9100DBERRSOR-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO:(9.9) * + * サブモジュール名:ABEND処理 * + * 処理概要 : ABENDサブPGM呼出 * + ***************************************************************** + 9999ABDSOR SECTION. + * + MOVE CNS-ABD999 TO E01ABDCOD. + CALL 'SUB03END' USING E01ABDPAR. + * + 9999ABDSOR-EXT. + EXIT. diff --git a/production/sub/SUB01DAT.cbl b/production/sub/SUB01DAT.cbl new file mode 100644 index 0000000..45322fb --- /dev/null +++ b/production/sub/SUB01DAT.cbl @@ -0,0 +1,57 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. SUB01DAT. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : SUB01DAT * + * プログラム名 : 運用日付取得サブ * + * 作成日 : 2026-06-14 * + * 処理概要 : FUNCTION CURRENT-DATEにより現在日付を取得 * + * しYYYYMMDD形式で返す * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + DATA DIVISION. + ***************************************************************** + WORKING-STORAGE SECTION. + ***************************************************************** + 01 WRKARA. + 03 WRK-SYS-DATE PIC X(026). + 03 WRK-DATE-8 PIC 9(008). + * + ***************************************************************** + * リンケージエリア * + ***************************************************************** + LINKAGE SECTION. + * + 01 D01UBSPAR. + 03 D01FKICOD PIC S9(004) COMP. + 03 D01UBSUDATE PIC 9(008). + * + PROCEDURE DIVISION USING D01UBSPAR. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAINSOR SECTION. + * + *** 現在日付を取得する + MOVE FUNCTION CURRENT-DATE TO WRK-SYS-DATE. + *** YYYYMMDD部分を抽出 + MOVE WRK-SYS-DATE(1:8) TO D01UBSUDATE. + *** 正常終了 + MOVE ZERO TO D01FKICOD. + * + 0000MAINSOR-EXT. + GOBACK. diff --git a/production/sub/SUB02MSG.cbl b/production/sub/SUB02MSG.cbl new file mode 100644 index 0000000..da735b7 --- /dev/null +++ b/production/sub/SUB02MSG.cbl @@ -0,0 +1,76 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. SUB02MSG. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : SUB02MSG * + * プログラム名 : メッセージ編集出力サブ * + * 作成日 : 2026-06-14 * + * 処理概要 : メッセージ番号とパラメータを編集し * + * 標準出力へ出力する * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + DATA DIVISION. + ***************************************************************** + WORKING-STORAGE SECTION. + ***************************************************************** + 01 WRKARA. + 03 WRK-MSG-LINE PIC X(303). + * + ***************************************************************** + * リンケージエリア * + ***************************************************************** + LINKAGE SECTION. + * + 01 M00MHOPAR. + 03 M00MSGCOD PIC 9(003). + 03 M00UMKDATS22-01 PIC X(030). + 03 M00UMKDATS22-02 PIC X(030). + 03 M00UMKDATS22-03 PIC X(030). + 03 M00UMKDATS22-04 PIC X(030). + 03 M00UMKDATS22-05 PIC X(030). + 03 M00UMKDATS22-06 PIC X(030). + 03 M00UMKDATS22-07 PIC X(030). + 03 M00UMKDATS22-08 PIC X(030). + 03 M00UMKDATS22-09 PIC X(030). + 03 M00UMKDATS22-10 PIC X(030). + * + PROCEDURE DIVISION USING M00MHOPAR. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAINSOR SECTION. + * + *** メッセージ行を編集する + STRING 'MSG[' + M00MSGCOD + '] P1=' + M00UMKDATS22-01 + ' P2=' + M00UMKDATS22-02 + ' P3=' + M00UMKDATS22-03 + ' P4=' + M00UMKDATS22-04 + ' P5=' + M00UMKDATS22-05 + INTO WRK-MSG-LINE + END-STRING. + *** 標準出力へ出力 + DISPLAY WRK-MSG-LINE. + * + 0000MAINSOR-EXT. + GOBACK. diff --git a/production/sub/SUB03END.cbl b/production/sub/SUB03END.cbl new file mode 100644 index 0000000..3467ca0 --- /dev/null +++ b/production/sub/SUB03END.cbl @@ -0,0 +1,55 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. SUB03END. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : SUB03END * + * プログラム名 : ABEND処理サブ * + * 作成日 : 2026-06-14 * + * 処理概要 : ABENDコードを表示しプログラムを異常終了 * + * させる * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + DATA DIVISION. + ***************************************************************** + WORKING-STORAGE SECTION. + ***************************************************************** + 01 WRKARA. + 03 WRK-ABEND-MSG PIC X(020). + * + ***************************************************************** + * リンケージエリア * + ***************************************************************** + LINKAGE SECTION. + * + 01 E01ABDPAR. + 03 E01ABDCOD PIC 9(003). + * + PROCEDURE DIVISION USING E01ABDPAR. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAINSOR SECTION. + * + *** 異常終了メッセージを表示する + MOVE 'ABEND CODE=' TO WRK-ABEND-MSG. + MOVE E01ABDCOD TO WRK-ABEND-MSG(12:3). + DISPLAY WRK-ABEND-MSG. + *** プログラムを異常終了させる + STOP RUN. + * + 0000MAINSOR-EXT. + GOBACK. diff --git a/production/sub/SUB04CHK.cbl b/production/sub/SUB04CHK.cbl new file mode 100644 index 0000000..2fbe4b3 --- /dev/null +++ b/production/sub/SUB04CHK.cbl @@ -0,0 +1,213 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. SUB04CHK. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : SUB04CHK * + * プログラム名 : 項目チェックサブ * + * 作成日 : 2026-06-14 * + * 処理概要 : 指定されたタイプによりデータ項目の妥当性 * + * をチェックする * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + DATA DIVISION. + ***************************************************************** + WORKING-STORAGE SECTION. + ***************************************************************** + 01 WRKARA. + 03 WRK-RETURN-CODE PIC 9(004). + 03 WRK-SIGN PIC S9(004). + 03 WRK-NN PIC 9(004). + 03 WRK-DIGIT PIC 9(004). + 03 WRK-ALPHA PIC 9(004). + * + ***************************************************************** + * リンケージエリア * + ***************************************************************** + LINKAGE SECTION. + * + 01 C01CHKPAR. + 03 C01CHKTYP PIC X(008). + 03 C01CHKDAT PIC X(080). + 03 C01CHKRRC PIC 9(004). + * + PROCEDURE DIVISION USING C01CHKPAR. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAINSOR SECTION. + * + *** チェックタイプにより分岐する + EVALUATE C01CHKTYP + *** 日付チェック(YYYYMMDD) + WHEN 'DATE' + PERFORM 1000CHKDATE + *** 時刻チェック(HHMM) + WHEN 'TIME' + PERFORM 2000CHKTIME + *** 数字チェック + WHEN 'NUM' + PERFORM 3000CHKNUM + *** 社員番号チェック(英数字8桁) + WHEN 'EMPID' + PERFORM 4000CHKEMP + WHEN OTHER + MOVE 9999 TO WRK-RETURN-CODE + END-EVALUATE. + * + *** 復帰コードを設定して復帰 + MOVE WRK-RETURN-CODE TO C01CHKRRC. + * + 0000MAINSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 日付チェック * + * 処理概要 : YYYYMMDD形式の妥当性チェック * + ***************************************************************** + 1000CHKDATE SECTION. + * + *** 月チェック(桁位置5〜6: 01-12) + MOVE FUNCTION NUMVAL( + C01CHKDAT(5:2)) TO WRK-NN. + IF (WRK-NN < 1) OR (WRK-NN > 12) THEN + MOVE 0001 TO WRK-RETURN-CODE + GO TO 1000CHKDATE-EXT + END-IF. + *** 日チェック(桁位置7〜8: 01-31) + MOVE FUNCTION NUMVAL( + C01CHKDAT(7:2)) TO WRK-NN. + IF (WRK-NN < 1) OR (WRK-NN > 31) THEN + MOVE 0001 TO WRK-RETURN-CODE + GO TO 1000CHKDATE-EXT + END-IF. + *** 正常 + MOVE ZERO TO WRK-RETURN-CODE. + * + 1000CHKDATE-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (2.0) * + * サブモジュール名: 時刻チェック * + * 処理概要 : HHMM形式の妥当性チェック * + ***************************************************************** + 2000CHKTIME SECTION. + * + *** 時チェック(桁位置1〜2: 00-23) + MOVE FUNCTION NUMVAL( + C01CHKDAT(1:2)) TO WRK-NN. + IF (WRK-NN > 23) THEN + MOVE 0002 TO WRK-RETURN-CODE + GO TO 2000CHKTIME-EXT + END-IF. + *** 分チェック(桁位置3〜4: 00-59) + MOVE FUNCTION NUMVAL( + C01CHKDAT(3:2)) TO WRK-NN. + IF (WRK-NN > 59) THEN + MOVE 0002 TO WRK-RETURN-CODE + GO TO 2000CHKTIME-EXT + END-IF. + *** 正常 + MOVE ZERO TO WRK-RETURN-CODE. + * + 2000CHKTIME-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (3.0) * + * サブモジュール名: 数字チェック * + * 処理概要 : 全桁が数字であることをチェック * + ***************************************************************** + 3000CHKNUM SECTION. + * + *** 空チェック(全スペース→正常=オプショナル) + INSPECT C01CHKDAT + TALLYING WRK-NN FOR + LEADING SPACES. + IF WRK-NN = LENGTH OF C01CHKDAT + MOVE ZERO TO WRK-RETURN-CODE + GO TO 3000CHKNUM-EXT + END-IF. + *** 数字(0-9)とスペースのみをカウント + INSPECT C01CHKDAT + TALLYING WRK-NN + FOR ALL "0" "1" "2" "3" "4" + "5" "6" "7" "8" "9" + SPACE. + IF WRK-NN NOT = LENGTH OF C01CHKDAT + MOVE 0003 TO WRK-RETURN-CODE + GO TO 3000CHKNUM-EXT + END-IF. + *** 正常 + MOVE ZERO TO WRK-RETURN-CODE. + * + 3000CHKNUM-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (4.0) * + * サブモジュール名: 社員番号チェック * + * 処理概要 : 英数字8桁のチェック * + ***************************************************************** + 4000CHKEMP SECTION. + * + *** 桁数チェック(8桁) + IF C01CHKDAT(9:72) NOT = SPACES THEN + MOVE 0004 TO WRK-RETURN-CODE + GO TO 4000CHKEMP-EXT + END-IF. + *** 空チェック(全8桁がスペース→必須エラー) + IF C01CHKDAT(1:8) = SPACES + MOVE 0004 TO WRK-RETURN-CODE + GO TO 4000CHKEMP-EXT + END-IF. + *** 数字(0-9)カウント + MOVE ZERO TO WRK-DIGIT. + INSPECT C01CHKDAT(1:8) + TALLYING WRK-DIGIT + FOR ALL "0" "1" "2" "3" "4" + "5" "6" "7" "8" "9". + *** 英字(A-Z a-z)カウント + MOVE ZERO TO WRK-ALPHA. + INSPECT C01CHKDAT(1:8) + TALLYING WRK-ALPHA + FOR ALL "A" "B" "C" "D" "E" + "F" "G" "H" "I" "J" + "K" "L" "M" "N" "O" + "P" "Q" "R" "S" "T" + "U" "V" "W" "X" "Y" + "Z" + "a" "b" "c" "d" "e" + "f" "g" "h" "i" "j" + "k" "l" "m" "n" "o" + "p" "q" "r" "s" "t" + "u" "v" "w" "x" "y" + "z". + *** スペースカウント + MOVE ZERO TO WRK-NN. + INSPECT C01CHKDAT(1:8) + TALLYING WRK-NN + FOR ALL SPACE. + *** 英数字以外(特殊文字)がないかチェック + ADD WRK-DIGIT TO WRK-ALPHA. + ADD WRK-NN TO WRK-ALPHA. + IF WRK-ALPHA NOT = 8 + MOVE 0004 TO WRK-RETURN-CODE + GO TO 4000CHKEMP-EXT + END-IF. + *** 正常 + MOVE ZERO TO WRK-RETURN-CODE. + * + 4000CHKEMP-EXT. + EXIT. diff --git a/production/sub/SUB05TIM.cbl b/production/sub/SUB05TIM.cbl new file mode 100644 index 0000000..5266721 --- /dev/null +++ b/production/sub/SUB05TIM.cbl @@ -0,0 +1,153 @@ + IDENTIFICATION DIVISION. + PROGRAM-ID. SUB05TIM. + ***************************************************************** + * システム名 : 残業統計管理システム * + * プログラムID : SUB05TIM * + * プログラム名 : 時刻丸め計算サブ * + * 作成日 : 2026-06-14 * + * 処理概要 : 時間値を指定単位で丸め計算する * + * * + ***************************************************************** + * 更新履歴 * + *---------------------------------------------------------------* + * 更新日付 担当者 更新内容 * + *---------------------------------------------------------------* + * 26-06-14 @@@ 新規作成 * + * * + ***************************************************************** + ENVIRONMENT DIVISION. + CONFIGURATION SECTION. + SOURCE-COMPUTER. IBM-ZSERIES. + OBJECT-COMPUTER. IBM-ZSERIES. + * + DATA DIVISION. + ***************************************************************** + WORKING-STORAGE SECTION. + ***************************************************************** + 01 WRKARA. + 03 WRK-MINUTES PIC S9(005). + 03 WRK-HOURS PIC S9(005)V9(001). + 03 WRK-REMAINDER PIC S9(005). + * + ***************************************************************** + * リンケージエリア * + ***************************************************************** + LINKAGE SECTION. + * + 01 T01TIMPAR. + 03 T01TIMHRS PIC 9(004)V9(001). + 03 T01TIMOUT PIC 9(004)V9(001). + 03 T01TIMRRC PIC 9(004). + * + PROCEDURE DIVISION USING T01TIMPAR. + ***************************************************************** + * サブモジュールNO: (0.0) * + * サブモジュール名: 制御処理 * + * 処理概要 : メインコントロール処理 * + ***************************************************************** + 0000MAINSOR SECTION. + * + *** 丸めモードにより分岐する + EVALUATE T01TIMRRC + *** モード0: 0.5時間単位・切上 + WHEN 0 + PERFORM 1000RNDHALF + *** モード1: 0.1時間単位・切上 + WHEN 1 + PERFORM 2000RNDUP + *** モード2: 0.1時間単位・切捨 + WHEN 2 + PERFORM 3000RNDDOWN + *** モード3: 単純四捨五入(0.1h単位) + WHEN 3 + PERFORM 4000RNDNORMAL + WHEN OTHER + *** モード指定なし→そのまま出力 + MOVE T01TIMHRS TO T01TIMOUT + END-EVALUATE. + * + 0000MAINSOR-EXT. + GOBACK. + ***************************************************************** + * サブモジュールNO: (1.0) * + * サブモジュール名: 0.5時間単位・切上 * + * 処理概要 : 30分単位で切り上げる * + ***************************************************************** + 1000RNDHALF SECTION. + * + *** 時間→分変換 + COMPUTE WRK-MINUTES = + T01TIMHRS * 60. + *** 30分単位で切り上げ + DIVIDE WRK-MINUTES BY 30 + GIVING WRK-HOURS + REMAINDER WRK-REMAINDER. + IF WRK-REMAINDER > 0 THEN + COMPUTE WRK-HOURS = + WRK-HOURS + 1 + END-IF. + *** 分→時間変換 + COMPUTE T01TIMOUT = + WRK-HOURS * 0.5. + * + 1000RNDHALF-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (2.0) * + * サブモジュール名: 0.1時間単位・切上 * + * 処理概要 : 6分単位で切り上げる * + ***************************************************************** + 2000RNDUP SECTION. + * + *** 時間→分変換 + COMPUTE WRK-MINUTES = + T01TIMHRS * 60. + *** 6分単位で切り上げ + DIVIDE WRK-MINUTES BY 6 + GIVING WRK-HOURS + REMAINDER WRK-REMAINDER. + IF WRK-REMAINDER > 0 THEN + COMPUTE WRK-HOURS = + WRK-HOURS + 1 + END-IF. + *** 分→時間変換 + COMPUTE T01TIMOUT = + WRK-HOURS * 0.1. + * + 2000RNDUP-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (3.0) * + * サブモジュール名: 0.1時間単位・切捨 * + * 処理概要 : 6分単位で切り捨てる * + ***************************************************************** + 3000RNDDOWN SECTION. + * + *** 時間→分変換 + COMPUTE WRK-MINUTES = + T01TIMHRS * 60. + *** 6分単位で切り捨て + DIVIDE WRK-MINUTES BY 6 + GIVING WRK-HOURS + REMAINDER WRK-REMAINDER. + *** 分→時間変換 + COMPUTE T01TIMOUT = + WRK-HOURS * 0.1. + * + 3000RNDDOWN-EXT. + EXIT. + ***************************************************************** + * サブモジュールNO: (4.0) * + * サブモジュール名: 単純四捨五入(0.1h単位) * + * 処理概要 : 0.05を加算して切捨 * + ***************************************************************** + 4000RNDNORMAL SECTION. + * + *** 0.05を加算してV9(1)に収める + COMPUTE WRK-HOURS = + T01TIMHRS + 0.05. + *** V9(1)への代入で小数点第2位以下切捨 + MOVE WRK-HOURS TO T01TIMOUT. + * + 4000RNDNORMAL-EXT. + EXIT. diff --git a/production/使用資源一覧/KIN01INP_使用資源一覧.md b/production/使用資源一覧/KIN01INP_使用資源一覧.md new file mode 100644 index 0000000..bb60650 --- /dev/null +++ b/production/使用資源一覧/KIN01INP_使用資源一覧.md @@ -0,0 +1,51 @@ +# KIN01INP 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN01INP +- **プログラム名**: 休暇申請CSV取込・検証処理 +- **処理概要**: CSV形式の休暇申請ファイルを読み込み、休暇種別テーブル検索と項目チェックを行い、ステータスによってWORK-LEAVEまたはERROR-LOGへ振り分ける。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| KIN01R01 | CSV-INPUT | 順編成 | F (固定長) | 80B | なし(自前定義) | +| KIN01W01 | WORK-LEAVE | 順編成 | F (固定長) | 80B | KIN01REC | +| KIN01W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | KIN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN01REC | レコード定義(W01出力ファイル) | FILE SECTION | +| KIN05REC | エラーログレコード定義(W02出力ファイル) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| ZANCHKAC | 項目チェックサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | +| SUB04CHK | 日付/時刻/社員番号妥当性チェック | 2030VALIDATESOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→休暇種別テーブル設定→運用日付取得→OPEN→初回読込) +2. CSV分解(UNSTRINGで8項目に分解) +3. 休暇種別テーブル検索(SEARCH) +4. エラー前提判定 + - フィールド数≠8 → ERROR-LOG出力(種別:F) + - 休暇種別未発見 → ERROR-LOG出力(種別:L) +5. ステータス判定 + - ステータス'1'(有効)→ 項目チェック(SUB04CHK: 開始日付/時刻、終了日付/時刻)→ WORK-LEAVE出力(APPL-ID=0) + - ステータス'9'(取消)→ WORK-LEAVE出力(APPL-ID保持、チェックなし) + - その他(エラー)→ ERROR-LOG出力(種別:S) +6. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/KIN02UPD_使用資源一覧.md b/production/使用資源一覧/KIN02UPD_使用資源一覧.md new file mode 100644 index 0000000..7b20202 --- /dev/null +++ b/production/使用資源一覧/KIN02UPD_使用資源一覧.md @@ -0,0 +1,59 @@ +# KIN02UPD 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN02UPD +- **プログラム名**: 休暇申請DB更新処理 +- **処理概要**: WORK-LEAVEファイルの各レコードをDB2テーブルLEAVE_RECORDSに反映する。ステータスに応じて新規登録(INSERT)、変更(DELETE+INSERT)、取消(DELETE)を行う。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| KIN01W01 | WORK-LEAVE | 順編成 | F (固定長) | 80B | KIN01REC | +| KIN02W01 | ERROR-LOG | 順編成 | V (可変長) | 200B | KIN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN01REC | レコード定義(R01入力ファイル) | FILE SECTION | +| KIN05REC | エラーログレコード定義(W01出力) | FILE SECTION | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| SQLCA | SQL通信領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | + +## 使用DB2テーブル + +| テーブル名 | 操作 | 備考 | +|-----------|------|------| +| LEAVE_RECORDS | INSERT, DELETE | APPLICATION_ID=0→INSERT, >0→DELETE+INSERT, STATUS='9'→DELETE | + +## EXEC SQL一覧 + +| SQL種別 | 処理 | 実行条件 | 使用箇所 | +|---------|------|---------|---------| +| CONNECT | TO 'data/kin.db' | 常時 | 1000ITTSOR | +| INSERT | LEAVE_RECORDSへ追加 | STATUS='1' AND APPL-ID=0 | 2110INSERTSOR | +| DELETE | APPLICATION_ID一致削除+INSERT | STATUS='1' AND APPL-ID>0 | 2120UPDATESOR | +| INSERT | LEAVE_RECORDSへ追加(変更後) | STATUS='1' AND APPL-ID>0 | 2120UPDATESOR | +| DELETE | APPLICATION_ID一致削除 | STATUS='9' | 2130DELETESOR | +| COMMIT | WORK | 常時 | 3000STPSOR | +| ROLLBACK | WORK | SQLエラー時 | 9100DBERRSOR | + +## 処理フロー +1. 初期処理(開始メッセージ→DB接続→OPEN(R01/W01)→初回読込) +2. ホスト変数設定(R01→WS-*) +3. ロジック分岐(EVALUATE) + - STATUS='1' AND APPL-ID=0 → INSERT + - STATUS='1' AND APPL-ID>0 → DELETE + INSERT + - STATUS='9' → DELETE + - その他 → スキップ +4. SQLエラー時 → ROLLBACK + ERROR-LOG出力(W01) + エラーメッセージ + ABEND +5. 終了処理(COMMIT→CLOSE(R01/W01)→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/KIN03EXP_使用資源一覧.md b/production/使用資源一覧/KIN03EXP_使用資源一覧.md new file mode 100644 index 0000000..675d953 --- /dev/null +++ b/production/使用資源一覧/KIN03EXP_使用資源一覧.md @@ -0,0 +1,61 @@ +# KIN03EXP 使用資源一覧 + +## プログラム概要 +- **プログラムID**: KIN03EXP +- **プログラム名**: 休暇日別展開処理 +- **処理概要**: LEAVE_RECORDS(DB2)より有効申請(STATUS='1')を読込み、開始日〜終了日の期間を日別に展開し、休日・週末を除外してLEAVE-DAILYファイルを出力する。社員番号キーブレイクで小計出力を行う。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| KIN02W01.DAT | LEAVE-DAILY | 順編成 | F (固定長) | 80B | KIN02REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| KIN02REC | レコード定義(W01出力ファイル) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| SQLCA | SQL通信領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | +| br_fetch_next | SQLカーソル次行FETCH(bridge) | 1100C1FETCHSOR, 1200HDINNSOR | +| br_get_col | SQLカラム値取得(bridge) | 1100C1FETCHSOR, 1200HDINNSOR | + +## 使用DB2テーブル + +| テーブル名 | 操作 | 備考 | +|-----------|------|------| +| LEAVE_RECORDS | SELECT | STATUS='1'、ORDER BY EMP_ID, START_DATE | +| HOLIDAY_CALENDAR | SELECT | 休日マスタ、ORDER BY HOLIDAY_DATE | + +## EXEC SQL一覧 + +| SQL種別 | 処理 | 実行条件 | 使用箇所 | +|---------|------|---------|---------| +| CONNECT | TO 'data/kin.db' | 常時 | 1000ITTSOR | +| SELECT | HOLIDAY_DATE FROM HOLIDAY_CALENDAR | 常時(初回のみ) | 1200HDINNSOR | +| SELECT | LEAVE_RECORDS(全件) | 常時(初回のみ) | 1100C1INITSOR | + +## 処理フロー +1. 初期処理(開始メッセージ→DB接続→運用日付取得) +2. 休日カレンダー全件読込(WORKING-STORAGEに格納) +3. 出力ファイルOPEN +4. DB初回FETCH(LEAVE_RECORDS:STATUS='1'、ORDER BY EMP_ID, START_DATE) +5. 社員番号キーブレイクループ + - 社員別に期間内を日別展開 + - 週末判定(MOD(INTEGER-OF-DATE,7)=0/6)→除外 + - 休日判定(SEARCH ALL on WRK-HOLIDAY-TABLE)→除外 + - 非週末・非休日 → LEAVE-DAILY出力 + - 日付加算(月跨ぎ/閏年対応) + - キーブレイク時:社員別小計メッセージ出力 +6. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/ZAN01CHK_使用資源一覧.md b/production/使用資源一覧/ZAN01CHK_使用資源一覧.md new file mode 100644 index 0000000..38c9983 --- /dev/null +++ b/production/使用資源一覧/ZAN01CHK_使用資源一覧.md @@ -0,0 +1,48 @@ +# ZAN01CHK 使用資源一覧 + +## プログラム概要 +- **プログラムID**: ZAN01CHK +- **プログラム名**: 残業申請振分処理 +- **処理概要**: CSV形式の残業申請ファイルを読み込み、ステータスによって適切に振り分ける。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| ZAN01R01 | 入力CSV | 順編成 | F (固定長) | 80B | なし(自前定義) | +| ZAN01W01 | OVT-APPLY | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN01W02 | OVT-CANCEL | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN01W03 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| ZAN01REC | レコード定義(W01/W02出力ファイル) | FILE SECTION | +| ZAN05REC | エラーログレコード定義(W03出力ファイル) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| ZANCHKAC | 項目チェックサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | +| SUB04CHK | 日付/社員番号妥当性チェック | 2020VALIDATESOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN→初回読込) +2. CSV分解(UNSTRING) +3. ステータス判定 + - ステータス'0'/'1'(有効)→ 項目チェック(SUB04CHK)→ W01出力 + - ステータス'9'(取消)→ W02出力 + - その他(エラー)→ W03出力 +4. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/ZAN02CHK_使用資源一覧.md b/production/使用資源一覧/ZAN02CHK_使用資源一覧.md new file mode 100644 index 0000000..0cd1b7f --- /dev/null +++ b/production/使用資源一覧/ZAN02CHK_使用資源一覧.md @@ -0,0 +1,45 @@ +# ZAN02CHK 使用資源一覧 + +## プログラム概要 +- **プログラムID**: ZAN02CHK +- **プログラム名**: 時間帯重複チェック処理 +- **処理概要**: OVT-APPLYファイルの同一社員・同一日付内の開始時刻と終了時刻の重複をチェックする。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| ZAN02R01 | OVT-APPLY | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN02W01 | OVT-NODUP | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN02W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| ZAN01REC | レコード定義(R01入力/W01出力) | FILE SECTION | +| ZAN05REC | エラーログレコード定義(W02出力) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN→初回読込) +2. 1件目をそのままW01出力+前レコード保持 +3. メイン処理:キー比較 + - 同一社員+同一日付 かつ 前終了時刻>現開始時刻 → 重複エラー(W02出力) + - 同一社員+同一日付 かつ 重複なし → W01出力+前レコード更新 + - キーブレイク → 前レコード更新+W01出力 +4. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/ZAN03CHK_使用資源一覧.md b/production/使用資源一覧/ZAN03CHK_使用資源一覧.md new file mode 100644 index 0000000..d4b6461 --- /dev/null +++ b/production/使用資源一覧/ZAN03CHK_使用資源一覧.md @@ -0,0 +1,49 @@ +# ZAN03CHK 使用資源一覧 + +## プログラム概要 +- **プログラムID**: ZAN03CHK +- **プログラム名**: 打刻時間照合処理 +- **処理概要**: OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の照合を行う。申請時間帯が出勤〜退勤の範囲内かを確認する。申請日が休日かを判定しOVT-TYPEを付加する。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| ZAN03R01 | OVT-NODUP | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN03R02 | PUNCH-SORTED | 順編成 | F (固定長) | 80B | なし(自前定義:20B+56B) | +| ZAN03R03 | HOLIDAY | 順編成 | F (固定長) | 80B | なし(自前定義:9B+71B) | +| ZAN03W01 | OVT-CHECKED | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN03W02 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| ZAN01REC | レコード定義(R01入力/W01出力) | FILE SECTION | +| ZAN05REC | エラーログレコード定義(W02出力) | FILE SECTION | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→OPEN) +2. 休日ファイル(R03)全件読込→HOLIDAY-TABLE設定(OCCURS 1~366) +3. メイン処理:R01とR02のキー比較(社員番号+日付) + - R01 < R02 → 打刻データなしエラー(W02出力) + - R01 = R02 → 時間範囲チェック + - 申請時間帯が出勤〜退勤の範囲内 → OVT-TYPE設定(SEARCH ALL休日判定)→ W01出力 + - 範囲外 → エラー(W02出力) + - R01 > R02 → R02読み飛ばし +4. 終了処理(CLOSE→件数出力→終了メッセージ) + +## 備考 +- SUB01DAT不使用:日付取得不要のためFUNCTION CURRENT-DATEも使用しない +- R02FILLER = 56B(PUNCH-SORTEDのフォーマット:社員番号8B+日付8B+出勤4B+退勤4B+予備56B) \ No newline at end of file diff --git a/production/使用資源一覧/ZAN04MAT_使用資源一覧.md b/production/使用資源一覧/ZAN04MAT_使用資源一覧.md new file mode 100644 index 0000000..d5fa1f3 --- /dev/null +++ b/production/使用資源一覧/ZAN04MAT_使用資源一覧.md @@ -0,0 +1,48 @@ +# ZAN04MAT 使用資源一覧 + +## プログラム概要 +- **プログラムID**: ZAN04MAT +- **プログラム名**: 取消マッチング処理 +- **処理概要**: OVT-SORTED(有効申請)とOVT-CSORT(取消申請)を申請番号で1:1マッチングし、結果を振り分ける。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| ZAN04R01 | OVT-SORTED | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN04R02 | OVT-CSORT | 順編成 | F (固定長) | 80B | ZAN01REC | +| ZAN04W01 | OVT-MATCHED | 順編成 | F (固定長) | 80B | ZAN02REC | +| ZAN04W02 | OVT-DBCLEAN | 順編成 | F (固定長) | 80B | ZAN04REC | +| ZAN04W03 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| ZAN01REC | レコード定義(R01/R02入力ファイル) | FILE SECTION | +| ZAN02REC | OVT-MATCHEDレコード定義(W01出力) | FILE SECTION | +| ZAN04REC | OVT-DBCLEANレコード定義(W02出力) | FILE SECTION | +| ZAN05REC | エラーログレコード定義(W03出力) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN→R01/R02初回読込) +2. メイン処理:マッチング(申請番号APPL-IDで1:1突合) + - R01キー = R02キー(マッチ) → 取消済み申請をERROR-LOG(W03)に出力(ERR-CATEGORY=04) + - R01キー < R02キー(R01のみ) → 有効申請をOVT-MATCHED(W01)に出力(STRING編集でPROC-SEQ=01付加) + - R01キー > R02キー(R02のみ) → 取消申請をOVT-DBCLEAN(W02)に出力 +3. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/ZAN05CAL_使用資源一覧.md b/production/使用資源一覧/ZAN05CAL_使用資源一覧.md new file mode 100644 index 0000000..0396955 --- /dev/null +++ b/production/使用資源一覧/ZAN05CAL_使用資源一覧.md @@ -0,0 +1,50 @@ +# ZAN05CAL 使用資源一覧 + +## プログラム概要 +- **プログラムID**: ZAN05CAL +- **プログラム名**: 残業時間集計処理 +- **処理概要**: OVT-SORTED2(申請番号+処理番号昇順)をキーブレイク集計し、同一APPL-ID内の全明細の加班時間を積算してOVT-SUMMARYに1レコード出力。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| ZAN05R01 | OVT-SORTED2 | 順編成 | F (固定長) | 80B | ZAN02REC | +| ZAN05W01 | OVT-SUMMARY | 順編成 | F (固定長) | 80B | ZAN03REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| ZAN02REC | OVT-MATCHEDレコード定義(R01入力) | FILE SECTION | +| ZAN03REC | OVT-SUMMARYレコード定義(W01出力) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | +| ZANTIMAC | 時刻丸めサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | +| SUB05TIM | 時刻丸め(0.1h単位切捨) | 2100OUTSOR | + +## 使用DB2テーブル + +なし(DB操作なし) + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN→初回読込) +2. キーブレイク集計ループ + - キー変わり(APPL-ID) → 前グループ集計出力+累積リセット+新グループ開始 + - 同一グループ → 現レコード時間差分をWRK-ACCUM-MINに積算+最新レコード上書き保持 + - EOF → 最終グループを出力 +3. 集計出力処理(2100OUTSOR) + - DIVIDE REMAINDERで時→分変換 + - COMPUTE ROUNDED ON SIZE ERROR + - SUB05TIM呼出(0.1h単位切捨て丸め) + - OVT-SUMMARY出力(グループ先頭START・最新END・積算OVT-HOURS) +4. 終了処理(CLOSE→件数出力→終了メッセージ) diff --git a/production/使用資源一覧/ZAN06UPD_使用資源一覧.md b/production/使用資源一覧/ZAN06UPD_使用資源一覧.md new file mode 100644 index 0000000..00fe3c5 --- /dev/null +++ b/production/使用資源一覧/ZAN06UPD_使用資源一覧.md @@ -0,0 +1,72 @@ +# ZAN06UPD 使用資源一覧 + +## プログラム概要 +- **プログラムID**: ZAN06UPD +- **プログラム名**: 残業統計DB更新処理 +- **処理概要**: OVT-SUMMARYの各レコードをDBにINSERT/UPSERTし、OVT-DBCLEANの各レコードについて該当申請を取消状態に更新する。DB2テーブル操作を含む全サブシステムB唯一のDB更新プログラム。 + +## 使用ファイル + +| DD名 | ファイル識別子 | 編成 | レコード形式 | レコード長 | COPY句 | +|------|---------------|------|-------------|-----------|--------| +| ZAN06R01 | OVT-SUMMARY | 順編成 | F (固定長) | 80B | ZAN03REC | +| ZAN06R02 | OVT-DBCLEAN | 順編成 | F (固定長) | 80B | ZAN04REC | +| ZAN06W01 | ERROR-LOG | 順編成 | V (可変長) | 200B | ZAN05REC | + +## 使用COPY句 + +| COPY句 | 用途 | 使用箇所 | +|--------|------|---------| +| ZAN03REC | OVT-SUMMARYレコード定義(R01入力) | FILE SECTION | +| ZAN04REC | OVT-DBCLEANレコード定義(R02入力) | FILE SECTION | +| ZAN05REC | エラーログレコード定義(W01出力) | FILE SECTION | +| ZANDATAC | 運用日付サブPGM連絡領域 | WORKING-STORAGE | +| ZANMSGAC | メッセージ編集サブPGM連絡領域 | WORKING-STORAGE | +| ZANENDAC | ABENDサブPGM連絡領域 | WORKING-STORAGE | + +## 使用サブプログラム + +| サブPGM | 役割 | CALL箇所 | +|---------|------|---------| +| SUB01DAT | 運用日付取得 | 1000ITTSOR | +| SUB02MSG | メッセージ編集出力 | 4000MSGOUTSOR | +| SUB03END | ABEND処理 | 9999ABDSOR | + +## 使用DB2テーブル + +| テーブル名 | 操作種別 | 説明 | +|------------|---------|------| +| OVT_APPLICATIONS | INSERT / UPDATE | 申請データ登録・更新(取消) | +| OVT_MONTHLY | SELECT / INSERT / UPDATE | 月次集計テーブル(加算・減算) | + +## 実行SQL一覧 + +| SQL種別 | 内容 | 該当箇所 | +|---------|------|---------| +| CONNECT TO | DB接続(data\OVERTIME.DB) | 1000ITTSOR | +| INSERT INTO ... OVT_APPLICATIONS | 申請データ新規登録 | 2100SUMMARYSOR | +| UPDATE ... OVT_APPLICATIONS | 重複時更新(STATUS) | 2100SUMMARYSOR | +| SELECT ... OVT_MONTHLY | 月次集計存在確認 | 2110MONTHLYUPSOR | +| UPDATE ... OVT_MONTHLY (+加算) | 月次集計加算 | 2110MONTHLYUPSOR | +| INSERT INTO ... OVT_MONTHLY | 月次集計新規作成 | 2110MONTHLYUPSOR | +| SELECT ... OVT_APPLICATIONS | 取消データ取得 | 2200DBCLEANSOR | +| UPDATE ... OVT_APPLICATIONS (取消) | 申請ステータス取消 | 2200DBCLEANSOR | +| UPDATE ... OVT_MONTHLY (-減算) | 月次集計減算(リトライ3回) | 2210MONTHLYSUBSOR | +| COMMIT WORK | 50件毎/最終コミット | 2300COMMITDBX | +| ROLLBACK WORK | DBエラー時ロールバック | 9100DBERRSOR | + +## 処理フロー +1. 初期処理(開始メッセージ→運用日付取得→OPEN→DB CONNECT→R01/R02初回読込) +2. フェーズ1(OVT-SUMMARY処理): + - SQLホスト変数設定(年月抽出・時刻変換・時間→分変換) + - OVT_APPLICATIONSにINSERT + - 成功 → INSERTカウンタ+1 + - 重複エラー(SQLCODE≠0) → UPDATE(STATUS更新) + - OVT_MONTHLY UPSERT(存在確認SELECT→UPDATE/INSERT) + - 50件毎にCOMMIT +3. フェーズ2(OVT-DBCLEAN処理): + - OVT_APPLICATIONSから既存データSELECT + - 該当なし(孤立取消) → ERROR-LOG出力+ABEND(999) + - OVT_APPLICATIONSステータス更新('9'=取消) + - OVT_MONTHLY減算(3回リトライ付きUPDATE) +4. 終了処理(最終COMMIT→CLOSE→件数出力→終了メッセージ) diff --git a/production/詳細設計書/COPY句定義書.md b/production/詳細設計書/COPY句定義書.md new file mode 100644 index 0000000..88485cd --- /dev/null +++ b/production/詳細設計書/COPY句定義書.md @@ -0,0 +1,542 @@ +# ファイル定義書 + +## 変更履歴 + +| No | 変更内容 | 担当者 | 変更日 | 承認者 | 備考 | +|----|---------|--------|--------|--------|------| +| 1 | 新規作成(ZAN系10部品) | AI | 2026/06/15 | | | +| 2 | KIN系6部品追加(KIN02-07REC) | AI | 2026/06/23 | | KIN07DAI実装に伴い追加 | + +--- + +# ZAN01REC — 加班申請レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| OVT-VALID / OVT-CANCEL / OVT-SORTED / OVT-CSORT / OVT-VSORT / OVT-NODUP / OVT-CHECKED | ZAN01REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | YYYYMMDD+SEQ | +| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | | +| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD | +| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM | +| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM | +| 6 | 03 | ステータス | (A)STATUS | X(1) | 1 | | 33 | | | 0:有効/1:確定/9:取消 | +| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 34 | | | W:平日/H:休日 | +| 8 | 03 | 予約 | (A)FILLER | X(46) | 46 | | 35 | | | | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| ZAN01CHK | W01 | OVT-VALID出力(STATUS=0/1) | O | +| ZAN01CHK | W02 | OVT-CANCEL出力(STATUS=9) | O | +| ZAN02CHK | R01 | OVT-VSORT入力 | I | +| ZAN02CHK | W01 | OVT-NODUP出力 | O | +| ZAN03CHK | R01 | OVT-NODUP入力 | I | +| ZAN03CHK | W01 | OVT-CHECKED出力 | O | +| ZAN04MAT | R01 | OVT-SORTED入力(有効申請) | I | +| ZAN04MAT | R02 | OVT-CSORT入力(取消申請) | I | + +--- + +# ZAN02REC — マッチング結果レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| OVT-MATCHED | ZAN02REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | | +| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | | +| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD | +| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM | +| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM | +| 6 | 03 | ステータス | (A)STATUS | X(1) | 1 | | 33 | | | | +| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 34 | | | W:平日/H:休日 | +| 8 | 03 | 処理番号 | (A)PROC-SEQ | 9(2) | 2 | | 35 | | | 01固定 | +| 9 | 03 | 予約 | (A)FILLER | X(44) | 44 | | 37 | | | | + +### ZAN01RECとの差分 + +| 項目 | ZAN01REC | ZAN02REC | +|------|----------|----------| +| 追加 | — | PROC-SEQ(9(2)) | +| FILLER | X(46) | X(44) | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| ZAN04MAT | W01 | OVT-MATCHED出力 | O | + +--- + +# ZAN03REC — 集約結果レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| OVT-AGGREGATED | ZAN03REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | | +| 2 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 9 | | | | +| 3 | 03 | 申請日 | (A)APPL-DATE | 9(8) | 8 | | 17 | | | YYYYMMDD | +| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 25 | | | HHMM | +| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 29 | | | HHMM | +| 6 | 03 | 残業時間 | (A)OVT-HOURS | 9(4)V9(1) | 5 | | 33 | | | HH.h(0.1h単位) | +| 7 | 03 | 残業種別 | (A)OVT-TYPE | X(1) | 1 | | 38 | | | W:平日/H:休日 | +| 8 | 03 | 予約 | (A)FILLER | X(42) | 42 | | 39 | | | | + +### ZAN01RECとの差分 + +| 項目 | ZAN01REC | ZAN03REC | +|------|----------|----------| +| 削除 | STATUS | — | +| 追加 | — | OVT-HOURS(9(4)V9(1)) | +| FILLER | X(46) | X(42) | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | 備考 | +|-----------|--------------|------|-----|------| +| ZAN05CAL | (未定) | 集約結果出力 | O | 未実装 | + +--- + +# ZAN04REC — DBCLEAN対象レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| OVT-DBCLEAN | ZAN04REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 申請番号 | (A)APPL-ID | X(8) | 8 | | 1 | | | DB削除対象申請番号 | +| 2 | 03 | 予約 | (A)FILLER | X(72) | 72 | | 9 | | | | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| ZAN04MAT | W02 | OVT-DBCLEAN出力(APPL-IDのみ設定) | O | + +--- + +# ZAN05REC — エラーログレコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| ERROR-LOG | ZAN05REC | PS | VB | 200 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | エラーカテゴリ | (A)ERR-CATEGORY | 9(2) | 2 | | 1 | | | 01:項目CHK/02:重複/03:打刻不突合/03:取消監査 | +| 2 | 03 | エラー詳細 | (A)ERR-DETAIL | X(198) | 198 | | 3 | | | STRING編集値 | + +### 使用プログラム + +| プログラム | プレフィックス | エラーカテゴリ | I/O | +|-----------|--------------|---------------|-----| +| ZAN01CHK | W03 | 01(項目チェックエラー) | O | +| ZAN02CHK | W02 | 02(時間重複エラー) | O | +| ZAN03CHK | W02 | 03(打刻不突合エラー) | O | +| ZAN04MAT | W03 | 03(取消マッチ監査証跡) | O | + +--- + +# ZANDATAC — SUB01DAT 運用日付取得用連絡領域 + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| SUB01DAT連絡領域 | ZANDATAC | — | — | 10 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 01 | 運用日付パラメタ | D01UBSPAR | | | | 1 | | | CALL USING対象 | +| 2 | 03 | 復帰コード | D01FKICOD | S9(4) COMP | 2 | | 1 | | D01UBSPAR | 0000:正常 | +| 3 | 03 | 運用日付 | D01UBSUDATE | 9(8) | 8 | | 3 | | D01UBSPAR | YYYYMMDD | + +### 使用プログラム + +| プログラム | 呼出方法 | 備考 | +|-----------|---------|------| +| ZAN01CHK | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 | +| ZAN02CHK | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 | +| ZAN04MAT | CALL 'SUB01DAT' USING D01UBSPAR | 初期処理 | + +※ ZAN03CHKはFUNCTION CURRENT-DATEを使用し本COPY未使用 + +--- + +# ZANMSGAC — SUB02MSG メッセージ出力用連絡領域 + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| SUB02MSG連絡領域 | ZANMSGAC | — | — | 303 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 01 | メッセージパラメタ | M00MHOPAR | | | | 1 | | | CALL USING対象 | +| 2 | 03 | メッセージ番号 | M00MSGCOD | 9(3) | 3 | | 1 | | M00MHOPAR | | +| 3 | 03 | パラメータ1 | M00UMKDATS22-01 | X(30) | 30 | | 4 | | M00MHOPAR | | +| 4 | 03 | パラメータ2 | M00UMKDATS22-02 | X(30) | 30 | | 34 | | M00MHOPAR | | +| 5 | 03 | パラメータ3 | M00UMKDATS22-03 | X(30) | 30 | | 64 | | M00MHOPAR | | +| 6 | 03 | パラメータ4 | M00UMKDATS22-04 | X(30) | 30 | | 94 | | M00MHOPAR | | +| 7 | 03 | パラメータ5 | M00UMKDATS22-05 | X(30) | 30 | | 124 | | M00MHOPAR | | +| 8 | 03 | パラメータ6 | M00UMKDATS22-06 | X(30) | 30 | | 154 | | M00MHOPAR | | +| 9 | 03 | パラメータ7 | M00UMKDATS22-07 | X(30) | 30 | | 184 | | M00MHOPAR | | +| 10 | 03 | パラメータ8 | M00UMKDATS22-08 | X(30) | 30 | | 214 | | M00MHOPAR | | +| 11 | 03 | パラメータ9 | M00UMKDATS22-09 | X(30) | 30 | | 244 | | M00MHOPAR | | +| 12 | 03 | パラメータ10 | M00UMKDATS22-10 | X(30) | 30 | | 274 | | M00MHOPAR | | + +### 使用プログラム + +| プログラム | 呼出方法 | 備考 | +|-----------|---------|------| +| ZAN01CHK | CALL 'SUB02MSG' USING M00MHOPAR | | +| ZAN02CHK | CALL 'SUB02MSG' USING M00MHOPAR | | +| ZAN03CHK | CALL 'SUB02MSG' USING M00MHOPAR | | +| ZAN04MAT | CALL 'SUB02MSG' USING M00MHOPAR | | +| ZAN05CAL | CALL 'SUB02MSG' USING M00MHOPAR | | +| ZAN06UPD | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN01INP | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN02UPD | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN03EXP | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN04CHK | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN05MAT | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN06CLD | CALL 'SUB02MSG' USING M00MHOPAR | | +| KIN07DAI | CALL 'SUB02MSG' USING M00MHOPAR | | + +--- + +# ZANENDAC — SUB03END ABEND処理用連絡領域 + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| SUB03END連絡領域 | ZANENDAC | — | — | 3 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 01 | ABENDパラメタ | E01ABDPAR | | | | 1 | | | CALL USING対象 | +| 2 | 03 | ABENDコード | E01ABDCOD | 9(3) | 3 | | 1 | | E01ABDPAR | 999:汎用 | + +### 使用プログラム + +| プログラム | 呼出方法 | +|-----------|---------| +| ZAN01CHK | CALL 'SUB03END' USING E01ABDPAR | +| ZAN02CHK | CALL 'SUB03END' USING E01ABDPAR | +| ZAN03CHK | CALL 'SUB03END' USING E01ABDPAR | +| ZAN04MAT | CALL 'SUB03END' USING E01ABDPAR | +| ZAN05CAL | CALL 'SUB03END' USING E01ABDPAR | +| ZAN06UPD | CALL 'SUB03END' USING E01ABDPAR | +| KIN01INP | CALL 'SUB03END' USING E01ABDPAR | +| KIN02UPD | CALL 'SUB03END' USING E01ABDPAR | +| KIN03EXP | CALL 'SUB03END' USING E01ABDPAR | +| KIN04CHK | CALL 'SUB03END' USING E01ABDPAR | +| KIN05MAT | CALL 'SUB03END' USING E01ABDPAR | +| KIN06CLD | CALL 'SUB03END' USING E01ABDPAR | +| KIN07DAI | CALL 'SUB03END' USING E01ABDPAR | + +--- + +# ZANCHKAC — SUB04CHK 項目チェック用連絡領域 + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| SUB04CHK連絡領域 | ZANCHKAC | — | — | 92 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 01 | 項目チェックパラメタ | C01CHKPAR | | | | 1 | | | CALL USING対象 | +| 2 | 03 | チェックタイプ | C01CHKTYP | X(8) | 8 | | 1 | | C01CHKPAR | DATE/TIME/NUM/EMPID | +| 3 | 03 | チェック対象データ | C01CHKDAT | X(80) | 80 | | 9 | | C01CHKPAR | | +| 4 | 03 | 復帰コード | C01CHKRRC | 9(4) | 4 | | 89 | | C01CHKPAR | 0000:正常/0001:日付/0002:時刻/0003:数字/0004:社員番号/9999:不明 | + +### 使用プログラム + +| プログラム | 呼出方法 | 備考 | +|-----------|---------|------| +| ZAN01CHK | CALL 'SUB04CHK' USING C01CHKPAR | 日付/時刻チェック | + +--- + +# ZANTIMAC — SUB05TIM 時刻丸め用連絡領域 + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| SUB05TIM連絡領域 | ZANTIMAC | — | — | 14 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 01 | 時刻丸めパラメタ | T01TIMPAR | | | | 1 | | | CALL USING対象 | +| 2 | 03 | 入力時間 | T01TIMHRS | 9(4)V9(1) | 5 | | 1 | | T01TIMPAR | HH.h | +| 3 | 03 | 出力時間 | T01TIMOUT | 9(4)V9(1) | 5 | | 6 | | T01TIMPAR | 丸め後 | +| 4 | 03 | 丸めモード | T01TIMRRC | 9(4) | 4 | | 11 | | T01TIMPAR | 0:0.5h切上/1:0.1h切上/2:0.1h切捨/3:四捨五入 | + +### 使用プログラム + +| プログラム | 呼出方法 | 備考 | +|-----------|---------|------| +| ZAN05CAL | CALL 'SUB05TIM' USING T01TIMPAR | 残業時間丸め | +| KIN07DAI | CALL 'SUB05TIM' USING T01TIMPAR | 休暇時間丸め(0.1h切上) | + +--- + +# KIN02REC — 日別展開休暇レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| LEAVE-DAILY | KIN02REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 社員番号 | (A)EMP-ID | X(8) | 8 | | 1 | | | | +| 2 | 03 | 日付 | (A)DATE | 9(8) | 8 | | 9 | | | YYYYMMDD | +| 3 | 03 | 休暇種別 | (A)LEAVE-TYPE | X(2) | 2 | | 17 | | | 01/02/03/04 | +| 4 | 03 | 開始時刻 | (A)START-TIME | 9(4) | 4 | | 19 | | | HHMM | +| 5 | 03 | 終了時刻 | (A)END-TIME | 9(4) | 4 | | 23 | | | HHMM | +| 6 | 03 | 申請番号 | (A)APPL-ID | 9(9) | 9 | | 27 | | | | +| 7 | 03 | 予約 | (A)FILLER | X(45) | 45 | | 36 | | | | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| KIN03EXP | W02 | LEAVE-DAILY出力(日別展開結果) | O | +| KIN05MAT | R02 | LEAVE-DAILY入力(照合N側) | I | +| KIN07DAI | R03 | LEAVE-DAILY入力(休暇日別) | I | + +--- + +# KIN03REC — 打刻休暇照合レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| KIN-LEAVE | KIN03REC | PS | FB | 160 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 社員番号 | (A)EMP-ID | X(8) | 8 | | 1 | | | | +| 2 | 03 | 勤怠日付 | (A)WORK-DATE | 9(8) | 8 | | 9 | | | YYYYMMDD | +| 3 | 03 | 出勤時刻 | (A)STR-TIME | 9(4) | 4 | | 17 | | | HHMM | +| 4 | 03 | 退勤時刻 | (A)END-TIME | 9(4) | 4 | | 21 | | | HHMM | +| 5 | 03 | 部門ID | (A)DEPT-ID | X(4) | 4 | | 25 | | | | +| 6 | 03 | 端末ID | (A)TERMINAL | X(6) | 6 | | 29 | | | | +| 7 | 03 | 予約 | (A)FILLER-1 | X(46) | 46 | | 35 | | | 打刻データ領域 | +| 8 | 03 | 休暇種別 | (A)LEAVE-TYPE | X(2) | 2 | | 81 | | | 01/02/03/04 | +| 9 | 03 | 休暇開始時刻 | (A)LEAVE-STR-TIME | 9(4) | 4 | | 83 | | | HHMM | +| 10 | 03 | 休暇終了時刻 | (A)LEAVE-END-TIME | 9(4) | 4 | | 87 | | | HHMM | +| 11 | 03 | 休暇時間 | (A)LEAVE-HOURS | 9(4)V9(1) | 5 | | 91 | | | 0.1h単位 | +| 12 | 03 | 申請番号 | (A)APPLICATION-ID | 9(9) | 9 | | 96 | | | | +| 13 | 03 | 予約 | (A)FILLER-2 | X(56) | 56 | | 105 | | | | + +### KIN04RECとの差分 + +前半80BはKIN04REC(打刻編集レコード)と同一レイアウト。後半80Bに休暇情報を追記して160B構成。 + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| KIN05MAT | W01 | KIN-LEAVE出力(照合結果) | O | +| KIN07DAI | R02 | KIN-LEAVE入力(打刻+休暇) | I | + +--- + +# KIN04REC — 打刻編集レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| EDITED-PUNCH | KIN04REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 社員番号 | (A)EMP-ID | X(8) | 8 | | 1 | | | | +| 2 | 03 | 勤怠日付 | (A)WORK-DATE | 9(8) | 8 | | 9 | | | YYYYMMDD | +| 3 | 03 | 出勤時刻 | (A)STR-TIME | 9(4) | 4 | | 17 | | | HHMM | +| 4 | 03 | 退勤時刻 | (A)END-TIME | 9(4) | 4 | | 21 | | | HHMM | +| 5 | 03 | 部門ID | (A)DEPT-ID | X(4) | 4 | | 25 | | | | +| 6 | 03 | 端末ID | (A)TERMINAL | X(6) | 6 | | 29 | | | | +| 7 | 03 | 予約 | (A)FILLER | X(46) | 46 | | 35 | | | | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| KIN04CHK | W01 | EDITED-PUNCH出力(打刻編集結果) | O | +| KIN05MAT | R01 | EDITED-PUNCH入力(照合主駆動) | I | + +--- + +# KIN05REC — エラーログレコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| KERR-LOG | KIN05REC | PS | VB | 200 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | エラーカテゴリ | (A)ERR-CATEGORY | 9(2) | 2 | | 1 | | | 01:項目CHK/02:重複/03:打刻不突合 | +| 2 | 03 | エラー詳細 | (A)ERR-DETAIL | X(198) | 198 | | 3 | | | STRING編集値 | + +### ZAN05RECとの関係 + +ZAN05REC(残業側エラーログ)と同一レイアウト。別COPY IDだが実質同じ定義。 + +### 使用プログラム + +| プログラム | プレフィックス | エラーカテゴリ | I/O | +|-----------|--------------|---------------|-----| +| KIN01INP | W02 | 01(項目チェックエラー) | O | +| KIN02UPD | W03 | 02(DB更新エラー) | O | + +--- + +# KIN06REC — 出勤日カレンダーレコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| WORK-DAY-FILE | KIN06REC | PS | FB | 80 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 社員番号 | (A)EMP-ID | X(8) | 8 | | 1 | | | | +| 2 | 03 | 日付 | (A)DATE | 9(8) | 8 | | 9 | | | YYYYMMDD | +| 3 | 03 | 曜日 | (A)DAY-OF-WEEK | 9(1) | 1 | | 17 | | | 0=日/1=月/…/6=土 | +| 4 | 03 | 予約 | (A)FILLER | X(63) | 63 | | 18 | | | | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| KIN06CLD | W01 | WORK-DAY-FILE出力(カレンダー生成) | O | +| KIN07DAI | R01 | WORK-DAY-FILE入力(主駆動) | I | + +--- + +# KIN07REC — 日別勤怠計算レコード + +## Layout(レコードレイアウト) + +### ファイル基本情報 + +| ファイル名 | COPY ID | 媒体 | レコード形式 | レコード長 | +|-----------|---------|------|-------------|-----------| +| DAILY-RECORD | KIN07REC | PS | FB | 200 | + +### レコード定義 + +| No | レベル | 項目名 | 項目名(英字名) | 属性(PIC TYPE) | バイト数 | OCCURS | 開始位置 | REDEFINES | 所属グループ | 備考 | +|----|--------|--------|---------------|----------------|---------|--------|---------|-----------|-------------|------| +| 1 | 03 | 社員番号 | (A)EMP-ID | 9(8) | 8 | | 1 | | | | +| 2 | 03 | 日付 | (A)DATE | 9(8) | 8 | | 9 | | | YYYYMMDD | +| 3 | 03 | 出勤時刻 | (A)TIME-IN | 9(4) | 4 | | 17 | | | HHMM、打刻なし=0000 | +| 4 | 03 | 退勤時刻 | (A)TIME-OUT | 9(4) | 4 | | 21 | | | HHMM、打刻なし=0000 | +| 5 | 03 | 年休時間 | (A)ANNUAL-H | 9(4)V9(1) | 5 | | 25 | | | 0.1h単位(SUB05TIM丸め) | +| 6 | 03 | 事假時間 | (A)PERSONAL-H | 9(4)V9(1) | 5 | | 30 | | | 0.1h単位(SUB05TIM丸め) | +| 7 | 03 | 因公特批假時間 | (A)OFFICIAL-H | 9(4)V9(1) | 5 | | 35 | | | 0.1h単位(SUB05TIM丸め) | +| 8 | 03 | 病欠時間 | (A)SICK-H | 9(4)V9(1) | 5 | | 40 | | | 0.1h単位(SUB05TIM丸め) | +| 9 | 03 | 未申請欠勤時間 | (A)ABSENT-H | 9(4)V9(1) | 5 | | 45 | | | 8.0h固定(パターンD) | +| 10 | 03 | 予約 | (A)FILLER | X(151) | 151 | | 50 | | | | + +### 使用プログラム + +| プログラム | プレフィックス | 用途 | I/O | +|-----------|--------------|------|-----| +| KIN07DAI | W01 | DAILY-RECORD出力 | O | +| KIN08DBU | R01 | DAILY-RECORD入力(DB書込用) | I | diff --git a/production/詳細設計書/DB定義書.md b/production/詳細設計書/DB定義書.md new file mode 100644 index 0000000..58ddb85 --- /dev/null +++ b/production/詳細設計書/DB定義書.md @@ -0,0 +1,232 @@ +# DB定義書 + +## 変更履歴 + +| No | 変更内容 | 担当者 | 変更日 | 承認者 | 備考 | +|----|---------|--------|--------|--------|------| +| 1 | 新規作成(全8テーブル) | AI | 2026/06/23 | | サブシステムA(6) + B(2) | + +--- + +# EMP_MASTER — 社員マスタ + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 勤怠休暇管理DB | EMP_MASTER | — | PK: EMP_ID | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | | +| 2 | 部署ID | DEPT_ID | CHAR | 4 | | 4 | NOT NULL | | | | | | | +| 3 | 氏名 | EMP_NAME | VARCHAR | 50 | | 50 | NOT NULL | | | | | | | +| 4 | ステータス | STATUS | CHAR | 1 | | 1 | NOT NULL | | | | | | '1'=在籍, '9'=退職 | + +### 備考 + +- サブシステムA: 参照のみ(SELECT) +- サブシステムB: 使用しない + +--- + +# LEAVE_RECORDS — 休暇申請記録 + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 勤怠休暇管理DB | LEAVE_RECORDS | — | PK: APPLICATION_ID | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 申請番号 | APPLICATION_ID | INTEGER | 10 | | 4 | NOT NULL | | ✓ | | | | 自動採番 | +| 2 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | | | | | | +| 3 | 休暇種別 | LEAVE_TYPE | CHAR | 2 | | 2 | NOT NULL | | | | | | 01/02/03/04 | +| 4 | 開始日 | START_DATE | CHAR | 8 | | 8 | NOT NULL | | | | | | YYYYMMDD | +| 5 | 開始時刻 | START_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM | +| 6 | 終了日 | END_DATE | CHAR | 8 | | 8 | NOT NULL | | | | | | YYYYMMDD | +| 7 | 終了時刻 | END_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM | +| 8 | ステータス | STATUS | CHAR | 1 | | 1 | NOT NULL | | | | | | '1'=有効, '9'=取消 | + +### 備考 + +- KIN02UPDがINSERT/DELETEを実行 +- KIN03EXPがSELECT(日付展開用) +- 取消はDELETE FROM で物理削除 + +--- + +# HOLIDAY_CALENDAR — 休日カレンダー + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 勤怠休暇管理DB | HOLIDAY_CALENDAR | — | PK: HOLIDAY_DATE | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 休日日付 | HOLIDAY_DATE | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | YYYYMMDD | +| 2 | 説明 | DESCRIPTION | VARCHAR | 50 | | 50 | NULL許可 | NULL | | | | | 例:「建国記念の日」 | + +### 備考 + +- 土日は曜日判定で処理するため、このテーブルには祝日のみ格納 +- KIN03EXP, KIN06CLDがSELECTで参照 + +--- + +# SICK_LEAVE_RATE — 病欠控除率 + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 勤怠休暇管理DB | SICK_LEAVE_RATE | — | PK: LEAVE_TYPE | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 休暇種別 | LEAVE_TYPE | CHAR | 2 | | 2 | NOT NULL | | ✓ | | | | '04'固定 | +| 2 | 控除率 | DEDUCTION_RATE | DECIMAL | 3 | 2 | 3 | NOT NULL | | | | | | 例:0.50(50%控除) | + +### 備考 + +- 全社員共通の設定値 +- 現時点では参照プログラム未実装(設計上定義) + +--- + +# DAILY_RECORDS — 日別勤怠記録 + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 勤怠休暇管理DB | DAILY_RECORDS | — | PK: (EMP_ID, TARGET_DATE) | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | | +| 2 | 対象日 | TARGET_DATE | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | YYYYMMDD | +| 3 | 出勤時刻 | TIME_IN | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM, '0000'=打刻なし | +| 4 | 退勤時刻 | TIME_OUT | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM, '0000'=打刻なし | +| 5 | 年休時間 | ANNUAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 | +| 6 | 事假時間 | PERSONAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 | +| 7 | 因公特批假時間 | OFFICIAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 | +| 8 | 病欠時間 | SICK_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 | +| 9 | 未申請欠勤時間 | UNAPPROVED_ABSENT_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | 0.1h単位 | +| 10 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | DEFAULT CURRENT_TIMESTAMP | + +### 備考 + +- KIN08DBUがKIN07DAIの出力ファイルからINSERT +- 1社員1日=1レコード。出勤日のみ存在。 + +--- + +# MONTHLY_ABSENCE — 月次統計 + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 勤怠休暇管理DB | MONTHLY_ABSENCE | — | PK: (EMP_ID, YEAR_MONTH) | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | | +| 2 | 対象年月 | YEAR_MONTH | CHAR | 6 | | 6 | NOT NULL | | ✓ | | | | YYYYMM | +| 3 | 年休合計 | ANNUAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | | +| 4 | 事假合計 | PERSONAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | | +| 5 | 因公特批假合計 | OFFICIAL_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | | +| 6 | 病欠合計 | SICK_LEAVE_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | | +| 7 | 未申請欠勤合計 | UNAPPROVED_ABSENT_H | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | | +| 8 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | DEFAULT CURRENT_TIMESTAMP | + +### 備考 + +- KIN08DBUが月次集計後にUPSERT(MERGE) +- サブシステムC(給与計算)への連携元 + +--- + +# OVT_APPLICATIONS — 個別加班申請テーブル + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 残業統計管理DB | OVT_APPLICATIONS | — | PK: APPL_ID | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 申請番号 | APPL_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | YYYYMMDD+SEQ | +| 2 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | | | | | | +| 3 | 申請日 | APPL_DATE | CHAR | 8 | | 8 | NOT NULL | | | | | | YYYYMMDD | +| 4 | 残業種別 | OVT_TYPE | CHAR | 1 | | 1 | NOT NULL | | | | | | W=平日, H=休日 | +| 5 | 開始時刻 | START_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM | +| 6 | 終了時刻 | END_TIME | CHAR | 4 | | 4 | NOT NULL | | | | | | HHMM | +| 7 | 加班時間 | OVT_HOURS | DECIMAL | 4 | 1 | 4 | NOT NULL | | | | | | 0.1h単位 | +| 8 | ステータス | STATUS | CHAR | 1 | | 1 | NOT NULL | | | | | | 0=有効, 9=取消 | +| 9 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | | + +### 備考 + +- ZAN06UPDがINSERT/UPDATEを実行 +- STATUS=9で取消(物理削除はしない) + +--- + +# OVT_MONTHLY — 月次集計テーブル + +## Layout(テーブル定義) + +### DB基本情報 + +| DB名 | DB ID | COPY ID | INDEX | +|------|-------|---------|-------| +| 残業統計管理DB | OVT_MONTHLY | — | PK: (EMP_ID, YEAR_MONTH, OVT_TYPE) | + +### カラム定義 + +| No | 項目名 | 項目名(英字名) | TYPE | 最大長 | 小数桁 | バイト数 | NULL | DEFAULT | PK | INDEX1 | INDEX2 | INDEX3 | 備考 | +|----|--------|---------------|------|--------|--------|---------|------|---------|----|--------|--------|--------|------| +| 1 | 社員番号 | EMP_ID | CHAR | 8 | | 8 | NOT NULL | | ✓ | | | | | +| 2 | 対象年月 | YEAR_MONTH | CHAR | 6 | | 6 | NOT NULL | | ✓ | | | | YYYYMM | +| 3 | 残業種別 | OVT_TYPE | CHAR | 1 | | 1 | NOT NULL | | ✓ | | | | W=平日, H=休日 | +| 4 | 加班時間合計 | OVT_HOURS | DECIMAL | 6 | 1 | 5 | NOT NULL | | | | | | | +| 5 | 加班回数 | OVT_COUNT | INTEGER | 10 | | 4 | NOT NULL | | | | | | | +| 6 | 更新日時 | UPDATED_AT | TIMESTAMP | — | | 10 | NOT NULL | | | | | | | + +### 備考 + +- ZAN06UPDが月次集計結果をUPSERT diff --git a/production/詳細設計書/詳細設計書_KIN01INP.md b/production/詳細設計書/詳細設計書_KIN01INP.md new file mode 100644 index 0000000..2d5b054 --- /dev/null +++ b/production/詳細設計書/詳細設計書_KIN01INP.md @@ -0,0 +1,153 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN01INP | +| 3 | プログラム名 | 休暇申請CSV取込・検証処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | 振り分け | +| 6 | 機能概要 | CSV形式の休暇申請ファイルを読み込み、休暇種別テーブル検索と項目チェックを行い、ステータスによってWORK-LEAVEまたはERROR-LOGへ振り分ける。 | +| 7 | | ステータス'1':有効申請としてWORK-LEAVEに出力(項目チェック実施) | +| 8 | | ステータス'9':取消申請としてWORK-LEAVEに出力(項目チェックなし、APPL-ID保持) | +| 9 | | その他・フィールド数異常・休暇種別異常:ERROR-LOGに出力 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | KIN01R01(CSV) | ソート不要。CSV形式(カンマ区切り、8項目) | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | CSV-INPUT | R01 | KIN01R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 | +| 2 | WORK-LEAVE | W01 | KIN01W01 | O | KIN01REC | FB | | 80 | PS | | +| 3 | ERROR-LOG | W02 | KIN01W02 | O | KIN05REC | VB | | 200 | PS | | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | CSV-INPUT | なし | なし | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | +| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.休暇種別テーブル設定(WRK-LEAVE-TYPE-TABLE) + WRK-LT-CODE(1)='01' (年休/年假) + WRK-LT-CODE(2)='02' (事假) + WRK-LT-CODE(3)='03' (因公特批假) + WRK-LT-CODE(4)='04' (病欠) + 1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-6.使用ファイルのオープン(R01:入力、W01/W02:出力) + 1-7.R01を読み込む。(1100R01INNSOR)(1回目) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.CSVの分解(2010CSVSOR) + UNSTRINGでカンマ区切りのCSVを8項目に分解する。 + (APPL-ID, EMP-ID, START-DATE, START-TIME, END-DATE, END-TIME, LEAVE-TYPE, STATUS) + 2-2.休暇種別テーブル検索(2020LEAVSERSOR) + SEARCH(非ALL)でWRK-LEAVE-TYPE-TABLEを検索し、休暇種別の妥当性を検証する。 + 2-3.エラー判定 + 2-3-1.フィールド数≠8の場合 + ERROR-LOGに出力する。(2050ERRORSOR) + エラー種別:'F'(FIELD COUNT ERROR) + 2-3-2.休暇種別がテーブルに存在しない場合 + ERROR-LOGに出力する。(2050ERRORSOR) + エラー種別:'L'(INVALID LEAVE TYPE) + 2-3-3.ステータス'1'(有効)の場合 + 項目チェックを実施し、エラーがあればERROR-LOGに出力、なければWORK-LEAVEに出力する。(2030VALIDATESOR) + 2-3-3-1.SUB04CHKで社員番号チェック(EMPID): WRK-CSV-EMP-IDをC01CHKDATに設定し、CALL 'SUB04CHK' EMPIDタイプで社員番号フォーマットの妥当性を検証する。エラーの場合はW02ERR-CATEGORY='01'でエラーログに出力し本レコードをスキップ。 + 2-3-3-2.開始日付チェック(SUB04CHK)。エラー→W02出力 + 2-3-3-3.開始時刻チェック(SUB04CHK)。エラー→W02出力 + 2-3-3-4.終了日付チェック(SUB04CHK)。エラー→W02出力 + 2-3-3-5.終了時刻チェック(SUB04CHK)。エラー→W02出力 + 2-3-3-6.複合条件チェック(AND+OR+3段ネスト) + 開始日>0 AND 終了日>0 AND 開始時刻>0 の場合: + - 開始日>終了日 → WRK-DEMO-TYPE=10 + - 開始日=終了日 AND 開始時刻>=終了時刻 → WRK-DEMO-TYPE=10 + - 上記以外 → WRK-DEMO-TYPE=20 + 2-3-3-7.すべて通過→W01出力(APPL-ID=0, STATUS='1') + 2-3-4.ステータス'9'(取消)の場合 + WORK-LEAVEにそのまま出力する。(2040CANCELSOR) + APPL-ID=CSV値、STATUS='9'(項目チェックなし) + 2-3-5.その他のステータスの場合 + ERROR-LOGに出力する。(2050ERRORSOR) + エラー種別:'S'(INVALID STATUS) + 2-4.R01を読み込む。(1100R01INNSOR)(2件目以降) + +3.終了処理(3000STPSOR) + 3-1.入出力ファイルのクローズ + 3-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:'KIN01R01' + PARM2:当該入力ファイルの件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:'KIN01W01'、'KIN01W02' + PARM2:当該出力ファイルの件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/WORK-LEAVE) KIN01REC 80B FB + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | WRK-CSV-APPL-ID | 有効時=0、取消時=CSV値 | +| 2 | EMP-ID | WRK-CSV-EMP-ID | | +| 3 | LEAVE-TYPE | WRK-CSV-LEAVE-TYPE | 01/02/03/04 | +| 4 | START-DATE | WRK-CSV-START-DATE | YYYYMMDD | +| 5 | START-TIME | WRK-CSV-START-TIME | HHMM | +| 6 | END-DATE | WRK-CSV-END-DATE | YYYYMMDD | +| 7 | END-TIME | WRK-CSV-END-TIME | HHMM | +| 8 | STATUS | WRK-CSV-STATUS | '1'(有効)または'9'(取消) | +| 9 | FILLER | SPACE | 36B | + +### 出力ファイル2(W02/ERROR-LOG) KIN05REC 200B VB + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | '01'固定 | | +| 2 | ERR-DETAIL | STRING編集 | エラー内容(198B) | diff --git a/production/詳細設計書/詳細設計書_KIN02UPD.md b/production/詳細設計書/詳細設計書_KIN02UPD.md new file mode 100644 index 0000000..c447fb8 --- /dev/null +++ b/production/詳細設計書/詳細設計書_KIN02UPD.md @@ -0,0 +1,155 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN02UPD | +| 3 | プログラム名 | 休暇申請DB更新処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | DB更新 | +| 6 | 機能概要 | WORK-LEAVEファイルの各レコードをDB2テーブルLEAVE_RECORDSに反映する。 | +| 7 | | ステータスによって新規登録(INSERT)、変更(DELETE+INSERT)、取消(DELETE)を行う。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | KIN01W01 | KIN01INPの出力順に従う。ソート不要。 | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | WORK-LEAVE | R01 | KIN01W01 | I | KIN01REC | FB | | 80 | PS | | +| 2 | ERROR-LOG | W01 | KIN02W01 | O | KIN05REC | VB | | 200 | PS | DBエラー時出力 | +| 3 | LEAVE_RECORDS | DB | — | I/U/D | — | — | — | — | DB | SQLite | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | WORK-LEAVE | なし | なし | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 2 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.DB接続 + EXEC SQL CONNECT TO 'data/kin.db' + 1-5.R01ファイルOPEN(入力)+ W01ファイルOPEN(出力) + 1-6.R01を初回読込(1100R01INNSOR) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.レコード処理(2100PROCSOR) + 2-1-1.R01各項目をホスト変数(WS-*)にMOVEする。 + 2-1-2.ロジック分岐判定(EVALUATE) + 2-1-2-1.STATUS='1' AND APPL-ID=0(新規)の場合 + INSERT処理(2110INSERTSOR) + 【SQL】 + INSERT INTO LEAVE_RECORDS + (EMP_ID, LEAVE_TYPE, START_DATE, START_TIME, + END_DATE, END_TIME, STATUS) + VALUES + (:WS-EMP-ID, :WS-LEAVE-TYPE, + :WS-START-DATE, :WS-START-TIME, + :WS-END-DATE, :WS-END-TIME, + :WS-STATUS) + SQLCODE≠0の場合、DBエラー処理(9100DBERRSOR)を実行する。 + CUN-DBXINSを+1する。 + 2-1-2-2.STATUS='1' AND APPL-ID>0(変更)の場合 + UPDATE処理(2120UPDATESOR) + 【SQL】 + DELETE FROM LEAVE_RECORDS + WHERE APPLICATION_ID = :WS-APPL-ID + INSERT INTO LEAVE_RECORDS + (EMP_ID, LEAVE_TYPE, START_DATE, START_TIME, + END_DATE, END_TIME, STATUS) + VALUES + (:WS-EMP-ID, :WS-LEAVE-TYPE, + :WS-START-DATE, :WS-START-TIME, + :WS-END-DATE, :WS-END-TIME, + :WS-STATUS) + 各SQLでSQLCODE≠0の場合、DBエラー処理(9100DBERRSOR)を実行する。 + CUN-DBXUPDを+1する。 + 2-1-2-3.STATUS='9'(取消)の場合 + DELETE処理(2130DELETESOR) + 【SQL】 + DELETE FROM LEAVE_RECORDS + WHERE APPLICATION_ID = :WS-APPL-ID + SQLCODE≠0の場合、DBエラー処理(9100DBERRSOR)を実行する。 + CUN-DBXDELを+1する。 + 2-1-2-4.その他 + 何も処理しない(CONTINUE) + 2-2.次レコード読込(1100R01INNSOR)(2件目以降) + +3.終了処理(3000STPSOR) + 3-1.COMMIT + EXEC SQL COMMIT WORK + 3-2.入出力ファイルのクローズ + 3-3.件数メッセージ出力 + 【メッセージ編集】 + メッセージ番号:6(入力件数) + PARM1:'KIN01W01' + PARM2:入力件数 + PARM1:'INS'、'UPD'、'DEL' + PARM2:各処理件数 + 3-4.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) + +4.DBエラー処理(9100DBERRSOR) + 4-1.ROLLBACK + EXEC SQL ROLLBACK WORK + 4-2.ERROR-LOG出力(W01OUTFIL) + 【MOVE → INITIALIZE & WRITE】 + MOVE SQLCODE TO WRK-SQLCODE-DISP + W01ERR-CATEGORY = '01'(固定) + W01ERR-DETAIL = 'KIN02UPD SQLCODE=' + WRK-SQLCODE-DISP + ' APPL-ID=' + WS-APPL-ID + CUN-W01OUTを+1する。 + 4-3.エラーメッセージ出力 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'KIN02UPD SQL ERROR' + PARM2:SQLCODE + PARM3:WS-APPL-ID + 4-4.ABEND処理SUB呼出(9999ABDSOR) + ABENDコード:999 +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | 01で固定 | DBエラー | + | 2 | ERR-DETAIL | STRINGで編集 | KIN02UPD SQLCODE= + WRK-SQLCODE-DISP + APPL-ID= + WS-APPL-ID | + +### DB更新結果 + +LEAVE_RECORDSテーブルに直接反映される。 diff --git a/production/詳細設計書/詳細設計書_KIN03EXP.md b/production/詳細設計書/詳細設計書_KIN03EXP.md new file mode 100644 index 0000000..853b1a3 --- /dev/null +++ b/production/詳細設計書/詳細設計書_KIN03EXP.md @@ -0,0 +1,170 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 勤怠休暇管理システム | +| 2 | プログラムID | KIN03EXP | +| 3 | プログラム名 | 休暇日別展開処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | キーブレイク(集計) | +| 6 | 機能概要 | LEAVE_RECORDS(DB2)より有効申請(STATUS='1')を読込み、開始日〜終了日の期間を日別に展開し、休日・週末を除外してLEAVE-DAILYファイルを出力する。 | +| 7 | | 社員番号(EMP_ID)キーブレイクで小計出力を行う。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | DB(LEAVE_RECORDS) | EMP_ID, START_DATE順にソート済(ORDER BYで取得) | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | LEAVE-DAILY | W01 | KIN02W01.DAT | O | KIN02REC | FB | | 80 | PS | 日別展開後レコード | +| 2 | LEAVE_RECORDS | DB | — | I | — | — | — | — | DB | SQLite | +| 3 | HOLIDAY_CALENDAR | DB | — | I | — | — | — | — | DB | SQLite | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | DB(LEAVE_RECORDS) | EMP-ID, START_DATE(昇順) | キーブレイク: EMP-ID | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.DB接続 + EXEC SQL CONNECT TO 'data/kin.db' + 1-5.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-6.休日カレンダーテーブル読込(1200HDINNSOR) + 【SQL】 + SELECT HOLIDAY_DATE FROM HOLIDAY_CALENDAR ORDER BY HOLIDAY_DATE + FETCHループでWORKING-STORAGEのWRK-HOLIDAY-TABLEに全件格納する。 + WRK-HD-COUNTに件数を保持。最大366件(ODO定義)。 + 1-7.出力ファイルOPEN(W01) + 1-8.C1カーソル初回FETCH(1100C1INITSOR) + 【SQL】 + SELECT APPLICATION_ID, EMP_ID, LEAVE_TYPE, + START_DATE, START_TIME, END_DATE, END_TIME + FROM LEAVE_RECORDS + WHERE STATUS = '1' + ORDER BY EMP_ID, START_DATE + INTO :SQL-APPL-ID, :SQL-EMP-ID, :SQL-LEAVE-TYPE, + :SQL-START-DATE, :SQL-START-TIME, + :SQL-END-DATE, :SQL-END-TIME + SQLCODE=0の場合、入力件数+1 + SQLCODE≠0の場合、WRK-R01EOF='1'(EOF) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.社員番号キー保存 + SQL-EMP-ID → WRK-BFR-EMP-ID + 2-2.1社員分処理(2100-PROCESS-EMP)(PERFORM THRU) + 2-2-1.CUN-EMP-SUB初期化(ZERO) + 2-2-2.EOFまたはキー変化(SQL-EMP-ID≠WRK-BFR-EMP-ID)まで繰り返し + 2-2-2-1.日付展開処理(2200-EXPAND-DATE)(PERFORM THRU) + 2-2-2-1-1.開始日(SQL-START-DATE)→WRK-DATE-CURRENT + 終了日(SQL-END-DATE)→WRK-DATE-END + 2-2-2-1-2.WRK-DATE-CURRENT > WRK-DATE-END までループ + 2-2-2-1-2-1.曜日判定 + COMPUTE WRK-DAY-OF-WEEK = FUNCTION MOD( + FUNCTION INTEGER-OF-DATE(WRK-DATE-CURRENT), 7) + 0=日曜日、6=土曜日 → 週末としてスキップ + 2-2-2-1-2-2.非週末の場合、休日テーブル検索 + SEARCH ALL WRK-HD-ENTRY(昇順KEY=WRK-HD-DATE) + WRK-HD-DATE(WRK-HD-IDX) = WRK-DATE-CURRENT → 休日としてスキップ + 2-2-2-1-2-3.非週末かつ非休日の場合、W01出力 + W01レコード初期化 + APPL-ID = SQL-APPL-ID + EMP-ID = WRK-BFR-EMP-ID + LEAVE-TYPE = SQL-LEAVE-TYPE + START-TIME = SQL-START-TIME + END-TIME = SQL-END-TIME + DATE = WRK-DATE-ALPHA(現在日付) + WRITE W01OUTREC + CUN-W01OUT +1 + CUN-EMP-SUB +1 + 2-2-2-1-2-4.日付加算(2300-DATE-ADD-1) + WRK-DATE-DAY + 1 + 各月の最終日判定: + - 1/3/5/7/8/10/12月:31日超で月+1、13月→年+1 + - 4/6/9/11月:30日超で月+1 + - 2月:閏年判定(MOD年400=0 または MOD年4=0 AND MOD年100≠0) + 閏年→29日超、平年→28日超で月+1 + 2-2-3.次レコードFETCH(1100C1FETCHSOR) + CALL 'br_fetch_next' USING SQLCODE + SQLCODE=0の場合、br_get_colで各カラムを取得 + SQLCODE≠0の場合、WRK-R01EOF='1' + 2-2-4.社員別小計出力(キーブレイク) + 【メッセージ編集】 + メッセージ番号:33(情報メッセージ) + PARM1:WRK-BFR-EMP-ID + PARM2:CUN-EMP-SUB + PARM3:'EMP SUB' + +3.終了処理(3000STPSOR) + 3-1.出力ファイルのクローズ + 3-2.件数メッセージ出力 + 【メッセージ編集】 + メッセージ番号:6(入力件数) + PARM1:'LEAVE_RECORDS' + PARM2:入力件数 + 【メッセージ編集】 + メッセージ番号:7(出力件数) + PARM1:'KIN02W01' + PARM2:出力件数 + 【メッセージ編集】 + メッセージ番号:33(情報) + PARM1:'HOLIDAYS LOADED' + PARM2:休日テーブル件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/LEAVE-DAILY) KIN02REC 80B FB + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | EMP-ID | WRK-BFR-EMP-ID | キーブレイク単位 | +| 2 | DATE | WRK-DATE-ALPHA | 展開された日付(YYYYMMDD) | +| 3 | LEAVE-TYPE | SQL-LEAVE-TYPE | 01/02/03/04 | +| 4 | START-TIME | SQL-START-TIME | 元申請の開始時刻(HHMM) | +| 5 | END-TIME | SQL-END-TIME | 元申請の終了時刻(HHMM) | +| 6 | APPL-ID | SQL-APPL-ID | APPLICATION_ID | +| 7 | FILLER | SPACE | 45B | diff --git a/production/詳細設計書/詳細設計書_SUB01DAT.md b/production/詳細設計書/詳細設計書_SUB01DAT.md new file mode 100644 index 0000000..8f32bee --- /dev/null +++ b/production/詳細設計書/詳細設計書_SUB01DAT.md @@ -0,0 +1,52 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | SUB01DAT | +| 3 | プログラム名 | 運用日付取得サブ | +| 4 | PGMタイプ | サブ | +| 5 | PGMパターン | - | +| 6 | 機能概要 | 現在日付を取得し、運用日付(YYYYMMDD)として返す | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 使用方法 + +``` + CALL 'SUB01DAT' USING D01UBSPAR +``` + +### 入出力パラメータ + +| COPY句 | ZANDATAC | +|------------|----------| + +| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 | +|----|-----------|------|------|------|------| +| 1 | O | D01FKICOD | S9(4) COMP | 4 | 復帰コード(0000:正常) | +| 2 | O | D01UBSUDATE | 9(8) | 8 | 運用日付(YYYYMMDD) | + +### リターンコード一覧 + +| NO | コード | 説明 | +|----|--------|------| +| 1 | 0000 | 正常終了 | + +--- + +## 処理詳細 + +``` +1.制御処理(0000MAINSOR) + 1-1.現在日時を取得する。 + MOVE FUNCTION CURRENT-DATE TO WRK-SYS-DATE. + 1-2.YYYYMMDD部分を抽出する。 + MOVE WRK-SYS-DATE(1:8) TO D01UBSUDATE. + 1-3.正常終了 + MOVE ZERO TO D01FKICOD. + 1-4.復帰(GOBACK)。 +``` diff --git a/production/詳細設計書/詳細設計書_SUB02MSG.md b/production/詳細設計書/詳細設計書_SUB02MSG.md new file mode 100644 index 0000000..2407a62 --- /dev/null +++ b/production/詳細設計書/詳細設計書_SUB02MSG.md @@ -0,0 +1,72 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | SUB02MSG | +| 3 | プログラム名 | メッセージ編集出力サブ | +| 4 | PGMタイプ | サブ | +| 5 | PGMパターン | - | +| 6 | 機能概要 | メッセージ番号とパラメータを編集し、標準出力へ出力する。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 使用方法 + +``` + CALL 'SUB02MSG' USING M00MHOPAR +``` + +### 入出力パラメータ + +| COPY句 | ZANMSGAC | +|------------|----------| + +| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 | +|----|-----------|------|------|------|------| +| 1 | I | M00MSGCOD | 9(3) | 3 | メッセージ番号 | +| 2 | I | M00UMKDATS22-01 | X(30) | 30 | パラメータ1 | +| 3 | I | M00UMKDATS22-02 | X(30) | 30 | パラメータ2 | +| 4 | I | M00UMKDATS22-03 | X(30) | 30 | パラメータ3 | +| 5 | I | M00UMKDATS22-04 | X(30) | 30 | パラメータ4 | +| 6 | I | M00UMKDATS22-05 | X(30) | 30 | パラメータ5 | +| 7 | I | M00UMKDATS22-06 | X(30) | 30 | パラメータ6 | +| 8 | I | M00UMKDATS22-07 | X(30) | 30 | パラメータ7 | +| 9 | I | M00UMKDATS22-08 | X(30) | 30 | パラメータ8 | +| 10 | I | M00UMKDATS22-09 | X(30) | 30 | パラメータ9 | +| 11 | I | M00UMKDATS22-10 | X(30) | 30 | パラメータ10 | + +### リターンコード一覧 + +| NO | コード | 説明 | +|----|--------|------| +| 1 | - | 復帰コードなし(GOBACKで復帰) | + +--- + +## 処理詳細 + +``` +1.制御処理(0000MAINSOR) + 1-1.メッセージ行(WRK-MSG-LINE)を編集する。 + STRING 'MSG[' + M00MSGCOD + '] P1=' + M00UMKDATS22-01 + ' P2=' + M00UMKDATS22-02 + ' P3=' + M00UMKDATS22-03 + ' P4=' + M00UMKDATS22-04 + ' P5=' + M00UMKDATS22-05 + INTO WRK-MSG-LINE + END-STRING. + 1-2.標準出力へ出力する。 + DISPLAY WRK-MSG-LINE. + 1-3.復帰(GOBACK)。 +``` diff --git a/production/詳細設計書/詳細設計書_SUB03END.md b/production/詳細設計書/詳細設計書_SUB03END.md new file mode 100644 index 0000000..d9d3297 --- /dev/null +++ b/production/詳細設計書/詳細設計書_SUB03END.md @@ -0,0 +1,51 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | SUB03END | +| 3 | プログラム名 | ABEND処理サブ | +| 4 | PGMタイプ | サブ | +| 5 | PGMパターン | - | +| 6 | 機能概要 | ABENDコードを表示し、異常終了する。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 使用方法 + +``` + CALL 'SUB03END' USING E01ABDPAR +``` + +### 入出力パラメータ + +| COPY句 | ZANENDAC | +|------------|----------| + +| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 | +|----|-----------|------|------|------|------| +| 1 | I | E01ABDCOD | 9(3) | 3 | ABENDコード | + +### リターンコード一覧 + +| NO | コード | 説明 | +|----|--------|------| +| 1 | - | ABENDするため復帰コードなし(STOP RUN実行) | + +--- + +## 処理詳細 + +``` +1.制御処理(0000MAINSOR) + 1-1.ABENDメッセージを編集する。 + MOVE 'ABEND CODE=' TO WRK-ABEND-MSG. + MOVE E01ABDCOD TO WRK-ABEND-MSG(12:3). + 1-2.メッセージを表示する。 + DISPLAY WRK-ABEND-MSG. + 1-3.異常終了する。 + STOP RUN. +``` diff --git a/production/詳細設計書/詳細設計書_SUB04CHK.md b/production/詳細設計書/詳細設計書_SUB04CHK.md new file mode 100644 index 0000000..a7d5333 --- /dev/null +++ b/production/詳細設計書/詳細設計書_SUB04CHK.md @@ -0,0 +1,115 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | SUB04CHK | +| 3 | プログラム名 | 項目チェックサブ | +| 4 | PGMタイプ | サブ | +| 5 | PGMパターン | 項目チェック | +| 6 | 機能概要 | チェックタイプに応じてデータ妥当性を検証する。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 使用方法 + +``` + CALL 'SUB04CHK' USING C01CHKPAR +``` + +### 入出力パラメータ + +| COPY句 | ZANCHKAC | +|------------|----------| + +| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 | +|----|-----------|------|------|------|------| +| 1 | I | C01CHKTYP | X(8) | 8 | チェックタイプ(DATE/TIME/NUM/EMPID) | +| 2 | I | C01CHKDAT | X(80) | 80 | チェック対象データ | +| 3 | O | C01CHKRRC | 9(4) | 4 | 復帰コード(0000:正常,0001:日付不正,0002:時刻不正,0003:数字不正) | + +### リターンコード一覧 + +| NO | コード | 説明 | +|----|--------|------| +| 1 | 0000 | 正常終了(チェックOK) | +| 2 | 0001 | 日付不正(DATE指定時、月01〜12/日01〜31範囲外) | +| 3 | 0002 | 時刻不正(TIME指定時、時00〜23/分00〜59範囲外) | +| 4 | 0003 | 数字不正(NUM指定時、非数字文字を含む) | +| 5 | 0004 | 社員番号不正(EMPID指定時、8桁以外または空欄) | +| 6 | 9999 | チェックタイプ不明 | + +--- + +## 処理詳細 + +``` +1.制御処理(0000MAINSOR) + 1-1.C01CHKTYPにより分岐する。 + 1-1-1.C01CHKTYP = 'DATE' の場合 + 1000CHKDATEへ。 + 1-1-2.C01CHKTYP = 'TIME' の場合 + 2000CHKTIMEへ。 + 1-1-3.C01CHKTYP = 'NUM' の場合 + 3000CHKNUMへ。 + 1-1-4.C01CHKTYP = 'EMPID' の場合 + 4000CHKEMPへ。 + 1-1-5.その他の場合 + C01CHKRRC = 9999 を設定し、1-2へ。 + 1-2.復帰(GOBACK)。 + +2.日付チェック(1000CHKDATE) + 2-1.C01CHKDATから年月日を抽出する。 + YYYY = C01CHKDAT(1:4) + MM = C01CHKDAT(5:2) + DD = C01CHKDAT(7:2) + 2-2.月チェック(MM) + 2-2-1.MM < 1 OR MM > 12 + → C01CHKRRC = 0001 を設定し、2-5へ。 + 2-3.日チェック(DD) + 2-3-1.DD < 1 OR DD > 31 + → C01CHKRRC = 0001 を設定し、2-5へ。 + 2-4.正常の場合 + C01CHKRRC = 0000 を設定する。 + 2-5.復帰(0000MAINSOR-EXTへ)。 + +3.時刻チェック(2000CHKTIME) + 3-1.C01CHKDATから時分を抽出する。 + HH = C01CHKDAT(1:2) + MM = C01CHKDAT(3:2) + 3-2.時チェック(HH) + 3-2-1.HH > 23 + → C01CHKRRC = 0002 を設定し、3-5へ。 + 3-3.分チェック(MM) + 3-3-1.MM > 59 + → C01CHKRRC = 0002 を設定し、3-5へ。 + 3-4.正常の場合 + C01CHKRRC = 0000 を設定する。 + 3-5.復帰(0000MAINSOR-EXTへ)。 + +4.数字チェック(3000CHKNUM) + 4-1.C01CHKDATにSPACEより前の文字があるかチェックする。 + INSPECT C01CHKDAT TALLYING WRK-NN FOR + CHARACTERS BEFORE INITIAL SPACE. + 4-2.WRK-NN > 0 の場合 + C01CHKRRC = 0003 を設定し、4-4へ。 + 4-3.正常の場合 + C01CHKRRC = 0000 を設定する。 + 4-4.復帰(0000MAINSOR-EXTへ)。 + +5.社員番号チェック(4000CHKEMP) + 5-1.桁数チェック(8桁以内) + C01CHKDAT(9:72)にSPACES以外がある場合 + C01CHKRRC = 0004 を設定し、5-4へ。 + 5-2.空欄チェック + INSPECT C01CHKDAT(1:8) TALLYING WRK-NN FOR + CHARACTERS BEFORE INITIAL SPACE. + WRK-NN > 0 の場合 + C01CHKRRC = 0004 を設定し、5-4へ。 + 5-3.正常の場合 + C01CHKRRC = 0000 を設定する。 + 5-4.復帰(0000MAINSOR-EXTへ)。 +``` diff --git a/production/詳細設計書/詳細設計書_SUB05TIM.md b/production/詳細設計書/詳細設計書_SUB05TIM.md new file mode 100644 index 0000000..4afbb16 --- /dev/null +++ b/production/詳細設計書/詳細設計書_SUB05TIM.md @@ -0,0 +1,107 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | SUB05TIM | +| 3 | プログラム名 | 時刻丸め計算サブ | +| 4 | PGMタイプ | サブ | +| 5 | PGMパターン | - | +| 6 | 機能概要 | 時間値を指定単位で丸め計算する。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 使用方法 + +``` + CALL 'SUB05TIM' USING T01TIMPAR +``` + +### 入出力パラメータ + +| COPY句 | ZANTIMAC | +|------------|----------| + +| NO | 入出力区分 | 名称 | 属性 | 桁数 | 説明 | +|----|-----------|------|------|------|------| +| 1 | I | T01TIMHRS | 9(4)V9(1) | 4.1 | 入力時間(HH.h) | +| 2 | O | T01TIMOUT | 9(4)V9(1) | 4.1 | 出力時間(丸め後) | +| 3 | I | T01TIMRRC | 9(4) | 4 | 丸めモード(0:0.5h切上,1:0.1h切上,2:0.1h切捨,3:単純四捨五入) | + +### リターンコード一覧 + +| NO | コード | 説明 | +|----|--------|------| +| 1 | 0000 | 正常終了 | + +--- + +## 処理詳細 + +``` +1.制御処理(0000MAINSOR) + 1-1.T01TIMRRCにより丸めモードを分岐する。 + 1-1-1.T01TIMRRC = 0 の場合(0.5時間単位・切上) + 1000RNDHALFへ。 + 1-1-2.T01TIMRRC = 1 の場合(0.1時間単位・切上) + 2000RNDUPへ。 + 1-1-3.T01TIMRRC = 2 の場合(0.1時間単位・切捨) + 3000RNDDOWNへ。 + 1-1-4.T01TIMRRC = 3 の場合(単純四捨五入・0.1h単位) + 4000RNDNORMALへ。 + 1-1-5.その他の場合 + T01TIMOUT = T01TIMHRS をそのまま設定する。 + 1-2.復帰(GOBACK)。 + +2.0.5時間単位・切上(1000RNDHALF) + 2-1.T01TIMHRSを分に変換する。 + WRK-MINUTES = T01TIMHRS * 60. + 2-2.30分単位で切り上げる(DIVIDE REMAINDER)。 + DIVIDE WRK-MINUTES BY 30 + GIVING WRK-HOURS + REMAINDER WRK-REMAINDER. + 2-2-1.WRK-REMAINDER > 0 の場合 + WRK-HOURS = WRK-HOURS + 1. + 2-2-2.WRK-REMAINDER = 0 の場合 + そのまま。 + 2-3.時間に戻す。 + T01TIMOUT = WRK-HOURS * 0.5. + 2-4.復帰(0000MAINSOR-EXTへ)。 + +3.0.1時間単位・切上(2000RNDUP) + 3-1.T01TIMHRSを分に変換する。 + WRK-MINUTES = T01TIMHRS * 60. + 3-2.6分単位で切り上げる(DIVIDE REMAINDER)。 + DIVIDE WRK-MINUTES BY 6 + GIVING WRK-HOURS + REMAINDER WRK-REMAINDER. + 3-2-1.WRK-REMAINDER > 0 の場合 + WRK-HOURS = WRK-HOURS + 1. + 3-2-2.WRK-REMAINDER = 0 の場合 + そのまま。 + 3-3.時間に戻す。 + T01TIMOUT = WRK-HOURS * 0.1. + 3-4.復帰(0000MAINSOR-EXTへ)。 + +4.0.1時間単位・切捨(3000RNDDOWN) + 4-1.T01TIMHRSを分に変換する。 + WRK-MINUTES = T01TIMHRS * 60. + 4-2.6分単位で切り捨てる(DIVIDE REMAINDER)。 + DIVIDE WRK-MINUTES BY 6 + GIVING WRK-HOURS + REMAINDER WRK-REMAINDER. + 4-3.時間に戻す。 + T01TIMOUT = WRK-HOURS * 0.1. + 4-4.復帰(0000MAINSOR-EXTへ)。 + +5.単純四捨五入・0.1h単位(4000RNDNORMAL) + 5-1.T01TIMHRSに0.05を加算する。 + WRK-HOURS = T01TIMHRS + 0.05. + 5-2.小数点第2位以下を切り捨てる。 + T01TIMOUT = WRK-HOURS. + *> 9(4)V9(1)へのMOVEにより自動で切捨 + 5-3.復帰(0000MAINSOR-EXTへ)。 +``` diff --git a/production/詳細設計書/詳細設計書_ZAN01CHK.md b/production/詳細設計書/詳細設計書_ZAN01CHK.md new file mode 100644 index 0000000..9f737a4 --- /dev/null +++ b/production/詳細設計書/詳細設計書_ZAN01CHK.md @@ -0,0 +1,144 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | ZAN01CHK | +| 3 | プログラム名 | 残業申請振分処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | 振り分け | +| 6 | 機能概要 | CSV形式の残業申請ファイルを読み込み、ステータスによって振り分ける。 | +| 7 | | ステータス0/1:有効申請としてOVT-VALIDに出力 | +| 8 | | ステータス9:取消申請としてOVT-CANCELに出力 | +| 9 | | その他:エラーとしてERROR-LOGに出力 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | OVT-APPLY(CSV) | ソート不要。CSV形式(カンマ区切り) | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | OVT-APPLY | R01 | ZAN01R01 | I | 自前(80B) | F | | 80 | PS | CSV形式 | +| 2 | OVT-VALID | W01 | ZAN01W01 | O | ZAN01REC | FB | | 80 | PS | | +| 3 | OVT-CANCEL | W02 | ZAN01W02 | O | ZAN01REC | FB | | 80 | PS | | +| 4 | ERROR-LOG | W03 | ZAN01W03 | O | ZAN05REC | VB | | 200 | PS | | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | OVT-APPLY | なし | なし | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | +| 4 | 項目チェックSUB | SUB04CHK | ZANCHKAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-5.使用ファイルのオープン + 1-6.R01を読み込む。(1100R01INNSOR)(1回目) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.CSVの分解 + UNSTRINGでカンマ区切りのCSVを各項目に分解する。(2010CSVSOR) + 2-2.ステータス判定 + 2-2-1.ステータスが0または1の場合 + 項目チェックを実施し、エラーがあればERROR-LOGに出力、なければOVT-VALIDに出力。(2020VALIDATESOR) + 2-2-1-1.日付チェック(SUB04CHK)。エラー→W03出力 + 2-2-1-2.開始時刻>=1830チェック。NG→W03出力 + 2-2-1-3.開始時刻<終了時刻チェック。NG→W03出力 + 2-2-1-4.時間差>=30分チェック。NG→W03出力 + 2-2-1-5.すべて通過→W01出力 + 2-2-2.ステータスが9の場合 + OVT-CANCELにそのまま出力する。(2030CANCELSOR) + 2-2-3.その他の場合 + ERROR-LOGに出力する。(2040ERRORSOR) + 2-3.R01を読み込む。(1100R01INNSOR)(2件目以降) + +3.終了処理(3000STPSOR) + 3-1.入出力ファイルのクローズ + 3-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:当該入力ファイルのDD名 + PARM2:当該入力ファイルの件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:当該出力ファイルのDD名 + PARM2:当該出力ファイルの件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/OVT-VALID) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | CSV同項目を設定 | | +| 2 | EMP-ID | CSV同項目を設定 | | +| 3 | APPL-DATE | CSV同項目を設定 | | +| 4 | START-TIME | CSV同項目を設定 | | +| 5 | END-TIME | CSV同項目を設定 | | +| 6 | STATUS | CSV同項目を設定 | 0または1 | +| 7 | OVT-TYPE | CSV同項目を設定 | | +| 8 | FILLER | CSV同項目を設定 | | + +### 出力ファイル2(W02/OVT-CANCEL) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | CSV同項目を設定 | | +| 2 | EMP-ID | CSV同項目を設定 | | +| 3 | APPL-DATE | CSV同項目を設定 | | +| 4 | START-TIME | CSV同項目を設定 | | +| 5 | END-TIME | CSV同項目を設定 | | +| 6 | STATUS | CSV同項目を設定 | 9 | +| 7 | OVT-TYPE | CSV同項目を設定 | | +| 8 | FILLER | CSV同項目を設定 | | + +### 出力ファイル3(W03/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | 01で固定 | | +| 2 | ERR-DETAIL | STRINGで編集 | エラー内容 | diff --git a/production/詳細設計書/詳細設計書_ZAN02CHK.md b/production/詳細設計書/詳細設計書_ZAN02CHK.md new file mode 100644 index 0000000..9e9da40 --- /dev/null +++ b/production/詳細設計書/詳細設計書_ZAN02CHK.md @@ -0,0 +1,123 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | ZAN02CHK | +| 3 | プログラム名 | 時間帯重複チェック処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | 項目チェック | +| 6 | 機能概要 | OVT-VSORTファイルの同一社員・同一日付内の時間帯重複をチェックする。 | +| 7 | | 重複なしのレコードはOVT-NODUPに出力 | +| 8 | | 重複ありのレコードはERROR-LOGに出力 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | OVT-VSORT | 社員番号>日付>開始時刻で昇順ソート済み | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | OVT-VSORT | R01 | ZAN02R01 | I | ZAN01REC | FB | | 80 | PS | | +| 2 | OVT-NODUP | W01 | ZAN02W01 | O | ZAN01REC | FB | | 80 | PS | | +| 3 | ERROR-LOG | W02 | ZAN02W02 | O | ZAN05REC | VB | | 200 | PS | | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | OVT-VSORT | EMP-ID>APPL-DATE>START-TIME(昇順) | EMP-ID>APPL-DATE | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-5.使用ファイルのオープン + 1-6.R01を読み込む。(1100R01INNSOR)(1回目) + 1-7.1件目をW01に出力し、前レコードに保持する。 + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.前レコードとの比較 + 2-1-1.同一社員番号かつ同一日付の場合 + 2-1-1-1.前終了時刻>現開始時刻 → 重複あり(2011OVERLAPERRSOR) + エラーカテゴリ02でERROR-LOGに出力 + 2-1-1-2.前終了時刻<=現開始時刻 → 重複なし(2012NORMALOUTSOR) + W01に出力 + 2-1-2.異なる社員番号または日付の場合(キーブレイク) + キーブレイク処理として前レコードを更新しW01に出力(2013KEYBRSOR) + 2-2.R01を読み込む。(1100R01INNSOR)(2件目以降) + +3.終了処理(3000STPSOR) + 3-1.入出力ファイルのクローズ + 3-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:当該入力ファイルのDD名 + PARM2:当該入力ファイルの件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:当該出力ファイルのDD名 + PARM2:当該出力ファイルの件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/OVT-NODUP) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | R01.同項目を設定 | | +| 2 | EMP-ID | R01.同項目を設定 | | +| 3 | APPL-DATE | R01.同項目を設定 | | +| 4 | START-TIME | R01.同項目を設定 | | +| 5 | END-TIME | R01.同項目を設定 | | +| 6 | STATUS | R01.同項目を設定 | | +| 7 | OVT-TYPE | R01.同項目を設定 | | +| 8 | FILLER | R01.同項目を設定 | | + +### 出力ファイル2(W02/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | 02で固定 | 重複エラー | +| 2 | ERR-DETAIL | STRINGで編集 | EMP-IDと日付を編集 | diff --git a/production/詳細設計書/詳細設計書_ZAN03CHK.md b/production/詳細設計書/詳細設計書_ZAN03CHK.md new file mode 100644 index 0000000..5394433 --- /dev/null +++ b/production/詳細設計書/詳細設計書_ZAN03CHK.md @@ -0,0 +1,122 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | ZAN03CHK | +| 3 | プログラム名 | 打刻時間照合処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | マッチング(N:1) | +| 6 | 機能概要 | OVT-NODUPとPUNCH-SORTEDを突合し申請時間帯の照合を行う。 | +| 7 | | 申請時間帯が出勤〜退勤の範囲内かを確認する。 | +| 8 | | 申請日が休日かを判定しOVT-TYPEを付加する。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | OVT-NODUP | 社員番号>日付で昇順ソート済み | +| 2 | PUNCH-SORTED | 社員番号>日付で昇順ソート済み | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | OVT-NODUP | R01 | ZAN03R01 | I | ZAN01REC | FB | | 80 | PS | | +| 2 | PUNCH-SORTED | R02 | ZAN03R02 | I | 自前(80B) | FB | | 80 | PS | | +| 3 | HOLIDAY-FILE | R03 | ZAN03R03 | I | 自前(80B) | FB | | 80 | PS | 休日カレンダー | +| 4 | OVT-CHECKED | W01 | ZAN03W01 | O | ZAN01REC | FB | | 80 | PS | | +| 5 | ERROR-LOG | W02 | ZAN03W02 | O | ZAN05REC | VB | | 200 | PS | | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | OVT-NODUP | EMP-ID>APPL-DATE(昇順) | EMP-ID>APPL-DATE | +| 2 | PUNCH-SORTED | EMP-ID>DATE(昇順) | EMP-ID>DATE | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 2 | ABEND処理SUB | SUB03END | ZANENDAC |※ コード上では未使用(PERFORM元なし)| + +※ ZAN03CHKはSUB01DATを使用しない。日付取得は不要のためFUNCTION CURRENT-DATEも使用しない。 + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.使用ファイルのオープン + 1-6.HOLIDAY-FILEを全件読込しHOLIDAY-TABLEに設定する。(1300HOLIDAYSOR) + 1-7.R01を読み込む。(1100R01INNSOR)(1回目) + 1-8.R02を読み込む。(1200R02INNSOR)(1回目) + +2.主処理(2000MAJSOR)(R01を全て読み終えるまで下記を繰り返す) + 2-1.R01キーとR02キーを比較 + 2-1-1.R01キー < R02キー(打刻データなし) + ERROR-LOGにエラー出力する(エラーカテゴリ03)。(2010NOMATCHSOR) + 2-1-2.R01キー = R02キー(マッチ) + 時間範囲チェックを実施する。(2020MATCHSOR) + 2-1-2-1.開始時刻>=出勤時刻 かつ 終了時刻<=退勤時刻 → 通過 + OVT-TYPEを設定しW01に出力する。(2200SETOVTSOR) + 2-1-2-2.範囲外 → ERROR-LOGに出力(エラーカテゴリ03) + 2-1-3.R01キー > R02キー(R02スキップ) + R02を1件読み進める。(1200R02INNSOR) + +3.終了処理(3000STPSOR) + 3-1.入出力ファイルのクローズ + 3-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:当該入力ファイルのDD名 + PARM2:当該入力ファイルの件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:当該出力ファイルのDD名 + PARM2:当該出力ファイルの件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/OVT-CHECKED) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | R01.同項目を設定 | | +| 2 | EMP-ID | R01.同項目を設定 | | +| 3 | APPL-DATE | R01.同項目を設定 | | +| 4 | START-TIME | R01.同項目を設定 | | +| 5 | END-TIME | R01.同項目を設定 | | +| 6 | STATUS | R01.同項目を設定 | | +| 7 | OVT-TYPE | 2200SETOVTSORで設定 | W:平日/H:休日 | +| 8 | FILLER | R01.同項目を設定 | | + +### 出力ファイル2(W02/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | 03で固定 | 打刻不突合 | +| 2 | ERR-DETAIL | STRINGで編集 | 社員番号と日付を編集 | diff --git a/production/詳細設計書/詳細設計書_ZAN04MAT.md b/production/詳細設計書/詳細設計書_ZAN04MAT.md new file mode 100644 index 0000000..3d33b75 --- /dev/null +++ b/production/詳細設計書/詳細設計書_ZAN04MAT.md @@ -0,0 +1,144 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | ZAN04MAT | +| 3 | プログラム名 | 取消マッチング処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | マッチング(1:1) | +| 6 | 機能概要 | OVT-SORTED(有効申請)とOVT-CSORT(取消申請)を申請番号(APPL-ID)で1:1マッチングし、結果を振り分ける。 | +| 7 | | 申請番号一致(取消済):監査証跡としてERROR-LOGに記録 | +| 8 | | 申請のみ(取消なし):OVT-MATCHEDに出力(処理番号=1) | +| 9 | | 取消のみ(既DB登録済):OVT-DBCLEANに出力(DB削除用) | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | ファイルR01(OVT-SORTED) | 申請番号(APPL-ID)で昇順ソート済、重複なし | +| 2 | ファイルR02(OVT-CSORT) | 申請番号(APPL-ID)で昇順ソート済、重複なし | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | OVT-SORTED | R01 | ZAN04R01 | I | ZAN01REC | FB | | 80 | PS | 有効申請(APPL-ID昇順) | +| 2 | OVT-CSORT | R02 | ZAN04R02 | I | ZAN01REC | FB | | 80 | PS | 取消申請(APPL-ID昇順) | +| 3 | OVT-MATCHED | W01 | ZAN04W01 | O | ZAN02REC | FB | | 80 | PS | マッチング結果(処理番号付) | +| 4 | OVT-DBCLEAN | W02 | ZAN04W02 | O | ZAN04REC | FB | | 80 | PS | DB削除用(APPL-IDのみ) | +| 5 | ERROR-LOG | W03 | ZAN04W03 | O | ZAN05REC | VB | | 200 | PS | 監査証跡(取消マッチ記録) | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | ファイルR01 | APPL-ID(重複NG) | APPL-ID | +| 2 | ファイルR02 | APPL-ID(重複NG) | APPL-ID | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-5.使用ファイルのオープン + 1-6.R01を読み込む。(1100R01INNSOR)(1回目) + 1-7.R02を読み込む。(1200R02INNSOR)(1回目) + +2.主処理(2000MAJSOR)(R01、R02を全て読み終えるまで下記を繰り返す) + 2-1.マッチの場合(R01.APPL-ID = R02.APPL-ID) + 取消済みの申請のため、OVT-MATCHEDには出力しない。 + 監査証跡としてERROR-LOGにマッチ情報を出力する。(2100MATCHSOR) + 【STRING編集】 + ERR-CATEGORY = 04 + ERR-DETAIL = 'CANCEL-MATCH: ' + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 + R01を読み込む。(1100R01INNSOR)(2件目以降) + R02を読み込む。(1200R02INNSOR)(2件目以降) + 2-2.R01のみの場合(R01.APPL-ID < R02.APPL-ID) + R01をOVT-MATCHEDにSTRING編集して出力する。(2200R01OUTSOR) + 【STRING編集】 + W01 = 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 + ステータス + OVT-TYPE + 処理番号(01) + R01を読み込む。(1100R01INNSOR)(2件目以降) + 2-3.R02のみの場合(R01.APPL-ID > R02.APPL-ID) + R02をOVT-DBCLEANに出力する。(2300R02OUTSOR) + W02.APPL-ID = R02.APPL-ID + R02を読み込む。(1200R02INNSOR)(2件目以降) + +3.終了処理(3000STPSOR) + 3-1.入出力ファイルのクローズ + 3-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:当該入力ファイルのDD名 + PARM2:当該入力ファイルの件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:当該出力ファイルのDD名 + PARM2:当該出力ファイルの件数 + 3-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/OVT-MATCHED) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | R01.APPL-ID | | +| 2 | EMP-ID | R01.EMP-ID | | +| 3 | APPL-DATE | R01.APPL-DATE | | +| 4 | START-TIME | R01.START-TIME | | +| 5 | END-TIME | R01.END-TIME | | +| 6 | STATUS | R01.STATUS | | +| 7 | OVT-TYPE | R01.OVT-TYPE | | +| 8 | PROC-SEQ | 01固定 | 同一申請番号グループ内連番 | +| 9 | FILLER | 初期値 | | + +### 出力ファイル2(W02/OVT-DBCLEAN) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | R02.APPL-ID | DB削除対象申請番号 | +| 2 | FILLER | 初期値 | | + +### 出力ファイル3(W03/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | 04で固定 | 取消マッチ監査証跡 | +| 2 | ERR-DETAIL | STRINGで編集 | CANCEL-MATCH: + 申請番号 + 社員番号 + 申請日 + 開始時刻 + 終了時刻 | diff --git a/production/詳細設計書/詳細設計書_ZAN05CAL.md b/production/詳細設計書/詳細設計書_ZAN05CAL.md new file mode 100644 index 0000000..15c1d65 --- /dev/null +++ b/production/詳細設計書/詳細設計書_ZAN05CAL.md @@ -0,0 +1,169 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | ZAN05CAL | +| 3 | プログラム名 | 残業時間集約処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | キーブレイク(集計) | +| 6 | 機能概要 | OVT-SORTED2(申請番号+処理番号昇順)をキーブレイク集約し、 | +| 7 | | 同一APPL-IDの全レコードの加班時間を積算し、 | +| 8 | | OVT-SUMMARYに1レコードに集計して出力する。 | +| 9 | | キーブレイク制御にCONTINUE/SET、時間計算にCOMPUTE ROUNDED/DIVIDEをそれぞれ使用する。 | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | ファイルR01(OVT-SORTED2) | 申請番号(APPL-ID)>処理番号(PROC-SEQ)で昇順ソート済 | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | OVT-SORTED2 | R01 | ZAN05R01 | I | ZAN02REC | FB | | 80 | PS | マッチング結果(APPL-ID+PROC-SEQ昇順) | +| 2 | OVT-SUMMARY | W01 | ZAN05W01 | O | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) | + +### キー項目一覧 + +| NO | ファイル名 | ソート条件(キー項目) | キー条件(マッチング/キーブレイク) | +|----|-----------|---------------------|-------------------------------------------| +| 1 | ファイルR01 | APPL-ID>PROC-SEQ(同一APPL-ID内複数明細あり) | APPL-ID(キーブレイク) | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | +| 4 | 時刻丸め計算SUB | SUB05TIM | ZANTIMAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化(WRK-ACCUM-MIN含む) + 1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-6.使用ファイルのオープン(R01入力、W01出力) + 1-7.R01の初回読込(1100R01INNSOR) + 1-8.初回読込成功時、WRK-PREV-APPL-IDに設定 + WRK-GROUP-STARTに現レコードのSTARTを保持 + WRK-LAST-RECに現レコードを保持 + SET WRK-GROUP-IS-ACTIVE TO TRUE + (積算は主処理2000MAJSOR内の各分岐で行う) + +2.主処理(2000MAJSOR)(R01を全て読み終え、最終グループ出力完了まで下記を繰り返す) + 2-1.EOFの場合(WRK-R01KEY = HIGH-VALUE) + 2-1-1.WRK-GROUP-IS-ACTIVEなら最終グループを出力(2100OUTSOR) + 2-1-2.SET WRK-GROUP-NOT-ACTIVE TO TRUE(ループ終了条件) + 2-2.初回設定済みの場合(WRK-PREV-APPL-ID = 初回値あり) + 2-2-1.同一APPL-IDの場合 + 現レコードの時間差分を積算(2200ACCUMSOR) + 現レコードをWRK-LAST-RECに上書き保持(ENDは最終明細で上書きされる) + グループ内最初の明細のSTARTはWRK-GROUP-STARTに保持済のため不変 + R01次回読込(1100R01INNSOR) + 2-2-2.異なるAPPL-IDの場合(キーブレイク) + WRK-GROUP-IS-ACTIVEなら直前に保持していたグループを出力(2100OUTSOR) + WRK-PREV-APPL-IDを現レコードのAPPL-IDで更新 + WRK-GROUP-STARTに現レコードのSTARTを保持 + 現レコードをWRK-LAST-RECに設定 + 2200ACCUMSORを呼出(新グループ初回レコードの時間差分を積算) + SET WRK-GROUP-IS-ACTIVE TO TRUE + R01次回読込(1100R01INNSOR) + +3.積算処理(2200ACCUMSOR) + 3-1.現レコードの時刻→分変換 + DIVIDE R01START-TIME BY 100 GIVING WRK-START-HOUR REMAINDER WRK-START-MIN + DIVIDE R01END-TIME BY 100 GIVING WRK-END-HOUR REMAINDER WRK-END-MIN + COMPUTE WRK-START-TOTAL = WRK-START-HOUR * 60 + WRK-START-MIN + COMPUTE WRK-END-TOTAL = WRK-END-HOUR * 60 + WRK-END-MIN + 3-2.差分計算 + COMPUTE WRK-DIFF-MIN = WRK-END-TOTAL - WRK-START-TOTAL + 3-3.WRK-ACCUM-MINに積算 + COMPUTE WRK-ACCUM-MIN = WRK-ACCUM-MIN + WRK-DIFF-MIN + +4.計算出力処理(2100OUTSOR) + 4-1.分→時間変換(DIVIDE for coverage) + DIVIDE WRK-ACCUM-MIN BY 60 GIVING WRK-INT-HOURS REMAINDER WRK-REMAIN-MIN + 4-2.COMPUTE ROUNDED for coverage(結果はSUB05TIMには渡さない) + COMPUTE WRK-OVT-HOURS ROUNDED = WRK-ACCUM-MIN / 60 + ON SIZE ERROR + CONTINUE + MOVE ZERO TO WRK-OVT-HOURS + END-COMPUTE + 4-3.SUB05TIM呼出(mode 2:0.1h単位切捨) + COMPUTE WRK-TEMP-HOURS = WRK-ACCUM-MIN / 60(切捨用にそのまま) + MOVE WRK-TEMP-HOURS TO T01TIMHRS + MOVE 2 TO T01TIMRRC(mode 2) + CALL 'SUB05TIM' USING T01TIMPAR + MOVE T01TIMOUT TO WRK-OVT-HOURS + 4-4.OVT-SUMMARY出力 + 【STRING編集相当(MOVE)】 + INITIALIZE W01OUTREC + MOVE WRK-LAST-APPL-ID TO W01APPL-ID + MOVE WRK-LAST-EMP-ID TO W01EMP-ID + MOVE WRK-LAST-APPL-DATE TO W01APPL-DATE + MOVE WRK-GROUP-START TO W01START-TIME + MOVE WRK-LAST-END TO W01END-TIME + MOVE WRK-OVT-HOURS TO W01OVT-HOURS + MOVE WRK-LAST-OVT-TYPE TO W01OVT-TYPE + WRITE W01OUTREC + W01出力カウンタ加算 + 4-5.WRK-ACCUM-MINをZEROに初期化(次グループ用) + +5.終了処理(3000STPSOR) + 5-1.入出力ファイルのクローズ + 5-2.入出力件数出力メッセージ出力 + 【入力メッセージ編集】 + メッセージ番号:6(入力件数メッセージ) + PARM1:'ZAN05R01' + PARM2:入力件数 + 【出力メッセージ編集】 + メッセージ番号:7(出力件数メッセージ) + PARM1:'ZAN05W01' + PARM2:出力件数 + 5-3.終了メッセージ出力 + 【メッセージ編集】 + メッセージ番号:2(終了メッセージ) +``` + +--- + +## 出力レコード定義 + +### 出力ファイル1(W01/OVT-SUMMARY) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | APPL-ID | WRK-LAST-APPL-ID | 申請番号 | +| 2 | EMP-ID | WRK-LAST-EMP-ID | 社員番号 | +| 3 | APPL-DATE | WRK-LAST-APPL-DATE | 申請日 YYYYMMDD | +| 4 | START-TIME | WRK-GROUP-START | 開始時刻 HHMM(グループ最初の明細のSTART) | +| 5 | END-TIME | WRK-LAST-END | 終了時刻 HHMM | +| 6 | OVT-HOURS | SUB05TIM出力(T01TIMOUT) | 加班時間(0.1h単位切捨) | +| 7 | OVT-TYPE | WRK-LAST-OVT-TYPE | W=平日 / H=休日 | +| 8 | FILLER | 初期値 | | diff --git a/production/詳細設計書/詳細設計書_ZAN06UPD.md b/production/詳細設計書/詳細設計書_ZAN06UPD.md new file mode 100644 index 0000000..40a5800 --- /dev/null +++ b/production/詳細設計書/詳細設計書_ZAN06UPD.md @@ -0,0 +1,238 @@ +# 詳細設計書 + +## 基本情報 + +| # | 項目 | 内容 | +|---|------|------| +| 1 | システム名 | 残業統計管理システム | +| 2 | プログラムID | ZAN06UPD | +| 3 | プログラム名 | 残業統計DB更新処理 | +| 4 | PGMタイプ | メイン | +| 5 | PGMパターン | DB更新 | +| 6 | 機能概要 | OVT-SUMMARYの各レコードをOVT-APPLICATIONSテーブルにINSERT/UPSERTし、 | +| 7 | | OVT-MONTHLYテーブルに月次集計を反映する。 | +| 8 | | またOVT-DBCLEANの各レコードについて、該当申請を取消状態に更新し、 | +| 9 | | OVT-MONTHLYから該当加班時間を減算する。 | +| 10 | | 新規カバレッジ:EXEC SQL(INSERT/UPDATE/SELECT)、COMMIT/ROLLBACK、 | +| 11 | | PERFORM VARYING/TEST AFTER、COBOL MULTIPLY | + +※PGMタイプ:メイン、サブ +※PGMパターン:マッチング(1:1、1:N、N:1、M:N)、レイアウト編集のみ(GETPUT)、振り分け(IF文、EVALUATE文)、キーブレイク(集計、集約、集計・集約の以外)、DB更新 + +### 前提条件 + +| NO | 対象ファイル | 条件 | +|----|-------------|------| +| 1 | ファイルR01(OVT-SUMMARY) | ZAN05CALの出力、APPL-ID順ソート済 | +| 2 | ファイルR02(OVT-DBCLEAN) | ZAN04MATの出力、DB上に該当APPL-IDが存在すること(孤立取消はエラー) | + +### 使用ファイル一覧 + +| NO | 使用ファイル/DB名 | 識別子 | DD名 | I/O | COPY群 | 形式 | ブロック | レコード長 | 媒体 | 備考 | +|----|------------------|--------|------|-----|--------|------|---------|-----------|------|------| +| 1 | OVT-SUMMARY | R01 | ZAN06R01 | I | ZAN03REC | FB | | 80 | PS | 集約結果(加班時間付加) | +| 2 | OVT-DBCLEAN | R02 | ZAN06R02 | I | ZAN04REC | FB | | 80 | PS | 孤立取消(DB削除対象) | +| 3 | ERROR-LOG | W01 | ZAN06W01 | O | ZAN05REC | VB | | 200 | PS | DBエラー・データ不整合記録 | +| 4 | OVERTIME-DB | DB | - | - | - | DB2 | - | - | DASD | EXEC SQLで直接操作 | + +### キー項目一覧 + +| NO | ファイル名 | キー項目 | 用途 | +|----|-----------|---------|------| +| 1 | ファイルR01 | APPL-ID | OVT-APPLICATIONS INSERT/UPDATEのキー | +| 2 | ファイルR02 | APPL-ID | OVT-APPLICATIONS SELECT/UPDATEのキー | +| 3 | DB OVT-MONTHLY | EMP-ID + YEAR-MONTH + OVT-TYPE | 月次集計UPSERTのキー | + +### テーブル定義 + +#### OVT-APPLICATIONS(個別加班申請テーブル) + +| カラム | 型 | 内容 | +|--------|-----|------| +| APPL-ID | CHAR(8) | 申請番号(PK) | +| EMP-ID | CHAR(8) | 社員番号 | +| APPL-DATE | CHAR(8) | 申請日 YYYYMMDD | +| OVT-TYPE | CHAR(1) | W=平日 / H=休日 | +| START-TIME | CHAR(4) | 開始時刻 HHMM | +| END-TIME | CHAR(4) | 終了時刻 HHMM | +| OVT-HOURS | DECIMAL(4,1) | 加班時間 | +| STATUS | CHAR(1) | 0=有効 / 9=取消 | +| UPDATED-AT | TIMESTAMP | 更新日時 | + +#### OVT-MONTHLY(月次集計テーブル) + +| カラム | 型 | 内容 | +|--------|-----|------| +| EMP-ID | CHAR(8) | 社員番号(PK) | +| YEAR-MONTH | CHAR(6) | 対象年月 YYYYMM(PK) | +| OVT-TYPE | CHAR(1) | W=平日 / H=休日(PK) | +| OVT-HOURS | DECIMAL(6,1) | 加班時間合計 | +| OVT-COUNT | INTEGER | 加班回数 | +| UPDATED-AT | TIMESTAMP | 更新日時 | + +### 使用モジュール一覧 + +| NO | 機能 | プログラムID | 使用COPY名 | +|----|------|-------------|-----------| +| 1 | 運用日付取得SUB | SUB01DAT | ZANDATAC | +| 2 | メッセージ編集出力SUB | SUB02MSG | ZANMSGAC | +| 3 | ABEND処理SUB | SUB03END | ZANENDAC | + +--- + +## 処理詳細 + +``` +1.初期処理(1000ITTSOR) + 1-1.開始メッセージ出力 + 【メッセージ編集】 + メッセージ番号:1(開始メッセージ) + 1-2.コンパイル日時出力 + 【メッセージ編集】 + メッセージ番号:33(コンパイル日時) + PARM1:コンパイル日時 + PARM2:'COMPILED' + 1-3.ワークエリアの初期化 + 1-4.運用日付取得SUB(SUB01DAT)により運用日を取得する。 + 復帰コード≠ZEROの場合、メッセージを出力し、ABEND処理SUBを呼び出し異常終了する。 + 【メッセージ編集】 + メッセージ番号:5(サブエラー) + PARM1:'SUB01DAT' + PARM2:復帰コード + 【ABEND処理SUB】 + ABENDコード:999 + 1-5.使用ファイルのオープン(R01/R02入力、W01出力) + 1-6.R01、R02の初回読込(1100R01INNSOR、1200R02INNSOR) + +2.主処理(2000MAJSOR) + 2-1.処理フェーズ1:OVT-SUMMARY(R01)を全件処理 + R01 EOFまで以下の処理を繰り返す + 2-1-1.OVT-APPLICATIONSへのINSERTを試行 + 【EXEC SQL INSERT】 + INSERT INTO OVT-APPLICATIONS (APPL-ID, EMP-ID, APPL-DATE, OVT-TYPE, + START-TIME, END-TIME, OVT-HOURS, STATUS, UPDATED-AT) + VALUES (:WRK-SQL-APPL-ID, :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE, + :WRK-SQL-OVT-TYPE, :WRK-SQL-START-TIME, :WRK-SQL-END-TIME, + :WRK-SQL-OVT-HOURS, :WRK-SQL-STATUS, CURRENT TIMESTAMP) + 2-1-2.SQLCODE NOT = 0の場合(APPL-ID重複): + 【EXEC SQL UPDATE】 + UPDATE OVT-APPLICATIONS SET STATUS = :WRK-SQL-STATUS, + UPDATED-AT = CURRENT TIMESTAMP + WHERE APPL-ID = :WRK-SQL-APPL-ID + SQLCODE異常時は9100DBERRSORへ + 2-1-3.SQLCODE = 0の場合:CUN-DBXINS加算、それ以外:CUN-DBXUPD加算 + 2-1-4.OVT-MONTHLYのUPSERT(2110MONTHLYUPSOR) + 2-1-5.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX) + + 2-2.処理フェーズ2:OVT-DBCLEAN(R02)を全件処理 + R02 EOFまで以下の処理を繰り返す + 2-2-1.SELECTでOVT-APPLICATIONSから該当レコード取得 + 【EXEC SQL SELECT INTO】 + SELECT EMP-ID, APPL-DATE, OVT-TYPE, OVT-HOURS + INTO :WRK-SQL-EMP-ID, :WRK-SQL-APPL-DATE, :WRK-SQL-OVT-TYPE, + :WRK-SQL-OVT-HOURS + FROM OVT-APPLICATIONS + WHERE APPL-ID = :WRK-SQL-APPL-ID + 2-2-2.SQLCODE NOT = 0(該当なし=孤立取消): + ERROR-LOGに出力(カテゴリ=20)、9999ABDSORで異常終了 + 2-2-3.OVT-APPLICATIONSのSTATUSを'9'に更新 + 【EXEC SQL UPDATE】 + UPDATE OVT-APPLICATIONS SET STATUS = '9', + UPDATED-AT = CURRENT TIMESTAMP + WHERE APPL-ID = :WRK-SQL-APPL-ID + 2-2-4.YEAR-MONTH抽出:APPL-DATE(1:6) + 2-2-5.OVT-MONTHLYから減算(2210MONTHLYSUBSOR) + 【EXEC SQL UPDATE(減算)】 + UPDATE OVT-MONTHLY SET + OVT-HOURS = OVT-HOURS - :WRK-SQL-OVT-HOURS, + OVT-COUNT = OVT-COUNT - 1, + UPDATED-AT = CURRENT TIMESTAMP + WHERE EMP-ID = :WRK-SQL-EMP-ID + AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH + AND OVT-TYPE = :WRK-SQL-OVT-TYPE + リトライ制御:PERFORM TEST AFTER VARYING(最大3回) + SQLCODE≠0時はROLLBACKしてリトライ + 全リトライ消費後もSQLCODE≠0の場合、 + ERROR-LOG(カテゴリ=21)に出力し9999ABDSORで異常終了する + (9100DBERRSORは通らない) + 2-2-6.CUN-COMMITが閾値以上の場合、COMMIT実行(2300COMMITDBX) + +3.OVT-MONTHLY UPSERT処理(2110MONTHLYUPSOR) + 3-1.OVT-MONTHLYの存在確認SELECT + 【EXEC SQL SELECT INTO(DB-OVT-HOURS, DB-OVT-COUNT)】 + SELECT OVT-HOURS, OVT-COUNT + INTO :DB-OVT-HOURS, :DB-OVT-COUNT + FROM OVT-MONTHLY + WHERE EMP-ID = :WRK-SQL-EMP-ID + AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH + AND OVT-TYPE = :WRK-SQL-OVT-TYPE + 3-2.SQLCODE = 0(既存レコードあり): + 【EXEC SQL UPDATE(加算)】 + UPDATE OVT-MONTHLY SET + OVT-HOURS = OVT-HOURS + :WRK-SQL-OVT-HOURS, + OVT-COUNT = OVT-COUNT + 1, + UPDATED-AT = CURRENT TIMESTAMP + WHERE EMP-ID = :WRK-SQL-EMP-ID + AND YEAR-MONTH = :WRK-SQL-YEAR-MONTH + AND OVT-TYPE = :WRK-SQL-OVT-TYPE + 3-3.SQLCODE NOT = 0(新規): + 【EXEC SQL INSERT】 + INSERT INTO OVT-MONTHLY + (EMP-ID, YEAR-MONTH, OVT-TYPE, OVT-HOURS, OVT-COUNT, UPDATED-AT) + VALUES + (:WRK-SQL-EMP-ID, :WRK-SQL-YEAR-MONTH, :WRK-SQL-OVT-TYPE, + :WRK-SQL-OVT-HOURS, 1, CURRENT TIMESTAMP) + 3-4.SQLCODE異常時は9100DBERRSORへ + +4.COMMIT処理(2300COMMITDBX) + 4-1.【EXEC SQL COMMIT】 + COMMIT WORK + 4-2.CUN-COMMITをZEROにリセット + +5.終了処理(3000STPSOR) + 5-1.最終COMMIT(2300COMMITDBX) + 5-2.入出力ファイルのクローズ + 5-3.DB操作件数メッセージ出力 + メッセージ番号:6(入力件数メッセージ) + PARM1:'ZAN06R01' / PARM2:CUN-R01INN + PARM1:'ZAN06R02' / PARM2:CUN-R02INN + PARM1:'INS' / PARM2:CUN-DBXINS + PARM1:'UPD' / PARM2:CUN-DBXUPD + PARM1:'W01' / PARM2:CUN-W01OUT + 5-4.終了メッセージ出力 + メッセージ番号:2(終了メッセージ) + +6.DBエラー処理(9100DBERRSOR) + 6-1.ERROR-LOGにDBエラー情報出力(カテゴリ=30) + 【COBOL STRING】 + STRING 'DB ERROR SQLCODE=' SQLCODE ' APPL-ID=' + WRK-SQL-APPL-ID INTO WRK-ERR-DETAIL + 6-2.【EXEC SQL ROLLBACK】 + ROLLBACK WORK + 6-3.9999ABDSORで異常終了 +``` + +--- + +## 新規カバレッジ構文 + +| # | 構文 | 用途 | +|---|------|------| +| 1 | EXEC SQL INSERT | OVT-APPLICATIONSへの新規登録 | +| 2 | EXEC SQL UPDATE | OVT-APPLICATIONSステータス更新・OVT-MONTHLY加減算 | +| 3 | EXEC SQL SELECT INTO | OVT-MONTHLY存在確認・OVT-APPLICATIONS検索 | +| 4 | EXEC SQL COMMIT | 定期的なCOMMIT発行 | +| 5 | EXEC SQL ROLLBACK | DBエラー時のROLLBACK | +| 6 | PERFORM VARYING | 月(1-12)のバリデーションループ | +| 7 | PERFORM TEST AFTER VARYING | 月次減算のリトライ制御 | +| 8 | COBOL MULTIPLY | 加班時間→分変換 | + + +## 出力レコード定義 + +### 出力ファイル1(W01/ERROR-LOG) + +| No | 項目名 | 設定元 | 備考 | +|----|--------|--------|------| +| 1 | ERR-CATEGORY | WRK-ERR-CATEGORY | 20=孤立取消 / 30=DBエラー | +| 2 | ERR-DETAIL | WRK-ERR-DETAIL | エラー詳細メッセージ |