はじめに
少し前に対応した案件の話です。
お客様から
「ヘッダ部」「明細1~ 明細α」「フッタ部」がそれぞれ別のレコードで構成されているCSVデータを「ヘッダ部 - 明細@ - フッタ部」で 1レコードのCSVデータにしたい
明細が3レコード有るとして、図にするとこんな感じにしたいらしい。
お客様要望を実現するためのフローチャートを考えてみました(チョット雑ですが)。
赤枠の中のようにループ処理が出来れば良いのですが・・・![]()
DataMagic は、読み込んだレコードが抽出条件に一致すれば、指定された処理をする 代物ですが、指定できる処理の中に、テーブルに一時保管していた明細を1レコードずつ一気に出力させるループ処理(上図の赤枠内)は無いんですよね。
以下の構成のように、「明細」を読み込んだら、先に読み込んでる「ヘッダ部」「フッタ部」と組合せて出力するなら、
2.「フッタ部」を読み込んで保管
3.「明細1」を読み込んで、保管した「ヘッダ部」「フッタ部」と一緒に出力
4.次の「ヘッダ部」を読み込むまで、読み込んだ「明細@」を3の編集で出力
で対応できるんで、全然難しくないんですけどね。
しか~し、ココでおめおめと引き下がる DataMagic ではない訳でして。
打つ手は無いのか
考えろ・・・考えろ・・・ ![]()
そこで思いだしたのが、データ加工画面の右上に薄っすら見えてる 仮想テーブル の存在。
仮想テーブル とは
レコードを仮想テーブルファイルとして DataMagic に取り込み、データ作成したテーブルです。
仮想テーブルとしてデータを格納することで、SQLの機能を活用した 柔軟で効率が良いデータの取得が可能になります。
ということで、仮想テーブルのSQL機能活用して、お客様要望に向き合ってみました。
ここから下の説明は、SQL文 や DataMagic が普通に扱えることを前提に、ピンポイントで説明しています。
入力データ
今回の入力データは以下を使用します。
"R0808051816","H","73841","2026/08/05"
"R0808051816","M","10","シャインマスカット",015,00880.00,0013200.00
"R0808051816","M","20","巨峰 ",015,00660.00,0009900.00
"R0808051816","M","30","プラム ",005,00500.00,0002500.00
"R0808051816","M","40","白桃 ",010,00400.00,0004000.00
"R0808051816","F",00029600.00,10.0,002960.00,00032560.00
"R0808131820","H","57918","2026/08/13"
"R0808131820","M","10","にんじん ",005,00123.00,0000615.00
"R0808131820","M","20","じゃがいも ",005,00234.00,0001170.00
"R0808131820","M","30","かぼちゃ ",005,00456.00,0002280.00
"R0808131820","F",00004065.00,10.0,000406.50,00004471.50
"R0808141822","H","91423","2026/08/14"
"R0808141822","M","10","バナナ ",003,00111.00,0000333.00
"R0808141822","M","20","キーウィ ",003,00222.00,0000666.00
"R0808141822","M","30","なす ",002,00333.00,0000666.00
"R0808141822","M","40","ピーマン ",002,00444.00,0000888.00
"R0808141822","F",00002553.00,10.0,000255.30,00002808.30
各レコードの構成は以下の通りです。
それぞれレコード区別で、ヘッダ部、明細、フッタ部を区別します。
2項目目(レコード区分)が H = ヘッダ部
- 1項目目 = 請求書番号
- 2項目目 = レコード区分
- 3項目目 = 顧客ID
- 4項目目 = 日付
2項目目(レコード区分)が M = 明細
- 1項目目 = 請求書番号
- 2項目目 = レコード区分
- 3項目目 = 明細番号
- 4項目目 = 品目
- 5項目目 = 数量
- 6項目目 = 単価
- 7項目目 = 金額
2項目目(レコード区分)が F = フッタ部
- 1項目目 = 請求書番号
- 2項目目 = レコード区分
- 3項目目 = 小計
- 4項目目 = 税率
- 5項目目 = 税金
- 6項目目 = 合計
レイアウト情報
マッピング情報を設定する際、関係線や出力情報が確認し易いように、以下の内容で出力用のCSV情報を登録して使用します。
ちなみに、コメントはオマケ。各項目の出力元を明示してみました。
仮想テーブル
詳しいことはマニュアルで確認していただくとして。
今回は以下の条件で登録します。
1.仮想テーブルファイルに取り込むデータは入力ファイル
2.形式はCSV、IDは省略
3.仮想テーブル名は初期値(VT_TABLE1)
4.IDを省略しているので[項目取り込み]をクリックすると「追加項目数設定」画面が表示されます。
「追加する行数」に〝7〟(一番項目数の多い明細の項目数:7)を入力して[OK]
5.画面下に展開された項目は、このまま使用します。
データ加工
1.入力ファイルエリアの編集
入力設定
入力ファイルエリアは、シンプルに設定。
形式=CSV。CSV情報のIDは省略で指定します。
入力データを収めたファイル名を指定して、これ以外の設定は初期値を採用します。
2.出力ファイルエリアの編集
出力設定
出力ファイルエリアも、シンプルに設定。
形式=CSV。CSV情報のIDは今回用に登録したIDを指定します。
処理結果を出力するファイル名を指定して、今回はタイトル行もオマケで出力します。
これ以外の設定は初期値を採用します。
3.抽出条件の設定
今回は、明細のレコードにヘッダ部とフッタ部を連結して出力するので、抽出条件に明細のレコードだけを抽出する条件「2項目目がM」を追加します。
4.関係線の設定1〔抽出条件と出力ファイル〕
抽出条件のアイコンを選んで、出力ファイルのアイコンの上にドラッグ&ドロップし、アイコン間の関係線をつなぎます。
5.関係線の設定2〔入力項目と出力項目をマッピング〕
簡単なところから設定していきます。
先ず、読み込んだ明細の項目と出力項目を関係線で結びます。
明細のレコードについては〝入力データ〟。出力元については〝レイアウト情報〟の説明を見直してください。
続いて出力元が[ヘッダ部(下図赤点線内)][フッタ部(下図緑点線内)]になる項目を編集します。
これらの項目はすべて〝クエリ値〟で、下図のように設定します。
SQL文を理解していることが前提なので、クエリ値の説明は不要だと思いますが、上図の顧客IDのクエリ値でやっていることは、
select NO_3 from VT_TABLE1 where NO_2 = "H" AND NO_1 = $INUM(1)
VT_TABLE1〔仮想テーブル〕から
NO_2〔レコード区分〕が "H"〔ヘッダ部〕且つ NO_1〔請求書番号〕が $INUM(1)〔入力項目の請求書番号〕と同じレコードの
NO_3〔顧客ID〕を抽出
です。
なので、他の項目は 赤太字 の〝抽出する項目〟と〝レコード区分〟を出力項目に合わせて変えるだけ。
結構簡単です![]()
5.データ加工処理
すべての設定が終わったので、 最後にIDを登録して、現在表示されている内容で、データ加工を実行します。
出力結果をプレビューで表示するとこんな感じ
ヘッダ部の顧客IDや日付、フッタ部の小計などが、しっかり各明細にくっ付いて出力されています。
補足
出力結果をメモ帳で開くと、入力データの数値項目が下図のように編集されていました。
- 明細の数値項目(ピンク部分)の 前ゼロがカットされている
- フッタ部の数値項目(緑部分)に 囲み文字が付いて文字列扱いされている
上記事象を解決し、入力データと同じ形で出力する方法は以下になります。
前ゼロをカットしない
コレは、出力設定で簡単に解決![]()
数値データの前ゼロの扱いを〝カットしない〟に変更するだけで ![]()
出力結果をメモ帳で開くと、明細の数値項目(ピンク部分)は、前ゼロがカットされずに出力されました。
囲み文字を外す(数値項目として扱う)
コレは、マッピング情報設定の〝出力フォーマット〟で解決![]()
そもそも、仮想テーブルの設定では、全項目を文字列扱いしているので、何もしない出力結果に囲み文字が付くのは正しい結果です。
数値項目の〝小計〟は、下図のように編集します。
フッタ部の〝小計〟は、整数部8桁+小数部2桁 で構成されているので
- [形式]を 数字文字列 に変更
- 入力データの小数部桁数が2なので、[有効小数部桁数]を 2桁に指定する
- [パディング方法]は 右詰+0でパディング
- [パディングサイズ]は 整数部の8、小数部の2に、小数点の1を加算して 11
この編集をした結果が ![]()
囲み文字が外れて、前ゼロも付いて出力されます。
なお、この設定が優先されるので、出力設定の〝前ゼロの扱い〟に出力結果は左右されません。
上記の補足をすべてのフッタ部の項目に施した結果が下図になります。
文字データの後ろスペースをカットしない
コレも、出力設定で簡単に解決![]()
文字データの後ろスペースの扱いを〝カットしない〟に変更するだけで ![]()
出力結果をメモ帳で開くと、明細の品目(赤破線内)は、後ろのスペースがカットされずに出力されました。
以上です。





















