Chapter 4 : データーの一括更新


 

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

テストデータ読み込み

再定義で定義画面にしてコマンドボタンを設定します。

住所一括更新ボタン

住所録のイベントファイルを開きます。右クリックメニューのイベント定義から開けます。

右クリックメニュー イベント定義


さてここからソースコードを作成していきますが、
プログラムを作成する際には、『分けて考える。順番を考える。単純から複雑に、そして単純に。』といったことを念頭に置くとよいかと思います。


〇 コマンドボタンを押した際に、確認メッセージを表示させます。

&WQ = #jis( #hex("22") ) について

&WQ はダブルクォーテーションと読みましょう(by 考案者)
&WQ の値は半角二重引用符 ( " ) となります。

文字列の表示には前後を二重引用符( " )で囲みますが、この例の様に ”-” と二重引用符自体を表示させるには
「郵便番号の " + """-""" +" を一旦取り除いて」
と書かなくてはなりません。よく話題になる 二重引用符( " )は一体いくつ必要かという問題です。
&WQ = #jis( #hex("22") はこの問題の解決策のひとつです。

〇 それでは 住所一括更新を作成しましょう。

図のように " 手続き定義開始 prc住所一括更新実行() " を追加します。

なお "確認 中止しました" は、キャンセルした際の表示なので実際に稼働しているときには不要でしょう。
*ここではメッセージボックスが動作したかどうかのデバッグ用に設定したわけです。

prc住所一括更新実行行を追加 

 

〇 新しい手続きを作成します。

手続き名と、ここで使う変数を設定します。
手続き名の接頭辞として使っている "prc" は他の手続きから呼び出される 一般手続き の目印にしています。
"cmd" や "Click" と同じ様に見やすく(読みやすく)するためには有効だと思います(いずれも、ある方の考案です)。

----------

自動変数は宣言した手続き内でのみ有効です。処理が終わると削除されます。

25  手続き定義開始 prc住所一括更新実行()
26   変数宣言 自動,整数  { &currentTblNum , &lookupTblNum }
27   変数宣言 自動,文字列 { &郵便番号 , &住所1 , &住所2 }

----------

自身(住所録)の編集対象表の表番号を取得します。自分自身を確定します。

28   &currentTblNum = &hwindow      /* &hwindowには現在のフォームの編集対象表番号が収納されています */

---------

郵便番号簿を開いて表番号を取得し、2つの編集対象表を操作する準備をします。

30   表 "郵便番号簿.tbx"        /* 郵便番号簿を開く */
31   &lookupTblNum = #IS表       /* 郵便番号簿の表番号を取得 */

----------

操作する表を住所録に切り替えて、絞り込みや整列状態を想定して解除コマンドを記載しておきます。
住所録の最初の行から処理するので、先頭に移動します。

33   編集表 &currentTblNum      /* 使用する表を 住所録 に切り替える */
34   解除 *
35   ジャンプ 行番号 = 先頭       /* 先頭行から順次処理していきます */

----------

"繰り返し" で同じ処理を繰り返します。
入力済みの郵便番号を取得して "-" が入力されている場合には削除して、検索用のデータに整形します。

37   繰り返し ( .not #eof)                /* 終端行でなければ。 */
38    &郵便番号 = [郵便番号]
39    &郵便番号 = #文字置換( &郵便番号 , "-" , "" )      /* 郵便番号簿検索のため "-" を削除します。 */

---------

郵便番号簿に切り替えて、検索して結果を変数に取り込みます。

41    編集表 &lookupTblNum               /* 郵便番号簿に切り替えます */
42    検索 [郵便番号]{ &郵便番号 }
43    if ( .not #eof)                   /* 終端行でなければ。つまり検索値が存在すれば。 */
44     &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
45    end  

----------

住所録に切り替えて住所等を更新する準備をします。郵便番号には "-" を挿入します。

47    編集表 &currentTblNum               /* 住所録の編集対象に戻る */
48    &郵便番号 = #部分列( &郵便番号 , 1 , 3 ) + "-" + #右側文字列( &郵便番号 ,4 )  /* 郵便番号に "-" を挿入します。 */

----------

取得、整形した値で 住所録の [郵便番号]、[都道府県]、[住所] を更新します。
以下の書式は定型書式とお考え下さい。

49    変数宣言 自動,長整数{&更新モード}
50    メソッド呼び出し @フォーム.更新モード取得(&更新モード)
51    if ( &更新モード = 0 )
52     行訂正 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
53    else
54     項目値代入 [郵便番号] = &郵便番号 , [都道府県] = &住所1 , [住所1] = &住所2
55    end

----------

以上で1行の処理ができたので、次の行に移動して "繰り返し" の最初に戻ります。
 * "繰り返し ( .not #eof)" と記載されているので、終端行 でなければ同じ処理を繰り返します。

57    ジャンプ 行番号 = 次行
58   繰り返し終了  

----------

郵便番号簿を閉じて
残っている(開いている)住所録の先頭行に移動します。

60   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
61   ジャンプ 行番号 = 先頭
62  手続き定義終了

----------

いかがでしょうか。2つの表を切り替えながらの処理ですが順序良く見ていけば大したことはないかと思います。 

住所録一括更新手続き 

コマンドボタンを押して問題なく動作するか確かめてください。


〇 次に多重化した表を使った処理を作成します。

コマンドボタンを設定します。

住所多重化更新コマンドボタン

 

イベント定義を開いて、

"cmd住所一括更新Click()" と "prc住所一括更新実行()" の手続き 全行を 適当なところに複写して

名前を "手続き定義開始 cmd住所多重化更新Click()" と "手続き定義開始 prc住所多重化更新実行()" に変更します。

・ "cmd住所多重化更新Click" は次の部分を変更します。

・ "手続き定義開始 prc住所多重化更新()" は次のように変更してください。

一括更新と多重化更新       

 

いかがでしょうか、動作は問題ないでしょうか。

ちなみに筆者のPCで 485件 のデータを更新したところ
住所一括更新コマンドボタンを押して実行した場合 7~8秒程度、多重化した場合ではその半分以下の時間で処理できました。

重要)多重化した表は、基本状態で開かれます。
元の表が 並べ替え られていたり 絞り込まれ ていても、裏では解除されているということです。
*試しに住所録を適当な行数絞り込んで、"住所多重化更新ボタン" を押してみてください。

 


参考)

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