OutSystemsでSQLを書いて検索する方法

Aggregate使えばSQL書かずに検索できますが、自分で複雑なSQL書いて検索したいとき、SQLツールを使います。

実行結果はAggregateの場合と同じように画面から参照できます。

公式情報

About SQL

使用手順

  1. SQLを準備する
  2. SQLのSELECTで取得する列の構造を、DataレイヤのStructuresの下に作成しておく
    ただし、出力構造が既存のEntityそのままだったりすると、そのEntityが使えるのでStructureは不要。
    型や列数が異なるとエラーになるので、SQLツールを使うたびに新しいStructureを用意することになりそう
    参考:http://www.outsystems.com/help/servicestudio/9.1/index.htm#t=Using_Data%2FSQL_Output_Structure.htm
    指定した出力構造の列数とSQLの列数が一致しないとこんなエラーが出ます。
    Structureと列数が違うだけでもエラー
  3. SQLツールをActionのフローの中にドラッグ&ドロップする
  4. 設定(SQL、入力、出力構造=上で用意しておいたもの)
  5. 利用法はAggregateと同様(画面に配置したTable RecordsのSource Record Listに設定したり)

使用例

前提

こんな感じのEntityがあるとします。

メンバーマスター(Member)と、各メンバーが毎日作成する日報(DailyReport)を想定。

メンバーとレポートの関係

メンバーが日報を提出した日はDailyReport内に

  • MemberId=そのメンバーのId
  • WorkDate=提出日

のレコードが登録され、未提出の日はその分のレコードが登録されていない状態です。

設定

外部結合を使って、「メンバー名、今日提出したか(boolean)、昨日提出したか(boolean)」を返すことにします。

まずはStructureを用意します。上の3項目にソート用にMemberIdも追加しました。

ちなみにこれを追加する先は、Dataレイヤ→Structuresです。Structuresを右クリックしてAdd Structureしてください。

AdvancedQuery用Structure

画面のPreparationアクションにSQLツールを配置。

SQL配置
配置したSQLツールをダブルクリックして下記のとおり設定。指定内容は、Parametersに2項目、Output Structureにうえで用意したStructure、SQLタブに実際のSQL文。

SQLでは、{}:Entity名 []:Attribute名 @:Parameterの指定です。TEST実行した後Executed SQLタブを開くとEntityとAttributeは実際の値に展開されたものが確認できます。

WS000001SQLをシンプルにするため、今日の日付、昨日の日付はパラメータにしてOutSystemsの組み込み関数で計算して渡すようにしました。

StatementがSQL文を入力するところです。その下に、Parameterとして指定した項目が自動で表示されています。

追加したパラメータは配置先で設定

結果

後はAggregateを使う時と同じように処理できます。

今日、昨日の列には、値がTRUEなら組み込みのチェックマーク画像を表示するようにしてみました。
検索結果イメージ