| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3507 人关注过本帖
标题:求助,合并表
只看楼主 加入收藏
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
CLOSE DATABASES
USE A10 IN 0
FOR I=1 TO ADIR(ADBF,"*.DBF")
    APPEND FROM (ADBF[I,1])
ENDFOR
BROWSE

坚守VFP最后的阵地
2017-11-05 09:20
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用tjdeming在2017-11-5 07:41:19的发言:

谢谢 就给的例子如何解决?

是不是这样结果:
图片附件: 游客没有浏览图片的权限,请 登录注册

CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20), 总量 N(10,2))
FOR i=1 TO ADIR(arr, "*.dbf")
    USE (arr[i,1]) ALIAS tt IN 0
    FOR j=1 TO AFIELDS(af, "tt")
        IF EMPTY(FIELD(af[j,1],"合并表"))
            par = af[j,1]+" "+af[j,2] + "("+TRANSFORM(af[j,3])
            IF af[j,2] == "N"
                par = par+","+TRANSFORM(af[j,4])
            ENDIF
            par = par+")"
            EXECSCRIPT("ALTER TABLE 合并表 ADD COLUMN " + par)
        ENDIF
    ENDFOR
    SELECT 合并表
    APPEND FROM DBF("tt")
    USE IN "tt"
ENDFOR
SELECT 合并表
GO TOP
BROWSE
2017-11-05 16:04
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用吹水佬在2017-11-5 16:04:12的发言:


是不是这样结果:

CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20), 总量 N(10,2))
FOR i=1 TO ADIR(arr, "*.dbf")
    USE (arr) ALIAS tt IN 0
    FOR j=1 TO AFIELDS(af, "tt")
        IF EMPTY(FIELD(af[j,1],"合并表"))
            par = af[j,1]+" "+af[j,2] + "("+TRANSFORM(af[j,3])
            IF af[j,2] == "N"
                par = par+","+TRANSFORM(af[j,4])
            ENDIF
            par = par+")"
            EXECSCRIPT("ALTER TABLE 合并表 ADD COLUMN " + par)
        ENDIF
    ENDFOR
    SELECT 合并表
    APPEND FROM DBF("tt")
    USE IN "tt"
ENDFOR
SELECT 合并表
GO TOP
BROWSE

楼主发的A10.DBF 是汇总表

坚守VFP最后的阵地
2017-11-05 17:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册:2014-5-20
收藏
得分:0 
“汇总表效果如表A10 : 工号,姓名,部门,不同表的字段,总量”
是按这句话说法去理解的,不知有无理解错。
为操作方便变动了一下: 工号,姓名,部门,总量,不,同,表,的,字,段
2017-11-05 19:09
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
以下是引用吹水佬在2017-11-5 19:09:28的发言:

“汇总表效果如表A10 : 工号,姓名,部门,不同表的字段,总量”
是按这句话说法去理解的,不知有无理解错。
为操作方便变动了一下: 工号,姓名,部门,总量,不,同,表,的,字,段

可能是我理解错了

CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20), 总量 N(10,2))
FOR i=1 TO ADIR(adbf,"*.dbf")
    SELECT * FROM (adbf[i,1]) WHERE .F. INTO CURSOR tt
    FOR ii=4 TO AFIELDS(azdm,"tt")
        IF TYPE("合并表."+azdm[ii,1])=="U"
            cf=azdm[ii,1]+" "+azdm[ii,2]+"("+TRANSFORM(azdm[ii,3])+","+TRANSFORM(azdm[ii,4])+")"
            ALTER TABLE 合并表 ADD &cf
        ENDIF
    ENDFOR
    USE IN (adbf[i,1])
    USE IN tt
    SELECT 合并表
    APPEND FROM (adbf[i,1])
ENDFOR
BROWSE

坚守VFP最后的阵地
2017-11-05 19:48
tjdeming
Rank: 2
等 级:论坛游民
帖 子:429
专家分:54
注 册:2013-3-4
收藏
得分:0 
回复 15楼 sdta
合并表完成了,谢谢吹水佬版主和sdta版主,二位版主的程度我都试用了后,有一点我没有注意到:合并表里想达到一人一条记录的结果。现在我把每个表特意添加了一条记录工号姓名部门相同的信息如999张支的信息要在一条记录上。
现附上附件
求完善,谢谢
合并表.rar (2.04 KB)
2017-11-05 22:56
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用tjdeming在2017-11-5 22:56:05的发言:

合并表完成了,谢谢吹水佬版主和sdta版主,二位版主的程度我都试用了后,有一点我没有注意到:合并表里想达到一人一条记录的结果。现在我把每个表特意添加了一条记录工号姓名部门相同的信息如999张支的信息要在一条记录上。
现附上附件
求完善,谢谢

是不是这样:
图片附件: 游客没有浏览图片的权限,请 登录注册

CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20))
FOR i=1 TO ADIR(arr, "*.dbf")
    USE (arr[i,1]) ALIAS tt IN 0
    SELECT DISTINCT 工号,姓名,部门 FROM tt WHERE 工号 NOT in (SELECT 工号 FROM 合并表) INTO CURSOR tmp
    INSERT INTO 合并表 (工号,姓名,部门) SELECT 工号,姓名,部门 FROM tmp
    FOR j=1 TO AFIELDS(af, "tt")
        IF EMPTY(FIELD(af[j,1],"合并表"))
            par = af[j,1]+" "+af[j,2] + "("+TRANSFORM(af[j,3])
            IF af[j,2] == "N"
                par = par+","+TRANSFORM(af[j,4])
            ENDIF
            par = par+")"
            EXECSCRIPT("ALTER TABLE 合并表 ADD COLUMN " + par)
        ENDIF
        IF af[j,1]!="工号" AND af[j,2]=="N"
            EXECSCRIPT("UPDATE 合并表 SET 合并表."+af[j,1]+"=合并表."+af[j,1]+"+tt."+af[j,1]+" from tt WHERE 合并表.工号==tt.工号")
        ENDIF
    ENDFOR
    USE IN "tt"
ENDFOR
SELECT * FROM 合并表
2017-11-06 08:48
tjdeming
Rank: 2
等 级:论坛游民
帖 子:429
专家分:54
注 册:2013-3-4
收藏
得分:0 
回复 17楼 吹水佬
谢谢吹大侠,这是正是我想要的结果.
CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20),总量 n(10,2))
合并表的字段名,我把总量放在了部门后面:即工号、姓名、部门、总量、字段1、字段2、字段3、……
能否在程序里做个审核  总量=字段1+字段2+字段3…… 的逻辑性
                 如果有 总量<>各字段之和的 则提示并显示该记录,以便手工或自动修正数据.想保证数据的正确性.
求再完善.
另,吹大侠用的是VFP9.0的   而我单位上班的电脑是VFP6.0的,我只能在家里多干一点了.
2017-11-06 21:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10608
专家分:43186
注 册:2014-5-20
收藏
得分:10 
以下是引用tjdeming在2017-11-6 21:59:00的发言:

谢谢吹大侠,这是正是我想要的结果.
CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20),总量 n(10,2))
合并表的字段名,我把总量放在了部门后面:即工号、姓名、部门、总量、字段1、字段2、字段3、……
能否在程序里做个审核  总量=字段1+字段2+字段3…… 的逻辑性
                 如果有 总量<>各字段之和的 则提示并显示该记录,以便手工或自动修正数据.想保证数据的正确性.
求再完善.
另,吹大侠用的是VFP9.0的   而我单位上班的电脑是VFP6.0的,我只能在家里多干一点了.

看提供的几个表,各表好象没有相同工号的记录,如果有就要先分类统计。
如果各表字段名相对固定的话,代码就不用那么复杂,执行起来也会快点。
检查 总量<>各字段之和,后面增加检查代码:
par = "总量<>("
FOR j=1 TO AFIELDS(af, "合并表")
    IF af[j,2]=="N" AND !INLIST(af[j,1],"工号","总量")
        par = par + "+"+af[j,1]
    ENDIF
ENDFOR
par = par + ")"
SELECT 合并表
EXECSCRIPT("LOCATE FOR " + par)
IF FOUND()
    ? "错误数据的记录:", par
    DO WHILE FOUND()
        ? 工号,姓名,部门
        CONTINUE
    ENDDO
ENDIF
*EXECSCRIPT("SELECT * FROM 合并表 WHERE " + par)
2017-11-06 23:39
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:10 
VFP6.0代码
程序代码:
clear
CLOSE DATABASES ALL
SET COLLATE TO "MACHINE" 
CREATE CURSOR 合并表 (工号 N(4,0), 姓名 C(8), 部门 C(20), 总量 N(10,2))
FOR i=1 TO ADIR(adbf,"*.dbf")
    USE (adbf[i,1]) IN 0 ALIAS tt
    *!* 第一步:检查表中的平衡关系
    SELECT tt
    cField=""
    FOR ii=4 TO FCOUNT()-1
        cField=cField+IIF(EMPTY(cField),"","+")+FIELD(ii)
    ENDFOR
    SELECT * FROM tt WHERE 总量!=&cField INTO CURSOR TTT
    * 平衡关系发生错误时弹出浏览窗口,显示错误记录
    IF _TALLY>0
        BROWSE FOR 总量!=&cField TITLE adbf[i,1]+"  平衡关系发生错误,请手工修改数据!"
        USE IN ttt
    ENDIF 
    *!* 第二步:合并表中增加字段
    FOR ii=4 TO AFIELDS(azdm,"tt")
        IF TYPE("合并表."+azdm[ii,1])=="U"
            cf=azdm[ii,1]+" "+azdm[ii,2]+"("+TRANSFORM(azdm[ii,3])+","+TRANSFORM(azdm[ii,4])+")"
            ALTER TABLE 合并表 ADD &cf
        ENDIF 
    ENDFOR
    *!* 第三步:向 合并表 中添加数据
    SELECT 合并表
    INDEX ON 工号 TAG PX
    SELECT tt
    SET RELATION TO 工号 INTO 合并表
    SCAN
        IF NOT FOUND("合并表")
            INSERT INTO 合并表 (工号,姓名,部门) VALUES (tt.工号,tt.姓名,tt.部门)
        ENDIF
        FOR ii=4 TO FCOUNT("tt")
            nValue=EVALUATE(FIELD(ii,"tt"))
            REPLACE (FIELD(ii,"tt")) WITH EVALUATE("合并表."+FIELD(ii,"tt"))+nValue IN 合并表
        ENDFOR
    ENDSCAN
    USE IN tt
ENDFOR
SELECT 合并表
LOCATE
BROWSE

坚守VFP最后的阵地
2017-11-07 02:13
快速回复:求助,合并表
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020409 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved