@DbLookup は便利な関数です。ただ、頻繁に使用するようになると、フォームを開くのが遅くなったり、計算結果の動作が遅くなったと感じることがあります。これは、@DbLookup 1 回の実行時間は小さなものでも、多数の @DbLookup の実行時間が積み重なりレスポンスの悪化につながっていることになります。
今回は、この対策として @DbLookup 関数の数を減らす方法についてまとめます。
郵便番号検索の事例
入力した郵便番号から住所を検索する処理を例とします。入力した郵便番号を @DbLookup で検索して住所を表示しています。
実現するためには、郵便番号マスタに次のような検索用ビューを作成します。検索される 1 列目はソートしておく必要があります。
フィールドは入力した郵便番号 Zip の値を使用して先ほどのマスタビューを検索します。そして取得したい値がある列を指定することになります(”計算結果” フィールド)。下図では、県名(カナ)を取得するので 2 列目を取得しています。
@DbLookup("Notes":"NoCache"; Srv: FP; "SchZip"; Zip; 2)
|
なお、Svr と FP のフィールドには、郵便番号マスタのサーバとファイルパスが指定されている前提です。
ここで問題となるのが各フィールドの設定です。今回の事例では、住所1~3の漢字とカナの計 6 フィールドがあり、取得する列の違うほぼ同様の式を記述しています。これは、キーが同じ検索を 6 回実行していることになります。
検索回数の削減
このような場合に活用できる技を紹介します。
まず検索用ビューに1列追加し、所得したい値を特定の文字列で区切る式を記述します。
kana1 + "@" + address1 + "@" + kana2 + "@" + address2 + "@" + kana3 + "@" + address3
|
続いて、フォームの変更です。Kana1 フィールドの式を変更して、先ほど作成した列を取得します。その結果を区切り文字で分離して、それぞれのフィールドにセットします。
xAns := @DbLookup("Notes":"NoCache"; Srv: FP; "SchZip"; Zip; 8); @SetField("Addr1"; @Word(xAns; "@"; 2)); @SetField("Kana2"; @Word(xAns; "@"; 3)); @SetField("Addr2"; @Word(xAns; "@"; 4)); @SetField("Kana3"; @Word(xAns; "@"; 5)); @SetField("Addr3"; @Word(xAns; "@"; 6)); @Left(xAns; "@") |
@Word は、指定した分離記号を使って、部分文字列を取得する関数です。
@Word(xAns; "@"; 2)
|
この式では、文字列 xAns を "@" で区切って 2 つ目を取得するという指定になります。検索結果が次の通りの場合、赤字の部分を取得することになります。なかなか便利な関数ですね。
トツトリケン@鳥取県@トツトリシ@鳥取市@ハマサカヒガシ@浜坂東
|
そして、その取得した値を @SetField 関数で目的のフィールドにセットしています。
なお、この変更で、残り 5 つのフィールドの式は不要になります。”作成時の計算結果” に変更して、初期値が null となるよう変更しておきましょう。
このように記述することにより、6 フィールドの分の値を 1 回の @DbLookup で取得できます。
0 件のコメント:
コメントを投稿