No.61-1 |
宛名ラベルの無駄を排除したい |
回答者 高橋 周助 |
1997年11月 190号 P.23 |
◆ No.61(1997年 09月号)の回答-1 (P-4G PT-351)
-
現在稼動しているプログラムの一部を切り取って、記事用に部分的変更を加えたものです。変更に伴うバグがあったらご容赦ください。また、スーパーピップスを持っていませんので、それ用に変更していません。次の3ヵ所を変更すれば良いかと思います。
-
9行目 G/S;顧客台帳/%X1; → SB; G;顧客台帳/%X1; SB;
-
38〜43行目 印刷設定を適切にしてください。
-
58〜62行目 印刷設定を適切にしてください。
-
基本の考え方: 1レコードずつ読み込んで2レコード分たまったら印刷する。
最後に1レコード分残ったら、それを印刷して終了する。
-
PIPS的特徴がないので、まったく面白味がありません。これなら、PIPSを使う意味がないとお感じでしょう。個々のデータの内容によって、編集の内容を複雑に変えるために作ったものです。
-
バッファ上で編集する方法には、NFコマンドを多用することもできます。データや処理方法によって、最適な方法を工夫してください。
-
Lコマンド1回毎に、印刷設定とその解除をいちいちやっているのが奇異に思われるでしょう。プログラムのはじめに1回設定し、最後に1回解除すれば良いはずです。
印刷設定に限らずこのようなときに、私は、あえて1回毎に繰り返させることをよくやります。理由は2つあります。
-
PIPSは柔軟性が有りすぎて、いつ、どんな原因で止まるかわからないということを大前提として考えます。いつ止まっても設定が元へ戻っている確率を高くしておいたほうが、結局は安全で得だと思っています。
-
プログラムを解読している途中で、Lコマンドにぶつかった時、その直前直後を見れば、どんな設定をしているか、それを戻しているかどうかが、即時にわかります。
所要時間の長短によって課金されるわけでもないし、所要時間が数分延びたところで、たいしたことでは無い場合がほとんどでしょう。プログラムの良否の基準は、昔と違って、安全性と解読のし易さが最大の要件だと考えます。
1<ラベル印刷>
2 /******* A.準備 **********************************************/
3 DISP OPEN,[18,3],"◆ ◆ ◆ 宛名ラベル 印刷中 ◆ ◆ ◆";
4 LET X26=0; /*印刷済みレコード件数*/
5 LET X27=10; /*左余白桁数 */; LET V27=STRING$(32,X27);
6 LET X28=40; /*左右のラベル間隔桁数*/
7 LET V10="左"; /*読込むデータの左右別*/
8 FOR X1=1 TO BINDER("顧客台帳");
9 G/S;顧客台帳/%X1;
10 FOR X2={H} TO {T};
11 IF V10="左" THEN GOTO $左 ELSE GOTO$右;
12 /*** B-1.(分岐先1) 左側ラベル用データ読み込み*****************/
13 $左: CLEAR V11,14;
14 LET V11={X2,@郵便番号 };
15 LET V12={X2,@住所(1) }; IF V12="" THEN CONTINUE;
16 LET V13={X2,@住所(2) };
17 LET V14={X2,@顧客名 }; IF V14="" THEN CONTINUE;
18 LET V14=V14+{X2,@敬称 };
19 LET V10="右"; CONTINUE;
20 /*** B-2(分岐先2)右側ラベル用データ読み込み*****************/
21 $右: CLEAR V21,24;
22 LET V21={X2,@郵便番号 };
23 LET V22={X2,@住所(1) }; IF V22="" THEN CONTINUE;
24 LET V23={X2,@住所(2) };
25 LET V24={X2,@顧客名 }; IF V24="" THEN CONTINUE;
26 LET V24=V24+{X2,@敬称 };
27 /*** C.左右ラベル編集、印刷 ********************************/
28 LET X26=X26+2;
29 DISP CLR,[18,3],"印刷済みラベル枚数: ",X26," 枚";;
30 DISP [5,13],V14,[45,13],V24;
31
32 O;AAA;ESC;
33 LET X11=X28-LEN(V11); LET [L2]=V27+V11+STRING$(32,X11)+V21;
34 LET X12=X28-LEN(V12); LET [L3]=V27+V12+STRING$(32,X12)+V22;
35 LET X13=X28-LEN(V13); LET [L4]=V27+V13+STRING$(32,X13)+V23;
36 LET X14=X28-LEN(V14); LET [L5]=V27+V14+STRING$(32,X14)+V24;
37
38 L;S;7;N;/*頁タイトルなし*/10;N;/*改頁せず*/12;N;/*行番号なし*/;Y;
39 L;E;1;1,10;;Y;/* 印刷対象行 1,10 */
40 L;G;M;
41 L;S;7;Y;/*頁タイトルあり*/10;Y;/*改頁する*/12:N;/*行番号なし*/;Y;
42 L;E;1;;;Y; /* 印刷対象行 全行 */
43 LET V10="左";
44 NEXT;
45 NEXT;
46 /******* D.左ラベル 残った場合の 最終印刷 ********************/
47 IF V10="左" THEN GOTO $終;
48 LET X26=X26+1;
49 DISP CLR,[18,31],"印刷済みラベル枚数 : ",X26," 枚";;
50 DISP [5,13],V14;
51
52 O;AAA;ESC;
53 LET [L2]=V27+V11;
54 LET [L4]=V27+V12;
55 LET [L5]=V27+V13;
56 LET [L7]=V27+V14;
57
58 L;S;7;N;/*頁タイトルなし*/10;N;/*改頁せず*/12;N;/*行番号なし*/;Y;
59 L;E;1;1,10;,Y;/*印刷対象行1,10 */
60 L;G;M;
61 L;S;7;Y;/*頁タイトルあり*/10;Y;/*改頁する*/12;N;/*行番号なし*/;Y;
62 L;E;1;;;Y; /* 印刷対象行全行 */
63 /******* Z.終わり ********************************************/
64 $終: SELECT [20,20],"確認",X5,"終了します";
65 CLOSE; STOP;
|
| |