有一个问题,系统是用Clarion 5编写的,它来自过去,现在需要用Java重写。
要做到这一点,我需要处理它的当前状态以及它是如何工作的。
我通过应用程序生成器(*.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是否可以重新配置数据文件的路径?
通常,Clarion使用数据字典(DCT)作为程序将使用的持久数据(文件)的中心。还有其他方法可以定义表,但由于您提到了从应用程序编译,我得出的结论是,您的应用程序链接到了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.datorders' )
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.datitems' )
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管理器的内容是必要的。请查看"连接字符串"以获取大量的连接字符串示例。
检查文件的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