通常、Clarion では、プログラムが使用する永続データ (ファイル) の中心として、データ ディクショナリ (DCT) を使用します。テーブルを定義する方法は他にもありますが、APP からコンパイルすると述べたので、APP は DCT にリンクされていると結論付けています。
DCT には、アプリケーションが使用するすべてのファイルの宣言があります。ファイル宣言では、ロジックとディスク ファイル名の両方を指定できます。エラー メッセージは、ディスク ファイル名の定義に問題があることを示しています。
Clarion 言語は、論理データ構造定義をそのディスク ファイルから分離します。Clarion プログラムの「ファイル」は複雑なデータ構造であり、以下に準拠しています。
structName FILE, DRIVER( 'driverType' ), NAME( 'diskFileName' )
key KEY( keyName )
index INDEX( indexName )
recordName RECORD
field DATATYPE
.
.
END
END
上記は基本的な宣言構文であり、実際の例は次のようになります。
orders FILE, DRIVER( 'TopSpeed' ), NAME( 'sales.dat\orders' )
ordersPK KEY( id ), PRIMARY
customerK INDEX( customerID )
notes MEMO( 4096 )
RECORD RECORD
id LONG
customerID LONG
datePlaced DATE
status STRING( 1 )
END
END
orderItems FILE, DRIVER( 'TopSpeed' ), NAME( 'sales.dat\items' )
itemsPK KEY( orderID, id ), PRIMARY
RECORD RECORD
orderID LONG
id LONG
productID LONG
quantityOrdered DECIMAL( 10, 2 )
unitPrice DECIMAL( 10, 2 )
END
END
上記の 2 つの宣言により、同じディスク ファイルに 2 つのロジック ファイルが存在します。これは、TopSpeed ファイル ドライバーなどの一部のファイル ドライバーに提供される機能です。同じディスク ファイルに存在するかどうか、およびどのファイルが存在するかを決定するのはシステム設計者次第です。
今のところ、ファイル宣言の NAME プロパティを変更していない可能性があり、使用しているドライバーがマルチファイル ストレージをサポートしていないことが問題の原因である可能性があります。
上記と同じケースの修正されたファイル定義を次に示しますが、SQL データベースを対象としています。
szDBConn CSTRING( 1024 ) ! //Connection string to DB server
orders FILE, DRIVER( 'ODBC' ), NAME( 'orders' ), OWNER( szDBconn )
ordersPK KEY( id ), PRIMARY
customerK INDEX( customerID )
notes MEMO( 4096 ), NAME( 'notes' )
RECORD RECORD
id LONG, NAME( 'id | READONLY' )
customerID LONG
datePlaced DATE
status STRING( 1 )
END
END
orderItems FILE, DRIVER( 'ODBC' ), NAME( 'order_items' ), OWNER( szDBconn )
itemsPK KEY( orderID, id ), PRIMARY
RECORD RECORD
orderID LONG
id LONG
productID LONG
quantityOrdered DECIMAL( 10, 2 )
unitPrice DECIMAL( 10, 2 )
END
END
ここで、注意を払うszDBconn
と、ファイル宣言で参照される変数宣言の存在に気付くでしょう。これは、データベースに接続するために ODBC マネージャに何を渡すかを Clarion ファイル ドライバ システムに通知するために必要です。多くの接続文字列の例については、接続文字列を確認してください。
ファイルの DCT 定義をチェックして、ドライバーが期待するものを反映しているかどうかを確認します。
また、Clarion では、異なるファイル ドライバを混在させて同じプログラムで使用できることに注意してください。したがって、必要に応じて、外部データ ソースを使用するように既存のプログラムを適合させることができます。
以下は、ISAM ファイルから DBMS に情報を転送する完全な Clarion プログラムです。
PROGRAM
MAP
END
INCLUDE( 'equates.clw' ) ! //Include common definitions
szDBconn CSTRING( 1024 )
inputFile FILE, DRIVER( 'dBase3' )
RECORD RECORD
id LONG
name STRING( 50 )
END
END
outuputFile FILE, DRIVER( 'ODBC' ), NAME( 'import.newcustomers' ), |
OWNER( szDBconn )
RECORD RECORD
id LONG
name STRING( 50 )
backendImportedColumn STRING( 8 )
imported GROUP, OVER( backendImportedColumn )
date DATE
time TIME
END
processed CHAR( 1 )
END
END
CODE
IF NOT EXISTS( COMMAND( 1 ) )
MESSAGE( 'File ' & COMMAND( 1 ) & ' doesn''t exist' )
RETURN
END
imputFile{ PROP:Name } = COMMAND( 1 )
OPEN( inputFile, 42h )
IF ERRORCODE()
MESSAGE( 'Error openning file ' & inputFile{ PROP:Name } )
RETURN
END
szDBconn = 'Driver={{PostgreSQL ANSI};Server=192.168.0.1;Database=test;' & |
'Uid=me;Pwd=plaintextpassword'
OPEN( outputFile, 42h )
IF ERRORCODE()
MESSAGE( 'Error openning import table: ' & FILEERROR() )
RETURN
END
! // Lets stuff the information thatll be used for every record
outputFile.imported.date = TODAY()
outputFile.imported.time = CLOCK()
outputFile.processed = 'N'
! //arm sequential ISAM file scan
SET( inputFile, 1 )
LOOP UNTIL EOF( inputFile )
NEXT( inputFile )
outputFile.id = inputFile.id
outputFile.name = input.name
ADD( outputFile )
END
BEEP( BEEP:SystemExclamation )
MESSAGE( 'File importing completed' )
このサンプル プログラムは、プログラムのさまざまな要素をどのように使用するかを示すことのみを目的としています。ユーザーが進行状況を追跡できるようにするためにウィンドウを使用せず、ADD() などの Clarion のプリミティブを使用しました。これは確かに機能しますが、ループ内ではパフォーマンスが低下する可能性があります。
で開かれたトランザクションで読み取り全体をカプセル化outputFile{ PROP:SQ } = 'BEGIN TRANSACTION'
し、最後にoutputFile{ PROP:SQL } = 'COMMIT'
.
はい、PROP:SQL を介して、DROP DATABASE を含め、サーバーが受け入れる任意のコマンドを発行できるため、非常に強力です。注意して使用してください。
グスタボ