1

問題があります。システムはClarion 5で書かれており、過去から来ており、現在は Java で書き直す必要があります。

これを行うには、現在の状態とその動作に対処する必要があります。

Application Generator を介して実行可能ファイルを生成しています(\*.APP-> \*.CLW -> \*.EXE, \*.DLL)

しかし、実行すると次のメッセージが表示されます。

File(\...\...\DAT.TPS) could not be opened. Error: Path Not Found(3). Press OK to end this application

その後 -halt, File Access Error

問題は何でしょうか?Clarion 5 IDE でデータ ファイルへのパスを再構成することはできますか?

4

1 に答える 1

1

通常、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 を含め、サーバーが受け入れる任意のコマンドを発行できるため、非常に強力です。注意して使用してください。

グスタボ

于 2012-08-02T19:16:15.560 に答える