プログラミング入門 (桐s-2024LT:ツールバー編)


Chapter4:データーの一括更新
  改定版 /更新日:2024年10月3日

プロシージャ:[手続き]、[一般手続き]、[イベントハンドラ]のこと

郵便番号から住所を一括更新(読み込み)します

1 住所録フォームを開いてください。Chapter3 で作った [テストデータ読み込み]ボタンを押して郵便番号のみのサンプルデータを作成してください。

1-1 定義画面にしてコマンドボタンを設定します。
 
※ここでは 既にあるコマンドボタンをコピーして内容を変更したので、元のボタンデザインがそのまま残っています。
1-2 住所録のイベントファイルを開きます(ここでは右クリックメニューを表示してみました)。
 
 
2 ソースコードを作成します
※プログラムを作成する際には、『分けて考える。順番を考える。単純から複雑に、そして単純に。』といったことを念頭に置くとよいかと思います。
2-1 コマンドボタンを押した際に、確認メッセージを表示させます。
 
 
ヒント &WQ = #jis( #hex("22") ) について
 
  &WQ はダブルクォーテーションと読みましょう(by 考案者)
&WQ の値は半角二重引用符 ( " ) となります。

文字列の表示には前後を二重引用符( " )で囲みますが、この例の様に ”-” と二重引用符自体を表示させるには
「郵便番号の " + """-""" +" を一旦取り除いて」
と書かなくてはなりません。よく話題になる 二重引用符( " )は一体いくつ必要かという問題です。
&WQ = #jis( #hex("22") はこの問題の解決策のひとつです。
 
2-1-1
[確認:中止しました] は実際に稼働しているときには不要でしょう。
キャンセルした際には何も表示されずに元に戻る、というのが使用するオペレーターの感覚だと思います。
※ここではメッセージボックスが動作したかどうかのデバッグ用になります。

確認ができたら、ソースを次のように変更します。
   
   
2-2 一般手続き(プロシージャ):prc住所一括更新実行() を作成します。

プロシージャ(手続き)名の接頭辞として使っている "prc" は他の手続きから呼び出される目印です。
"cmd" や "Click" と同じ様に見やすく(読みやすく)するためには有効だと思います(いずれも、ある方の考案です)。
 
   
2-2-1 自動変数は宣言した プロシージャ(手続き)  内でのみで有効です。処理が終わると削除されます。
 
121 手続き定義開始 prc住所一括更新実行()  
122  変数宣言 自動,整数  { &currentTblNum , &lookupTblNum }  
123  変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }  
   

"住所録.tbx" の操作"郵便番号簿.tbx" の操作 、どちらを対象にしているか区別して解説しています。また対象に応じて色分けしています。

2-2-2 住所録の編集対象表の表番号を取得します(操作を実行している自身を確定します)。
 
124 &myTblNum= &hwindow /* &hwindowには現在のフォームの編集対象表番号が収納されています */
   
2-2-3 郵便番号簿を開いて表番号を取得し、2つの編集対象表を操作する準備をします。
 
126 表 "郵便番号簿.tbx" /* 郵便番号簿を開く */
127 &lookupTblNum = #IS表 /* 郵便番号簿の表番号を取得 */
   
2-2-4 操作する表を住所録に切り替えて、絞り込みや整列状態を想定して解除コマンドを記載しておきます。
住所録の最初の行から処理するので、先頭に移動します。
 
129 編集表 &myTblNum /* 使用する表を 住所録 に切り替える */
130 解除 *
131 ジャンプ 行番号 = 先頭 /* 先頭行から順次処理していきます */
   
2-2-5 [繰り返し] で同じ処理を繰り返します。
処理行の郵便番号を取得して "-" が入力されている場合には削除して、検索用のデータに整形します。
 
133 繰り返し ( .not #eof) /* 終端行でなければ。 */
134  &郵便番号 = [郵便番号]  
135  &郵便番号 = #文字置換( &郵便番号 , "-" , "" ) /* 郵便番号簿検索のため "-" を削除します。 */
   
2-2-6 郵便番号簿に切り替えて、検索して結果を変数に取り込みます。
 
137 編集表 &lookupTblNum /* 郵便番号簿に切り替えます */
138 検索 [郵便番号]{ &郵便番号 }  
139 if ( .not #eof)  /* 終端行でなければ。つまり検索値が存在すれば。 */
140  &住所1 = [住所1] , &住所2 = [住所2] + [住所3]  
141 end  
   
2-2-7 住所録に切り替えて住所等を更新する準備をします。郵便番号には "-" を挿入します。
 
143 編集表 &myTblNum /* 住所録の編集対象に戻る */
144 &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 ) /* 郵便番号に "-" を挿入します。 */
   
2-2-8 取得、整形した値で 住所録の [郵便番号]、[都道府県]、[住所] を更新します。
以下は定型書式とお考え下さい。
 
145 変数宣言 自動,長整数{&更新モード}  
146 メソッド呼び出し @フォーム.更新モード取得(&更新モード)  
147 if ( &更新モード = 0 )  
148  行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2  
149 else  
150  項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2  
151 end  
   
2-2-9 以上で1行の処理ができたので、次の行に移動して [繰り返し] の最初に戻ります。
※ 133行 で [繰り返し ( .not #eof)] と記載しているので、"終端行" でなければ同じ処理を繰り返します。
 
153  ジャンプ 行番号 = 次行  
154 繰り返し終了  
   
2-2-10 郵便番号簿を閉じて
住所録の先頭行に移動します。
 
156  終了 表 &lookupTblNum /* 郵便番号簿を閉じる */
157
158
 編集表 &myTblNum
 ジャンプ 行番号 = 先頭
 
158 手続き定義終了  
   
 
3 多重化した表を使った処理を作成します。
3-1 コマンドボタンを設定します。
 
3-2 プロシージャを作成します。
プロシージャ "cmd住所一括更新Click()" と "prc住所一括更新実行()" を 適当なところに複写して名前を変更します。
 
cmd住所一括更新Click() cmd住所多重化更新Click()
prc住所一括更新実行() prc住所多重化更新実行()
   
3-3 cmd住所多重化更新Click() は赤色の下線部分を変更して作成します。
   
3-4 "手続き定義開始 prc住所多重化更新実行()" は次の部分を変更して作成します。
赤色の下線部分が変更もしくは追加です
 
 
  多重化した表は、基本状態で開かれます。
元の表が "並べ替え" や "絞り込み" 状態でも、多重化した表では解除されています。

いかがでしょうか、動作に問題はないでしょうか。
ちなみに筆者のPCで 485件 のデータを更新したところ
[住所一括更新] が 6秒程度、[住所多重化更新](多重化した場合)はその半分程度の時間で処理できました。


Chapter 4 終わり、お疲れ様でした (^_^)ノ
  Special Thanks ONnojiさん、AKさん

参考) ※行番号は参考としてください
  サンプルコードをコピペしてうまく動作しないときには、一旦削除して手入力してください。

 
97  手続き定義開始 cmd住所一括更新Click()
98   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
99   変数宣言 自動, 文字列 { &title, &msg }
100   変数宣言 自動, 数値 { &ans }
101   &title = "cmd住所一括更新Click()"
102   &msg = &msg +   "  << 住所を更新します >>"
103   &msg = &msg + "\n"
104   &msg = &msg + "\n郵便番号から"
105   &msg = &msg + "\n都道府県と住所1を更新します。"
106   &msg = &msg + "\n"
107   &msg = &msg + "\n郵便番号の " + &WQ + "-" + &WQ +" を一旦取り除いて"
108   &msg = &msg + "\n郵便番号簿の住所で更新します。"
109   &msg = &msg + "\nその後新たに " + &WQ + "-" + &WQ +" を付け直します。"
110   &msg = &msg + "\n"
111   &msg = &msg + "\n実行しますか?"
112   メッセージボックス &title, &msg,ボタン指定 = 2,アイコン = ?,制御文字展開 = する,&ans
113    * アイコン = i|?|!|E| 、ボタン指定 = 1:[OK]のみ|2:[OK]と[キャンセル]
114   
115   if ( &ans = 1 )
116    手続き実行 prc住所一括更新実行()
117    確認 "完了しました"
118   end
119  手続き定義終了
120   
121  手続き定義開始 prc住所一括更新実行()
122   変数宣言 自動,整数  { &myTblNum , &lookupTblNum }
123   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
124   &myTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
125   
126   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
127   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
128   
129   編集表 &myTblNum      /* 使用する表を 住所録 に切り替える */
130   解除 *
131   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
132   
133   繰り返し ( .not #eof)     /* 終端行でなければ。 */
134    &郵便番号 = [郵便番号]
135    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
136   
137    編集表 &lookupTblNum                  /* 郵便番号簿に切り替えます */
138    検索 [郵便番号]{ &郵便番号 }
139    if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
140     &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
141    end  
142   
143    編集表 &myTblNum     /* 住所録の編集対象に戻る */
144    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
145    変数宣言 自動,長整数{&更新モード}
146    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
147    if ( &更新モード = 0 )
148     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
149    else
150     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
151    end
152   
153    ジャンプ 行番号 = 次行
154   繰り返し終了  
155  
156   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
157   編集表 &myTblNum        /* 住所録の編集対象に戻る */
158   ジャンプ 行番号 = 先頭
159  手続き定義終了
160   
161  手続き定義開始 cmd住所多重化更新Click()
162   変数宣言 自動,文字列{ &WQ = #jis( #hex("22") ) }
163   変数宣言 自動, 文字列 { &title, &msg }
164   変数宣言 自動, 数値 { &ans }
165   &title = "cmd住所多重化更新Click()"
166   &msg = &msg +   "  << 住所を更新します >>"
167   &msg = &msg + "\n"
168   &msg = &msg + "\n郵便番号から"
169   &msg = &msg + "\n都道府県と住所1を更新します。"
170   &msg = &msg + "\n"
171   &msg = &msg + "\n郵便番号の " + &WQ + "-" + &WQ +" を一旦取り除いて"
172   &msg = &msg + "\n郵便番号簿の住所で更新します。"
173   &msg = &msg + "\nその後新たに " + &WQ + "-" + &WQ +" を付け直します。"
174   &msg = &msg + "\n"
175   &msg = &msg + "\n実行しますか?"
176   メッセージボックス &title, &msg,ボタン指定 = 2,アイコン = ?,制御文字展開 = する,&ans
177    * アイコン = i|?|!|E| 、ボタン指定 = 1:[OK]のみ|2:[OK]と[キャンセル]
178   
179   if ( &ans = 1 )
180    手続き実行 prc住所多重化更新実行()
181    確認 "完了しました"
182   end
183  手続き定義終了
184   
185  手続き定義開始 prc住所多重化更新実行()
186   変数宣言 自動,整数  { &multiTblNum , &lookupTblNum }
187   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }
188  
189   編集表 &hwindow          /* 多重化する前には、基になる編集対象表を指定しておきます。 */
190   多重化 
191   &multiTblNum = #is表       /* 多重化した住所録の表番号を取得 */
192   
193   表 "郵便番号簿.tbx"       /* 郵便番号簿を開く */
194   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */
195   
196   編集表 &multiTblNum       /* 使用する表を 多重化した住所録 に切り替える */
197   解除 *
198   ジャンプ 行番号 = 先頭      /* 先頭行から順次処理していきます */
199   
200   繰り返し ( .not #eof)     /* 終端行でなければ。 */
201    &郵便番号 = [郵便番号]
202    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */
203   
204    編集表 &lookupTblNum                  /* 郵便番号簿に切り替えます */
205    検索 [郵便番号]{ &郵便番号 }
206    if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
207     &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
208    end  
209   
210    編集表 &multiTblNum     /* 多重化した住所録に戻る */
211    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */
212    変数宣言 自動,長整数{&更新モード}
213    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
214    if ( &更新モード = 0 )
215     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
216    else
217     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
218    end
219   
220    ジャンプ 行番号 = 次行
221   繰り返し終了  
222   
223   終了 表 &lookupTblNum     /* 郵便番号簿を閉じる */
224   終了 表 &multiTblNum     /* 多重化した表を閉じる */
225   編集表 &hwindow         /* 確実にもとの編集対象表に戻しておきます。 */
226   ジャンプ 行番号 = 先頭
227  手続き定義終了