Chapter2 : データーを検索して自動入力させましょう。


今回は郵便番号の入力で郵便番号簿から住所を検索して自動入力させます。
*郵便番号簿とリンクするのではありません(表引き ではありません)。

確認事項:
フォームを定義画面で開いて 書式 → 定義画面の設定 → 詳細プロパティを使用する にチェックを入れておいてください。
※一度設定すればOKです(桐自体の設定で、フォームごとの設定ではありません)。

詳細プロパティ 


"住所録.WFX" を再定義で開いてください。

項目名:郵便番号下の明細部に配置されているテキストオブジェクトをダブルクリックして、オブジェクトの属性 を表示します。

続いて、イベントタブを表示して イベント:入力前 をダブルクリックします。
※イベントファイルがない場合、ファイル名入力画面が表示されるのでここでは "住所録" と入力します(保存場所は表とフォームと同じフォルダを指定してください)。

入力前イベント設定 

入力前イベント

同様に、入力後、編集開始、ソース値更新もダブルクリックして入力枠を設定します。

イベント設定一覧

イベントファイルが次のように準備できました。

イベントファイル、イベント一覧

フォーム画面では次のようになります。 "t郵便番号" オブジェクトの属性 → イベント タブ
"入力前"、"入力後"、"編集開始"、"ソース値更新" にチェックが入っていることを確認してください(チェックが入ってなかったら、シングルクリック)。

イベント設定一覧

 


準備ができたので、次はプログラムコードを入力していきましょう。コメント部分は入力しなくても構いません。

頑張って入力してください。

名札

3   オブジェクト操作 @フォーム.編集対象表 = #一括パス名 + "住所録.tbx"  /* 編集対象表は、メイン処理でのみ変更できます */

編集対象表 をきちんと確定しておきましょう。

ここでは 局所変数を宣言しています。宣言できる変数には、共通、固有、局所そして自動変数があります。
イベント処理では局所変数を原則としましょう。
フォームが独立して動けるので変数を自分だけのものとしておくことがトラブル回避になります。

----------

t郵便番号::入力前

"入力前"イベントはテキストボックスで編集するデータの初期値を設定するために使います。
"入力前"イベントはエディタへ侵入する直前に発生します。つまりエディタの外部で発生するイベントです。

&編集文字列 に値が代入されているので、名札メインで設定した局所変数 "&m入力前値" に入力されていた値を保存しておきます。

---------

t郵便番号::入力後

"入力後"イベントは入力されたデータを整形するために使います。
"入力後"イベントはエディタから脱出する直前に発生します。つまりエディタの内部で発生するイベントです。

値を入力した際に全角だったり余計な空白があることがあるので、郵便番号としてのデータとして整形しています。

  * ここまでの処理で \
   &m入力前値:元々入力されていた値。 \
   &m入力後値:半角にして、空白を取り除いた値。 \
   &m郵便番号:"-" を除いた値。\
   &編集文字列(このイベント処理の引数):"-" を追加した値、*#文字数( &m郵便番号 ) = 7 の場合。 \
   となります。

----------

t郵便番号::編集開始

入力時に値をすべて選択済みの状態にします。 "編集選択位置設定" についてはイベントリファレンスをご覧になってください。
※ また &this も便利です。

----------

ソース値更新

 

"ソース値更新"イベントは何かを実行するために使います。
"ソース値更新"イベントはエディタから脱出した直後に発生します。つまりエディタの外部で発生するイベントです。

ここでは、今回入力した値が入力済みの値と同じだった場合と、入力している値を削除した場合ではないときに
住所検索を実行するとしています。
またその処理は別に準備している ”一般手続き” で実行します。

都道府県と住所1を入力させたら、次の入力のために(住所2は手入力になりますね)、フォーカスを[住所2]に移動します。

----------

prc住所検索 

実際に入力された郵便番号( "-" は除いている)を使って、郵便番号簿から住所を取得して自分(住所録)に値を入力する処理です。

自分自身の表と検索してくる表は、桐が自動的に割り当てる ”表番号”を取得して区別します。
表番号は桐が自動的に 1~40までを割り当てます。

表番号で処理する表を確定できるので、難しく考えず、いまどの表を処理しているかを念頭に置いて ”表” を切り替えていきます。

----------

53  手続き定義開始 prc住所検索()

接頭辞に prc と付けていますが、これは ” 他から呼び出される 一般手続き ” と明確にわかるようにです。
コマンドボタンを押したときの処理には cmd と付けておけば、コマンドボタンを押した際の処理、
そしてその処理の中から呼び出すのが prcで始まる手続き。といった具合に整理できます。
※prcで始まる手続き は ひとつの機能 にするように心がけましょう。汎用性につながりプログラムの使いまわしができるようになっていきます。まあ、先々の話です。

----------

54   変数宣言 自動,整数  { &currentTblNum , &lookupTblNum }
55   変数宣言 自動,文字列 { &住所1 , &住所2 }

ここでは 自動変数を使います。ここでのイベント処理が始まるときに宣言して、処理が終わればなくなってしまう使い捨て変数とお考え下さい。

----------

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

”住所録.TBX”の表番号を取得しています。

----------

58   表 "郵便番号簿.tbx"
59   &lookupTblNum = #IS表

”郵便番号簿.tbx”を開いて(フォーム 郵便番号簿.WFX は不要なので開きません)、表番号を取得しています。

----------

61   検索 [郵便番号] { &m郵便番号 }
62   if ( .not #eof)        /* 終端行でなければ。つまり検索値が存在すれば。 */
63    &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
64   end  
65  
66   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */

検索コマンドは特別な指定をしていなければ表の最初から検索を始めます。
指定されたデータが存在しない場合、終端行に移動するので、終端行でなければ検索値と一致するものがあったということで
その部分の所定項目からデーターを取得して、変数に代入します。

検索が終われば、”郵便番号簿.tbx” を閉じます。

----------

68   編集表 &currentTblNum     /* 住所録の編集対象に戻る */

処理対象とする”住所録.TBX”をきちんと指定して、郵便番号簿から取得した値を所定の項目に入力させます。

次の構文はフォームの更新モード(表示か編集)を調べて、それに応じて必要なコマンドを使用するようにしています。
一種の定型文だとお考え下さい。

70   変数宣言 自動,長整数{&更新モード}
71   メソッド呼び出し @フォーム.更新モード取得(&更新モード)
72   if ( &更新モード = 0 )
73    行訂正 [都道府県] = &住所1 , [住所1] = &住所2
74   else
75    項目値代入 [都道府県] = &住所1 , [住所1] = &住所2
76   end

----------

それでは保存終了して、住所録フォームで郵便番号を入力して住所が表示されるか確かめてください。

Chapter2はこれでおしまいです (=^・^=)

 


参考)

1  名札    メイン
2  
3   オブジェクト操作 @フォーム.編集対象表 = #一括パス名 + "住所録.tbx"  /* 編集対象表は、メイン処理でのみ変更できます */
4  
5   変数宣言 局所,文字列 { &m入力前値 , &m入力後値 }
6   変数宣言 局所,文字列 { &m郵便番号 }
7  
8  *
9  
10  手続き定義開始 t郵便番号::入力前(参照 文字列 &編集文字列)
11   &m入力前値 = &編集文字列                /* 既存入力値を取得します。半角 です。 */
12  手続き定義終了
13  
14  手続き定義開始 t郵便番号::入力後(参照 文字列 &編集文字列,長整数 &モード,参照 長整数 &入力継続)
15   &編集文字列 = #半角 ( &編集文字列 )           /* 全角入力された場合には半角にします。 */
16   &編集文字列 = #TRIM( &編集文字列 , 4 )         /* 空白を取り除きます。 */
17   &m入力後値 = &編集文字列                 /* 半角にして空白を取り除いた値になります。 */
18   &m郵便番号 = #文字置換( &編集文字列 , "-" , "" )    /* "-" が入力されている場合は、削除して &m郵便番号 に代入します。 */
19  
20   if ( #文字数( &m郵便番号 ) = 7 )       /* 郵便番号は "-"がなければ7桁です */
21    &編集文字列 = #部分列( &m郵便番号 , 1 , 3 ) + "-" + #右側文字列( &m郵便番号 ,4 )
22    * 最初から3文字取り出した値と、4文字目から取り出した値を組み合わせ正しい位置に "-" を入力します。
23   else
24    if ( &m入力後値 = #未定義 )
25     * 未定義の場合何もしません。郵便番号を削除した場合に未定義になります。
26    else
27     &編集文字列 = &m入力前値
28     &入力継続 = 1
29     * 入力した値が "-" を除いて7桁でない場合には、元の値に戻して入力を継続します( &入力継続 = 1 についてはイベントリファレンスを参照してください)。
30    end
31   end
32  
33   * ここまでの処理で \
34    &m入力前値:元々入力されていた値。&m入力後値:半角、空白を取り除いた値。 \
35    &m郵便番号:"-" を除いた値。 &編集文字列(このイベント処理の引数):"-" を追加した値、*#文字数( &m郵便番号 ) = 7 の場合。 \
36    となります。
37  手続き定義終了
38  
39  手続き定義開始 t郵便番号::編集開始()
40   メソッド呼び出し &this.編集選択位置設定( 1 ,-1 )     /* &this は、イベントが発生したオブジェクトの名前が格納されている定数です。*/
41  手続き定義終了
42  
43  手続き定義開始 t郵便番号::ソース値更新()
44   if ( &m入力後値 = &m入力前値 .or &m入力後値 = #未定義 )
45    * 入力前と値が同じ場合、また入力値が削除された場合には何もしません。
46   else
47    手続き実行 prc住所検索()
48   end
49
50   メソッド呼び出し @t住所2.フォーカス設定()
51  手続き定義終了
52  
53  手続き定義開始 prc住所検索()
54   変数宣言 自動,整数  { &currentTblNum , &lookupTblNum }
55   変数宣言 自動,文字列 { &住所1 , &住所2 }
56   &currentTblNum = &hwindow     /* &hwindowには現在のフォームの編集対象表番号が収納されています。 */
57  
58   表 "郵便番号簿.tbx"
59   &lookupTblNum = #IS表
60  
61   検索 [郵便番号] { &m郵便番号 }
62   if ( .not #eof)        /* 終端行でなければ。つまり検索値が存在すれば。 */
63    &住所1 = [住所1] , &住所2 = [住所2] + [住所3]
64   end  
65  
66   終了 表 &lookupTblNum    /* 郵便番号簿を閉じる */
67  
68   編集表 &currentTblNum     /* 住所録の編集対象に戻る */
69  
70   変数宣言 自動,長整数{&更新モード}
71   メソッド呼び出し @フォーム.更新モード取得(&更新モード)
72   if ( &更新モード = 0 )
73    行訂正 [都道府県] = &住所1 , [住所1] = &住所2
74   else
75    項目値代入 [都道府県] = &住所1 , [住所1] = &住所2
76   end
77  手続き定義終了