| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1443 人关注过本帖, 1 人收藏
标题:VFP学习、开发漫谈 (17)
只看楼主 加入收藏
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
结帖率:96.88%
收藏(1)
 问题点数:0 回复次数:11 
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 编辑 ]
搜索更多相关主题的帖子: 工作区 开发 记录 用户 
2014-04-14 12:27
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
收藏
得分:0 
细节非常重要
2014-04-14 16:30
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
细节决定成败

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2014-04-14 23:19
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
收藏
得分:0 
其实吧,REPLACE是Foxpro独有的,真正的数据库系统还是用UPDATE命令的。而且Foxpro 9.0的UPDATE命令已经与这些大型数据库系统的UPDATE命令完全一致了,可以很好地替代REPLACE命令。建议大家没有特殊情况还是用UPDATE命令比较好。
2014-04-15 14:07
liuxingang28
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:山东济南
等 级:贵宾
威 望:47
帖 子:658
专家分:2180
注 册:2014-2-7
收藏
得分:0 
回复 4 楼 taifu945
VFP 与 SQL Server 等数据库系统相比,真正的强大之处是可以深入数据表内部,对数据表进行记录级和字段级的控制和处理,如:Scan、Replace、Skip、Locate、Seek、EOF()、Recno()、Field()等等,这些命令和函数正是 VFP 数据处理的灵活之处。就性能来说,如果VFP表设置了主索引,并且将主索引作为 Update 的更新条件,则速度不是问题。如果更新条件不是主索引,则 Update 需要编历所有记录,不如 Replace 灵活和便捷。比如:要对数据表的当前记录进行修改,使用 Replace 无需定位记录,直接替换即可,而使用 Update 就做不到这一点。另外,使用 Replace 替换当前记录时仅需锁定记录,而使用 Update 则需要锁定整个表,即使仅修改一条记录。以上是本人的一点粗浅见解,欢迎批评指正。


[ 本帖最后由 liuxingang28 于 2014-4-16 08:51 编辑 ]

泉城飞狐
2014-04-16 08:48
wzxzh
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-6-10
收藏
得分:0 
重新学习
2014-06-25 22:16
小主板
Rank: 2
等 级:论坛游民
帖 子:187
专家分:21
注 册:2009-6-28
收藏
得分:0 
值得学习!!!!!!
2014-07-05 20:10
asdf_123000
Rank: 4
等 级:业余侠客
威 望:1
帖 子:273
专家分:227
注 册:2012-12-20
收藏
得分:0 
细则决定好坏
2014-10-19 15:33
boa13579
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2014-10-19
收藏
得分:0 
恩,不能按书本上说的那样死操作,多上机实践,然后发现问题,解决问题,那样细节问题就出现了。
2014-10-19 18:36
ILoveVFD
Rank: 3Rank: 3
等 级:论坛游侠
威 望:3
帖 子:218
专家分:147
注 册:2015-5-2
收藏
得分:0 
篇篇精彩!
2015-05-02 12:06
快速回复:VFP学习、开发漫谈 (17)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023771 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved