再一个更新问题:同表更新
各位老师,我这有个表,字段很多(200左右),因时间积累或录入先后不同,造成关键字相同,各个字段内容不全,现在想要完整的一条记录,将其余不全的删除。
就是同一个表中,例如表test中 有关键字相同的多个记录,我想把第2,3...填充到第一条记录中,同样:
若第一个记录字段不为空,则不更新该字段;
若第一个记录字段为空,且第2条对应字段不为空,则用第二条记录的字段替换;
若第一个记录字段为空,第2条对应字段也为空,则用第三条,第四,第五。。。不为空的记录的字段替换;
若相应字段都为空,无须替换;
最后要保留第一条记录,也就是把第2,3...剩余的记录删除,请问如何实现啊?
[解决办法]
CLEAR ALL
SELECT *,ff(fk)+spac(100) as newfield FROM test INTO CURSOR dd1
SELECT *,RECNO() as jl FROM dd1 INTO CURSOR dd
SELECT * FROM dd a WHERE NOT exists(SELECT 1 FROM dd WHERE fk=a.fk AND jl>a.jl) INTO dbf test
FUNCTION ff(dd)
ff1=""
SELECT * FROM testa WHERE fk=dd INTO CURSOR tt
SCAN
ff1=ff1+nvl(ALLTRIM(l1),'')+nvl(ALLTRIM(l2),'')+nvl(ALLTRIM(l3),'')+nvl(ALLTRIM(l4),'')+nvl(ALLTRIM(l5),'')+nvl(ALLTRIM(l6),'')
ENDSCAN
RETURN ff1
ENDFUNC
[解决办法]
Close Databases All
Set Default To C:\&& 假设这个表在 C:\
Select * Into Cursor T1 From Test Order By fk
Select T1
Scan
Update Test.Dbf Set L1=Evl(Test.L1,T1.L1),L2=Evl(Test.L2,T1.L2),L3=Evl(Test.L3,T1.L3),L4=Evl(Test.L4,T1.L4),L5=Evl(Test.L5,T1.L5),L6=Evl(Test.L6,T1.L6) Where Test.FK=T1.FK
Endscan
Select test
Index On fk To fksy
Total To 结果表.Dbf On fk Fields L1
Close Databases All
[解决办法]
USE test
INDEX ON fk TO test &&建立索引,以确保关键字连续
SCATTER TO ar BLANK
SCAN
IF ar[1] != fk
IF ! EMPTY(ar[1])
r = RECNO()
GO rec
GATHER FROM ar
GO r
ENDIF
SCATTER TO ar
rec = RECNO()
ELSE
FOR i=2 TO ALEN(ar)
IF EMPTY(ar[i])
ar[i] = EVAL(FIELD(i))
ENDIF
NEXT
DELETE
ENDIF
ENDSCAN