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

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

 

実例

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

 

  • 部署マスタ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は引き続き内部値を保持していることに注意。画面に外部地が表示されているからといってGetItemメソッドを使っても内部値しか取れない。外部値を取得する方法は後述。

 

子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にこの計算フィールドを作っておくと便利だ。
PowerScript側でDescribe+Evaluate+LookUpDisplayを繰り返すとソースコードが非常に読みづらい上に、Describeメソッド内ではIDE内がシンタックスエラーを教えてくれず、実行するまでエラーを検出できないからだ。

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

コメントする