一般来说,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
完成没有错误。但是执行时没有找到数据文件。 – 2012-07-24 06:36:12