VFP中怎样把同一张表中相同字段的内容合并为一条记录,并删除重复记录

例如:表名10086字段名:A,B,C,D10086100110401008610041070最后的结果应该是字段名:ABCD100861001,10041040,70即... 例如:表名 10086
字段名: A, B, C, D
10086 1001 10 40
10086 1004 10 70
最后的结果应该是
字段名: A B C D
10086 1001,1004 10 40,70
即表中所有记录的A字段都是10086,如果两条记录中的C字段相同的话,就将B和D两个字段按上述合并。高分求解
可解决再追加50分,不要粘贴别人答案,能搜的我已经都搜过了。
前面的例子可能举的太典型了,其实表的结构是这样,C字段并不是只有10.
例如:表名 10086
字段名: A, B, C, D
10086 1001 10 40
10086 1004 10 70
10086 1000 11 20
10086 1002 11 25
10086 1003 12 26
最后的结果应该是
字段名: A B C D
10086 1001,1004 10 40,70
10086 1000,1002 11 20,25
10086 1003 12 26
展开
 我来答
syc_xhm
2011-05-11 · TA获得超过4044个赞
知道大有可为答主
回答量:2122
采纳率:100%
帮助的人:2311万
展开全部
做了一晚上,终于有结果了,我写了4条记录,验证正确。最后的合并结果在一个新的表:新10086.dbf中。

新10086 表的结构与10086表结构相同。所有字段都是字符型。字段b、字段d的宽度要足够。

clear
sele 1
use 10086
copy stru to 新10086
flag=0
xyz=c
b合并值=alltrim(b)
d合并值=alltrim(d)
do while not eof()
skip
if c==xyz
b合并值=b合并值+","+alltrim(b)
d合并值=d合并值+","+alltrim(d)
flag=1
loop
else
if flag=1
sele 2
use 新10086
append blank
replace a with "10086",b with b合并值,c with xyz ,d with d合并值
endif
endif
sele 1
xyz=c
b合并值=alltrim(b)
d合并值=alltrim(d)
flag=0
enddo
sele 2
browse
close table all
cancel
更多追问追答
追问
不太清楚XYZ代表什么 ,是要用10来替换吗?
追答
我写的程序没问题,前提是你的c字段相同的值要排列在一起,如果需要,可以先按c字段建立索引。
xyz 是把当前c 字段的值先存到此变量中,然后与下面记录的c 字段的值进行比较,不能用具体值代替。
百度网友6382c60
2011-05-12 · TA获得超过548个赞
知道小有建树答主
回答量:649
采纳率:100%
帮助的人:220万
展开全部
我这个不需要索引,也不需要将C列相同的项排在一起。已经在电脑上验证过了,完全没问题
use 10086
copy stru to temp &&生成临时文件,存储合并数据
hbbb="" &&保存合并数据的变量
hbdd="" &&保存合并数据的变量
do whil recc()>0
go 1
stor allt(a) to aa
stor allt(c) to cc
stor allt(b) to bb
stor allt(d) to dd
count for allt(A)=aa .and. allt(C)=cc to sc &&计算与第一条记录A列和C列相同的记录条数
if sc=1
dele for allt(A)=aa .and. allt(C)=cc &&删除已经统计过的数据,避免重复统计
pack &&删除已经统计过的数据,避免重复统计
use temp
appe blan
repl A with aa,B with bb,C with cc,D with dd &&向临时数据库中添加统计结果
else
k=1
loca for allt(A)=aa .and. allt(C)=cc
if found()
if sc>1
do whil k<=sc
stor allt(b) to bb
stor allt(d) to dd
dele &&删除已经统计过的数据,避免重复统计
pack &&删除已经统计过的数据,避免重复统计
hbbb=hbbb+","+bb &&合并A列和C列相同的记录的B、D列
hbdd=hbdd+","+dd &&合并A列和C列相同的记录的B、D列
loca for allt(A)=aa .and. allt(C)=cc
k=k+1
endd
endi
use temp
appe blan
repl A with aa,B with subs(allt(hbbb),2,len(allt(hbbb))-1),C with cc,D with subs(allt(hbdd),2,len(allt(hbdd))-1) &&向临时数据库中添加统计结果
hbbb=""
hbdd=""
endi
endi
clos data
use 10086
endd
clos data
dele file 10086.dbf &&注意此处删除了你的原始文件,如果你要保留你的原始文件,请先备份
rena temp.dbf to 10086.dbf &&将临时文件改名为10086.dbf
use 10086
brow
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shishuyuan777
2011-05-12 · 超过29用户采纳过TA的回答
知道答主
回答量:162
采纳率:0%
帮助的人:106万
展开全部
use 10086
kkk=""
Clear
PUBL mc
kh=1
mm=reccount()
i=FCOUNT()
GO top
DO while kh<mm
GO kh
DIMENSION myarray(i)
SCATTER to myarray(i)
xh1=myarray(1)
FOR j=2 to i
jj=allt(str(j))
zd&jj=""
xh1&jj=myarray(j)
ENDFOR
DO while.not.eof()
IF .not.eof()
Skip
IF mc=xh1
FOR j=2 to i
jj=allt(str(j))
bn=fields(j)
xh1&jj=allt(xh1&jj)+","+allt(&bn)
ENDFOR
Dele
mm=mm-1
ENDIF
ENDIF
ENDDO
FOR j=2 to i
jj=allt(str(j))
bn=fields(j)
REPL &bn with xh1&jj for mc=xh1
ENDFOR
kh=kh+1
ENDDO
PACK
RETURN
这个问题你让我耗费了一天半的时间,脑袋都要炸了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hjwaNF
2011-05-12 · TA获得超过1479个赞
知道小有建树答主
回答量:1025
采纳率:71%
帮助的人:542万
展开全部
编程可解决吧。你的问题是要按A和C合并B和D,而且B和D都是字符型的。不知这个理解对不对呢
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
ldurabe
2011-05-14 · TA获得超过1945个赞
知道小有建树答主
回答量:975
采纳率:0%
帮助的人:579万
展开全部
dsa
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式