GET DOCUMENT PROPERTIESコマンドは、引数documentに渡した名前またはパス名を持つドキュメントに関する情報を返します。
呼び出し後、以下の情報が返されます。
- ドキュメントがロックされていると、lockedはTrueを返します。ロックされているドキュメントを修正することはできません。
- ドキュメントが非表示の場合、invisibleはTrueを返します。
- created onとcreated atにはドキュメントが作成された日付と時間が返されます。
- modified onとmodified atにはドキュメントが最後に修正された日付と時間が返されます。
ドキュメントデータベースを作成し、そのデータベースに作成したすべてのレコードをディスク上のドキュメントに書き出す場合を想定します。データベースは定期的に更新されているため、ドキュメントが存在しなかったり、ドキュメントが最後に保存された後に、対応するレコードが修正されてしまった場合には、各ドキュメントを作成、再作成するようなデータ書き出しのアルゴリズムを記述します。そのため、ドキュメント(存在する場合には) を修正した日付と時間をそれに対応するレコードと比較する必要があります。これを図解するために、以下のテーブルを使用してその定義を表します。
各レコードに日付と時間の両方を保存するのではなく、任意の日付時刻とレコードが保存された日付時間との間の経過数秒を示す"タイムスタンプ" の値を保存することができます (この例では1995年1月1日午前0時を使用しています) 。
この例では、[Documents]Creation Stampフィールドにレコードが最初に作成されたときのタイムスタンプがあり、[Documents]Modification Stampフィールドにレコードが最後に更新されたときのタイムスタンプがあります。
この後に示されているTime stampプロジェクトメソッドでは、引数が渡されない場合には、現在の日付と時間または特定の日付と時間としてタイムスタンプを計算します。
注: このメソッドを使用すると、日付と時間を1995/01/01 00:00:00から2063/01/19 03:14:07の間でコード化できるため、倍長整数の0から2^31 -1の範囲に対応できます。
一方、次に示されているTime stamp to dateおよびTime stamp to timeのプロジェクトメソッドでは、タイムスタンプに保存されている日付および時間を抽出することができます。
レコードの作成や更新の方法に関係なく、レコードのタイムスタンプが、正しく更新されるようにするには、[Documents]テーブルのトリガーを使用して、その規則を強制します。
Case of
:(Trigger event=Save New Record Event)
[Documents]Creation Stamp:=Time stamp
[Documents]Modification Stamp:=Time stamp
:(Trigger event=Save Existing Record Event)
[Documents]Modification Stamp:=Time stamp
End case
このトリガをデータベースに記述すると、以下のCREATE DOCUMENTATIONプロジェクトメソッドの作成に必要となるすべての準備が整います。ドキュメントの作成および更新の日付および時間の処理にはGET DOCUMENT PROPERTIESコマンドおよびSET DOCUMENT PROPERTIESコマンドを使用します。
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)
$vsPath:=Long name to path name(Application file)
Else
$vsPath:=Long name to path name(Data file)
End if
$vsPath:=$vsPath+"Documentation"+Char(Directory symbol)
If(Test path name($vsPath)#Is a folder)
CREATE FOLDER($vsPath)
End if
ARRAY STRING(255;$asDocument;0)
DOCUMENT LIST($vsPath;$asDocument)
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
$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
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
ALERT("Number of documents processed: "+String($vlNbRecords)+"\rNumber of documents updated: "+String($vlNbDocs)+"\rNumber of documents deleted: "+String(Size of array($asDocument)))