過去の桐井戸端BBS (桐ver.8)
2983 会話処理の行複写の代わりはどの様に? 小川 伸二 1999/10/22-17:00
以下の処理をしたいのですが、私が考えた方法はなんかスマート
でないので、質問というかお知恵を拝借したいです。

仕様:出荷情報.TBL を 現品票.RPT(タックシール形式A4を6分割)
   で出力するのですが、1レコードを複数枚出力したいのです。
   枚数はデータの中の[1箱許容量]と[出荷数]から計算します。
   (例:[1箱許容量]=50で[出荷数]=121 なら3枚)

   現品票には次のように表示させたい。
    1枚目: 入数 50 箱No.1/3
    2枚目: 入数 50 箱No.2/3
    3枚目: 入数 21 箱No.3/3

   つまり、3枚同一の情報ではないのでレポート印刷の繰り返し数の
   パラメータが使えません。


私案:1)出荷情報をワーク.TBLに書き出す。
   2)一出荷情報で必要な枚数分にレコードを増やす。
     ここで増やす方法がお知恵拝借したいところ!!
        元レコードから総箱数を計算してそれになるまで
     案1:行挿入を繰り返す。
     案2:もう一つのワークファイルに書き出してあとで元表に
        読み込む。


会話処理の行複写の代わりはどの様にすればよいのでしょう?
行挿入は項目が多いし項目の追加等でのメンテが大変そうで...

よろしくお願いします。
2984 Re: 悲しげ 1999/10/22-21:08
記事番号2983へのコメント
どもっ、小川さん、
ごりごりの一括処理ですが(^^;)

仮に元表を「小川1.TBL」、作業表を「小川2.TBL」とします。

項目構成は次のような感じ。
[宛先とか]文字列
[出荷数]整数
[1箱許容量]整数
[入数]整数
[箱No分子]整数
[箱No分母]
[箱No]文字列 計算式;#str([箱No分子])+"/"+#str([箱No分母])

--------------- 一括処理 ---------------------
変数宣言 長整数{&i,&j}
表 "小川2.TBL",索引名="宛先とか順"  /*作業表である*/
行削除 *
表整理 余白割合=10
終了 表 編集対象表
表 "小川1.TBL",索引名="宛先とか順"  /*元表である*/
置換 [箱No分母]=#ceil([出荷数]/[1箱許容量])
*ジャンプ 行番号=1
繰り返し(.not #EOF)
 &i=1,&j=[箱No分母]
 行マーク定義 1
 繰り返し
  条件(&i>&j) 繰り返し中止
  行訂正 [箱No分子]=&i\
   ,[入数]=#cond(&i<&j,[1箱許容量],1,[出荷数]-(&i-1)*[1箱許容量])
  絞り込み 行数=1
  書き出し 表,"小川2.TBL",追加,終了状態=&実行リターン,*
  絞り込み解除 1
  ジャンプ 行マーク=1
  &i=&i+1
 繰り返し終了
 行マーク解除 1
 ジャンプ 行番号=+1
繰り返し終了
*表 "小川2.TBL",索引名="宛先とか順"
*表形式編集
-----------------------------------------
*印刷はこの作業表からさせるといんじゃないでしょうか。
2985 ちょっと補足訂正 悲しげ 1999/10/22-21:18
記事番号2984へのコメント
すいません、説明がもれてまして。
作業表の項目構成は元表と(ほとんど)同じものを考えています。

それと絞り込みと解除、ジャンプの位置がちょっと違っているよ
うでした。次のところでいいような・・・・。(^^;)

繰り返し(.not #EOF)
 &i=1,&j=[箱No分母]
 行マーク定義 1
 絞り込み 行数=1
 繰り返し
  条件(&i>&j) 繰り返し中止
  行訂正 [箱No分子]=&i\
   ,[入数]=#cond(&i<&j,[1箱許容量],1,[出荷数]-(&i-1)*[1箱許容量])
  書き出し 表,"小川2.TBL",追加,終了状態=&実行リターン,*
  &i=&i+1
 繰り返し終了
 絞り込み解除 1
 ジャンプ 行マーク=1
 行マーク解除 1
 ジャンプ 行番号=+1
繰り返し終了
2986 行をコピーして増やすには 佐田 守弘 1999/10/22-21:30
記事番号2983へのコメント
小川 伸二 さん
行(レコード)データをコピーして増やすには、次の様な方法があります。
@行退避、行復活コマンドを使う方法
 「行退避」コマンド:処理対象行(表形式ならカーソルがある行)を1行だけバ
ッファメモリに一時記憶します。
 「行復活」コマンド:バッファに記憶してあるレコード値を、処理対象行に上
書きで貼り付けます。行復活でのレコード値の貼り付けは、同じ表でなくても
構いません。別の表の場合、項目の数が同じで、データ型が同じでさえあれば
、項目名が違っても構いません。つまり、
  行退避
  行挿入 (または行追加)
  行復活
の3つのコマンドを行えば、同じ行を追加できます。。

A項目値を変数に代入しておき、行挿入や行追加を行う方法
 コピーしたい行の項目値を、適当な変数に代入しておき、行挿入(または行
追加)コマンドで行を追加します。
 代入 &名前=[名前],&住所=[住所],&電話=[電話],&番号=[番号]
 行挿入 [名前]=&名前,[住所]=&住所,[電話]=&電話,[番号]=&番号+1
この方法は、単に読み取った行をそのままコピーするだけでなく、[番号]の項
目の様に、代入コマンドで読み込んだ値で計算した値を次の行に書き込むとい
った事もできます。

Bワーク表に書き出してから読み込む
 これもありです。この場合も、書き出す方法以外に、行退避、行復活コマン
ドでレコードをコピーする方法が使えます。
 この方法の利点は、超゜C絞り込みを行った時と同じ様に、ワーク表が1組の
データが揃っている利点があります。つまり置換などで1組分の値を設定して
から、元の表に読み込めます。

以上の様にレコードをコピーしたい場合、いくつかの方法がありますが、ご質
問の目的には、Aの方法を使い、印刷用のワークファイルに必要なレコード数
を出力する方法が良いかと思います。

次に示すのは、出荷情報と印刷情報の2つの表を使う方法です。出荷情報は項
目数が多い様ですが、印刷情報にはこのうちの印刷に使う項目だけを持ちます。
一括処理の概略は次の様になります。

 表 出荷情報,表番号=1
 表 印刷情報,表番号=2
 編集表 1
 繰り返し (.not #終端行)
  代入 &1箱許容量=[1箱許容量],&出荷数=[出荷数],・・・(印刷する項目値)
  編集表 2
  繰り返し (&出荷数>0)
   &箱数=#CEIL(&出荷数/&1箱許容量),&箱番号=0
   ケース開始
    ケース (&出荷数>&1箱許容量)
     &入数=&1箱許容量,&出荷数=&出荷数-&入数,&箱番号=&箱番号+1
    ケース その他
     &入数=&出荷数,&出荷数=0,&箱番号=&箱番号+1
   ケース終了
   行追加 [入数]=&入数\
      ,[番号]="箱No."+#全角(文字列(&箱番号))+"/"+#全角(文字列(&
箱数))
  繰り返し終了
 繰り返し終了
2987 訂正>行をコピーして増やすには 佐田 守弘 1999/10/22-21:46
記事番号2986へのコメント
訂正です。最後から2行目に「ジャンプ 行番号=+1」を入れて下さい。
でないと、無限ループになります。

 表 出荷情報,表番号=1
 表 印刷情報,表番号=2
 編集表 1
 繰り返し (.not #終端行)
  代入 &1箱許容量=[1箱許容量],&出荷数=[出荷数],・・・(印刷する項目値)
  編集表 2
  繰り返し (&出荷数>0)
   &箱数=#CEIL(&出荷数/&1箱許容量),&箱番号=0
   ケース開始
    ケース (&出荷数>&1箱許容量)
     &入数=&1箱許容量,&出荷数=&出荷数-&入数,&箱番号=&箱番号+1
    ケース その他
     &入数=&出荷数,&出荷数=0,&箱番号=&箱番号+1
   ケース終了
   行追加 [入数]=&入数\
      ,[番号]="箱No."+#全角(文字列(&箱番号))+"/"+#全角(文字列(&箱数))
  繰り返し終了
  ジャンプ 行番号=+1
 繰り返し終了

佐田守弘(KS-00119)
2999 Re: 小川 伸二 1999/10/25-09:02
記事番号2983へのコメント
悲しげさん、佐田先生、早速の回答有り難うございました。
週末と重なり返事が遅れてすいませんでした。

書き出しで考えた場合、処理対象行の把握が難しいなと考えて
いたのですが、行マークというものがあったのですね、

行複写には行待避、行復活ですか。

本当に色々と勉強になることばかりです。

今回は、一部項目値の計算がある行複写ですし、
元表を変更しないですむ
佐田先生の(2)の方法で行きたいと思います。

ありがとうございました。

戻る