ドロップダウンデータウィンドウ(DDDW)は、データウィンドウの項目(カラム)の編集様式の一つ。
DBからデータ取得した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」を「名古屋支社」として表示してくれる。
イメージとしては、社員マスタDWの「部署ID」カラム内に子DWとして部署マスタDWを埋め込むイメージだ。
これをSQLだけで実現しようとすると、JOINを使って都度マスタテーブルと結合しなくてはならないため結構手間になる。
また、ただ内部コードを外部値に変換するだけでなく、ドロップダウンデータウィンドウの名前のとおり、部署マスタDWから取得した結果をドロップダウン形式で表示・選択させることができる。上記例でいえば、DDDWに設定した「部署ID」の項目をクリックすると
・東京本社
・名古屋支社
・大阪支社
から選択できるドロップダウンが生成される。ここもいちいちSQLを書かなくていいので非常に便利だ。
なお、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については、時間があれば詳しく解説したい。
コメントする