有一个问题,系统是用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中是否可以重新配置数据文件的路径?
答案 0 :(得分:2)
通常,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
现在,通过上述两个声明,我有两个逻辑文件驻留在同一个磁盘文件中。这是为某些文件驱动程序提供的功能,如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,因此它非常强大。小心使用。
古斯塔沃