過去の桐井戸端BBS (桐ver.8)
15162 血液センターの結果表のようなレポートを作りたい macoto 2002/02/19-10:14
献血をした際に血液センターから送付される結果表のようなレポートを
作成したいと考えています。
具体的には、「個人ID」をもとに、今回データと
前回データを並列してレポート印刷したいと思います。
前述の血液センターの結果表(ハガキ)をイメージしていただければ結構です。
単票、伝票形式といろいろとトライしたのですが、なかなか上手く行きません。
このレポートの作り方のポイントなどを教えていただきたいのですが。
なお、Ver8 SP6を使用しています。宜しくお願いいたします。
15164 Re:血液センターの結果表のようなレポート macoto 2002/02/19-16:22
記事番号15162へのコメント
前回投稿した質問内容はあまりにも漠然としていました。
具体例を提示しますので、教えていただきたいと思います。

テーブルに下記上段のような形の複数のレコードがあります。
それを[ ID ]で絞り込んで、下段のようなレポートを作成したいと考えています。
つまり、時系列的に最新のレコードを左に、前回のレコードを右に併記したいのです。

*********************************************************
【テーブル】

date    ID  氏名  項目1 項目2 項目3 項目4 項目5

H14-01-01 0001 ●●●  10  15   11  20   22
H14-02-03 0001 ●●●  11  18   14  18   25

**********************************************************
      
          ↓↓

**********************************************************
【レポート】

ID:0001  氏名:●●●

date:H14-01-01       date:H14-02-03
項目1:10           項目1:11  
項目2:15           項目2:18           
項目3:11           項目3:14
項目4:20           項目4:18
項目5:22           項目5:25
**********************************************************




15165 Re:血液センターの結果表のようなレポート natsu 2002/02/19-18:17
記事番号15164へのコメント
元の表が、検査日・ID・検査項目・検査値で正規化されているテーブルであれば
処理は簡単ですが、この場合はがき大のレポートで、オブジェクトもそれ程多くなさそうですから、
以下の一括処理にある変数をテキストオブジェクトとしてレポートを作成してみてください

3回以上検査がある場合、以前のデータは印字しないようになっています
また、IDは長整数で定義した方が後々楽です
それから、前回検査がない場合は***と印字されます


変数宣言 固有,文字列{&項目1[2],&項目2[2],&項目3[2],&項目4[2],&項目5[2]}
変数宣言 固有,文字列{&氏名,&検査無="***"}
変数宣言 固有,日時{&date,&date1,&date2}
変数宣言 固有,整数{&カウンタ}
変数宣言 固有,長整数{&ID}

表 "test"

並べ替え {[ID]昇順,[date]降順}
&カウンタ=1
繰り返し
代入 &ID=[ID],&date=[date],&氏名=[氏名]
ケース開始
 ケース (&カウンタ=1)    /*項目値を代入 今回分*/
    代入 &項目1[1]=[項目1],&項目2[1]=[項目2],&項目3[1]=[項目
3],&項目4[1]=[項目4],&項目5[1]=[項目5]
    &date1=&date
 ケース (&カウンタ=2)    /*項目値を代入 前回分 さらにレポートを印
刷*/
    代入 &項目1[2]=[項目1],&項目2[2]=[項目2],&項目3[2]=[項目
3],&項目4[2]=[項目4],&項目5[2]=[項目5]
    &date2=&date
    レポート印刷 "test",プレビュー=する
 ケース (&カウンタ>2)    /*2回以前の分は何もしない*/
ケース終了
ジャンプ 行番号=次行
ケース開始
 ケース (#EOF=1)       /*繰り返し中止*/
    繰り返し中止
 ケース (&ID=[ID])      /*&カウンタを1増やす*/
    &カウンタ=&カウンタ+1
 ケース (&ID≠[ID] .and &カウンタ=1)     /*&カウンタを1とする*/
    代入 &項目1[2]=&検査無,&項目2[2]=&検査無,&項目3[2]=&検査無,&
項目4[2]=&検査無,&項目5[2]=&検査無
    &date2=#U
    &カウンタ=1
    レポート印刷 "test",プレビュー=する
 ケース (&ID≠[ID] .and &カウンタ≠1)     /*&カウンタを1とする*/
    &カウンタ=1
ケース終了

繰り返し終了

15166 Re:血液センターの結果表のようなレポート 悲しげ 2002/02/19-19:12
記事番号15164へのコメント
どもっ、macotoさん

>つまり、時系列的に最新のレコードを左に、前回のレコードを右に併記

些細なことですが、例示したものでは、最新のレコードが右で、前回のレコードが左のように見えます。(^^;)
図示が間違っているのか、本文の方が間違っているのか、どちらでしょう?
15167 Re:血液センターの結果表のようなレポート macoto 2002/02/19-19:38
記事番号15166へのコメント
悲しげさん、こんばんは。

>些細なことですが、例示したものでは、最新のレコードが右で、前回のレコ
>ードが左のように見えます。(^^;)
>図示が間違っているのか、本文の方が間違っているのか、どちらでしょう?

あらら。ご指摘のとおりでした。
お恥ずかしいです。
最新のレコードが「左」で、前回のレコードが「右」のようにしたいのです。


15168 有難うございました macoto 2002/02/19-19:50
記事番号15165へのコメント
natsuさん、こんばんは。

素晴らしい処理の方法を教えていただきまして有難うございました。
これは単票にオブジェクトを配置すれば良いのですね。
早速作ってみることにします。
また、質問することが出てきそうですが、宜しくお願いいたします。
15169 Re:血液センターの結果表のようなレポート 【多遊】 2002/02/19-22:17
記事番号15165へのコメント
natsuさんこんばんは。
最初質問を見たとき、また、文字列の転置集計?OR書きだし&読み込みで・・と
思いましたが、「変数に取り込み印刷」はいいですね。
私も利用させていただきます。ありがとうございます。

ところで、内容を拝見していて気づいたことなんですが(試せばわかる程度)
2回目のケース文が
>  ケース (#EOF=1)       /*繰り返し中止*/
>    繰り返し中止
と、なってますが、導入時(前年のデーターがない場合)の最後の人や、
テストケースで1行入れた場合、
> 代入 &項目1[2]=&検査無,&項目2[2]=&検査無,&項目3[2]=&検査無
を、実行せず終了しませんか?
(ただ、そんな気がするだけで実際は試していません。)
15170 Re:血液センターの結果表のようなレポート natsu 2002/02/20-09:57
記事番号15169へのコメント
>導入時(前年のデーターがない場合)の最後の人や、
>テストケースで1行入れた場合、
> 代入 &項目1[2]=&検査無,&項目2[2]=&検査無,&項目3[2]=&検査無
>を、実行せず終了しませんか?

昨日は、ちょっと急いでいて一括処理だけUPしてしまい反省しています
自分で書いた一括も1週間すると何でこんなので動作しているのか解らなくなるので
なるべく注釈は入れようと努力はするのですが...

さて

この処理は、[ID]と[date]で整列させて、1行ずつ処理しています
[カウンタ]というダミー項目( 計算式は#グループ([ID],[date]) )を
あらかじめ作っておけば、もう少し記述がすっきりします

繰り返し処理の中は2つのケースからできておりまして
一つ目のケースは
処理対象行がその人の何回目の検査かを&カウンタで判断させ
&カウンタ1なら、検査値を1回目の配列変数に代入
&カウンタ2なら、検査値を2回目の配列変数に代入して印刷実行
&カウンタが3以上なら何もしない

次のケース処理で何をしているかというと
終端行なら処理終わり
前の行と[ID]が同じならその行の&カウンタを一つ増やして一つ目の
ケース処理をさせます
さて、ここからですが

前の行と[ID]が違う場合の処理ですが(レポートを発行する対象が変わる)
&カウンタ=1であれば、そこで印刷処理をさせます
ジャンプ 行番号=次行で 処理対象行は移りましたが、変数はまだ
変更していませんので、検査データに &検査無 を代入してやります

&カウンタが2以上で、前の行と[ID]が違う場合は、&カウンタを1に
リセットします

というように、2つのケースの中に
・データの代入 ・&カウンタの処理 ・レポート印刷 という3つの
作業を詰め込んでいます

今回に限らず、一括処理は後からのメンテナンスを考えると
作業ごとに段落を分けて作成しないといけませんね

余談ですが...
桐でもHTMLエディタの様に色つきで一括処理を書けるようになるといいのですが...
(ケースや繰り返しのコマンドの時は自動でタブスペースが入るともっといいです)


15172 Re:血液センターの結果表のようなレポート tuji 2002/02/20-11:18
記事番号15164へのコメント
レポートで段組みの設定をするという方法もあります。

戻る