【GeneXus】Find

残りの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が減ったりしてレスポンスが良くなったりしますので
ぜひ使ってみてはどうでしょうか!!!

参考 Find 式wiki.genexus.jp

以上。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください