ネットワークでINEXT

     ◇   罍  昭夫  
         ◇ 事例/お薦めプログラムの目次へ
《 DOSマシーンでFORMが使えません ---- 第2弾 》
  1. 使用ソフト     THE PIPS
  2. 使用ハード    サーバー J3100/VX-501
                       クライアント FUTURE32α
                                   J3100PV466/201J
                                   J3100SL-081VW
                                   J3100PV2(PV49933V)
  3. 使用プリンター    PT-352
                      PT-3067
                    キヤノン レーザショット B406E

   前回 THE PIPS No.151 のネットワークの事例の、さらに≪INEXT≫ を使用した場合です。

《前回からの改良点》
1. プログラムのキャビネットに、UNIONを設定しました。
2. プログラムのキャビネットとデータのキャビネットを別々にしました。
USEINF(3)を使用していますので、同じキャビネットに混在していますと、キャビネ ット使用不能になります。
3. IUSE から IEND までの時間を、できるだけ短くしました。

4. USEINF の3(読み書き可能)を使用しました。
X変数=1 ------- キャビネット使用可能
X変数=0 ------- キャビネット使用不能
5. 次のデータを読むために MENU を呼んでいましたが、 MENU画面の入力済みデータをDISP文で消去する方法にしました。
6. SET と USEINF を併用しました。

《今回の追加点》
1. ネットワーク上で INEXT を使用しているので、データのアクセスの度に IEND して います。(最初の現在行になるため)
そのため、INEXT の回数が 0 になるので X1 で INEXT の回数を管理しています。
2. データの登録では、継続と新規のデータを区別するために X3 で管理しています。

《内容》
共済NOを入力しますと、
1. 初めに継続者名簿を検索します。
2. データを修正して登録します。
同じ共済NOならば、INEXT して次の継続者名簿を検索します。
該当がなければメッセージを表示して、マスター名簿から検索して新規のデータを表 示します。
該当すれば1と同様です。
3. 新規のデータを表示します。
4. データを登録します。
5. 共済NOを入力しますと、今度はマスター名簿から検索してきます。

《プログラムの手順》
 <健康診断AUTO  P1>
    データを画面に呼出した後の修正PROGRAMです。(プログラム略)

 <健康診断AUTO  P2>
    P1での<判定><取消><脱退>
    P3での<健康診断登録><健康診断画面消去><継続読み><新規読み> の GOSUB文です。
    (<判定>,<脱退>の部分は省略)

 <健康診断AUTO  P3>

 2行目    SETで設定します。
          他のクライアントと同時に共済NOを入力した時にエラーになりますので。
 5行目    ENV関数を使用します
          CPMとDOSとDOS/Vとでは表示行数が違うためです。
 8行目    X1,X3変数をCLEARします
          X1=INEXTの回数を管理します
          X3 --- 登録する時に
            0  --- 新規登録
            1  --- 継続登録
 9行目   登録するとここに戻ります。
11行目  次検索でERRするとここに戻ります。
13行目  共済NO(V1)をV27に保存します。
14行目  共済NOを入力します。
17行目  前回の共済NO = 今回の共済NO かつ X39=0 ならば 次検索します。
18行目  前回の共済NO = 今回の共済NO かつ X39=0 ならば 質問に戻ります。
19行目  前回の共済NO <>今回の共済NO ならば  継続者名簿を検索します。
20行目  前回の共済NO = 今回の共済NO かつ X39=-1 ならばマスター名簿を検索します。
21行目  X30 ---ERR(0)
        0 ならば 質問へ  それ以外ならば $1へ
22行目  SETを解除します。
24行目  NO1-7のGOSUB文へ飛びます。
          1 --- [次検索] ----- 質問へ
                               ERRならば$新規CHKへ
          2 --- [修正]   ----- NO訂正後、 質問へ
                               そのまま 質問へ
          3 --- [取消]   ----- $コ-ドへ
          4 --- [登録]   ----- $コ-ド1へ
          5 --- [前検索] ----- 質問へ
          6 --- [最初]   ----- 質問へ
          7 --- [最後]   ----- 質問へ
42行目  1-7以外ならば 質問へ
43行目  継続者名簿を検索します。
45行目  ERRチェックします。
46行目  X3=1を入力します。
47行目  継続者名簿になければ$ERR1に飛びます。
48行目  排他処理をしているかチェックします。
        ERRでなければ排他処理します。
49行目  排他処理していなければ、GOSUB<継続読み>に飛びます。
50行目  排他処理していれば、GOSUB<更新中>に飛びます。
51行目  質問へ戻ります。
52行目  メッセージを出し$1へ
55行目  X39=-1を入力します。
        $1へ戻った時に、共済NOを前回と同じ場合には20行目の条件となりマスター名簿
        を検索します。
57行目  マスター名簿を検索します。
62行目  ERRチェックします。
63行目  X39=-1を入力します。
        $1へ戻った時に、共済NOが前回と同じ場合には20行目の条件となりマスター名簿
       を検索します。
64行目  X3=0を入力します。
65行目  ERR=0ならば、GOSUB<新規読み>に飛びます。
66行目  質問へ戻ります。
67行目  メッセージを出し$1へ
69行目  X39=-1を入力します。
        $1へ戻った時に、共済NOが前回と同じ場合には20行目の条件となりマスター名簿
       を検索します。
71行目  継続者名簿に登録します。
73行目  初めに共済NOを入力した時は、継続者名簿を検索しますので、X3=1が46行目で入
        ります。$一人目に飛びます。
74行目  同じ共済NOを2回続けて入力しますと、いったん、52行目の$ERR1へ飛び、その後
        57行目の$新規CHKへ飛びX3=0が64行目で入ります。
        そして、77行目の$新加入へ飛んでIAPPENDします。
75行目  2件目以降を継続者名簿を検索した時は、X1=1以上が入りますので、その回数だけ
        INEXTします。そして、78行目の$一人目へ飛びます。
78行目  <健康診断登録>へGOSUBします。
79行目  <健康診断画面消去>へGOSUBします。
80行目  X3=0 にして初期化します。
81行目  質問へ戻ります。

《サブルーチンの説明》
 <最後>     全件数を表示させます。

88行目  次のデータがなければ、$件数表示へ飛びます。
89行目  次のINEXTをします。
92行目  全件数を表示します。
93行目  INEXTのX1が1つプラスしていますので 1 をマイナスします。
96行目  最後のデータを表示します。


 <最初>   最初のデータを表示します。

108行目  初めに実行しますと、INEXTしていませんので0回ですので、
         $最初読みへ飛びます。
110行目  すでにINEXTをしていますと、X1に数字が入っています。
111行目  最初のデータを表示する前に排他処理している#記号を消去しますので、前のデ
         ータを表示させる処理 <最初> <前検索> では、INEXTしてからIWRITEで#記号を
         消去しています。
115行目  1件目のデータを表示しますので、INEXTの回数を0にします。
<健康診断登録>
$登録:DISP [01,21],SP80;
      DISP [16,21],COLOR(Y),"               登 録 中               ",COLOR(W);
LET X40=10;
CLEAR V2,26;

 LET V3=[4,@入力日];LET V4=[4,@入力者];
 LET V5=[4,@シNO];  LET V6=[4,@支部];  LET V7=[4,@班];
 LET V8=[4,@TEL1]; LET V9=[4,@氏名];  LET V10=[4,@ヨミガナ];
 LET V11=[4,@ク];   LET V12=[4,@区];   LET V13=[4,@ホ];
 LET V14=[4,@保険];LET V15=[4,@J];    LET V16=[4,@受診];
 LET V17=[4,@シ];   LET V18=[4,@種別]; LET V19=[4,@S];
 LET V20=[4,@性];  LET V21=[4,@生年]; LET V22=[4,@記号];
 LET V23=[4,@国保];LET V24=[4,@カ];    LET V25=[4,@会場];

 IWRITE V30,@入力日 =V3,@入力者 =V4,@シNO =V5,@支部 =V6,@班 =V7;
 IWRITE V30,@TEL1 =V8,@氏名 =V9,@ヨミガナ =V10,@ク =V11,@区 =V12,@ホ =V13;
 IWRITE V30,@保険 =V14,@J =V15,@受診 =V16,@シ =V17,@種別 =V18,@S =V19;
 IWRITE V30,@性 =V20,@生年 =V21,@記号 =V22,@国保 =V23,@カ =V24,@会場 =V25;
CLEAR V2,25;
 LET V2=[4,@月];  LET V3=[4,@日];    LET V4=[4,@備考];
 LET V5=[4,@PC計];LET V6=[4,@納入額];LET V7=[4,@差額];
 IWRITE V30,@月 =V2,@日 =V3,@備考 =V4,@PC計 =V5,@納入額 =V6,@差額 =V7,@# ="";
DISP [01,21],SP80;
RETURN;

<健康診断画面消去>
DISP [16,04],SP6; DISP [31,04],SP6;DISP [44,04],SP4;
DISP [60,04],SP2; DISP [63,04],SP4; DISP [68,04],SP2;
DISP [03,08],SP1; DISP [05,08],SP6; DISP [13,08],SP16;
DISP [30,08],SP16;DISP [47,08],SP1; DISP [49,08],SP2;
DISP [52,08],SP1; DISP [54,08],SP4; DISP [64,08],SP6;
DISP [03,12],SP1; DISP [05,12],SP6; DISP [14,12],SP1;
DISP [16,12],SP6; DISP [24,12],SP7; DISP [33,12],SP5;
DISP [39,12],SP1; DISP [41,12],SP22;DISP [64,12],SP2;DISP [68,12],SP2;
DISP [06,16],SP6; DISP [16,16],SP6; DISP [25,16],SP6;
DISP [32,16],SP20;
RETURN;

<取消>
IF X3=0 THEN RETURN; GOSUB A/DATA:USEINFCHK; IUSE V30;ISEARCH V30,V1; IF X1=0 THEN GOTO $一人目; FOR X2=1 TO X1;IWRITE V30,@# ="";INEXT V30;NEXT; $一人目:IWRITE V30,@# ="";IEND V30; LET X40=100;LET X39=-1;RETURN; <継続読み> CLEAR V2,22/24,26;IWRITE V30,@# ="#"; IREAD V30,V4=@入力者 ,V5=@シNO ,V6=@支部 ,V7=@班 ; IREAD V30,V9=@氏名 ,V10=@ヨミガナ ,V11=@ク ,V12=@区 ,V13=@ホ ; IREAD V30,V14=@保険 ,V15=@J ,V16=@受診 ,V17=@シ ,V18=@種別 ,V19=@S ; IREAD V30,V20=@性 ,V21=@生年 ,V22=@記号 ,V26=@国保 ,V24=@カ ,V25=@会場 ; LET [4,@NO]=V2;LET [4,@入力者]=V4; LET [4,@シNO]=V5;LET [4,@支部]=V6; LET [4,@班]=V7; LET [4,@氏名]=V9; LET [4,@ヨミガナ]=V10; LET [4,@ク]=V11; LET [4,@区]=V12; LET [4,@ホ]=V13; LET [4,@保険]=V14;LET [4,@J]=V15; LET [4,@受診]=V16; LET [4,@シ]=V17; LET [4,@種別]=V18; LET [4,@S]=V19; LET [4,@性]=V20; LET [4,@生年]=V21; LET [4,@記号]=V22; LET [4,@国保]=V26;LET [4,@カ]=V24; LET [4,@会場]=V25; DISP [05,04],V2, U(%(STRING$(60,04))); DISP [31,04],V4, U(%(STRING$(60,06)));DISP [60,04],V5, U(%(STRING$(60,02))); DISP [63,04],V6, U(%(STRING$(60,04)));DISP [68,04],V7, U(%(STRING$(60,02))); DISP [13,08],V9, U(%(STRING$(60,16)));DISP [30,08],V10,U(%(STRING$(60,16))); DISP [52,08],V11,U(%(STRING$(60,01)));DISP [54,08],V12,U(%(STRING$(60,04))); DISP [03,12],V13,U(%(STRING$(60,01)));DISP [05,12],V14,U(%(STRING$(60,06))); DISP [14,12],V15,U(%(STRING$(60,01)));DISP [16,12],V16,U(%(STRING$(60,06))); DISP [03,08],V17,U(%(STRING$(60,01)));DISP [05,08],V18,U(%(STRING$(60,06))); DISP [47,08],V19,U(%(STRING$(60,01)));DISP [49,08],V20,U(%(STRING$(60,02))); DISP [64,08],V21,U(%(STRING$(60,06)));DISP [24,12],V22,U(%(STRING$(60,07))); DISP [33,12],V26,U(%(STRING$(60,05)));DISP [39,12],V24,U(%(STRING$(60,01))); DISP [41,12],V25,U(%(STRING$(60,22))); CLEAR V2,22; IREAD V30,V2=@月 ,V3=@日 ,V4=@備考 ,V5=@PC計 ,V6=@納入額 ,V7=@差額 ; IEND V30; LET [4,@月]=V2; LET [4,@日]=V3; LET [4,@備考]=V4; LET [4,@PC計]=V5;LET [4,@納入額]=V6;LET [4,@差額]=V7; DISP [64,12],V2,U(%(STRING$(60,02)));DISP [68,12],V3,U(%(STRING$(60,02))); DISP [32,16],V4,U(%(STRING$(60,20)));DISP [06,16],V5,U(%(STRING$(60,06))); DISP [16,16],V6,U(%(STRING$(60,06)));DISP [25,16],V7,U(%(STRING$(60,06))); RETURN; <新規読み> DISP [60,04],SP2; DISP [63,04],SP4; DISP [68,04],SP2; DISP [03,08],SP1; DISP [05,08],SP6; DISP [13,08],SP16; DISP [30,08],SP16;DISP [47,08],SP1; DISP [49,08],SP2; DISP [52,08],SP1; DISP [54,08],SP4; DISP [64,08],SP6; DISP [03,12],SP1; DISP [05,12],SP6; DISP [14,12],SP1; DISP [16,12],SP6; DISP [24,12],SP7; DISP [33,12],SP5; DISP [39,12],SP1; DISP [41,12],SP22;DISP [64,12],SP2;DISP [68,12],SP2; DISP [06,16],SP6; DISP [16,16],SP6; DISP [25,16],SP6; DISP [32,16],SP20; CLEAR V2,26; IREAD V29,V5=@シNO ,V6=@支部 ,V7=@班 ,V8=@氏名 ,V9=@ヨミガナ ; IREAD V29,V22=@国保記号 ,V24=@国保 ; IEND V29; LET [4,@シNO]=V5; LET [4,@支部]=V6; LET [4,@班]=V7;LET [4,@氏名]=V8; LET [4,@記号]=V22;LET [4,@国保]=V24;LET [4,@ヨミガナ]=V9; DISP [60,04],V5, U(%(STRING$(60,02)));DISP [63,04],V6, U(%(STRING$(60,04))); DISP [68,04],V7, U(%(STRING$(60,02)));DISP [24,12],V22,U(%(STRING$(60,07))); DISP [13,08],V8, U(%(STRING$(60,16)));DISP [30,08],V9, U(%(STRING$(60,16))); DISP [33,12],V24,U(%(STRING$(60,05))); LET V10="1";LET V11="新規"; LET [4,@ク]=V10; LET [4,@区]=V11; DISP [52,08],V10,U(%(STRING$(60,1))); DISP [54,08],V11,U(%(STRING$(60,4))); RETURN; <KENKO> SET/N;F;;3;1;4;60;;; LET V30="A/NENKO:KENIND"; LET V29="A/MF:MF2IND"; LET V28="A/DATA:SIBUIND";LET X1=0;CLEAR V1/27; DISP OPEN(1,1,80,ENV(6)-3)/N; $始: CLEAR V1; MENU/N/A;G;A/DATA:2;ESC; $コード: CLEAR V1,27;CLEAR X1,3; $コード1:LET Z2=TODAY;LET V26=NUM$(Z2);LET V25=MID$(V26,3,6); DISP [16,04],COLOR(W),V25;G;A/DATA:健康診断ダミー/1;LET [4,@入力日]=V25; $1: DISP [01,22],SP80; DISP [01,21],SP80,[01,21],COLOR(Y),"[ESC]=終了",COLOR(W); LET V27=V1; INPUT [44,04],V1,U(NNNN); IF ERR(0)=55 THEN GOTO $終了; LET [4,@共済]=V1; IF V27=V1 AND X39=0 THEN GOSUB A/DATA:次検索; IF V27=V1 AND X39=0 THEN GOTO $質問; IF V27<>V1 THEN GOTO $継続CHK; IF V27=V1 AND X39=-1 THEN GOTO $新規CHK; IF X30=0 THEN GOTO $質問 ELSE GOTO $1; $終了:SET;F;M;4;0;;;RETURN; $質問:DISP [01,21],SP80;CLEAR V23; DISP [01,22],"次検索[1] 修正[2] 取消[3] 登録[4] 前検索[5] 最初[6] 最後[7]"; INPUT [65,22],V23,COLOR(Y),U(X/AS); LET V23=FORM$(V23,1);LET X38=10; IF V23="1" THEN GOSUB A/DATA:次検索; IF V23="1" AND X39=0 THEN GOTO $質問; IF V23="1" AND X39=-1 THEN GOTO $新規CHK; IF V23="2" THEN GOSUB A/DATA:健康診断修正; IF V23="3" THEN GOSUB A/DATA:健康診断画面消去; IF V23="3" THEN GOSUB A/DATA:取消; IF V23="3" THEN GOTO $コード; IF V23="" THEN GOTO $質問; IF V23="4" THEN GOTO $登録; IF V23="5" THEN GOSUB A/DATA:前検索; IF V23="5" THEN GOTO $質問; IF V23="6" THEN GOSUB A/DATA:最初; IF V23="6" THEN GOTO $質問; IF V23="7" THEN GOSUB A/DATA:最後; IF V23="7" THEN GOTO $質問; IF VAL(V23)<1 OR VAL(V23)>7 THEN GOTO $質問; $継続CHK: CLEAR X1/30;GOSUB A/DATA:NENKOUSEINFCHK;IUSE V30;ISEARCH V30,V1; LET X30=ERR(0); LET X3=1; IF X30<>0 THEN GOTO $ERR1; IREAD V30,V2=@# ; IF V2="" THEN GOSUB A/DATA:継続読み; IF V2="#" THEN GOSUB A/DATA:更新中; GOTO $質問; $ERR1:IEND V30;BELL; DISP [01,22],SP80; DISP [01,22],COLOR(R),"該当する共済NO",V1,"は、ありません"; DISP COLOR(W);SLEEP 5;DISP [01,22],SP80;LET X39=-1; GOTO $1; $新規CHK: CLEAR X30; GOSUB A/DATA:MFUSEINFCHK; IUSE V29; ISEARCH V29,V1; LET X30=ERR(0); LET X39=-1; LET X3=0; IF X30=0 THEN GOSUB A/DATA:新規読み; GOTO $質問; $ERR2:IEND V30;BELL;DISP [01,22],SP80; DISP [01,22],COLOR(R),"該当する共済NO",V1,"は、ありません"; DISP COLOR(W);SLEEP 5;DISP [01,22],SP80;LET X39=-1; GOTO $1; $登録: GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1; IF X1=0 AND X3=1 THEN GOTO $一人目; IF X3=0 THEN GOTO $新加入; FOR X2=1 TO X1;INEXT V30;NEXT; GOTO $一人目; $新加入:IAPPEND V30,@共済 =V1; $一人目:GOSUB A/DATA:健康診断登録;IEND V30; GOSUB A/DATA:健康診断画面消去; LET X3=0; GOTO $コード1; <最後> GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1; LET X1=1; $繰り返し:INEXT V30; IF ERR(0)<>0 THEN GOTO $件数表示; LET X1=X1+1; GOTO $繰り返し; $件数表示:LET X39=-1; DISP [01,19],"全件数は",%X1,"件です";SLEEP 2;DISP [01,19],SP80; LET X1=X1-1; IEND V30; GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1; FOR X11=1 TO X1; IWRITE V30,@# =""; INEXT V30; IF ERR(0)<>0 THEN GOTO $読み; NEXT; $読み:GOSUB A/DATA:継続読み;RETURN; <最初> LET X39=0;GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1; LET X3=1; IF X1=0 THEN GOTO $最初読み; FOR X2=1 TO X1; INEXT V30; IWRITE V30,@# =""; NEXT; IEND V30; $最初読み: LET X1=0;GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1;GOSUB A/DATA:継続読み;RETURN; <前検索> LET X39=0;GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1; LET X3=1; FOR X2=1 TO X1; INEXT V30; IWRITE V30,@# =""; NEXT; IEND V30; LET X1=X1-1; IUSE V30;ISEARCH V30,V1; IF X1=0 THEN GOTO $前候補; FOR X4=1 TO X1; IWRITE V30,@# =""; INEXT V30; NEXT; GOSUB A/DATA:継続読み; RETURN; $前候補:LET X39=-1;GOSUB A/DATA:継続読み;RETURN; <次検索> LET X39=0;GOSUB A/DATA:NENKOUSEINFCHK; IUSE V30;ISEARCH V30,V1;LET X1=X1+1; LET X3=1; FOR X2=1 TO X1; IWRITE V30,@# =""; INEXT V30; IF ERR(0)<>0 THEN GOTO $次候補; NEXT; GOSUB A/DATA:継続読み;RETURN; $次候補:LET X39=-1; IEND V30; DISP [01,21],SP80; DISP [01,21],COLOR(M), "条件を満足するデータは、見つかりません!!"; DISP COLOR(W);BELL;SLEEP 5;DISP [01,21],SP80; RETURN; <更新中> IEND V30; DISP [01,21],SP80; DISP [01,21],COLOR(M), "共済NO ",V1,"は更新中ですので、呼び出せません!!"; DISP COLOR(W);CLEAR V1;BELL;SLEEP 5;DISP [01,21],SP80;RETURN; <MFUSEINFCHK> LET V20="A/MF"; $CC1:LET X37=USEINF(3,V20); IF X37=1 THEN GOTO $CC3 ELSE GOTO $CC2; $CC2:DISP COLOR(Y),[01,22],"キャビネットは使用中"; GOTO $CC1; $CC3:RETURN; <NENKOUSEINFCHK> LET V20="A/NENKO"; $CC1:LET X37=USEINF(3,V20); IF X37=1 THEN GOTO $CC3 ELSE GOTO $CC2; $CC2:DISP COLOR(Y),[01,22],"キャビネットは使用中"; GOTO $CC1; $CC3:RETURN;

このページのTOPへ戻る