GET DOCUMENT PROPERTIES

4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次

version 6.0


GET DOCUMENT PROPERTIES (document; locked; invisible; created on; created at; modified on; modified at)

引数説明
document文字列ドキュメントの名前
lockedブールTrueの場合はロック、またはFalseの場合はアンロック
invisibleブールTrueの場合は非表示、またはFalseは表示
created on日付作成日
created at時間作成時間
modified on日付更新日
modified at時間更新時間

説明

GET DOCUMENT PROPERTIESコマンドは、引数documentに渡した名前またはパス名を持つドキュメントに関する情報を返します。

呼び出し後、以下の情報が返されます。

・ドキュメントがロックされていると、lockedはTrueを返します。ロックされているドキュメントを修正することはできません。

・ドキュメントが非表示の場合、invisibleはTrueを返します。

created oncreated atにはドキュメントが作成された日付と時間が返されます。

modified onmodified atにはドキュメントが最後に修正された日付と時間が返されます。

例題

ドキュメントデータベースを作成し、そのデータベースに作成したすべてのレコードをディスク上のドキュメントに書き出す場合を想定します。データベースは定期的に更新されているため、ドキュメントが存在しなかったり、ドキュメントが最後に保存された後に、対応するレコードが修正されてしまった場合には、各ドキュメントを作成、再作成するようなデータ書き出しのアルゴリズムを記述します。そのため、ドキュメント(存在する場合には) を修正した日付と時間をそれに対応するレコードと比較する必要があります。これを図解するために、以下のテーブルを使用してその定義を表します。

各レコードに日付と時間の両方を保存するのではなく、任意の日付時刻とレコードが保存された日付時間との間の経過数秒を示す"タイムスタンプ" の値を保存することができます (この例では1995年1月1日午前0時を使用しています) 。

この例では、[Documents]Creation Stampフィールドにレコードが最初に作成されたときのタイムスタンプがあり、[Documents]Modification Stampフィールドにレコードが最後に更新されたときのタイムスタンプがあります。

この後に示されているTime stampプロジェクトメソッドでは、引数が渡されない場合には、現在の日付と時間または特定の日付と時間としてタイムスタンプを計算します。

      `Time stamp プロジェクトメソッド
      `Time stamp { ( 日付 ; 時間 ) } -> 倍長整数
      `Time stamp { ( 日付 ; 時間 ) } -> 1995年1月1日から経過した数秒

   C_DATE($1;$vdDate)
   C_TIME($2;$vhTime)
   C_LONGINT($0)

   If (Count parameters=0)
      $vdDate:=Current date
      $vhTime:=Current time
   Else 
      $vdDate:=$1
      $vhTime:=$2
   End if 
   $0:=(($vdDate-!01/01/95!)*86400)+$vhTime

Note: このメソッドを使用すると、日付と時間を1995/01/01 00:00:00から2063/01/19 03:14:07の間でコード化できるため、倍長整数の0から2^31 -1の範囲に対応できます。

一方、次に示されているTime stamp to dateおよびTime stamp to timeのプロジェクトメソッドでは、タイムスタンプに保存されている日付および時間を抽出することができます。

      `Time stamp to dateプロジェクトメソッド
      `Time stamp to date ( 倍長整数 ) -> 日付
      `Time stamp to date ( Time stamp ) -> 抽出する日付

   C_DATE($0)
   C_LONGINT($1)

   $0:=!01/01/95!+($1\86400)

      `Time stamp to timeプロジェクトメソッド 
      `Time stamp to time ( 倍長整数 ) -> 日付
      `Time stamp to time ( Time stamp ) -> 抽出する時間

   C_TIME($0)
   C_LONGINT($1)

   $0:=Time(Time string(†00:00:00†+($1%86400)))

レコードの作成や更新の方法に関係なく、レコードのタイムスタンプが、正しく更新されるようにするには、[Documents]テーブルのトリガを使用して、その規則を強制します。

      `[Documents]ーブルのトリガ

   Case of 
      : (Database event=Save New Record Event)
         [Documents]Creation Stamp:=Time stamp 
         [Documents]Modification Stamp:=Time stamp 
      : (Database event=Save Existing Record Event)
         [Documents]Modification Stamp:=Time stamp 
   End case 

このトリガをデータベースに記述すると、以下のCREATE DOCUMENTATIONプロジェクトメソッドの作成に必要となるすべての準備が整います。ドキュメントの作成および更新の日付および時間の処理には、GET DOCUMENT PROPERTIESコマンドおよびSET DOCUMENT PROPERTIESコマンドを使用します。


      `CREATE DOCUMENTATIONプロジェクトメソッド

   C_STRING(255;$vsPath;$vsDocPathName;$vsDocName)
   C_LONGINT($vlDoc)
   C_BOOLEAN($vbOnWindows;$vbDoIt;$vbLocked;$vbInvisible)
   C_TIME($vhDocRef;$vhCreatedAt;$vhModifiedAt)
   C_DATE($vdCreatedOn;$vdModifiedOn)

   If (Application type=4D Client)
         `4D Clientを実行しいる場合には、4D Clientが存在するクライアントマシンで
         `ドキュメントをローカルに保存します。
      $vsPath:=Long name to path name (Application file)
   Else 
         `それ以外の場合には、データファイルが存在する位置にドキュメントを保存する
      $vsPath:=Long name to path name (Data file)
   End if 
      `任意で"Documentation"と命名したディレクトリにあるドキュメントを保存する
   $vsPath:=$vsPath+"Documentation"+Char(Directory symbol )
      `このディレクトリが存在しない場合には、作成する
   If (Test path name($vsPath) # Is a directory)
      CREATE FOLDER($vsPath)
   End if 
      `古いドキュメント、つまり、対応するレコードが削除されいるドキュメントは
      `削除しなければならないため、既にあるドキュメントのリストを作成する
   ARRAY STRING(255;$asDocument;0)
   DOCUMENT LIST($vsPath;$asDocument)
      `[Documents] ーブルから全のレコードを 選択する
   ALL RECORDS([Documents])
      `各レコードに対し
   $vlNbRecords:=Records in selection([Documents])
   $vlNbDocs:=0
   $vbOnWindows:=On Windows 
   For ($vlDoc;1;$vlNbRecords)
         ` ディスクにドキュメントを(再) 作成しなければならないと想定する 
      $vbDoIt:=True
         `ドキュメントの名前およびパス名を求める
      $vsDocName:="DOC"+String([Documents]Number;"00000")
      $vsDocPathName:=$vsPath+$vsDocName
         `このドキュメントは既に存在するか?
      If (Test path name($vsDocPathName+".HTM")=Is a document)
            `その場合には、ドキュメントのリストからドキュメントを除去します
            `このようにすると、ドキュメントが削除される場合があります
         $vlElem:=Find in array($asDocument;$vsDocName+".HTM")
         If ($vlElem>0)
            DELETE FROM ARRAY($asDocument;$vlElem)
         End if 
            `レコードが最後に更新された後で、ドキュメントが保存されたか?
         GET DOCUMENT PROPERTIES($vsDocPathName+".HTM";$vbLocked;$vbInvisible;$vdCreatedOn;$vhCreatedAt;
                                                $vdModifiedOn;$vhModifiedAt)
         If (Time stamp ($vdModifiedOn;$vhModifiedAt)>=[Documents]Modification Stamp)
               `その場合には、ドキュメントを再作成する必要はない
            $vbDoIt:=False
         End if 
      Else 
            `ドキュメントは存在しないため、これら2つの変数をリセットし、ドキュメント
            `の最終的なプロパィを設定する前にこれらを計算する必要があることを確認で
            `きるようにする
         $vdModifiedOn:=!00/00/00!
         $vhModifiedAt:=?00:00:00?
      End if 
         `ドキュメントを(再) 作成する必要があるのか?
      If ($vbDoIt)
            `その場合には、更新されたドキュメントの数を増分する
         $vlNbDocs:=$vlNbDocs+1
            `ドキュメントが既に存在する場合には、削除する
         DELETE DOCUMENT($vsDocPathName+".HTM")
            `再度、作成する
         If ($vbOnWindows)
            $vhDocRef:=Create document($vsDocPathName;"HTM")
         Else 
            $vhDocRef:=Create document($vsDocPathName+".HTM")
         End if 
         If (OK=1)
               `ここで、ドキュメントの内容を記述する
            CLOSE DOCUMENT($vhDocRef)
            If ($vdModifiedOn=!00/00/00!)
                  `ドキュメントは存在しなかったため、
                  `更新の日付および時間を正しい値に設定する
               $vdModifiedOn:=Current date
               $vhModifiedAt:=Current time
            End if 
               `ドキュメントのプロパィを変更し、作成の日付および時間が対応するレコードと
               `等しくなるようにする
            SET DOCUMENT PROPERTIES($vsDocPathName+".HTM";$vbLocked;$vbInvisible;
                                          Time stamp to date ([Documents]Creation Stamp);
                                          Time stamp to time ([Documents]Creation Stamp);
                                                $vdModifiedOn;$vhModifiedAt)
         End if 
      End if 
         `現在実行中の処理を確認するために
      SET WINDOW TITLE("Processing Document "+String($vlDoc)+" of "+String($vlNbRecords))
      NEXT RECORD([Documents])
   End for 
      `古いドキュメント、つまりまた$asDocument配列内にあるドキュメントを削除する
   For ($vlDoc;1;Size of array($asDocument))
      DELETE DOCUMENT($vsPath+$asDocument{$vlDoc})
      SET WINDOW TITLE("Deleting obsolete document: "+Char(34)+$asDocument{$vlDoc}+Char(34))
   End for 
      ` We're done
   ALERT("Number of documents processed: "+String($vlNbRecords)+Char(13)+"Number of documents updated: "
                                    +String($vlNbDocs)+Char(13)+"Number of documents deleted: "
                                             +String(Size of array($asDocument)))

参照

Document creator, Document type, SET DOCUMENT PROPERTIES.


4D - Documentation   French   English   German   Spanish   日本語   4D v11 SQLコマンドテーマリスト   4D v11 SQLインデックス   4D v11 SQL定数テーマリスト   戻る   前   次