Chapter 5 :  引数は とっても便利


今回は Chapter4で作成した手続きを変更 します。

それでは "住所録" のイベント定義を開いてください。
郵便番号簿の検索部分を変更します。

郵便番号を検索する部分をコピーして新たな "一般手続き" を作成します。次のようにします。

郵便番号検索作成 

次に現在の検索部分を次のように書き換えてください。
"prc住所一括更新実行" と "prc住所多重化更新実行" 手続きの両方の該当部分を書き換えてください。

検索部分を変更

なお "手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )" に記載している変数は
すでに宣言済みですね( 手続き "prc住所多重化更新実行" の場合該当部分は次の通りです)。

変数宣言

 

それでは  "引数" の話です(ある手続きから、別の "一般手続き" を呼び出して利用する際にとても便利になります)。

手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )
  この処理で "一般手続き:prc郵便番号簿検索" を呼び出しますが、ここでは引数を設定し ”prc郵便番号簿検索” に値を渡します。
  使用する引数は任意で決められます。渡す値は "変数" だけでなく "値" そのものも OKです(参照渡しでは "変数" のみ)。
 ルールは 「記載順」、「値を渡すだけか、受け取るか(参照渡し)」、「同じデータ型」、の3つです。 

次が呼び出された "一般手続き:prc郵便番号簿検索" ですが、送られてきた値を設定した引数(変数)に受け入れます。
手続き定義開始 prc郵便番号簿検索( 整数 &TblNum , 文字列 &郵便番号 , 参照 文字列 &住所1 , 参照 文字列 &住所2 )

  引数に記載することで、変数宣言がなされ自動変数が設定され、呼び出した ”手続きの 引数並び順” にその値が代入されます。
  ※新たに宣言した変数に初期値を代入する、ということなので呼び出した手続きの引数と同じ変数名でなくてかまいません。

  また ”参照” と記載された変数では、この "一般手続き" で処理(変更)した値を 呼び出した 元の手続きに”戻(渡)します” 。

引数を使うと "一般手続き" の汎用性が高まります。プログラムが読みやすくなります。などなど、、、です。

今回の引数の関係は次のようになります。

引数の関係

矢印は値の方向を示しています。送る側と受ける側の表記は違ってかまいません。
ここでは最初の引数の名前だけを変えています。 汎用性を考えたりとか分かり易いように考えてください。

 "一般手続き:prc郵便番号簿検索" は、"&TblNum" と "&郵便番号" に受け取った値で住所を検索し
結果を "&住所1" と "&住所2" へ返します。


次はメッセージの部分も変更します。
メッセージを表示するための新たな手続きを作成します(該当部分をコピーして作成しましょう)。

"手続き定義開始 prc実行確認( 文字列 &title , 参照 数値 &ans )" ← 引数を設定した手続きです。

prc実行確認 

次に現在のメッセージ表示部分を変更します。
"手続き定義開始 cmd住所一括更新Click()" と "手続き定義開始 cmd住所多重化更新Click()" の両方を書き換えてください。 

メッセージ表示部分変更 

ここでの引数の関係は次のようになっています。

実行確認引数関係 

値を更新するために "参照渡し" とする変数ですが、 実は先ず現在の値を 呼び出す "一般手続き" に渡しています。
※引数の値はまず  "一般手続き:prc実行確認" に渡ります。
 そして参照渡しの場合は値が変更されて戻ってくることができるということです。

その際の問題点として、元の手続きから "一般手続き" を呼び出した際に(上記の例では)
何らかの原因で 元の手続きで "&ans = 1" となっていた場合、まずその値が呼び出した "一般手続き" に渡ってしまいます。
そして "一般手続き" 側で 判定処理がない時 ( 本来 "&ans = 0" )でも 元の手続きに "&ans = 1" と戻してしまいます。
そこで 呼び出された "一般手続き" 側で最初に  "&ans = 0" と初期化しておくことで安定した結果を返すことができます。

引数の関係を正しく表示すると次のようになります
(※ 手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 ) も同様です)。

参照引き正しい関係 

 

同様に "prc郵便番号簿検索手続き " も次のように訂正しましょう。

手続き実行時初期化 

もしくは

検索時初期化 

もしくは

検索直前に初期化 

それではコマンドボタンを押して、きちんと動作するか確認してください。


"引数" の話いかがでしたか。それでは次にチャレンジしてみてください (ll゚д゚)

2つの手続きを比べると、似てますよね~

手続き比較 

左側の
"解除"コマンドは、多重化した表には必要ないのですがあってもかまいません(もともと解除済みの場合には何もしないコマンドです)。
また 最後の "ジャンプ 行番号 = 先頭 " は、多重化した表の場合は閉じてしまうので不要というだけで困る訳ではありません。

住所録の表番号を収納した変数名が左右で異なりますが、処理は同じです( &currentTblNum , &multiTblNum )。

そこで次のようにすることができます。

prc住所一括更新実行() 

住所多重化更新 

prc住所一括更新処理 

如何でしょうか ε=ε=ε= ┌(;´゚ェ゚)┘


おまけ

住所併合更新

住所併合更新 

 


参考)

1  手続き定義開始 prc実行確認( 文字列 &title , 参照 数値 &ans )
2   &ans = 0                        /* 参照値の初期化 */
3   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
4   変数宣言 自動, 文字列 { &msg }
5   * 変数宣言 自動, 文字列 { &title, &msg }        /* &title は、引数ですでに宣言済みです */
6   * 変数宣言 自動, 数値 { &ans }             /* 引数ですでに宣言済みです */
7   * &title = ""                      /* &title の値は引数で受け取り済みです */
8   &msg = &msg +   "  << 住所を更新します >>"
9   &msg = &msg + "\n"
10   &msg = &msg + "\n郵便番号から"
11   &msg = &msg + "\n都道府県と住所1を更新します。"
12   &msg = &msg + "\n"
13   &msg = &msg + "\n郵便番号の " + &WQ + "-" + &WQ +" を一旦取り除いて"
14   &msg = &msg + "\n郵便番号簿の住所で更新します。"
15   &msg = &msg + "\nその後新たに " + &WQ + "-" + &WQ +" を付け直します。"
16   &msg = &msg + "\n"
17   &msg = &msg + "\n実行しますか?"
18   メッセージボックス &title, &msg,ボタン指定 = 2,アイコン = ?,制御文字展開 = する,&ans
19    * アイコン = i|?|!|E| 、ボタン指定 = 1:[OK]のみ|2:[OK]と[キャンセル]
20  手続き定義終了
21  
22  手続き定義開始 cmd住所一括更新Click()
23   変数宣言 自動, 数値 { &ans }
24  
25   手続き実行 prc実行確認( "cmd住所一括更新Click()" , &ans )
26   if ( &ans = 1 )
27    手続き実行 prc住所一括更新実行()
28    確認 "完了しました"
29   end
30  手続き定義終了
31  
32  手続き定義開始 prc住所一括更新実行()
33   変数宣言 自動,整数  { &currentTblNum }
34   &currentTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
35   手続き実行 prc住所一括更新処理( &currentTblNum )
36   ジャンプ 行番号 = 先頭
37  手続き定義終了
38  
39  手続き定義開始 cmd住所多重化更新Click()
40   変数宣言 自動, 数値 { &ans }
41  
42   手続き実行 prc実行確認( "cmd住所多重化更新Click()" , &ans )
43   if ( &ans = 1 )
44    手続き実行 prc住所多重化更新()
45    確認 "完了しました"
46   end
47  手続き定義終了
48  
49  手続き定義開始 prc住所多重化更新()
50   変数宣言 自動,整数  { &currentTblNum , &multiTblNum }
51   &currentTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
52   多重化 
53   &multiTblNum = #is表       /* 多重化した住所録の表番号を取得 */
54   手続き実行 prc住所一括更新処理( &multiTblNum )
55   終了 表 &multiTblNum     /* 多重化した表を閉じる */
56   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
57  手続き定義終了
58  
59  手続き定義開始 prc住所一括更新処理( 整数 &currentTblNum )
60   変数宣言 自動,整数  { &lookupTblNum }
61   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
62  
63   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
64   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
65  
66   編集表 &currentTblNum      /* 使用する表を 住所録 に切り替える */
67   解除 *
68   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
69  
70   繰り返し ( .not #eof)     /* 終端行でなければ。 */
71    &郵便番号 = [郵便番号]
72    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
73  
74    手続き実行 prc郵便番号簿検索( &lookupTblNum , &郵便番号 , &住所1 , &住所2 )
75  
76    編集表 &currentTblNum     /* 住所録の編集対象に戻る */
77    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
78    変数宣言 自動,長整数{&更新モード}
79    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
80    if ( &更新モード = 0 )
81     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
82    else
83     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
84    end
85  
86    ジャンプ 行番号 = 次行
87   繰り返し終了  
88  
89   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
90  手続き定義終了
91  
92  手続き定義開始 prc郵便番号簿検索( 整数 &TblNum , 文字列 &郵便番号 , 参照 文字列 &住所1 , 参照 文字列 &住所2 )
93   &住所1 = #u , &住所2 = #u              /* 初期化します。 */
94   編集表 &TblNum                     /* 郵便番号簿に切り替えます */
95   検索 [郵便番号]{ &郵便番号 }
96   * &住所1 = #u , &住所2 = #u               /* 検索する前に変数の値を初期化します。 */
97   if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
98    &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
99   * else
100   *  &住所1 = #u , &住所2 = #u              /* 検索値がない場合、変数の値を初期化します。 */
101   end  
102  手続き定義終了
103  
104  
105  手続き定義開始 cmd住所併合更新Click()
106   変数宣言 自動, 数値 { &ans }
107  
108   手続き実行 prc実行確認( "cmd住所併合更新Click()" , &ans )
109   if ( &ans = 1 )
110    解除 *
111    置換 [郵便番号] = #文字置換( [郵便番号] , "-" , "" )
112    併合 "郵便番号簿.tbx" , 置換 , {[郵便番号]照合[郵便番号],[都道府県]複写[住所1],[住所1]複写[住所2],[住所1]連結[住所3]}
113    置換 [郵便番号] = #部分列( [郵便番号] , 1 , 3 ) + "-" + #右側文字列( [郵便番号] ,4 )
114    確認 "完了しました"
115   end
116  手続き定義終了