注册 登录
编程论坛 VFP论坛

菜鸟问题:关于replace

sxlgg 发布于 2021-06-27 11:10, 2781 次点击
replace bz with "f" for dw="111" and gz<=880

我单个运行就直接替换2个记录,请问这是怎么回事,要怎么解决
replace bz with "f" for dw="111"
运行这个,就全部替换了。多个替换不是要加All的吗

[此贴子已经被作者于2021-6-27 11:12编辑过]

15 回复
#2
吹水佬2021-06-27 11:13
满足for条件的记录都替换
#3
sxlgg2021-06-27 11:15
回复 2楼 吹水佬
程序中要只替换1个,要怎么处理
#4
吹水佬2021-06-27 11:58
以下是引用sxlgg在2021-6-27 11:15:51的发言:

程序中要只替换1个,要怎么处理

if dw="111" and gz<=880
    replace bz with "f"
endif
#5
gs25367856782021-06-27 12:51
这需要看你表的内容才能确定,例如说,你字段dw内容都是111
#6
wengjl2021-06-28 09:50
replace bz with "f" for dw="111" and gz<=880
这是二个条件同时满足,才修改BZ

replace bz with "f" for dw="111"
这是只满足一个条件,就修改BZ。 肯定是这个修改的内容多
#7
liuxingang282021-06-30 09:04
普及一下基础知识:
1、Replace 命令不带FOR/WHILE 条件时,默认范围是当前记录,即:Next 1
2、带FOR条件时,默认范围是所有记录,即:ALL
3、带WHILE条件时,默认范围是当前记录之后的所有记录,即:REST
4、带FOR条件,同时又带WHILE条件,则WHILE条件优先,默认范围是:REST
#8
hu9jj2021-07-03 08:48
以下是引用liuxingang28在2021-6-30 09:04:01的发言:

普及一下基础知识:
1、Replace 命令不带FOR/WHILE 条件时,默认范围是当前记录,即:Next 1
2、带FOR条件时,默认范围是所有记录,即:ALL
3、带WHILE条件时,默认范围是当前记录之后的所有记录,即:REST
4、带FOR条件,同时又带WHILE条件,则WHILE条件优先,默认范围是:REST


不带条件时,只替换当前记录;
后面加ALL时,替换所有记录;
带FOR条件时,是替换符合条件的所有记录。

[此贴子已经被作者于2021-7-3 09:11编辑过]

#9
sdta2021-07-04 08:49
以下是引用liuxingang28在2021-6-30 09:04:01的发言:

普及一下基础知识:
1、Replace 命令不带FOR/WHILE 条件时,默认范围是当前记录,即:Next 1
2、带FOR条件时,默认范围是所有记录,即:ALL
3、带WHILE条件时,默认范围是当前记录之后的所有记录,即:REST
4、带FOR条件,同时又带WHILE条件,则WHILE条件优先,默认范围是:REST

好像不对吧
#10
liuxingang282021-07-14 11:20
回复 9楼 sdta
带 while 条件时的默认范围是 Rest, 可用下例来验证:
表 employee.dbf 记录如下:
==========================
name   dept   salary
- - - - - - - - - - - - -
张三   信息   4000
李四   信息   4500
王五   财务   6000
马六   财务   4200
闫七   设计   7000
刘八   设计   6800
==========================
执行如下命令:
loca for dept='财务'
repl salary with salary+100 while dept='财务'

命令执行完后,财务处人员的工资均增加了100元,而记录指针停留在第 5 条记录上。
如果将上述命令加上范围语句 rest,即:repl rest salary with salary+100 while dept='财务',执行结果与原命令相同。

通过以上例子,可以验证“带 while 条件时的默认范围是 Rest”

[此贴子已经被作者于2021-7-14 11:23编辑过]

#11
liuxingang282021-07-14 11:42
还以上面的数据为例,再验证以下“带FOR条件,同时又带WHILE条件,则WHILE条件优先,默认范围是:REST”。

执行如下命令:
loca for dept='财务'
repl salary with salary+100 for salary<5000 while dept='财务'

执行以上命令后,仅将财务部门工资小于5000元的人员(马六的工资由4200修改为4300)工资加了100元,而记录指针停留在第 5 条记录上,范围仍然是 REST
#12
吹水佬2021-07-14 15:22
这样看看:
表 employee.dbf 记录如下:
==========================
name   dept   salary
- - - - - - - - - - - - -
张三   信息   4000
李四   信息   4500
王五   财务   6000
马六   财务   4200
闫七   设计   7000
刘八   设计   6800
刘九   财务   9413
==========================
执行如下命令:

loca for dept='财务'
repl salary with salary+100 while dept='财务'
或:
go 2
repl salary with salary+100 while dept='财务'

结果:如果当前记录符合条件就开始替换,直至遇到第一个不符合条件的记录为止。
这时与 REST 的情况不同,REST是从当前到最后。
#13
吹水佬2021-07-14 15:25
VFP版本 VFP9 7423
其他版本没测试
#14
liuxingang282021-07-15 09:52
版主们对我的示例可能理解有误。我的示例是想说明:在省略范围选项且只有WHILE条件时,这时的默认范围是REST,也就是说加上REST与不加效果是一样的。
我们再测试一下,如果将示例中的语句改为:replace ALL salary with salary+100 while dept='财务',则该命令什么也不会做。因为范围是ALL,系统会首先将指针跳转至行首,从第一条记录判断while条件,由于该记录不满足条件,因此指针就定位在第1条记录(WHILE条件的特性)。
另外,WHILE 条件一般情况下应用于索引排序后的表。我给出的示例就是按部门做了排序。
#15
吹水佬2021-07-15 10:48
VFP帮助对WHILE子句有说明:其他条件与WHILE一起使用时,WHILE优先且其他脱离不了WHILE范围,受WHILE制约。
只有本站会员才能查看附件,请 登录
#16
gs25367856782021-07-15 14:09
十四楼确实是错了。
九楼的朋友,指出了错误所在。

[此贴子已经被作者于2021-7-15 14:10编辑过]

1