VFP学习、开发漫谈 (17)
今天,本来想谈一谈多用户下的编程问题,但在浏览狐友的帖子时突然改变了主意,想纠正一个 Replace 命令的错误用法。Relace 命令是一个古老的命令,在修改记录时经常用到。在 VFP 下,初学者最容易犯的错误是:在当前工作区下,试图通过在字段名前加表别名的方式,去修改另一表字段的内容。比如:Replace 表.字段 WITH 值。正确的写法应该是:Relplace 字段 WITH 值 IN 表。
我们先做一个测试,验证一下命令“Replace 表.字段 WITH 值”的实际运行情况:
程序代码:
CLOSE TABLES ALL CREATE TABLE 表1 (字段1 C(10)) && 建立一个表 APPEND BANK && 添加一条记录: SELECT 0 && 切换到一个未使用的工作区: REPLACE 表1.字段1 WITH '123' && 更新“表1”的“字段1”
这段代码试图将“表1”的“字段1”替换为“123”。但在执行到 Replace 语句时出现错误,系统提示当前工作区没有打开表。因此,我们得出第一个结论:执行 Replace 命令时,当前工作区必须有表打开。
我们再接着测试,在 Replace 命令前,打开一个空表看看运行结果如何:
程序代码:
CLOSE TABLES ALL CREATE TABLE 表1 (字段1 C(10)) && 建立一个表 APPEND BANK && 添加一条记录: SELECT 0 && 切换到一个未使用的工作区: * ---------------------------------------------------------- CREATE CURSOR 表2 (字段1 I) && 新建一个空表 * ---------------------------------------------------------- REPLACE 表1.字段1 WITH '123' && 更新“表1”的“字段1”
运行程序,我们发现:这一次系统没有报错,但表1的字段还为空,并没有被替换成“123”。因此,我们得出第二个结论:执行 Replace 命令时,若当前工作区EOF()=.t.,则不执行任何操作。
有用户可能会问:什么情况下才执行替换操作呢?为了进一步验证我们的结论,我们在上述代码中向“表2”中添加一条记录,再看结果如何:
程序代码:
CLOSE TABLES ALL CREATE TABLE 表1 (字段1 C(10)) && 建立一个表 APPEND BANK && 添加一条记录: SELECT 0 && 切换到一个未使用的工作区: CREATE CURSOR 表2 (字段1 I) && 新建一个空表 * ---------------------------------------------------------- APPEND BLANK * ---------------------------------------------------------- REPLACE 表1.字段1 WITH '123' && 更新“表1”的“字段1”
运行程序,这一次“表1”的内容被成功替换为“123”。
由此可见,使用“Replace 表.字段 WITH 值”这种命令形式,是有前提条件的。它需要当前工作区有表打开,并且记录指针不在表尾。因此,当使用 Replace 命令去修改另一工作区的记录时,应该使用“IN 工作区”选项。将上述 3 个示例中的 Replace 命令改为“REPLACE 字段1 WITH '123' IN 表1”就能在任何情况下正确执行。从示例中不难看出,Replace 是基于当前工作区的命令(无 IN 选项时),在命令执行前先判断当前工作区的状态然后才执行。
在学习 VFP 时,细节非常重要,还要注意多上机实践,不要死读课本。
再举一个例子:ISALPHA()函数是判断一个字符串的首字符是不是字母,但是 ? ISALPHA('刘')却显示.t.,因此,我们在实际使用时,应该使用“ISALPHA(字符串) AND !ISLEADBYTE(字符串)”作为字符串的首字符是字母的判断依据。再比如,函数 ASC(字符串) 返回字符串首字符的 ASCII 值,但它并不等同于 ASC(LEFT(字符串,1)),如:ASC('刘') = 49653,ASC(LEFT('刘',1)) = 193。这些细节都是书本上没有的,需要在实践中去总结和体会。
[ 本帖最后由 liuxingang28 于 2014-4-14 18:01 编辑 ]