メインコンテンツまでスキップ
バージョン: 開発中

Type

Type ( fieldVar ) -> 戻り値

引数説明
fieldVarフィールド, 変数🡒テストするフィールドまたは変数
戻り値倍長整数🡐データタイプ番号

説明

Type コマンドは、fieldVar 引数に渡したフィールドまたは変数の型を示す数値を返します。

4Dは、Field and Variable Types テーマ内に以下のような定義済み定数を持っています:

定数
Array 2D倍長整数13
Blob array倍長整数31
Boolean array倍長整数22
Date array倍長整数17
Integer array倍長整数15
Is alpha field倍長整数0
Is BLOB倍長整数30
Is Boolean倍長整数6
Is collection倍長整数42
Is date倍長整数4
Is integer倍長整数8
Is integer 64 bits倍長整数25
Is longint倍長整数9
Is null倍長整数255
Is object倍長整数38
Is picture倍長整数3
Is pointer倍長整数23
Is real倍長整数1
Is string var倍長整数24
Is subtable倍長整数7
Is text倍長整数2
Is time倍長整数11
Is undefined倍長整数5
Is variant倍長整数12
LongInt array倍長整数16
Object array倍長整数39
Picture array倍長整数19
Pointer array倍長整数20
Real array倍長整数14
String array倍長整数21
Text array倍長整数18
Time array倍長整数32

Type ファンクションはフィールド、インタープロセス変数、プロセス変数、ローカル変数、そしてこれらのタイプのオブジェクトの逆参照されているポインターに対して適用可能です。Type は、プロジェクトメソッドの引数*($1, $2 ... ${...})、あるいは関数の戻り値($0)*に対しても適用可能です。

注:

  • Type ファンクションは、オブジェクトプロパティ*(emp.name)* やコレクション要素(myColl[5]) などのスカラー式に対して適用することができません。これには、Value type コマンドを使用する必要があります。
  • コンパイル済みモードでは、C_VARIANT として宣言されたメソッド引数($0, $1...) に対してType を呼び出した場合、Is variant は返されず、実際のデータ型が返されます(Value type を呼んだ場合と同じ)

例題 1

以下のプロジェクトメソッドは、テーブルのカレントレコードのフィールドの一部あるいはすべてをクリアします。テーブルは、ポインタ引数として渡されます。カレントレコードの削除や変更は行いません

  // EMPTY RECORD Project Method
  // EMPTY RECORD ( Pointer {; Long } )
  // EMPTY RECORD ( -> [table] { ; type Flags } )
 
 var $1 : Pointer
 var $2;$vlTypeFlags : Integer
 
 If(Count parameters>=2)
    $vlTypeFlags:=$2
 Else
    $vlTypeFlags:=0xFFFFFFFF
 End if
 For($vlField;1;Get last field number($1))
    $vpField:=Field(Table($1);$vlField)
    $vlFieldType:=Type($vpField->)
    If($vlTypeFlags ??$vlFieldType )
       Case of
          :(($vlFieldType=Is alpha field)|($vlFieldType=Is text))
             $vpField->:=""
          :(($vlFieldType=Is real)|($vlFieldType=Is integer)|($vlFieldType=Is longint))
             $vpField->:=0
          :($vlFieldType=Is date)
             $vpField->:=!00/00/00!
          :($vlFieldType=Is time)
             $vpField->:=?00:00:00?
          :($vlFieldType=Is Boolean)
             $vpField->:=False
          :($vlFieldType=Is picture)
             var $vgEmptyPicture : Picture
             $vpField->:=$vgEmptyPicture
          :($vlFieldType=Is subtable)
             Repeat
                ALL SUBRECORDS($vpField->)
                DELETE SUBRECORD($vpField->)
             Until(Records in subselection($vpField->)=0)
          :($vlFieldType=Is BLOB)
             SET BLOB SIZE($vpField->;0)
       End case
    End if
 End for

このプロジェクトメソッドをデータベースに作成後、以下のように使用できます:

  // テーブル [Things To Do]のカレントレコードを空にする
 EMPTY RECORD(->[Things To Do])
 
  // テーブル [Things To Do]のカレントレコードのテキスト, BLOB, ピクチャを空にする
 EMPTY RECORD(->[Things To Do];0?+Is text?+Is BLOB?+Is picture)
 
  // テーブル [Things To Do] のカレントレコードの文字フィールド以外を空にする
 EMPTY RECORD(->[Things To Do];-1?-Is alpha field)

例題 2

汎用コードを書くなど特別なケースで、配列が標準の配列か、2次元配列の行かを知りたい場合があるとします。以下のように書くことができます:

 ptrmyArr:=->myArr{6} // myArr{6} 2D 配列か?
 RESOLVE POINTER(ptrmyArr;varName;tableNum;fieldNum)
 If(varName#"")
    $ptr:=Get pointer(varName)
    $thetype:=Type($ptr->)
  // myArr{6} が2次元配列の行なら$thetype は 13になる
 End if

例題 3

APPEND DATA TO PASTEBOARD コマンドの例題参照

参照

Is a variable
Undefined
Value type