【小技】"空"のUUIDを検出する

Go down

【小技】"空"のUUIDを検出する

投稿 by miyako on 2016-12-29, 10:22 am

v11以降,4Dのフィールドには,空の値(文字列は"",数値は0,etc)に加え,ヌルという"状態"が存在し得るようになりました。

ヌルという"状態"は,既存のレコードにフィールドを追加した場合,あるいはコマンドでフィールドをヌルにセットした場合に生まれます。

UUID型のフィールドについては,ヌルと空があるだけでなく,値が代入された経緯により,空の値にもいくつかのバリエーションが存在する,とドキュメントに説明されています。

"" (空の文字列)
"20202020202020202020202020202020" (スペース)
"00000000000000000000000000000000" (ゼロ)

http://doc.4d.com/4Dv15R5/4D/15-R5/Field-properties.300-2964250.ja.html#106190

それで,ヌルまたは空のUUIDをクエリするためには,4パターンの可能性を考慮する必要があります。



フィールドがUUIDであるかどうかをGET FIELD PROPERTIESで知ることはできません。

http://doc.4d.com/4Dv15R5/4D/15-R5/GET-FIELD-PROPERTIES.301-2937352.ja.html

それで,代わりにSQLシステムテーブルを参照することになります。

http://doc.4d.com/4Dv15R5/4D/15-R5/System-Tables.300-2977353.ja.html

Code:
SELECT * FROM _USER_COLUMNS INTO LISTBOX :L;

みたいなコードを実行すればわかりますが,UUIDのDATA_TYPEは13です。

そのようなわけで,空のUUIDに新しい値を代入するコードは下記のような感じになります。

Code:
ARRAY LONGINT($tabs;0)
ARRAY LONGINT($cols;0)
Begin SQL
  select TABLE_ID, COLUMN_ID
   from _USER_COLUMNS
   WHERE DATA_TYPE = 13
   AND DATA_LENGTH = 16
  into :$tabs, :$cols;
End SQL

C_LONGINT($i;$end)
$end:=Size of array($tabs)

For ($i;1;$end)
C_POINTER($table;$field)
$table:=Table($tabs{$i})
$field:=Field($tabs{$i};$cols{$i})
  //empty values
ARRAY TEXT($t;3)
$t{1}:="20202020202020202020202020202020"
$t{2}:="00000000000000000000000000000000"
$t{3}:=""
QUERY WITH ARRAY($field->;$t)
CREATE SET($table->;"$a")
  //null
QUERY BY FORMULA($table->;Is field value Null($field->))
CREATE SET($table->;"$b")

//do something
UNION("$a";"$b";"$c")
APPLY TO SELECTION($table->;$field->:=Generate UUID)

//cleanup
CLEAR SET("$a")
CLEAR SET("$b")
CLEAR SET("$c")
End for

miyako

投稿数 : 281
登録日 : 2016/07/05

トップに戻る Go down

トップに戻る


 
Permissions in this forum:
返信投稿: 不可