残りのFindを書こう(遅い)
結構前のエントリー
【GeneXus】Sum・Count・Average・Max・Min
想定環境
GeneXus X Ev3 u6
DB:ORACLE (MYSQL環境は吹っ飛びましたw)
言語:Java
DB関係の準備
データは適当に初期データとして100件くらいループで登録しておきます。
For &i = 1 to 100
New
//Transaction2_ID オートナンバー
Transaction2_NAME = "TEST_" + &i.ToFormattedString()
Endnew
Endfor
Commit
Transaction3_Transaction2_NAME の式の内容は以下です。
find(Transaction2_NAME, Transaction2_ID = Transaction3_Transaction2_ID, "")
説明すると
取得項目:Transaction2_NAME
取得条件:Transaction2_ID = Transaction3_Transaction2_ID
取得できなかった場合のデフォルト項目:””
ビルドを行いTransaction3に適当にデータを登録します。
Transaction3の画面です。
赤枠で囲った部分で既にわかると思いますが
Transaction3_Transaction2_IDという項目に1~100の値を入れると
Transaction2_NAMEが取得できると思います。
確認
適当なプロシージャを作成してどんなSQLが発行されるか確認します。
// とりあえず Transaction3 を全件参照
For each
MSG(Transaction3_ID.ToString().Trim())
MSG(Transaction3_NAME)
MSG(Transaction3_Transaction2_NAME)
MSG("====================================")
Endfor
Return
上記のようなFor eachを記述して自動生成されるJavaコードを見ると
以下のようなSQLが記述されています。
SELECT
T2.Transaction2_ID
, T1.Transaction3_Transaction2_ID
, T1.Transaction3_ID
, T1.Transaction3_NAME
, COALESCE(T2.Transaction2_NAME, N'') AS Transaction3_Transaction2_NAME
FROM
(
Transaction3 T1
LEFT JOIN Transaction2 T2
ON T2.Transaction2_ID = T1.Transaction3_Transaction2_ID
)
ORDER BY
T1.Transaction3_ID
特にリレーションを使ってなくてもLEFT JOINされています。
まとめ
こんな感じで式項目(Formula)を使用すると
発行するSQLが減ったりしてレスポンスが良くなったりしますので
ぜひ使ってみてはどうでしょうか!!!
以上。