PowerBuilder - ドロップダウンデータウィンドウ

ドロップダウンデータウィンドウ(DDDW)は、データウィンドウの項目(カラム)の編集様式の一つ。
テーブルからデータ取得したDWはコード(内部値)しか持たないが、画面にはそのコードに対応した外部値を表示したい場合に便利な機能。

 

実例

  • 社員マスタDW (画面に表示するためのDW)
社員ID 社員名 部署ID 住所
0001 1太郎 A0001 ~~~~
0002 2次郎 A0001 ~~~~
0003 3三郎 B0001 ~~~~

 

  • 部署マスタDW (社員マスタDW内の部署IDから名称を取得するためのマスタ)
部署コード 名称
A0001 東京本社
B0001 名古屋支社
C0001 大阪支社

 

上記2DWを例とすると、

社員マスタDWをそのまま画面に表示すると、部署IDは「A0001」とか「B0001」とかコードのまま表示されてしまう。

そこで、社員マスタDWの「部署ID」カラムの編集様式を「ドロップダウンデータウィンドウ」にし、対象のデータウィンドウとして「部署マスタDW」を指定してやれば、
後は勝手に「A0001」を「東京本社」、「B0001」を「名古屋支社」として表示してくれる。

dddw1.jpg

イメージとしては、社員マスタDWの「部署ID」カラム内に子DWとして部署マスタDWを埋め込むイメージだ。
これをSQLだけで実現しようとすると、JOINを使って毎度マスタテーブルと結合しなくてはならないため結構手間になる。

 

また、ただ内部コードを外部値に変換するだけでなく、「ドロップダウン」の名前のとおり、部署マスタDWから取得した項目はドロップダウン形式で選択させることができる。
上記例でいえば、DDDWに設定した「部署ID」の項目をクリックすると

・東京本社
・名古屋支社
・大阪支社

から選択できるドロップダウンが生成される。ここもいちいちSQLを書かなくていいので非常に便利だ。

dddw2.jpg

なお、DDDWを使った場合、見た目には外部値が表示されるが、引き続きDWは内部値を保持していることに注意。ここから外部値を取得する方法は後述。

 

子DWのRetrieve

自動検索(dddw.AutoRetrieve)が有効でない場合、DDDWに指定した部署マスタDW(子DW)についてもRetrieveメソッドで取得してやらないと、ドロップダウンの中身が表示されないので注意。

このようにDDDWとして指定された方のDWは「子データウィンドウ(DataWindowChild)」と呼ばれる。

コード上で子DWに手を加えたい場合、親DWに対してGetChildメソッドを実行することで子DWを取得することができる。詳細はヘルプ「GetChild」を参照。


//子DW用の変数を宣言
DataWindowChild dwc_orders

//親DW(dw_news)の"open_orders"カラムに指定された子DWをdwc_orders変数に取得する
dw_news.GetChild("open_orders", dwc_orders)

//取得した子DW(dwc_orders)のトランザクションオブジェクトをSQLCAに設定する
dwc_orders.SetTransObject(SQLCA)

//子DWのデータを取得する
dwc_orders.Retrieve("open")

//メインDWのトランザクションオブジェクトを設定し、検索を実行する
dw_news.SetTransObject(SQLCA)
dw_news.Retrieve() 

DDDWの表示値を取得する

上述の通り、DDDWを使用して画面上は名称を表示したとしても、DW自体は内部値(コード)を持つため、
例えばGetItemStringメソッド等でカラムの値を取得しても表示値ではなくコードしか取得できない。

上記の例でいえば、

ls_busho_name = GetItemString(1,"部署ID")

を実行して取得できる値は"A0001"であり、"東京本社"ではない。

ここで表示値"東京本社"の方を取得したい場合は、LookUpDisplayを使用する

ls_busho_name = dw_1.Describe("Evaluate('LookUpDisplay(部署ID) ', 1)")

DescribeメソッドEvaluate式LookUpDisplay式の合わせ技のため非常に分かりにくいが、これで表示値"東京本社"の方を取得できる。

DescribeやEvaluateについてはヘルプ「Describe メソッド」に詳しく書いてあるので要確認。

 

手抜き案

上記のDescribe+Evaluate+LookUpDisplayが面倒な場合、手抜き技として、社員マスタDWに計算フィールド(comp_busho_nameと命名する)を作成し、その式に

LookUpDisplay(部署ID)

と入力することで、この計算フィールドにはLookUpDisplayの計算結果(=DDDWの表示値)が格納される。

あとはGetItemStringメソッドでこの計算フィールドの値を取得してやれば

ls_busho_name = GetItemString(1,"comp_busho_name")

これでls_busho_nameに表示値が取得できる。
(画面に表示する必要がないなら、計算フィールドは非表示にするなどして隠す)

余計な計算フィールドが必要になるので安易にお勧めはできないが、よく参照するフィールドなのであれば事前にDWにこの計算フィールドを作っておくと便利だ。
ソースコードがDescribe+Evaluate+LookUpDisplayだらけになると非常に読みづらい上に、Describeメソッド内ではIDE内がシンタックスエラーを教えてくれず、実行するまでエラーを検出できないからだ。

DescribeやEvaluateについては、時間があれば詳しく解説したい。

コメントする