评论:适用于 Linux 的 xBASE 产品

作者:Robert Broughton

XBASE 是最初的 dBASE 编程语言的各种实现的通用术语。该市场 MS-DOS 部分的主要参与者是 FoxPro (Microsoft)、dBASE V (Borland) 和 Clipper (Computer Associates)。这是一种具有编程语言中常见语句的语言,例如 IF、ELSE、ENDIF 和 WHILE。(有一个 GOTO 语句,但它是用于转到文件中的特定记录;FORTRAN 流控制意义上没有 GOTO。)它还具有一些强大的语句,用于处理文件和从屏幕获取数据。文件之间建立关系很容易做到。文件中所有字段的名称及其类型和长度都记录在文件头中。可以在不更改使用该文件的程序的情况下向文件添加新字段。

这些产品均不适用于 Linux,尽管至少有人尝试使 SCO 版本的 dBASE V 与 iBCS 一起工作。我们现在拥有的是来自 multisoft Datentechnik GmbH 的 FlagShip 和来自 Versasoft Corporation 的 dBMAN。这两种产品都在 Unix 的多个实现上运行;dBMAN 也在 MS-DOS 上运行。

这两种产品仅在非常简单的层面上彼此相似。首先,FlagShip 仿照 Clipper 5 版本,而 dBMAN 类似于 dBASE III+ 或 FoxPlus,并进行了一些增强。反过来,这意味着两件事。FlagShip 像 Clipper 一样是一个编译器,而 dBMAN 主要是一个解释器,尽管可以“编译” dBMAN 程序(但不是编译成二进制文件)。FlagShip 也是一种面向对象的语言,这使其在哲学上与 dBMAN 以及 FoxPro 和 dBASE 不同。Clipper 和 FlagShip 有很多类似 C 语言的特性,我怀疑这对大多数 Linux 用户来说不会有问题。

它们的目标市场也不同。dBMAN 主要针对个人用户。如果您想要一个可以在办公桌上运行的程序来跟踪向客户收取的工时,或者维护客户或库存数据库,dBMAN 可以胜任这项工作,但 FlagShip 可能有些大材小用。FlagShip 的目标是想要开发或移植软件包的人员。

我认为四个功能对于开发体面的用户界面至关重要:下拉菜单、窗口、热键激活的选择列表和输入验证。这些产品在评估时考虑了这些标准。我也对 FoxPro 的 BROWSE 命令感到敬畏,因此它是衡量其他语言浏览功能的标准。

FlagShip

正如我之前提到的,FlagShip 是一个编译器。它将 xBASE 代码转换为 C 代码,结果将交给 gcc 编译器。(是的,您可以将用 C 或汇编程序编写的函数链接到 FlagShip 程序中。您甚至可以在程序中混合使用 xBASE 和 C 代码。)编译后的二进制文件可以分发,而无需向 multisoft 支付版税。

FlagShip 没有其他 xBASE 产品中发现的“点提示”或交互式命令界面的等效项。但是,WorkGroup Solutions 的 FTP 区域中有一个名为 dbu 的公共领域程序。该程序将提供创建文件和索引、添加、更改或定位记录以及浏览文件的功能。

图 1

我最喜欢的 FlagShip 功能是其名为 fsman 的在线参考程序。fsman 包含整个 FlagShip 手册,超过 1,000 页的材料。如果您使用 X 窗口环境,您可以轻松地将 fsman 停放在屏幕的一个角​​落,并在需要时参考它。也可以将手册的页面保存到 ASCII 文件,这使得将手册中的编程示例合并到您当时正在处理的任何程序中变得容易。当然,您也可以使用鼠标将文本从 fsman 复制到您的程序中。

当您安装 FlagShip 时,您会获得一组专门用于 FlagShip 的 terminfo 文件。由于 ncurses 1.8.5 存在问题,它们是使用 ncurses 1.8.1 编译的。

FlagShip 没有专门用于管理下拉菜单的功能。FlagShip 和 Clipper 程序员通常的做法是使用 @PROMPT/MENU TO 语句创建水平菜单,并使用名为 ACHOICE() 的函数创建垂直菜单。

FlagShip 具有用于管理窗口的函数,这些函数运行良好,但它们不是基本软件包的一部分。您必须购买 FStools 库。顾名思义,FStools 库是 Clipper Tools 库的克隆。公共领域的 NanForum 库中也有窗口函数。

热键使用语句 SET KEY keyid TO 语句设置。通常,statement 将是一个函数调用。在此函数中,您可以调用函数 READVAR() 来查找按下键时光标所在的字段。

可以通过将 VALID 语句参数添加到 @SAY/GET 语句来验证输入字段。同样,statement 通常是一个函数调用。在该函数中,可以在数据库文件中查找用户键入的值。

为了确定 FlagShip 与 Clipper 的兼容性,我从本地 BBS 下载了几个程序。我遇到了两个问题。这些程序包含如下函数调用

IF (expr, true_result,)

FlagShip 抱怨缺少第三个参数。添加“.f.”作为第三个参数解决了问题。另一个问题是对名为 FT_Shadow() 的函数的引用,FlagShip 根本不知道该函数。我通过注释掉它来解决了这个问题。一旦我对这些程序进行了干净的编译,它们就可以完美地工作。

FlagShip 的一个关键功能是 TBROWSE() 对象。您可以使用它代替其他 xBASE 语言中存在的 BROWSE 命令。如果您没有任何面向对象编程的经验,那么第一次设置 TBROWSE() 会让人望而生畏。但是,我能够通过提取 fsman 中的示例并重新排列它来使其完成我想要的操作。

当我在 xterm 中运行 FlagShip 程序时,我遇到了 FlagShip 的一个问题;我得到了象形文字而不是线条绘制字符。摆弄“fslinxterm”terminfo 条目中的“acsc”参数没有任何效果。我通过使用 DOSEMU 附带的“vga”字体来解决这个问题。我最终了解到,FlagShip 没有使用 acsc 参数,而是使用了另一个名为 Fschrmap.def 的文件,该文件将程序生成的字符代码映射到屏幕上显示的字符代码。但是,我没有费心更改它。使用“vga”字体实际上是一个更好的解决方案,因为它可以显示双线绘制字符。

当我在程序中放入 REPORT EDIT 语句时,FlagShip 中又出现了一个“陷阱”;编译器拒绝了它。似乎此语句在 Linux 版本中根本不存在。如果您有 MS-DOS 版本的 Clipper 来设置报表,REPORT FORM 将起作用。REPORT EDIT 在 FlagShip 的其他实现中确实存在,WorkGroup Solutions(FlagShip 的北美代理商)告诉我,它将在下一个 Linux 版本中出现。

另一个问题让很多人抓耳挠腮了一段时间。ACHOICE() 和几个其他函数只是拒绝工作。事实证明,我的程序名称是 browse.prg,而 browse 被 FlagShip 视为保留字。我可以报告说,multisoft 和 WorkGroup Solutions 的支持人员在解决此问题方面相当有帮助。

WorkGroup Solutions 在营销其产品方面非常积极。(他们还销售 Linux CD-ROM。)他们在 comp.language.xbase 和 comp.os.linux.misc 新闻组中非常频繁地出现。他们承诺 FlagShip 最终将具有某种 GUI 支持。已移植或正在移植到 FlagShip 的程序包括

  • Accounting for Clipper——演示版本可以在 WorkGroup Solutions 的 FTP 站点找到,但它被认为是 alpha 版

  • SBT——一个主要的会计软件包

  • SourceMate——另一个会计软件包

  • Comix——一个处理 FoxPro 风格复合索引的库

  • BandIt——一个报表编写器

  • SoftCode——一个程序生成器

  • xPRINT——一个打印机控制库

  • NanForum Kit——一个广泛使用的函数库

WorkGroup Solutions 还愉快地指出,FlagShip 程序可以附加到 WWW 页面,从而使网络冲浪者可以访问和更新数据库。

dBMAN

dBMAN 主要以解释模式运行,尽管可以编译程序。(编译程序不会生成可执行二进制文件;它会生成一个 .run 文件,该文件仍然需要 dBMAN 才能执行。)当 dBMAN 启动时,屏幕顶部会出现 CMD: 提示符。此时,您可以键入 ASSIST,这将启动一个类似于 FoxPro 或 dBASE 的菜单驱动界面,但比较有限;dBMAN 的 ASSIST 只允许一次打开一个文件,这反过来意味着不可能建立关系。可以从 ASSIST 启动一个简单的程序生成器。同样,它也有单文件限制。

也可以在 CMD: 提示符下输入 CREATE REPORTMODIFY REPORT。这将使您进入 dBMAN 的报表编写器,该报表编写器运行良好。报表编写器允许关系。我有点难以让它编写宽度超过 80 列的报表,但我最终还是成功了。

dBMAN 提供了一个名为 PMENU() 的函数来创建下拉菜单。PMENU 没有任何机制可以临时禁用菜单选项。

dBMAN 处理窗口的方式与其他 xBASE 产品不同。在定义窗口之前,您调用 PUSHWIND() 将当前窗口推送到堆栈中。(当程序处于初始状态时,整个屏幕被视为一个窗口。)然后您调用 WINDOW() 来创建窗口。当您完成窗口后,您调用 POPWIND(),这将删除窗口,并使上一个窗口处于活动状态。

dBMAN 允许您仅定义一个热键。您可以通过调用 ONKEY( ) 函数来执行此操作。这在您执行语句 ON KEY statement 之前不会生效。(statement 通常是 DO 热键处理程序。)

BROWSE 命令有很长的选项列表。您只能浏览某些字段,并且可以指定每个字段的宽度以及是否可编辑。字段列表可以包括其他文件中的字段,如果您已设置关系,这将非常有用。

dBMAN 不使用 termcap 或 terminfo。相反,它包含一个名为 dbmterm.dbm 的文件。它看起来很像 termcap。安装 dBMAN 后,我必须解决的第一个问题是“xterm”或“console”都没有条目。

我为彩色 xterm 创建了一个,没有太大的困难,它包含在 列表 1 中。

dBMAN 没有执行用 C 或汇编程序编写的函数的功能。

在我评估的 dBMAN 版本(即 5.32 版)中,存在几个讨厌的错误。主要的一个是,如果过程文件是 .prg 文件,则过程文件根本不起作用。如果您将其编译为 .run 文件,则可以正常工作。

基准测试

我编写了一个简单的基准测试程序,可以在 列表 2 中找到。

我使用的测试文件包含 33,830 条记录。我在 MS-DOS 下使用 dBMAN(编译和未编译)、FlagShip 和 FoxPro 2.0 运行了基准测试。基准测试是在配备 SCSI 磁盘的 66MHz 486 上完成的。这是 结果。乍一看,您可能会得出结论,dBMAN 和 FlagShip 都被 FoxPro 击败了。这不公平。FoxPro 通常在基准测试中击败类似的 MS-DOS 产品,因为 FoxPro 在设计上会抢占它可以找到的所有资源。没有行为良好的 Linux 程序会这样做。换句话说,如果 dBMAN 和 FlagShip 分配了我机器上 16 兆字节内存中的大部分,它们会运行得更快,但是另一个终端上进行文本编辑的人员会看到他们的性能受到影响。

兼容性

xBASE 文件始终具有单独的数据 (.dbf) 和索引文件。数据文件的格式对于所有 xBASE 几乎都是统一的,但据我所知,没有两个 xBASE 产品使用相同的索引文件格式。我能够将相同的 .dbf 文件与 FlagShip 和 dBMAN 一起使用,但我还没有尝试任何备注字段。(备注字段将自由格式文本放入单独的文件中,通常带有 .dbt 扩展名。)

资源

Review: xBASE Products for Linux
Robert Broughton (a1040@mindlink.bc.ca) 拥有 23 年的软件开发经验,自 1993 年 2 月以来一直在使用 Linux。他受雇于加拿大不列颠哥伦比亚省伯纳比的 Zadall Systems Group。
加载 Disqus 评论