Files

213 lines
9.4 KiB
COBOL

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.
*
COPY ZANCHKAC.
*
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)とスペースのみをカウント
MOVE ZERO TO WRK-NN.
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.