回 帖 发 新 帖 刷新版面

主题:foxpro 表 程序设计

foxpro中两个表A、B,
其中表A含有字段,
分别xh(学号)、xm(姓名)、cj001(成绩1)、cj002(成绩2)、cj003(成绩3)
    2010001    张三           *                  *           *
    2010002    李四           *                   *          *
    。。。 
    。。。
表B:
    xh          kmh(科目)   cj(成绩)
   2010001      001            95
   2010001      002            65
   2010001      003            46
   2010002      001            64
   2010002      002            48
   2010002      003            58
   ....         ...             ..

将表B中的成绩数据更新到表A。
如:
分别xh(学号)、xm(姓名)、cj001(成绩1)、cj002(成绩2)、cj003(成绩3)
    2010001    张三           95                 65           46
    2010002    李四           64                 48           58

其中表B kmh 001与表A cj001,相对应


     请问这个程序应该怎么写啊?!!!!!!
请高手联系qq:232622130     !!!!!!!!
感谢啊!!!

回复列表 (共10个回复)

沙发


....高手都隐藏着,不说话呢。。。。。

板凳

可以用循环方式实现替换

QQ:249074734

3 楼

这种结构设计得有问题,A的字段名和B表中的内容相关连了,假如B中出错了或者要增加一个科目就麻烦了。估计是某个不懂数据库基本原理只学过两天VF的老师出的题目,汗一个先!

至于楼主的题目,可以使用宏来实现(就是字符串的连接),当然前提是只有cj001,cj002,cj003三个字段(否则还要判断表中是否有对应字段,非常复杂)。下面命令序列可供参考一下
cj001=3
kmh='001'
kemu='CJ'
curkm=kemu+kmh
STORE 4 TO &curkm
?cj001
? &curkm

4 楼


将第二个库的科目分出来,一个科目一个库,关联替换完事

5 楼


用成绩更新,一次集中更新与多次分次更新,程序是不同的,同时还要避免重复。我这有工作中用到的程序,与要求基本相似,现列下共参考:

*程序1,用于集中更新
sele 1
USE xj.dbf
go top
sele 2
use cj1
m=fcount()-2
x=min(m,28) &&28为28门课,可根据需要设定
do whil .not.eof()
sele 1
loca for 姓名=allt(b.姓名) and 学号=allt(b.学号)
if eof()
sele 2
skip
loop
endi
i=1
do whil i<=x
N=allt(str(i,2))
repl 成绩&n with allt(b.K&n)
i=i+1
enddo
sele 2
jlh=recn()
go top
sele 1
i=1
do whil i<x
N=allt(str(i,2))
repl 课程名称&n with allt(b.K&n)
i=i+1
enddo
sele 2
go jlh
skip
enddo
clos data

*程序2,用于分次更新
sele 1
USE xj.dbf 
sele 2
use cj2
go top
do whil .not.eof()
i=1
b=' '
do whil i<=28 &&28为28门课,可根据需要设定
y=allt(str(i,2))
sele 1
loca for 姓名=allt(b.姓名) and 学号=allt(b.学号)
if 课程名称&y=' '
repl 课程名称&y with allt(b.课程名称)
repl 成绩&y with allt(b.成绩)
exit
endi
if allt(课程名称&y)#' '
  b=b+课程名称&y+' '  
 if allt(课程名称&y)$b &&避免重复
 exit
 else
 i=i+1
endi
endi
enddo
sele 2
skip
enddo
clos data


6 楼

xj表字段包括:姓名 学号 课程名称1 成绩1 课程名称2 成绩2 ......
集中一次性添加的:cj1表字段除姓名、学号外,各科成绩字段以K1、K2、K3.....标识,第一行与K对应的 是各科名称,其它各行填各人相应成绩,格式如下:
姓名    学号        K1       K2        K3   ......  
            会计学   英语   法学 ...... 
姓名1  200900..      85        78        83   ......  
......

分科单独添加,cj2表字段:姓名 学号 课程名称 成绩

7 楼

****** data

CREATE CURSOR a (xh c (9),xm c(8),cj001 n(5,1),cj002 n(5,1),cj003 n(5,1))

CREATE CURSOR b (xh c (9),xm c(3),cj n(5,1))

INSERT INTO b (xh ,xm ,cj) VALUES ('2010001', '001',95)
INSERT INTO b (xh ,xm ,cj) VALUES ('2010001', '002',65)
INSERT INTO b (xh ,xm ,cj) VALUES ('2010001', '003',45)

INSERT INTO b (xh ,xm ,cj) VALUES ('2010002', '001',64)
INSERT INTO b (xh ,xm ,cj) VALUES ('2010002', '002',48)
INSERT INTO b (xh ,xm ,cj) VALUES ('2010002', '003',58)

****** 加入a表中缺的 xh
SELECT distinct xh FROM b INTO CURSOR tmpXh WHERE xh NOT in ( select xh FROM a)
SELECT a
APPEND FROM DBF('tmpXh')
USE IN tmpXh
*****  更新a表                此命令 vfp 8.0 才能运行
UPDATE a SET cj001=b.cj WHERE a.xh==b.xh AND b.xm='001' from b
UPDATE a SET cj002=b.cj WHERE a.xh==b.xh AND b.xm='002' from b
UPDATE a SET cj003=b.cj WHERE a.xh==b.xh AND b.xm='003' from b

8 楼

楼主 想要的 就是这最后的 三行

9 楼

请参照:http://bbs.pfan.cn/post-369662.html

10 楼

IF !USED('表A')
   USE 表A in 0 ALIAS A
ENDIF 
IF !USED('表B')
   USE 表B in 0 ALIAS B
ENDIF 
SELECT B        
GO top
DO WHILE !EOF()
   xh1=xh
   cj1=成绩
   cjm='cj'+ALLTRIM(kmh)
   SELECT A
   LOCATE FOR xh=xh1
   IF EOF()
      APPEND BLANK 
   ENDIF    
   replace &cjm WITH cj1
   SELECT B
   SKIP
enddo   

我来回复

您尚未登录,请登录后再回复。点此登录或注册