残りのFindを書こう(遅い)
結構前のエントリー
想定環境
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が減ったりしてレスポンスが良くなったりしますので
ぜひ使ってみてはどうでしょうか!!!
以上。