# プログラム仕様書　BK10030 回送到着入力　－　BK11600P（② 到着情報の入力・検証）

| 項目 | 内容 |
|---|---|
| 機能ID・機能名 | BK10030　回送到着入力（機能仕様書：[BK10030_回送到着入力_仕様書.md](BK10030_回送到着入力_仕様書.md)。次の処理 ③ 確認・登録は [BK11700P_仕様書.md](BK11700P_仕様書.md)） |
| システムID | BK |
| サブシステムID | BK0070 |
| サブシステム名 | 回送・域内便到着入力 |
| 参考資料 | ・現行ソース BK11600P.pl1<br/>・画面設計書「BK0070_回送・域内便到着入力.xlsx」（Ver.1.2023.1016.3）：資産一覧、MPBK150 の項目名、レコードフォーマット |
| 関連仕様書 | [BK11500P_仕様書.md](BK11500P_仕様書.md)（前の処理：回送入力票NOの照会）、[BK21500P_仕様書.md](BK21500P_仕様書.md)（センター照会） |

---

## 1. 概要

| 項目 | 内容 |
|---|---|
| プログラムID | BK11600P（手続き名：BK11600） |
| プログラム名称 | 回送到着入力（検証） |
| 言語 | PL/I（CICS コマンドレベル） |
| 処理形態 | オンライン（CICS 疑似会話型） |
| 動作環境 | SV（DDP 側） |
| トランザクションID | BK16 |
| パターンID | PPOD152P（1987/05/01）、業務 BXHEAD30 |
| 使用画面（マップ） | MPBK150（回送・域内便到着入力）、MPDM010（共通ヘッダ画面）、ELEPHAN（終了画面）、戻り先画面（PF3／PF4 時に動的に決定） |
| 前の処理 | トランザクション BK15（BK11500P：回送入力票NOの照会） |
| 次の処理 | トランザクション BK17（BK11700P：③ 確認・登録。ＤＤＰ回送マスターの更新と集信データ（発送鑑・到着鑑）の出力） |
| 参照ファイル | VPTENMS（ＤＤＰ　店所マスター） |
| 更新ファイル | なし |
| 使用モジュール | LSO0040（年月日 → 通日（年内の通し日数）変換） |
| 一時記憶 | TSキュー（キュー名・長さは BK11500P が通信領域に設定した値。端末ID＋'BK15'、280バイト） |

### 1.1 機能概要

回送便の到着入力の2画面目。BK11500P で照会した回送票に対して入力された到着情報をチェックし、確認画面を表示する。

1. 到着店コード・到着年月日時分・指示粁（出発時・到着時）をチェックする。
2. 発送日時と到着日時の前後関係、指示粁から求めた走行粁をチェックする。
3. すべてOKなら、全項目を入力不可にして「確認ＯＫなら実行キーを押して下さい」を表示し、次の処理（BK17）に進む。

本プログラムではファイルの更新は行わない。

```mermaid
flowchart LR
    BK15[BK15<br/>BK11500P<br/>回送入力票NOの照会] -- 照会OK --> BK16[BK16<br/>本プログラム<br/>到着内容の検証]
    BK16 -- エラー --> BK16
    BK16 -- OK<br/>確認画面 --> BK17[BK17<br/>BK11700P<br/>更新・集信]
    BK16 -- PF2 取消 --> BK15
```

---

## 2. 画面仕様（MPBK150）

### 2.1 画面レイアウト

画面は BK11500P と同じ MPBK150（[BK11500P_仕様書.md](BK11500P_仕様書.md) の 2.1 参照）。本プログラムでは、到着店コード・到着年月日時分・指示粁が入力対象になる。

### 2.2 画面項目一覧

「FLG番号」は、チェック結果を持つフラグ配列（FLG・FLGX）の添字。「BK16」の列は本プログラムでの入出力。

| FLG番号 | 項目ID | 項目名 | 型・桁 | BK16 | 本プログラムでの扱い |
|---|---|---|---|---|---|
| ― | BK15011（IMD） | システム年月日 | 文字 8 | O | 送信時に設定 |
| ― | BK15021（IMT） | システム時分秒 | 文字 8 | O | 送信時に設定 |
| （1） | BK15031 | 回送入力票ＮＯ | 数字 8 | O | 表示のみ（BK15 で確定済み） |
| ― | BK15041・BK15042 | 発店コード・発店所名 | | O | 表示のみ |
| ― | BK15051～BK15055 | 発送　年・月・日・時・分 | 数字 2×5 | O | 表示のみ。項目間チェックに使う |
| ― | BK15061 | 入力区分 | 数字 1 | O | 表示のみ |
| 2 | BK15081 | 到着店コード | 数字 4 | **I** | チェック |
| ― | BK15082 | 到着店所名 | 文字 20 | O | 店所マスターから表示 |
| 3 | BK15091 | 到着年 | 数字 2 | **I** | チェック |
| 4 | BK15092 | 到着月 | 数字 2 | **I** | チェック |
| 5 | BK15093 | 到着日 | 数字 2 | **I** | チェック |
| 6 | BK15094 | 到着時 | 数字 2 | **I** | チェック |
| 7 | BK15095 | 到着分 | 数字 2 | **I** | チェック |
| ― | BK15121～BK15134 | 社番・乗務員コード１・２・乗務員名１・２ | | O | 表示のみ |
| 8 | BK15141 | 指示キロメートル・出発時 | 数字 7 | **I** | チェック |
| 9 | BK15151 | 指示キロメートル・到着時 | 数字 7 | **I** | チェック |
| ― | BK15152 | 走行キロメートル | 数字 3 | O | 計算結果を表示 |
| ― | BK15241 | エラーメッセージ | 文字 70 | O | |
| ― | BK15242 | エラーコード | 文字 5 | O | |

項目名は画面設計書（MPBK150 シート）の名称。

#### 必須かどうか

必須かどうかは、前の処理（BK11500P）がTSキューに保存した入力状態フラグ（FLGX）で決まる。

| ケース | 必須になる項目 |
|---|---|
| 回送マスターに到着年月日がない（BK11500P が到着年月日に処理日をセットした場合） | 到着時・到着分・指示粁 出発時・到着時（FLGX(6)～(9)＝'1'） |
| 回送マスターに到着年月日がある | なし（未入力ならTSキューの値をそのまま使う） |

画面に表示済みの値は、利用者が書き換えない限り送信されない。この場合は「未入力」として扱われ、BK11500P がTSキューに保存した値がそのまま使われる（項目チェックは行われない）。

### 2.3 ファンクションキー

| キー | 機能 | 処理概要 |
|---|---|---|
| 実行（Enter） | 継続 | 到着内容をチェックし、OKなら確認画面を表示する |
| PF2 | 取消 | TSキューを削除し、空の MPBK150 を表示して BK15（回送入力票NOの入力）に戻る |
| PF3 | 終了 | 一つ前の画面（サブメニュー）に戻る |
| PF4 | 戻り | メインメニューに戻る |
| CLEAR | 強制終了 | 終了画面（ELEPHAN）を表示して終了 |
| 上記以外 | 再表示 | 画面をそのまま再表示し、BK16 で待機 |

### 2.4 表示属性

| 状態 | 入力可否 | カーソル |
|---|---|---|
| チェックOK（'2'）・未入力（'0'） | 入力不可（DFHBMASK） | ― |
| エラー（'1'）・関連エラー（'3'） | 入力可・高輝度（DFHUNINT） | 置く |

全項目OKの場合は、入力対象の項目がすべて入力不可になり、確認画面になる。色は設定しない。

---

## 3. インターフェース

### 3.1 通信領域（COMMAREA：256バイト）

| 項目ID | 型 | 本プログラムでの用途 |
|---|---|---|
| CRT_BACK_KOSU／CRT_BACK_DATA(5) | | 戻り先画面のスタック（PF3・PF4） |
| TSQ_LENGTH | 2進(15) | TSキューの長さ（BK11500P が 280 を設定） |
| TSQ_ID | 文字(8) | TSキュー名（BK11500P が端末ID＋'BK15' を設定） |
| XC_RTNCD | 2進(31) | 戻りコード（作業用） |

その他の項目（店所コード、処理日、COMM_ITEM_DDP など）は使用しない。COMM_ITEM_DDP（照会元）は変更せずに次の処理に渡す。

### 3.2 TSキュー（CHK_DSP_WORK：280バイト）

レイアウトは BK11500P と同じ（[BK11500P_仕様書.md](BK11500P_仕様書.md) の 3.2 参照）。本プログラムで更新する項目：

| 項目ID | 内容 |
|---|---|
| FLG(2～9)・FLGX(2～9) | 到着店～指示粁のチェック結果・入力状態 |
| OKFLG | 全体チェック結果（'1'：エラー、'2'：OK） |
| BK15081B～BK15095B、BK15141B、BK15151B | 入力された到着店・到着年月日時分・指示粁 |
| BK15082B | 到着店所名（店所略名（漢字）） |
| BK15KIKM | 走行粁（回送粁程、5桁） |
| BK15152B | 走行粁の下3桁（画面表示用） |
| WK_TEIKBN | 訂正区分。いずれかの項目が入力されたら '1' |

### 3.3 参照ファイル

| 識別 | データセット | 名称 | キー | 取得する項目 |
|---|---|---|---|---|
| TE | VPTENMS | ＤＤＰ　店所マスター（DDPTENMS） | 到着店コード | VETNGETA（店所区分）、VETNSRNM（店所略名（漢字）） |

共通の読込みルーチン（DPVSSRH）で読む。DDPJYUGY（従業員マスター）・DDPMORTR（車両マスター）も宣言されているが使わない。

### 3.4 使用モジュール

| モジュール | 引数 | 用途 |
|---|---|---|
| LSO0040 | YMD（YYMMDD）、JYMD（結果。下3桁が年内の通日）、LS4RTN（'0'：正常） | 発送日・到着日を通日に変換し、日数の差を求める |

LSO0020（チェックディジット）も宣言されているが使わない。

---

## 4. 処理仕様

### 4.1 処理の流れ

```mermaid
flowchart TD
    S([開始]) --> AID{押されたキー}
    AID -- CLEAR --> CLR[TSキュー削除<br/>終了画面]
    AID -- PF2/PF3/PF4/その他 --> PF[ファンクションキー処理<br/>4.7]
    AID -- 実行 --> RCV[MPBK150 を受信]
    RCV --> TSQ{TSキューを<br/>読めたか}
    TSQ -- キューなし --> INI[初期化 4.2]
    TSQ -- 読めた --> DEL[TSキューを削除]
    INI --> CHK[項目チェック 4.3]
    DEL --> CHK
    CHK --> REL[項目間チェック 4.4]
    REL --> DSP[表示の編集 4.5]
    DSP --> OK{全項目OK}
    OK -- いいえ --> ERR[TSキューに保存<br/>エラー表示]
    ERR --> R1([BK16 で待機])
    OK -- はい --> CNF[TSキューに保存<br/>確認画面を表示 4.6]
    CNF --> R2([BK17 で待機])
```

### 4.2 開始時の処理

1. 例外条件の分岐先を登録する（画面データなし・レコードなし・ファイルの終わり → いずれも終了処理）。
2. 押下キーの分岐先を登録する（CLEAR → 終了処理、実行・CLEAR以外 → ファンクションキー処理）。
3. 画面 MPBK150 を受信する。
4. TSキュー（通信領域の TSQ_ID・TSQ_LENGTH）を読む。
   - 読めた場合：キューを削除する。
   - キューがない場合：次のように初期化する（通常は発生しない）。

| 項目 | 初期値 |
|---|---|
| LOOP_FLG | '1' |
| OKFLG | '0' |
| FLG(1～30) | すべて '1' |
| FLGX(1～30) | すべて '0' |
| 画面項目の値 | 空 |

### 4.3 項目チェック（CHECK_SUB_RTN_LVL1）

各項目共通の処理：

1. すでにOK（FLG＝'2'）の項目はチェックしない。
2. 未入力（入力長＝0）の場合：FLGX が '1' なら FLG・FLGX を '1'（エラー）、それ以外は '0'（未入力）にする。
3. 入力ありの場合：入力値を作業域に移し、訂正区分（WK_TEIKBN）を '1' にして、次の表のチェックを行う。OKなら FLG・FLGX を '2'、エラーなら '1' にする。

| FLG番号 | 項目 | チェック内容 |
|---|---|---|
| 2 | 到着店コード | 数字で4桁入力。店所マスターに存在し、店所区分（VETNGETA）が '1' または '4'。店所マスターにあれば、エラーでも到着店所名に店所略名（漢字）をセット |
| 3 | 到着年 | 数字で、95～99 または 00～50 |
| 4 | 到着月 | 数字で、1～12 |
| 5 | 到着日 | 数字で、1～31 |
| 6 | 到着時 | 数字で、0～23 |
| 7 | 到着分 | 数字で、0～59 |
| 8 | 指示粁　出発時 | 数字であること |
| 9 | 指示粁　到着時 | 数字であること |

FLG(3～9) に '1' が1つもない場合だけ、項目間チェック（4.4）に進む。

### 4.4 項目間チェック

エラーの場合、対象の項目の FLG を '3'（関連エラー）にする。

#### (1) 到着日時

発送年月日・到着年月日を西暦8桁にして（年が 50 以下なら 2000年代、それ以外は 1900年代）比べる。

| No | チェック | エラー条件 | エラー項目 |
|---|---|---|---|
| 1 | 発送日より前 | 発送日 ＞ 到着日 | 到着年月日時分（FLG 3～7） |
| 2 | 発送日＋5日より後 | No.1 がOKの場合に、発送日の通日 ＋ 5 ＜ 到着日の通日 | 到着年月日時分（FLG 3～7） |
| 3 | 発送日時以前 | 発送年月日時分 ≧ 到着年月日時分（西暦4桁＋月日時分で比較） | 到着年月日時分（FLG 3～7） |

通日は LSO0040 で求めるが、変換の戻り値（エラーかどうか）は判定に使っていない。

#### (2) 指示粁と走行粁

走行粁 ＝ 指示粁 到着時 − 指示粁 出発時

| No | チェック | エラー条件 | エラー項目 |
|---|---|---|---|
| 1 | 走行粁の上限 | 走行粁 ≧ 600 | 指示粁 出発時・到着時（FLG 8・9） |
| 2 | 指示粁なし | 出発時・到着時がどちらも 0 | 指示粁 出発時・到着時 |
| 3 | メーター一巡 | No.2 に該当せず、走行粁 ≦ 0 の場合、(到着時 ＋ 10,000,000) − 出発時 を走行粁とし、≧ 600 ならエラー | 指示粁 出発時・到着時 |

計算した走行粁は、TSキューの回送粁程（BK15KIKM、5桁）に保存し、その下3桁を画面の走行キロメートル（BK15152）に表示する。

#### (3) 全体の判定

FLG(1～9) に '1' または '3' があれば OKFLG ＝ '1'（エラー）、なければ '2'（OK）。

### 4.5 表示の編集（DISPLAY_SUB_RTN_LVL1）

FLG番号 9 から 2 の順に、各項目の表示値と属性を設定する（2.4 参照）。あわせて、到着店所名と走行キロメートルを表示する。

| 結果 | エラーコード | メッセージ |
|---|---|---|
| エラーあり | ERR 1 | エラー項目あり，再入力して下さい |
| 全項目OK | OK  2 | 確認ＯＫなら実行キーを押して下さい |

エラーがある場合：TSキューに保存し、システム日付・時刻を設定して、画面のデータ部分を送信し（カーソル位置を指定、アラームを鳴らす）、BK16 で待機する。

### 4.6 全項目OK時の処理

1. TSキューに保存する（次の処理 BK17 への受渡し）。
2. システム日付・時刻を設定する。
3. 画面のデータ部分を送信し（アラームを鳴らす）、トランザクション **BK17** で待機する。

全項目が入力不可の確認画面になり、利用者が実行キー（または PF3・PF4）を押すと、BK11700P がＤＤＰ回送マスターの更新と集信データの出力を行う（[BK11700P_仕様書.md](BK11700P_仕様書.md) 参照）。

### 4.7 ファンクションキーの処理

| キー | 処理 |
|---|---|
| PF2：取消 | 画面をクリアし、TSキューを削除して、空の MPBK150 を画面を消去して送信する。BK15 で待機（回送入力票NOの入力からやり直し） |
| PF3：終了 | TSキューを削除し、戻り先画面のスタックから一つ前の画面を決める（下表）。共通ヘッダ画面（MPDM010）に日時を設定して送信し、戻り先の画面をデータなしで送信して、そのトランザクションで待機 |
| PF4：戻り | TSキューを削除し、スタックの1件目（メインメニュー）に戻る。表示方法は PF3 と同じ |
| その他 | 画面のデータ部分を再送信し、BK16 で待機 |

| PF3 の条件 | 戻り先 |
|---|---|
| スタックが空 | なし（終了画面を表示して終了） |
| 最上位が MPBK150 以外 | 最上位の画面（1件取り除く） |
| 最上位が MPBK150 で、その下がない | なし（終了画面を表示して終了） |
| 最上位が MPBK150 で、その下がある | その下の画面（2件取り除く） |

BK11500P が照会OK時にスタックへ MPBK150 を積んでいるため、通常は「最上位が MPBK150 で、その下がある」に当たり、その下の画面（サブメニュー）に戻る。

| PF4 の条件 | 戻り先 |
|---|---|
| スタックが空、または1件目が MPBK150 | なし（終了画面を表示して終了） |
| 1件目が MPBK150 以外 | 1件目の画面（スタックを全件消去） |

### 4.8 終了処理・例外処理

| 発生条件 | 処理 |
|---|---|
| CLEAR キー | TSキューを削除し、終了画面（ELEPHAN）を表示して終了 |
| 画面データなし（MAPFAIL）・レコードなし（NOTFND）・ファイルの終わり（ENDFILE） | CLEAR キーと同じ。BK11500P（処理を続ける）とは扱いが違う |

### 4.9 システム日付・時刻の設定（TIMESET_SUB_RTN）

現在の日時を `YY/MM/DD`・`HH:MM:SS` に編集して画面の日付・時刻欄に設定する（入力不可・変更フラグオン）。

---

## 5. メッセージ一覧

| No | コード | メッセージ | 表示するとき |
|---|---|---|---|
| 1 | ERR 1 | エラー項目あり，再入力して下さい | 項目チェック・項目間チェックでエラーがあったとき |
| 2 | OK  2 | 確認ＯＫなら実行キーを押して下さい | 全項目OKのとき（確認画面） |

---

## 6. 画面遷移

```mermaid
flowchart LR
    BK15[BK15<br/>BK11500P] -- 照会OK --> BK16[BK16<br/>本プログラム]
    BK16 -- 実行（エラー） --> BK16
    BK16 -- 実行（OK・確認画面） --> BK17[BK17<br/>BK11700P]
    BK16 -- PF2 --> BK15
    BK16 -- PF3 --> PREV[一つ前の画面]
    BK16 -- PF4 --> MAIN[メインメニュー]
    BK16 -- CLEAR・例外 --> END[ELEPHAN 終了]
```

---

## 7. 補足・留意事項

1. **表示済みの値はチェックされない**：BK11500P が表示した到着店・到着日時・指示粁は、利用者が書き換えなければ送信されず「未入力」扱いになる。この場合、店所マスターの存在チェックなどの項目チェックは行われず、TSキューの値がそのまま使われる（項目間チェックは行われる）。
2. **指示粁は実質的に必須**：指示粁の必須フラグが立っていなくても、出発時・到着時がどちらも 0 の場合は項目間チェックでエラーになる。
3. **到着店の店所区分**：到着店は店所区分 '1'・'4' だけを受け付ける。発送側の BK10300P のような個別の店所コード（0581 など）の例外はない。
4. **通日による日数比較**：発送日＋5日の判定は、年内の通日（1～366）で比べている。年をまたぐ場合（12月末の発送で1月初めの到着など）は正しく判定できない。また、通日への変換エラー（存在しない日付）を判定していない。
5. **最初のエラー判定は FLG(2) を見ていない**：項目間チェックに進む前の判定は FLG(3) から始まり、到着店コード（FLG(2)）のエラーを見ていない。到着店だけがエラーの場合も項目間チェックが動くが、最後の判定でエラーになるため結果は変わらない。
6. **走行粁の表示**：走行粁は回送粁程（5桁）に保存し、画面には下3桁だけを表示する。走行粁は 600 未満しか通らないため、表示上の問題はない。
7. **TSキューが読めないとき**：全項目が任意・値が空で初期化されるため、発送日などが空のまま項目間チェックが動き、エラーになる（通常の操作では発生しない）。
8. **使っていない領域**：HELP画面コントロールエリア、LSO0020、DDPJYUGY・DDPMORTR、センター　セッション用の領域（SEND_DATA・REVE_DATA・SYSID など）、WK_YMD3・WK_YMD33、END_MSG、CNT_MAX、MAX・XCNT、TSQ_LENGTH_W 等は使っていない。
