主题:foxpro 表 程序设计
mkcryins
[专家分:0] 发布于 2011-03-14 11:47:00
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个回复)
沙发
mkcryins [专家分:0] 发布于 2011-03-14 16:26:00
....高手都隐藏着,不说话呢。。。。。
板凳
yksfzp [专家分:200] 发布于 2011-03-14 19:07:00
可以用循环方式实现替换
QQ:249074734
3 楼
liupeisong [专家分:2340] 发布于 2011-03-14 19:17:00
这种结构设计得有问题,A的字段名和B表中的内容相关连了,假如B中出错了或者要增加一个科目就麻烦了。估计是某个不懂数据库基本原理只学过两天VF的老师出的题目,汗一个先!
至于楼主的题目,可以使用宏来实现(就是字符串的连接),当然前提是只有cj001,cj002,cj003三个字段(否则还要判断表中是否有对应字段,非常复杂)。下面命令序列可供参考一下
cj001=3
kmh='001'
kemu='CJ'
curkm=kemu+kmh
STORE 4 TO &curkm
?cj001
? &curkm
4 楼
wanglx20010701 [专家分:0] 发布于 2011-03-29 22:16:00
将第二个库的科目分出来,一个科目一个库,关联替换完事
5 楼
lszwhy [专家分:10] 发布于 2011-04-19 17:09:00
用成绩更新,一次集中更新与多次分次更新,程序是不同的,同时还要避免重复。我这有工作中用到的程序,与要求基本相似,现列下共参考:
*程序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 楼
lszwhy [专家分:10] 发布于 2011-04-19 17:41:00
xj表字段包括:姓名 学号 课程名称1 成绩1 课程名称2 成绩2 ......
集中一次性添加的:cj1表字段除姓名、学号外,各科成绩字段以K1、K2、K3.....标识,第一行与K对应的 是各科名称,其它各行填各人相应成绩,格式如下:
姓名 学号 K1 K2 K3 ......
会计学 英语 法学 ......
姓名1 200900.. 85 78 83 ......
......
分科单独添加,cj2表字段:姓名 学号 课程名称 成绩
7 楼
xplong82 [专家分:0] 发布于 2011-06-18 16:30:00
****** 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 楼
xplong82 [专家分:0] 发布于 2011-06-18 16:32:00
楼主 想要的 就是这最后的 三行
9 楼
lygcw9603 [专家分:250] 发布于 2012-01-27 13:29:00
请参照:http://bbs.pfan.cn/post-369662.html
10 楼
jiafangliang [专家分:0] 发布于 2012-02-07 20:12:00
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
我来回复