2012-07-23 22 views
1

還有一個問題,系統寫的是Clarion 5來自過去,現在需要用Java重寫。如何在Clarion 5 IDE中重新配置數據文件的路徑?

爲此,我需要處理它的當前狀態以及它的工作原理。

我通過應用程序生成器(\*.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中可以重新配置數據文件的路徑嗎?

+0

完成沒有錯誤。但是執行時沒有找到數據文件。 – 2012-07-24 06:36:12

回答

2

一般來說,Clarion使用數據字典(DCT)作爲程序將要使用的持久性數據(文件)的中心。還有其他方法可以定義表格,但是由於您提到您從APP進行編譯,因此我得出結論,您的APP已鏈接到DCT。

在DCT中,您對應用程序將使用的每個文件都有聲明。在文件聲明中,您可以通知邏輯和磁盤文件名。該錯誤消息表示您在定義磁盤文件名時遇到問題。

Clarion語言將邏輯數據結構定義與其磁盤文件分開。 A「文件」用於號角PROGRAMM,是一個複雜的數據結構,其符合以下:

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 

現在,通過上面的兩個聲明,我有兩個邏輯文件駐留在同一個磁盤文件中。這是爲某些文件驅動程序提供的功能,如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變量聲明,這是在文件中引用的聲明的存在。這是通知Clarion文件驅動程序系統需要傳遞ODBC管理器以連接到dabase的必要步驟。檢查Connection Strings瞭解大量連接字符串示例。

檢查文件的DCT定義,看它們是否反映了驅動程序的期望。

此外,請注意,Clarion確實允許混合不同的文件驅動程序以供同一程序使用。因此,如果需要,您可以調整現有程序以使用外部數據源。

這是一個完整的Clarion程序,用於將信息從ISAM文件傳輸到DBMS。

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') 

那麼,這個示例程序僅用於顯示如何使用程序的不同元素。我沒有使用窗口讓用戶跟蹤進度,並使用Clarion的基元,例如ADD(),這些基元肯定有效,但是在循環內部可能會影響性能。

更好的辦法是在用outputFile{ PROP:SQ } = 'BEGIN TRANSACTION'打開的事務中封裝整個讀數,最後發出outputFile{ PROP:SQL } = 'COMMIT'

是的,儘管PROP:SQL可以發出服務器接受的任何命令,包括DROP DATABASE,所以它非常強大。小心使用。

Gustavo

+0

Gustavo,謝謝你的詳細解答!很多我需要的信息!現在我明白了。 – 2012-08-03 05:17:22

+1

這就是Stackoverflow的目的! – 2012-08-03 19:17:44

+0

沒錯!這是最好的資源! – 2012-08-03 19:30:37

相關問題