ゾーン10進数とパック10進数のデータの持ち方

COBOLプログラムでの入出力が必要なデータ(ファイルや電文)を取り扱う際は、ゾーン10進数とパック10進数を意識する必要があります。
今回の記事では、ゾーン10進数とパック10進数について、どのようなデータの持ち方をしているのか(16進数のバイナリでどのようなデータが格納されるのか)を説明したいと思います。

【ゾーン10進数(符号無し)】

ゾーン10進数とは、簡単に言ってしまえば1バイト(8ビット)で1桁の数値を表現する形式です。
符号無しの場合は、通常の文字列と同じ形式で表現します。

表す数値と表現形式(文字コード)の一覧は以下の通りです。
表現形式については、メインフレームで良く使われるEBCDICと、Windows等のPCで良く使われるASCIIについて記載します。

数値表現形式(EBCDIC)表現形式(ASCII)
0F030
1F131
2F232
3F333
4F434
5F535
6F636
7F737
8F838
9F939

例えば、EBCDICで「123」を表現する時には、「F1 F2 F3」となります。

【ゾーン10進数(符号有り)】

符号有りの数値を表現する場合は、最後の桁の上位4ビットの値により符号を表現します。
表現形式はベンダ各社でまちまちなのですが、例としては以下のように表現します。

符号IBM互換機のメインフレーム(EBCDIC)opensource COBOL(ASCII)
符号無しF3
+C(Fの場合もあり)3
D7

例えば、IBM互換機のメインフレーム(EBCDIC)で「+123」を表現する時には、「F1 F2 C3」となります。
また、「-123」を表現する時には、「F1 F2 D3」となります。

【パック10進数】

パック10進数とは、4ビットで1桁の数値を表す形式です。4ビット(16進数)の値がそのまま1桁の数値になります。
また、最後の4ビットで符号を表し、符号無しの場合は F、+ の場合は C、-の場合は D が入ります。
最終的に1バイト(8ビット)の単位にする必要があるため、桁数が偶数の時(桁数×4ビットと符号4ビットの合計が8ビットの倍数にならない時)は、一番先頭の4ビットに 0 を入れます。

例えば、以下のように表現されます。
・「123」を表現する時…「12 3F」
・「+123」を表現する時…「12 3C」
・「-123」を表現する時…「12 3D」
・「1234」を表現する時…「01 23 4F」

【サンプル】

以下は、opensource COBOL(ASCII)を用いて実際にどのように値が表現されているのかを表したものです。
「1234567890」という値について、「ゾーン10進数(符号無し)」「ゾーン10進数(+)」「ゾーン10進数(-)」「パック10進数(符号無し)」「パック10進数(+)」「パック10進数(-)」の順番に出力しています。

・サンプルコード

IDENTIFICATION DIVISION.
PROGRAM-ID. SIGNTEST.
ENVIRONMENT DIVISION.
INPUT-OUTPUT SECTION.
FILE-CONTROL.
 SELECT F1 ASSIGN TO “C:\tmp\a.txt”.
*
DATA DIVISION.
FILE SECTION.
FD F1.
01 F1R.
 03 F1-REC PIC X(60).
*
WORKING-STORAGE SECTION.
01 F1-REC-WORK.
 03 F1-REC1 PIC 9(10) VALUE 1234567890.
 03 KAIGYO1 PIC X(02) VALUE X”0D0A”.
 03 F1-REC2 PIC S9(10) VALUE +1234567890.
 03 KAIGYO2 PIC X(02) VALUE X”0D0A”.
 03 F1-REC3 PIC S9(10) VALUE -1234567890.
 03 KAIGYO3 PIC X(02) VALUE X”0D0A”.
 03 F1-REC4 PIC 9(10) COMP-3 VALUE 1234567890.
 03 KAIGYO4 PIC X(02) VALUE X”0D0A”.
 03 F1-REC5 PIC S9(10) COMP-3 VALUE +1234567890.
 03 KAIGYO5 PIC X(02) VALUE X”0D0A”.
 03 F1-REC6 PIC S9(10) COMP-3 VALUE -1234567890.
 03 KAIGYO6 PIC X(02) VALUE X”0D0A”.
*
PROCEDURE DIVISION.
*
* 各種処理の呼び出し
*
000-CONTROLLER-S.
 PERFORM 100-START-S THRU 100-START-E.
 PERFORM 200-MAIN-S THRU 200-MAIN-E.
 PERFORM 300-END-S THRU 300-END-E.
 STOP RUN.
000-CONTROLLER-E.
*
* 前処理
*
100-START-S.
 OPEN OUTPUT F1.
100-START-E.
*
* 主処理
*
200-MAIN-S.
 MOVE F1-REC-WORK TO F1-REC.
 WRITE F1R.
200-MAIN-E.
*
* 後処理
*
300-END-S.
 CLOSE F1.
300-END-E.

・出力結果


金融系だと、仮に自社でCOBOLを使用していなくても、接続先のシステムがCOBOLを使用しているということ良くあります。
データ表現も接続先システムのCOBOLのシステムに合わせなければならないこともあるので、このようなCOBOLの知識が必要になることがあります。

来週も、実務で役立つ情報を提供していきたいと思います!

マッチング処理のサンプルプログラム

マッチング処理(マスタデータとトランザクションデータを突き合わせる)のロジックについて、前回の記事で紹介しました。
サンプルプログラムを作成しましたので、参考までに紹介します。
言語はCOBOL(opensource COBOL)です。

【サンプルプログラム】

【マスタファイル】

・C:\tmp\a.txt

【トランザクションファイル】

・C:\tmp\b.txt

【出力ファイル】

・C:\tmp\c.txt

【標準出力】


いかがでしたでしょうか。

マッチング処理はそこそこ複雑なロジックなので、マッチング処理を使用するプログラムを前知識無しで目にすると戸惑うと思います。
しかし、前回の記事で紹介したフローが頭に入っていれば、プログラムも読めるようになると思います。
業務で開発するバッチプログラムでは頻出のロジックなので、前回の記事の内容と合わせて頭に入れておくことをお勧めします。

これからも、実務で役に立つ情報をお伝えできればと思います。
では、また来週!

マッチング処理のロジック

今回は、バッチプログラムで使われるロジックの一つである「マッチング処理」について説明します。
「マッチング処理」とは特にCOBOLではよく目にするロジックであり、マスタデータ(業務の基盤となるデータ。商品一覧、取引先一覧等。)とトランザクションデータ(業務で日々発生するデータ。販売履歴、入金履歴等。)を突き合わせる処理です。
マッチング処理を覚えておけば、実業務でバッチプログラムを作る時のヒントになりますし、開発者同士のコミュニケーションもスムーズになります。

突き合わせを行う時は、マスタデータとトランザクションデータで同じキー項目(商品コード、取引先コード等)を使用し、そのキー項目で昇順にソートした後、マスタデータとトランザクションデータを1件ずつ読み、キー項目が一致するかどうかで突き合わせを行います。
マスタデータとトランザクションデータでキー項目が一致した場合(マスタで管理しているもので取引が発生した)と、マスタのみキー項目が存在している場合(マスタで管理しているが取引は発生しなかった)は正常ケースですが、トランザクションのみキー項目が存在している場合(マスタで管理していないものが取引された)は異常ケースとなります。

マスタデータの一つのキー項目に対して、トランザクションデータの0~1つのレコードが対応する場合は、1対1マッチングと呼ばれます。2つ以上のレコードが対応することがある場合は1対nマッチングと呼ばれ、処理が少しだけ複雑になります。

フローチャートと例は以下の通りとなります。

【フローチャート】

【例】

・要件

商品名が管理されている商品マスタと、商品の販売履歴(トランザクション)をファイル形式で読み込み、商品名と販売日を別ファイルで出力したい。

・商品マスタのフォーマット

カンマ区切りの固定長ファイル。
商品コードでレコードを一意に特定できるようにデータをセットする。

・販売履歴のフォーマット

カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。

・出力ファイルのフォーマット

・商品マスタのレコード

・販売履歴のレコード

・処理の流れ

・出力ファイル


以上、「マッチング処理」でした。
少し複雑なロジックですが、ファイルをキーの昇順に並べて順番に読み込むことと、キーがマッチする場合・しない場合は具体的にどのような状況なのかをイメージすることがポイントになります。

次回は、サンプルプログラムを書いてより具体的に説明したいと思います。
では、また来週!

コントロールブレイクのサンプルプログラム

コントロールブレイク(キー項目が変わる度に何らかの処理を実行)のロジックについて、前回の記事で紹介しました。
サンプルプログラムを作成しましたので、参考までに紹介します。
言語はCOBOL(opensource COBOL)です。

【サンプルプログラム】

【入力ファイル】

・C:\tmp\a.txt

【出力ファイル】

・C:\tmp\b.txt


いかがでしたでしょうか。
前回の記事ではプログラムまでは作成しなかったので、今回の記事ではプログラムも作成してみました。

今回はCOBOLでプログラムを作成したので、java等の他の言語を学んできた方にはわかりにくかったかもしれません。
しかし、COBOLは自然言語に近い書き方ができるという特徴があるので、経験が浅い方でもなんとなく雰囲気を感じ取ってもらえるのではないか、と個人的には思っています。
また、コントロールブレイクを使用する現場ではCOBOL資産に触れる機会が少なくないので、その意味でも慣れておいて損はないと思っています。

次回は、コントロールブレイクと並んで使用されることが多いロジックであるマッチングについて書いていきたいと思います。
では、また来週!

コントロールブレイクのロジック

今回の記事では、バッチプログラムで使われるロジックの一つである「コントロールブレイク」について説明します。
「コントロールブレイク」とは特にCOBOLではよく目にするロジックであり、キー項目(「商品番号」「顧客番号」「カード番号」等)順にソートされたデータに対して、キー項目が変わる度にタイトル出力や改ページ等を行うロジックです。
トランザクションファイル・トランザクションテーブル(履歴ファイル・履歴テーブル)を読み込み、帳票やハガキ等を出力する時に使われることが多いです。

フローチャートと例は以下の通りです。

【フローチャート】

【例】

・要件

商品の販売実績のデータをまとめたファイルを読み込み、商品毎にタイトルを付与して、別のファイルに出力したい。

・入力ファイルのフォーマット

カンマ区切りの固定長ファイル。
商品コード・販売日でレコードを一意に特定できるようにデータをセットする。

・入力ファイルのレコード

・タイトル行のフォーマット

・処理の流れ

・出力ファイル


以上、「コントロールブレイク」でした。
このロジックを覚えておくと、バッチ処理を設計するのが楽になります。
プログラミングだけでなくExcelの資料作りにも役立つことがあり、意外と応用も効きます。

これまでも週1でブログを更新してきましたが、今後もこのような記事を週1ペースで書いていきたいと思います。
では、また来週!