如何在Clarion 5 IDE中重新配置数据文件的路径?

时间:2012-07-23 14:55:32

标签: database clarion

有一个问题,系统是用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中是否可以重新配置数据文件的路径?

1 个答案:

答案 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,因此它非常强大。小心使用。

古斯塔沃