OutSystemsではBasic TypeにはNULL値がありません。NullIdentifierというのはあるのですが。
(根拠となる公式ドキュメントを探してみましたが、見つかりませんでした。あちこちの掲示板のQ&Aには出てくるのですが)
Table of Contents
値を指定しなかった場合の扱い
では、IsMandatory=Falseにした項目をどんな値になるかというと、各型のデフォルト値になります。
実際に試してみます。
簡単なEntity(Text, Integer, Decimal, DateTime, Booleanの列を1つずつ持つ)を作成し、Entity型のローカル変数を何もAssignせずにCreateしてみた結果が以下になります。
上のリンクに示されたデフォルト値になっていることが確認できます。
OutSystemsのAggrgateを介して更新すると、NULLでなく、デフォルト値がデータベースに格納されてしまいます。
NULLの扱いが必要なときは、Advanced Queryですね。
できれば、記述と内容把握が楽なAggregateですべて解決したいところです。Integration Studioで外部のDBとつないでいて、レガシーだったり他システムか使っていてNULL値が含まれている場合に困りますね。
AggregateでNULL的な値でフィルタしてみる
なんとかIS NULLで検索できる条件がないか見るために、AggregateのFiltersに色々な条件を設定し、Executed SQLをチェック。
環境はPersonal Environmentで、Service Studio 11.0.109.0を使用。
Text型に空文字列(Text型のデフォルト値)
条件:TypeTest.Text = “”
Executed SQLのWHERE句:(ENTypeTest.[TEXT] = N”)
これは普通に空文字列と比較になっていますね。
Text型をNullIdentifier()と比較
条件:TypeTest.Text = NullIdentifier()
Executed SQLのWHERE句:(ENTypeTest.[TEXT] IS NULL)
この方法はいけますね。
ただし、NullIdentifier()ですから、本来は他Entityを参照するための列にぶつける値です。
IS NULLにするためという意図があんまり明らかでないところが残念。
これが機能するのはEntity Identifierのデフォルト値がNULL(SQL Serverの場合)だからでしょうか。
Text型をNullTextIdentifier()と比較
条件:TypeTest.Text = NullTextIdentifier()
Executed SQLのWHERE句:(ENTypeTest.[TEXT] IS NULL)
これもいけますね。似たようなことしてうまく行かないことがあったので、環境か設定で動作が違うかもしれません。(DBの種類が違うとか)
Date型をNullDate()と比較
条件:TypeTest.Date = NullDate()
Executed SQLのWHERE句:(ENTypeTest.[DATE] = (convert(datetime, ‘1900-01-01’)))
これはIS NULLにはならないようです。1900-01-01を有効な値として扱うアプリでは別の方法を考える必要がありますね。