たまたま使ってマジで忘れてた
参考リンク
参考
データプロバイダーのグループステートメントwiki.genexus.jp
概要
とりあえずDBからデータとってきてくれるオブジェクト。
嫌いなところ
ErrorHandler が書けない。(もしかしたら書き方がある?)
良いところ
別にテーブルをSELECTするだけじゃなくて、固定値をデータプロバイダーから取得するのもあり。
DBとかSDTとかとか
プロパティ
Attと同じ名前
セットする構造体(SDTやBC)の項目がAttと同じ名前の場合イコールを使わないで
Att名を書くだけでOK。
複数件返却(outをコレクションにする)
検索条件(Where)
SDT_Transaction1
Where Transaction1_Id = 2
{ Transaction1_Id Transaction1_Name
}
ベーストランザクション(From)
SDT_Transaction1
From Transaction1
Where Transaction1_Id = 2
{ Transaction1_Id Transaction1_Name
}
並び(Order)
SDT_Transaction1
Order Transaction1_Id
Where Transaction1_Id = 2
{ Transaction1_Id Transaction1_Name
}
レコードが無い場合(Default)
SDT_Transaction1
Where Transaction1_Id = 999
{ Transaction1_Id Transaction1_Name
}
SDT_Transaction1[Default]
{ Transaction1_Id = 0 Transaction1_Name = "NONE"
}
出力件数(Count)
SDT_Transaction1 [Count = 20]
Order Transaction1_Id
{ Transaction1_Id Transaction1_Name
}
スキップ(Skip)
SDT_Transaction1 [Skip = 50]
Order Transaction1_Id
{ Transaction1_Id Transaction1_Name
}
最初のレコード(One)
SDT_Transaction1 [One]
Order Transaction1_Id
{ Transaction1_Id Transaction1_Name
}
NoOutput
子テーブルのレコードを取得し、階層を付けないで取得したい場合に便利。
SDTを編集
SDT_Transaction1
Order Transaction1_Id
{ Transaction1_Id Transaction1_Name SDT_Transaction2 [NoOutput] Where Transaction2_Id = Transaction1_Id { Transaction2_Id Transaction2_Name }
}
OutputIfDetail
明細レコードがある場合だけ、返却値(SDT)に追加します。
SDTを編集
SDT_Transaction1 [OutputIfDetail]
Order (Transaction1_Name)
{ Transaction1_Id Transaction1_Name Level1 Where Transaction2_Id = Transaction1_Id { Transaction2_Id Transaction2_Name }
}
この場合Transaction1のデータに対応するTransaction2のデータが存在する場合だけSDTにレコードが追加されます。
まとめ
書いたら意外と長くてアップするのが夜になったわw
まだいろいろあるから追記していく予定。
以上です。
いつもありがとうございます、とても勉強になりました。データプロバイダーについては、私のプロジェクトではとりあえず利用禁止にしています(笑)。文法が特殊(ちょっと変では?)のと、ErrorHandlerとSubが使えない、多重IFやCase Whenが使えない、少しでも仕様変更が発生されると大きく書き換えるなど、プロシージャと比べるとデメリットが多すぎです。唯一のメリッドと言えば、コーディング量が少ないことですが、プロシージャと比べて数分間程度しか削減できないので無視できる程度だと思いますね。