過去の桐井戸端BBS (桐ver.8)
10228 固定長データを読み込む方法 ezer 2001/03/13-05:07
諸先輩の方々、いつもお世話になっております。
固定長データの事でお教え下さい。
このデータはチェーンストアー伝票を打ち出すためのデータフォーマットです。
データの形としては下記の通りです。
  
伝票ヘッダレコード       | 項目数22
伝票ヘッダオプションレコード | 項目数7
  明細レコード        | 項目数16
  明細レコード        | 項目数16
  明細レコード        | 項目数16
  明細レコード        | 項目数16
  明細レコード        | 項目数16
  明細レコード        | 項目数16

以上のデータが連続してつづきます。
但し明細部のレコードは最大で6レコードでそれ以下の場合もあります。
(6レコード固定ではないので無理かも知れないと思いながら質問しています。)
ファイル変換で項目数、桁数を合わせて読み込んだ場合明細部のデータが当然細切れになってしまいます。
この様な場合は適当に読み込んでから加工するべきなのでしょうか?
それとも何か方法があるのでしょうか?
出来れば
伝票ヘッダ、伝票オプションレコード、明細レコード(1つ目)
伝票ヘッダ、伝票オプションレコード、明細レコード(2つ目)
伝票ヘッダ、伝票オプションレコード、明細レコード(3つ目)
以上のような形に変換することは可能でしょうか?お教え下さい。
このデータはこの場にそのまま掲載できないので方法がありそうな場合は
多少加工して掲載するかメールでお送りしてもかまいませんのでよろしくお願い申し上げます。


10231 Re:固定長データの質問です。 えむに 2001/03/13-07:59
記事番号10228へのコメント
ezerさんお早うございます。

>この様な場合は適当に読み込んでから加工するべきなのでしょうか?

 いろいろなやり方はあると思いますが・・・
 私なら通常は避けている表の計算式で対応する事を先に検討します。
 理由として、この手の処理はレコードフォーマットはほとんど変更などが無いが一般的ですよね。
 ・一括の記述でのメリットが少ない。
 ・一括の知識が少ない人でもこの計算式の入ったテーブルを使えば別途の処理が作りやすい。
 作り手としては面倒なのですが・・・と言う事で。

 受け取る項目を作りそこに固定長を受け取ります。
 後は計算式の入った処理用の項目ですね。
 ヘッダなのか明細なのかを識別する(フラグを立てる為の)項目を設けると処理がしやすいです。
 (全銀フォーマットなどはデータ区分が入ってるのですが)
 その識別に従って、ヘッダ・明細項目1〜16とかを処理する・・かな。
 伝票ヘッダも、条件選択でヘッダ行か明細行なのかを判定して、直前値を採用するか、元データから複写するか判定出来ますし。

 一括での方法はたぶん他の方から説明があると思いますので・・・

 追伸:例のリモートプリンタ件・・・昨日見て来ました。LPT2(¥¥・・・)と
 言う具合にプリンタプロパティの詳細へ追加してるのがわかりました。
 ダメもとで試してみて下さいな。LPT2です。・・ダメかもしれませんが。(汗)
10236 Re:固定長データの質問です。 ezer 2001/03/13-11:27
記事番号10231へのコメント
えむにさん 早速のコメントありがとうございます。大変助かりました。

>
> 受け取る項目を作りそこに固定長を受け取ります。
> 後は計算式の入った処理用の項目ですね。
> ヘッダなのか明細なのかを識別する(フラグを立てる為の)項目を設けると
> 処理がしやすいです。
> (全銀フォーマットなどはデータ区分が入ってるのですが)
> その識別に従って、ヘッダ・明細項目1〜16とかを処理する・・かな。
> 伝票ヘッダも、条件選択でヘッダ行か明細行なのかを判定して、直前値を
> 採用するか、元データから複写するか判定出来ますし。

ありがとうございます。早速試してみます。
(読み込んでからの方法は何とかなりそうなのですが、実は、恥ずかしながら、最初の段階が問題のようなのです。
もしかして変換して、受け取る表も別に作成しておく、この様な方法なのでしょうか?であれば出来そうなので試してみます。
分からなければ又質問させて下さい。)
>

> 追伸:例のリモートブリンタ件・・・昨日見て来ました。LPT2(¥¥・・・)と
> 言う具合にプリンタプロパティの詳細へ追加してるのがわかりました。
> ダメもとで試してみて下さいな。LPT2です。・・ダメかもしれませんが。(汗)

諦めておりましたが、又試してみます。気にかけて下さりありがとうございます。

10237 行毎に区切り位置が変わる固定長データ(一括処理による読み込み) 佐田 守弘 2001/03/13-11:28
記事番号10228へのコメント
ezerさん
いくつかの方法がありますが、そのうちの一括処理による方法です。
前提として各レコードの先頭などに、レコード種別を判定できる項目があると仮定します。これがないと処理ができませんから。

まず先に書き出す表を開いておきます。
この表は、目的とする

 >伝票ヘッダ、伝票オプションレコード、明細レコード

の様な項目で構成しておきます。
読み込みとデータ処理は、全体として繰り返しコマンドでのループになります。
そして読み込みですが、一括処理で読み込む場合には、ファイル入力コマンドで、1行単位で読むのが良いでしょう。
1行分読み込んだら、レコードヘッダで種別を判定し、種別事の切り出し処理を行います。
切り出し処理では、「#部分列」関数を用いて、読み込んだ1行の文字列から、それぞれの項目に該当する部分を切り出し、それを変数に代入しておきます。
読み込んだテキストが明細レコード以外の時には、単に対応する変数に値を代入するだけです。
そして、明細レコードの場合には、変数に代入した後、書き出す表に行追加コマンドで1レコード追加しながら、現在の変数値を書き込んで行きます。

処理内容は以上の繰り返しです。
この処理でお分かりと思いますが、ヘッダレコードを読み込んだら、&h1、&h2、・・・の変数
にヘッダレコードの項目値がセットされます。
次いでヘッダオプションレコードであれば、&h1などの値はそのまま残り、&o1、&o2などに
ヘッダオプションレコードの項目値をセットします。
そして明細レコードでは、今までの&h1や&o1などの値と明細レコードで読み込んだd1など
の値をまとめて表に書き出す訳です。

テキストファイルを順次読み込む事と、表ファイルに受に書き出す事を同時に行う訳ですが、
このあたりで「今何が行われているはず」が頭の中で把握できれば、それ程難しい処理ではありません。

佐田守弘(KS-00119)
10239 ありがとうございました。 ezer 2001/03/13-11:47
記事番号10237へのコメント
佐田 先生いつもありがとうございます。超初心者のエゼルです。

佐田先生、先生のコメントを呼んで、今日初めて128バイトの固定長のデータと言う意味が分かりました
伝票ヘッダ、伝票オプションレコード、明細レコード3つの項目を作成し部分列で文字を切り出すのですね。
佐田先生、言葉の使い方一つでよく分かるものですね、ライターの方の言葉に対する考え方、伝え方もよく解りました。
98%理解できました。頑張ってトライしてみますでも頭の中ではもう出来たような気がしています。
本当にありがとうございました。でも、又質問するかも知れませんが???????

10240 Re:JCAの通信ソフト(ハード)? 尾形 2001/03/13-11:54
記事番号10228へのコメント
みなさん、こんにちは
ちょっと話題がそれそうですが.....

使い勝手の良い、JCA通信ソフト(モデムと対?)
を教えて頂けないでしょうか
Biwareというのを使用しているのですが(サンプルソフト ^^;)
あまり使いやすくないのです。
桐から制御できれば最高なのですが(バッチ経由?)
そろそろ買い換え時なので探しているのです。

よろしくお願いします。

10245 行毎に区切り位置が変わる固定長データ(表だけで処理する方法) 佐田 守弘 2001/03/13-13:31
記事番号10228へのコメント
先程の方法は一括処理を使う方法でしたが、「究極の桐の活用技術」こと、一括処理を使わない方法を紹介します。
これは基本的には、えむにさんが#10231で書かれている方法と同じ考え方です。
まず、読み込み様の表には、[読込値]の様な項目の他、ヘッダレコード、オプションレコード、明細レコードの3種類のレコードに対応する全項目を作っておきます。
そして、[読込値]以外のこれらの項目は計算項目としますが、そこに設定する計算式のポイントは、
一括処理の場合と同じく、#部分列([読込値],<a>,<b>)といった計算式です。

ただし、単純に部分列を求めると、レコード種別が違う時に目的外の値になってしまいます。
そこで、「#条件選択」関数を使ってい、レコード種別により、そのレコードではその計算項目を求めるか、未定義とするかと言った判断を加えます。

つまり、次のようになります
●ヘッダレコードの場合
ヘッダレコード分の項目のみを切り出し、それ以外の項目は未定義値としておきます。
●オプションレコードの場合
ヘッダレコードの項目は、「#直前値」関数で直前行のヘッダレコードの値を参照します。
オプションレコードの項目は、[読込値]の値から、該当する項目を切り出し、明細レコードの項目は未定義のままにします。
●明細レコードの場合
ヘッダレコード、オプションレコードの項目は、「#直前値」関数でそれぞれ上の行を参照し、明細レコードの項目は、「#部分列」関数で切り出します。

この様な定義内容の読み込み表を作成しておくだけです。後は、この[読込値]の項目に、固定長データを読み込み、明細レコードだけを絞り込むだけです。

もしこの方法と結合表を組み合わせれば、「開けば目的のデータができている」もできると思います。
単に読み込むだけで、あるいは開くだけで、後は桐が勝手に処理してくれる方法、それが究極の桐の活用術です。

佐田守弘(KS-00119)

「戦略」とは、戦いを略すと書くそうです。つまり戦わずして戦いに勝つ。それが最高の勝ち方だとか。
桐も同じですね。一括処理でゴリゴリ処理をするのではなく、「処理をせずして処理を行う」。
表を開いてみれば、全てのデータができ上がっている。それが桐の最奥義です。
10249 諸先輩に感謝!! ezer 2001/03/13-14:41
記事番号10245へのコメント
佐田 先生 再びありがとうございました。
一括処理でやり始めましたが、今回の方法の方が簡単かなと思い作り直します。
しかし、一括処理の方法もほぼ出来そうです。
しかし、この処理は私がやるわけではないので、今回この方法も作ってみます。

今回のことで色々勉強させていただき感謝致しております。
この場でえむにさんにも、感謝!!本当にお二人に心から感謝致します。
又よろしくお願いいたします。

10269 Re:諸先輩に感謝!! えむに 2001/03/14-00:23
記事番号10249へのコメント
>この場でえむにさんにも、感謝!!本当にお二人に心から感謝致します。

 いえいえ、私なんか佐田さんに比べれば戯言の類です。
 こーして佐田さんのコメントをいろいろ読んでるとどんなコメントでも詳しくかつ丁寧なので驚きます。

 すごいもんです。ここは。

戻る