技術とか戦略とか

SIerで証券レガシーシステムを8年いじってからSESに転職した業務系エンジニアによる技術ブログ。

データレコードの種類を増やして拡張性を持たせる

企業間でやりとりするファイルでよく見かけるフォーマットとして、レコードが「ヘッダレコード」「データレコード」「トレーラレコード」に分かれているフォーマットがあります。
簡単に言うと、それぞれのレコードの説明は以下のようになります。
 
【それぞれのレコードの説明】
・ヘッダレコード
 ファイルの1レコード目のレコード。
 一般的には、そのファイルが何日のデータなのかが記載される。
 
・データレコード
 ファイルの中間レコード。
 実際にやりとりするデータの中身が記載される。
 
・トレーラレコード
 ファイルの最終レコード。
 一般的には、そのファイルのデータレコード件数が記載される。
 
----
 
ここで、拡張性を確保するために、データレコードの種類を増やすという手段が有効になることがあります。
種類が異なるデータレコードをファイルに含める場合、データレコードのフォーマットを変えてしまうと、フォーマットが複雑になることで書き込み・読み込み処理が複雑になったり、フォーマット変更時の影響が全種類のデータレコードに出てしまったりします。
しかし、種類毎にデータレコードを用意することで、1つ1つのフォーマットが複雑になることを防いだり、フォーマット変更の影響が当該種類内のデータレコードに限定させることができます。
 
フォーマットと処理の例としては以下の通りです。
商品の種類毎にデータレコードの種類を変えることで、データ体系の違いを吸収している所がポイントです。
(1つのデータレコードにしてしまうと、1つのデータレコードに「食品商品コード」と「玩具商品コード」が含まれることになり、どちらを書き込むか・読みこむかの判断が必要になってしまいます。また、食品若しくは玩具にだけ新たな項目を追加する時に、追加が必要無い方の種類の商品の考慮も必要になってしまいます。)
 
【フォーマット例】
取扱商品ファイルを想定した例を記載します。
可変長のCSVファイルを想定します。
(固定長の場合も多いです。固定長の場合は、カンマ区切りではなくバイト数で区切ることになります。)
 
・ヘッダレコード
 1項目目:ファイル区分(1がセットされる)
 2項目目:ファイル作成日付(YYYYMMDD)
 
・食品データレコード
 1項目目:ファイル区分(2がセットされる)
 2項目目:食品商品コード(7桁の数値)
 3項目目:商品名(全角文字)
 4項目目:値段(数値)
 
・玩具データレコード
 1項目目:ファイル区分(2がセットされる)
 2項目目:玩具商品コード(6桁の数値)
 3項目目:商品名(全角文字)
 4項目目:値段(数値)
 
・トレーラレコード
 1項目目:ファイル区分(9がセットされる)
 2項目目:データレコードの件数(数値)
 
【ファイルのレコード例】
1,20210602
2,0000001,ほげ食品,100
2,0000002,ふが食品,250
3,000001,ほげ玩具,3000
3,000002,ふが玩具,10000
9,4
 
【ファイル受信時の処理例】
ヘッダレコードやトレーラレコードは、受信側のチェック処理に利用できます。
以下、ファイルを1レコード目から順番に読む場合の処理例について記載します。
 
・ファイル区分が1の時
 1レコード目がファイル区分1でなければ異常終了。
 (送信側が中間ファイル等誤ったファイルを送信することを想定)
 バッチ日付と比較し一致しなければ異常終了。
 (送信側が誤って過去ファイルを送信することを想定)
 
・ファイル区分が2の時
 業務上必要な食品向けの処理を実行。
 
・ファイル区分が3の時
 業務上必要な玩具向けの処理を実行。
 
・ファイル区分が9の時
 最終レコードのファイル区分が9でなければ異常終了。
 (ファイルを全件受信できていないことを想定)
 件数がファイル区分2~3のレコード数と一致しなければ異常終了。
 (ファイルを全件受信できていないことを想定)