# JIN05UPD 詳細設計書 ## プログラム概要 | 項目 | 内容 | |------|------| | プログラムID | JIN05UPD(人事→JINji, 05, 人事異動DB更新→UPD) | | プログラムタイプ | 09(DB更新) | | 機能 | HR-TRANS(人事異動トランザクション)を読込み、DB2 EMPLOYEEテーブルをINSERT/UPDATEする | | CALL方式 | メインプログラム(JCLからCALL) | | DBアクセス | DB2 EMPLOYEE(CONNECT / INSERT / UPDATE) | | 使用サブプログラム | SUB01DAT(日付), SUB02MSG(メッセージ), SUB03END(アベンド) | ### 前提条件 | NO | 対象ファイル | 条件 | |----|-------------|------| | 1 | HR-TRANS | JCL の SORT で社員番号昇順に並替済であること | ### 使用ファイル一覧 | NO | 使用ファイル名 | 識別子 | DD名 | I/O | COPY群 | 形式 | レコード長 | 媒体 | 備考 | |----|--------------|--------|------|-----|--------|------|-----------|------|------| | 1 | HR-TRANS | R01 | JIN05R01 | I | JIN05REC | FB | 200 | PS | 人事異動トランザクション | | 2 | VALID-ERROR | W01 | JIN05W01 | O | (内約80B) | FB | 80 | PS | エラー退避 | > 補足:VALID-ERROR レコードは COPY を使用せず WORKING-STORAGE/W01OUTREC に内約定義(PROGRAMID 8B + EMP-ID 8B + CODE 4B + DETAIL 60B = 80B)。ID 設計上 COPY VALID-ERROR-REC を使用していない。将来は COPY 化推奨。 ### DB 使用一覧 | NO | テーブル | I/O | 内容 | |----|---------|:---:|------| | 1 | EMPLOYEE | I/U | 人事異動の新規登録(INSERT)/ 更新(UPDATE) | ### 使用モジュール一覧 | NO | 機能 | プログラムID | 使用COPY名 | |----|------|-------------|-----------| | 1 | 運用日付取得SUB | SUB01DAT | JINDATAC | | 2 | メッセージ編集出力SUB | SUB02MSG | JINMSGAC | | 3 | ABEND処理SUB | SUB03END | JINENDAC | --- ## 処理詳細 ### 段落一覧(SOR規約名) | 段落名 | 機能 | |:-------|:-----| | 0000MAJCOLSOR | メインコントロール(初期→読込→DB更新ループ→終了) | | 1000ITTSOR | 初期処理(開始表示・初期化・運用日付・CONNECT・OPEN・初回読込) | | 2000MAINSOR | 主処理(ホスト変数転記→種別判定→対応処理) | | 2100READSOR | R01読込・EOF判定 | | 3100INSERTSOR | INSERT処理(新規社員追加) | | 3200UPDATESOR | UPDATE処理(既存社員更新) | | 3300ERRSOR | 不明トランザクション→VALID-ERROR出力 | | 3400DBERRSOR | DBエラー(SQLCODE≠0)→VALID-ERROR出力 | | 4000STPSOR | 終了処理(統計表示・CLOSE・終了メッセージ) | | 9000ERRSOR | エラー処理(ABEND) | ### 処理フロー ``` 1. 0000MAJCOLSOR 1-1. PERFORM 1000ITTSOR(初期処理) 1-2. PERFORM 2000MAINSOR UNTIL WRK-R01EOF-Y OR WRK-COUNT >= CNS-MAX-TRANS (PERFORM UNTIL ... OR ... カバー。上限500件ガード) 1-3. PERFORM 4000STPSOR 1-4. GOBACK 2. 1000ITTSOR(初期処理) 2-1. DISPLAY 'JIN05UPD START' UPON CONSOLE 2-2. M00MHOPAR 初期化 → CALL SUB02MSG(開始 001) 2-3. INITIALIZE WRKARA REPLACING NUMERIC BY ZEROS ALPHANUMERIC BY SPACES 2-4. INITIALIZE CUNARA 2-5. CALL SUB01DAT ... ON EXCEPTION → PERFORM 9000ERRSOR(CALL ON EXCEPTION カバー) 2-6. EXEC SQL CONNECT(DB接続) 2-7. OPEN INPUT R01INNFIL OUTPUT W01OUTFIL 2-8. PERFORM 2100READSOR(初回読込) 3. 2000MAINSOR(主処理) 3-1. ADD 1 TO WRK-COUNT(処理件数増) 3-2. R01TRAN-* → HV-* へホスト変数転記 3-3. MOVE R01TRAN-TYPE TO WRK-TRAN-TYPE 3-4. EVALUATE TRUE WHEN WRK-TRAN-INSERT → PERFORM 3100INSERTSOR WHEN WRK-TRAN-UPDATE → PERFORM 3200UPDATESOR WHEN WRK-TRAN-DELETE → PERFORM 3300ERRSOR(削除未実装) WHEN OTHER → PERFORM 3300ERRSOR 3-5. PERFORM 2100READSOR 4. 2100READSOR(読込) READ R01INNFIL AT END → WRK-R01EOF='1' NOT AT END → ADD 1 TO CUN-R01INN 5. 3100INSERTSOR(INSERT) EXEC SQL INSERT INTO EMPLOYEE(:HV-* 9カラム) IF SQLCODE NOT = 0 → 3400DBERRSOR ELSE → ADD 1 TO CUN-DBINS 6. 3200UPDATESOR(UPDATE) STRING 'UPDATING: ' HV-EMP-ID INTO WS-SQL-STR ON OVERFLOW DISPLAY WS-SQL-STR UPON CONSOLE WITH NO ADVANCING EXEC SQL UPDATE EMPLOYEE SET(:HV-* 8-カラム→9列) WHERE EMP_ID = :HV-EMP-ID IF SQLCODE NOT = 0 → 3400DBERRSOR ELSE → ADD 1 TO CUN-DBUPD 7. 3300ERRSOR(不明種別) W01ERR-PROGRAMID=PGMID / W01ERR-EMP-ID=HV-EMP-ID / W01ERR-CODE='0001' STRING `INVALID TRAN-TYPE:` ... INTO W01ERR-DETAIL → WRITE ADD 1 TO CUN-W01OUT 8. 3400DBERRSOR(DBエラー) MOVE SQLCODE → WS-SQLCODE-DISP STRING `DB ERROR SQLCODE=` ... INTO W01ERR-DETAIL W01ERR-CODE='0002' → WRITE CALL SUB02MSG USING BY CONTENT 9. 4000STPSOR(終了) DISPLAY READ/INSERT/UPDATE/ERROR 件数 UPON CONSOLE CLOSE R01INNFIL CLOSE W01OUTFIL WITH LOCK CALL SUB02MSG(終了 002) CALL SUB03END(正常終了) 10. 9000ERRSOR(ABEND) DISPLAY 'JIN05UPD ABEND' UPON CONSOLE CALL SUB03END(E01ABDCOD) ``` ### トランザクション種別(88-level) | 88条件名 | VALUE | 対応処理 | |:---------|:------|:---------| | WRK-TRAN-INSERT | 'A' 'B' 'C' | 3100INSERTSOR | | WRK-TRAN-UPDATE | 'D' THRU 'G' | 3200UPDATESOR | | WRK-TRAN-DELETE | 'Z' | 3300ERRSOR(削除未実装) | | (WHEN OTHER) | 上記以外 | 3300ERRSOR | > 88-level の複数VALUE('A' 'B' 'C')と VALUE THRU('D' THRU 'G')をカバー。 ### カバレッジ対象キーワード | 予約語/記号 | 使用箇所 | |:-----------|:---------| | PERFORM UNTIL ... OR ... | 0000MAJCOLSOR: ループ上限 | | INITIALIZE ... REPLACING | 1000ITTSOR: REPLACING NUMERIC / ALPHANUMERIC | | CALL ... ON EXCEPTION | 1000ITTSOR: SUB01DAT(異常時9000) | | EXEC SQL CONNECT / INSERT / UPDATE | DB操作 | | 88-level 複数VALUE + VALUE THRU | 種別判定 | | EVALUATE TRUE | 2000MAINSOR: WHEN分岐 | | STRING ... ON OVERFLOW | 3200/3300/3400 | | DISPLAY ... UPON CONSOLE WITH NO ADVANCING | 自編集 | | CALL ... BY CONTENT | 3400DBERRSOR | --- ## 出力レコード定義 ### 出力ファイル1(W01/VALID-ERROR)— COPY VALID-ERROR-REC 80B | No | 項目名 | 設定元 | PIC | 備考 | |----|--------|--------|:---:|------| | 1 | ERR-PROGRAMID | CNS-PRGIDX | X(8) | 'JIN05UPD' | | 2 | ERR-EMP-ID | HV-EMP-ID | X(8) | 社員ID | | 3 | ERR-CODE | '0001'/'0002' | X(4) | エラー種別 | | 4 | ERR-DETAIL | STRING編集 | X(60) | 詳細メッセージ | > ER-CODE: 0001=不明種別、0002=DBエラー。 ### 入力レコード(R01/HR-TRANS)— JIN05REC 200B | No | 項目名 | PIC | 備考 | |----|--------|:---:|------| | 1 | TRAN-TYPE | X(1) | A/B/C=Insert, D-G=Update | | 2 | TRAN-EMP-ID | X(8) | | | 3 | TRAN-KANA-SEI | X(20) | | | 4 | TRAN-KANA-MEI | X(20) | | | 5 | TRAN-KANJI-NAME | X(40) | | | 6 | TRAN-SUB-CODE | X(4) | | | 7 | TRAN-BIRTH-DATE | X(8) | | | 8 | TRAN-DEPT-CODE | X(4) | | | 9 | TRAN-ENTRY-DATE | X(8) | | | 10 | TRAN-STATUS | X(1) | | | 11 | FILLER | X(86) | | > COPY JIN05REC(200B)を REPLACING (A)→R01 で定義。