2012-07-23 20 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

相关问题