注册 登录
编程论坛 VFP论坛

同名字段替换找不到列

fdqzy 发布于 2020-10-22 17:41, 2192 次点击
程序代码:
create cursor b1 (jnh N(2),m1 c(3),m2 c(3))
insert into b1 values (1,"","")
insert into b1 values (2,"","")
insert into b1 values (3,"","")
insert into b1 values (4,"","")
insert into b1 values (5,"","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")
***b1、b2字段名同,但记录数不同
SeLe   b1
mcount=Afields(marray)

      FOR i=1 TO mcount
         UPDATE b1 SET b1.marray(i,1)=b2.marray(i,1) from b2 WHERE b1.jnh==b2.jnh  &&用b2替换b1相同字段
      ENDFOR

运行时提示:SQL找不到列
但单独测试又找得到字段名
不知问题在哪?
如果部分字段名相同,能否用b2替换b1同名字段值?
如:
程序代码:
create cursor b1 (jnh N(2),,m0 c(3),m1 c(3),m2 c(3),m3 c(3),)
insert into b1 values (1,"","","","")
insert into b1 values (2,"","","","")
insert into b1 values (3,"","","","")
insert into b1 values (4,"","","","")
insert into b1 values (5,"","","","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")


[此贴子已经被作者于2020-10-22 18:16编辑过]

18 回复
#2
sdta2020-10-22 18:21
程序代码:
create cursor b1 (jnh N(2),m1 c(3),m2 c(3))
insert into b1 values (1,"","")
insert into b1 values (2,"","")
insert into b1 values (3,"","")
insert into b1 values (4,"","")
insert into b1 values (5,"","")
INDEX on jnh TAG aa
create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")
SET RELATION TO jnh INTO b1
SCAN
    REPLACE m1 WITH b2.m1, m2 WITH b2.m2 IN b1
ENDSCAN
SET RELATION TO
SELECT b1
SET ORDER TO
BROWSE
#3
sdta2020-10-22 18:25
程序代码:
create cursor b1 (jnh N(2),m0 c(3),m1 c(3),m2 c(3),m3 c(3))
insert into b1 values (1,"","","","")
insert into b1 values (2,"","","","")
insert into b1 values (3,"","","","")
insert into b1 values (4,"","","","")
insert into b1 values (5,"","","","")
INDEX on jnh TAG aa
create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")
SET RELATION TO jnh INTO b1
SCAN
    REPLACE m1 WITH b2.m1, m2 WITH b2.m2 IN b1
ENDSCAN
SET RELATION TO
SELECT b1
SET ORDER TO
BROWSE
#4
fdqzy2020-10-22 18:45
回复 3楼 sdta
辛苦版主!
能否在字段名用通用型?
上面的问题是替换字段太多,写代码麻烦,才提出此问题。
#5
sdta2020-10-22 19:08
解决问题要用实例
放上实际用表及要解决的问题
#6
吹水佬2020-10-22 19:50
b1.marray(i,1) 这样表达字段名不可以的吧
字段名变动的,之前的贴也有提到:
https://bbs.bccn.net/thread-503305-1-1.html
变通一下就可以
#7
fdqzy2020-10-22 20:23
回复 6楼 吹水佬
程序代码:

create cursor b1 (jnh N(2),m1 c(3),m2 c(3))
insert into b1 values (1,"","")
insert into b1 values (2,"","")
insert into b1 values (3,"","")
insert into b1 values (4,"","")
insert into b1 values (5,"","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")
SELECT b1
mcount=Afields(marray)
scan
      FOR i=2 TO mcount
         kk1='b1.'+marray(i,1)
         kk2='b2.'+marray(i,1)
              
         REPLACE (kk1) WITH EVALUATE(kk2) FOR b1.jnh==b2.jnh
      ENDFOR
endscan


程序代码:

SELECT b1
mcount=Afields(marray)
      FOR i=2 TO mcount
         kk1='b1.'+marray(i,1)
         kk2='b2.'+marray(i,1)
              
         REPLACE (kk1) WITH EVALUATE(kk2) FOR b1.jnh==b2.jnh
      ENDFOR

只替换b2最后一个值

[此贴子已经被作者于2020-10-22 20:25编辑过]

#8
fdqzy2020-10-22 20:32
回复 6楼 吹水佬
还是7楼的问题

[此贴子已经被作者于2020-10-22 20:41编辑过]

#9
吹水佬2020-10-22 21:07
程序代码:
create cursor b1 (jnh N(2),m1 c(3),m2 c(3))
insert into b1 values (1,"","")
insert into b1 values (2,"","")
insert into b1 values (3,"","")
insert into b1 values (4,"","")
insert into b1 values (5,"","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")

SELECT b2
INDEX on jnh TAG jnh

SELECT b1
nCount = FCOUNT()
SET RELATION TO jnh INTO "b2"
SCAN
    IF FOUND("b2")
        FOR i=2 TO nCount
            kk1='b1.'+FIELD(i)
            kk2='b2.'+FIELD(i)
            REPLACE (kk1) WITH EVALUATE(kk2)
        ENDFOR
    ENDIF
ENDSCAN
SET RELATION TO
BROWSE
#10
fdqzy2020-10-22 21:09
第1个问题可以了
程序代码:
create cursor b1 (jnh N(2),m1 c(3),m2 c(3))
insert into b1 values (1,"","")
insert into b1 values (2,"","")
insert into b1 values (3,"","")
insert into b1 values (4,"","")
insert into b1 values (5,"","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")
SELECT b1
mcount1=Afields(marray1)
SELECT b2
mcount2=Afields(marray2)
SELECT 1

      FOR i=2 TO mcount1
         kk1='b1.'+marray1(i,1)
         kk2='b2.'+marray2(i,1)
         UPDATE b1 SET &kk1=&kk2 from b2 WHERE b1.jnh==b2.jnh     
        
      ENDFOR
     
brow         


[此贴子已经被作者于2020-10-22 21:11编辑过]

#11
fdqzy2020-10-22 21:18
1楼第2个问题不知怎么解决?
#12
fdqzy2020-10-22 22:05
回复 9楼 吹水佬
谢谢!
1楼弟2个问题如何解决?
#13
吹水佬2020-10-22 22:11
回复 12楼 fdqzy
字段名可以不相同
kk1取b1的字段名
kk2取b2的字段名
#14
fdqzy2020-10-22 22:53
以下是引用吹水佬在2020-10-22 22:11:48的发言:

字段名可以不相同
kk1取b1的字段名
kk2取b2的字段名

1楼第2个问题是:
b1和b2的字段数不同,但关键字和部分字段名相同,在b1中寻找与b2相同的字段名,用b2替换b1字段名相同的字段值。
#15
fdqzy2020-10-23 09:14
以下是引用吹水佬在2020-10-22 21:07:51的发言:

create cursor b1 (jnh N(2),m1 c(3),m2 c(3))
insert into b1 values (1,"","")
insert into b1 values (2,"","")
insert into b1 values (3,"","")
insert into b1 values (4,"","")
insert into b1 values (5,"","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")

SELECT b2
INDEX on jnh TAG jnh

SELECT b1
nCount = FCOUNT()
SET RELATION TO jnh INTO "b2"
SCAN
    IF FOUND("b2")
        FOR i=2 TO nCount
            kk1='b1.'+FIELD(i)
            kk2='b2.'+FIELD(i)
            REPLACE (kk1) WITH EVALUATE(kk2)
        ENDFOR
    ENDIF
ENDSCAN
SET RELATION TO
BROWSE

    这个问题解决了字段名不同、相同字段序数相同问题。
    但字段序数不同的同名字段如何解决(1楼的第2个问题)?
主要是如何比较两表动态字段相同的问题。
故请教!

[此贴子已经被作者于2020-10-23 09:37编辑过]

#16
sdta2020-10-23 09:36
以下是引用fdqzy在2020-10-23 09:14:27的发言:


这个问题解决了字段名不同、相同字段序数相同问题。
但字段序数不同的同名字段如何解决?
    以上问题的提出是:在一个表中提取部分数据再进行其他统计(原表某些字段未统计),统计后将新的结果替换原表未统计的字段,
因替换字段有点多,一个一个写替换代码,有点麻烦,故想能否用这种办法解决。后一个问题用得有点多,我未找到解决的方法,主要是如何比较两表动态字段相同的问题。
故请教!

3楼的代码看了吗
#17
吹水佬2020-10-23 11:18
以下是引用fdqzy在2020-10-22 17:41:32的发言:

如果部分字段名相同,能否用b2替换b1同名字段值?
如:
create cursor b1 (jnh N(2),,m0 c(3),m1 c(3),m2 c(3),m3 c(3),)
insert into b1 values (1,"","","","")
insert into b1 values (2,"","","","")
insert into b1 values (3,"","","","")
insert into b1 values (4,"","","","")
insert into b1 values (5,"","","","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")


程序代码:
create cursor b1 (jnh N(2),m0 c(3),m1 c(3),m2 c(3),m3 c(3))
insert into b1 values (1,"","","","")
insert into b1 values (2,"","","","")
insert into b1 values (3,"","","","")
insert into b1 values (4,"","","","")
insert into b1 values (5,"","","","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")

SELECT b2
INDEX on jnh TAG jnh

SELECT b1
SET RELATION TO jnh INTO "b2"
SCAN
    IF FOUND("b2")
        FOR i=2 TO FCOUNT("b2")
            cf = FIELD(i,"b2")
            IF !EMPTY(FIELD(cf,"b1"))
                kk1 = 'b1.' + cf
                kk2 = 'b2.' + cf
                REPLACE (kk1) WITH EVALUATE(kk2) IN "b1"
            ENDIF
        ENDFOR
    ENDIF
ENDSCAN
SET RELATION TO
BROWSE

#18
fdqzy2020-10-23 14:24
以下是引用吹水佬在2020-10-23 11:18:13的发言:



create cursor b1 (jnh N(2),m0 c(3),m1 c(3),m2 c(3),m3 c(3))
insert into b1 values (1,"","","","")
insert into b1 values (2,"","","","")
insert into b1 values (3,"","","","")
insert into b1 values (4,"","","","")
insert into b1 values (5,"","","","")

create cursor b2 (jnh N(2),m1 c(3),m2 c(3))
insert into b2 values (1,'M1',"")
insert into b2 values (3,"M1","M2")
insert into b2 values (4,"M1","")

SELECT b2
INDEX on jnh TAG jnh

SELECT b1
SET RELATION TO jnh INTO "b2"
SCAN
    IF FOUND("b2")
        FOR i=2 TO FCOUNT("b2")
            cf = FIELD(i,"b2")
            IF !EMPTY(FIELD(cf,"b1"))
                kk1 = 'b1.' + cf
                kk2 = 'b2.' + cf
                REPLACE (kk1) WITH EVALUATE(kk2) IN "b1"
            ENDIF
        ENDFOR
    ENDIF
ENDSCAN
SET RELATION TO
BROWSE

谢谢!
#19
fdqzy2020-10-23 14:36
以下是引用sdta在2020-10-23 09:36:48的发言:


3楼的代码看了吗

看了。
谢谢版主!
这个代码是对已知道字段名一一去写替换代码,当需要替换的字段名多了,写起来就有点烦锁,就想寻个方便的方法不一个一个去写替换代码。
1