数据更新!

lang2000 2003-09-30 02:37:03
如何用一个dbf文件更新表中的数据?
如:已有表student.dbf
设student.dbf有一条这样记录
0001 张三 男 汉族
用于更新数据的def文件:stu.dbf其中一记录
0001 李四
更新后
student.dbf 0001记录变为:
0001 李四 男 汉族



...全文
96 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
westbulls 2003-10-04
  • 打赏
  • 举报
回复
重新写一次:
select stu
copy stru extend to lstmep
sele 0
use lstemp
tj='repl '
go top
scan
tj=tj+allt(field_name)+' with student.'+allt(field_name)+','
endscan
tj=substring(tj,1,len(allt(tj))-1)
use

select stu
go top
scan
sele student
loca for 编号=stu.编号
if found()
&tj
endif
endscan
westbulls 2003-10-04
  • 打赏
  • 举报
回复
还有点错误:
tj=tj+allt(field_name)+' with student.'+allt(field_name)
改为tj=tj+allt(field_name)+' with student.'+allt(field_name)+','
循环完成后加一句
tj=substring(tj,1,len(allt(tj))-1)
jiaxingxing 2003-10-04
  • 打赏
  • 举报
回复
如果不确定可以修改为:
for_value=代定值
fild_tmp=待定字段
tmp=新的值

use student
scan
select stu
loca for &fild_tmp= for_valueif found()
replace &fild_tmp with tmp && 通过宏代换来实现
endif
endscan

jiaxingxing 2003-10-04
  • 打赏
  • 举报
回复
不好意思,忘记修改一句

for_value=代定值
fild_tmp=待定字段
tmp=新的值
……
loca for &fild_tmp= for_value
……
westbulls 2003-10-04
  • 打赏
  • 举报
回复
写错一句话:
copy to stru to lstmep
改为copy stru extend to lstemp
(如果你的def的库结构就是要更新的字段内容)
其实可以不要def表的,只要有stu及student两个表就行了,将上一句改为
sele 0
use stu
copy stru extend to lstemp
就可以了!
westbulls 2003-10-04
  • 打赏
  • 举报
回复
select def
copy to stru to lstmep
sele 0
use lstemp
tj='repl '
go top
scan
tj=tj+allt(field_name)+' with student.'+allt(field_name)
endscan
use

select stu
go top
scan
sele student
loca for 编号=stu.编号
if found()
&tj
endif
endscan
jiaxingxing 2003-10-04
  • 打赏
  • 举报
回复
如果不确定可以修改为:
fild_tmp=待定字段
tmp=新的值
use student
scan
select stu
loca for 编号=student.编号
if found()
replace &fild_tmp with tmp && 通过宏代换来实现
endif
endscan
lang2000 2003-10-04
  • 打赏
  • 举报
回复
qufusongyu(元秋)
要求更改的不一定是姓名,还可以是性别或民族或姓名性别一起更改等
qufusongyu 2003-10-03
  • 打赏
  • 举报
回复
已有表student.dbf
设student.dbf有一条这样记录
0001 张三 男 汉族
用于更新数据的def文件:stu.dbf其中一记录
0001 李四
更新后
student.dbf 0001记录变为:
0001 李四 男 汉族

use student
scan
select stu
loca for 编号=student.编号
if found()
replace 姓名 with student.姓名
endif
endscan

lang2000 2003-09-30
  • 打赏
  • 举报
回复
但要求更新字段与用于更新数据的def文件决定
而用于更新数据的def文件的字段是不定的
可能包含student所有字段或少于
但必包含“编号”字段
mgan 2003-09-30
  • 打赏
  • 举报
回复
语法

REPLACE FieldName1 WITH eExpression1 [ADDITIVE]
[, FieldName2 WITH eExpression2 [ADDITIVE]] ...
[Scope] [FOR lExpression1] [WHILE lExpression2]
[IN nWorkArea | cTableAlias]
[NOOPTIMIZE]

参数
FieldName1 WITH eExpression1 [, FieldName2 WITH eExpression2 ... ]

指定用表达式 eExpression1 的值来代替 FieldName1 字段中的数据;用表达式 eExpression2 的值来代替字段 FieldName2 中的数据,依此类推。
当表达式的值比数值字段的宽度长时,REPLACE 采用以下方法来处理数据:

首先,REPLACE 截短表达式的小数位然后圆整剩余部分。


如果此时字段仍然放不下表达式的值,则 REPLACE 用科学计数法在字段中保存表达式的值。


如果还不行,REPLACE 则用星号代替字段内容。

ADDITIVE

把对备注字段的替代内容追加到备注字段的后面。ADDITIVE 只对替换备注字段有用。如果省略 ADDITIVE,则用表达式的值改写备注字段原有内容。

Scope

指定要替换内容的记录范围。只替换指定范围内记录字段的内容。范围子句有:ALL、NEXT nRecords、RECORD nRecordNumber 和 REST。有关范围子句的详细内容,请参阅Scope 子句或语言概述主题或《开发指南》第二章“语言概述”。
REPLACE 的默认范围是当前记录 ( NEXT 1 )。

FOR lExpression1

只有当指定记录使表达式 lExpression1 求值结果为“真”(.T.) 时,它的字段才会被替换为新的内容。因此,包含 FOR 子句可以使命令有条件地更新记录,而将那些不需要更新的记录筛选掉。
当表达式 lExpression1 是可优化表达式时,Rushmore 将优化 replace 命令。因此,为使系统获得最佳性能,应在 FOR 表达式中使用可优化的表达式。有关这方面的详细内容,请参阅 SET OPTIMIZE 和深入了解 Rushmore 技术主题,或《开发指南》第十五章“优化应用程序”。

WHILE lExpression2

指定一个逻辑表达式 lExpression2 作为替换字段内容的条件。只要逻辑表达式 lExpression2 计算为“真”(.T.),就替换记录中的数据,直至遇到第一个计算结果为“假”(.F.) 为止。

IN nWorkArea

指定要更新记录的表所在的工作区。

IN cTableAlias

指定要更新记录的表的别名。
如果同时省略 nWorkArea 和 cTableAlias,则更新当前选定工作区中表的记录。

NOOPTIMIZE

关闭 Rushmore 优化。有关详细内容,请参阅 SET OPTIMIZE 和 深入了解 Rushmore 技术主题,或者《开发指南》第十五章“优化应用程序”。

说明

replace 命令用表达式的值替换字段中的数据。在替换未选定工作区中的字段时,字段前面必须加上表的别名。

附注

mgan 2003-09-30
  • 打赏
  • 举报
回复
可以用REPLAC 来做啊
就可以高定

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧