| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 796 人关注过本帖, 1 人收藏
标题:请求表数据筛选问题
只看楼主 加入收藏
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 10楼 吹水佬
请教先生,您的运行代码是怎样的,能找到符合要求的,我运行了几天还是没有找到啊
2015-09-21 09:30
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
我是试算的。
先获取1...32中任选16个的组合作为记录号再求和比较。
因总共有6亿多个组合,一个文件存放不下,要分段处理。
我的机上试1...4开头的记录组合分了4次来处理,5开头的一次就可以。
试算代码:
程序代码:
ASTACKINFO(a程序)
SET DEFAULT TO ADDBS(JUSTPATH(a程序[2]))     
CLEAR
SET TALK OFF
CLOSE DATABASES ALL 

m = 32
n = 16
k1 = 1    && 1...17,开头记录号

USE 原表 IN 0
IF FILE("记录表.dbf")
    USE 记录表 IN 0
ELSE
    CREATE TABLE 记录表 (记录号列表 C(48))
ENDIF
CREATE CURSOR dd (ff I)
FOR i = 1 TO m
    APPEND BLANK
ENDFOR
REPLACE ff WITH RECNO() ALL
szSELECT = "d1.ff"
szFROM   = "dd d1"
szWHERE  = "d1.ff<d2.ff"
FOR i = 2 TO n
    szSELECT = szSELECT + ",d" + TRANSFORM(i) + ".ff"
    szFROM   = szFROM   + ",dd d" + TRANSFORM(i)
    IF i > 2
        szWHERE  = szWHERE  + " AND d" + TRANSFORM(i-1) + ".ff<d" + TRANSFORM(i) + ".ff"
    ENDIF
ENDFOR

T1 = DATETIME()

FOR k2 = k1+1 TO 18
? k2
FOR k3 = k2+1 TO 19
FOR k4 = k3+1 TO 20

szWHERE2  = "d1.ff=" + TRANSFORM(k1) + " AND " +;
            "d2.ff=" + TRANSFORM(k2) + " AND " +;
              "d3.ff=" + TRANSFORM(k3) + " AND " +;
              "d4.ff=" + TRANSFORM(k4) + " AND " + szWHERE

EXECSCRIPT("SELECT " + szSELECT + " FROM " + szFROM + " WHERE " + szWHERE2 + " INTO CURSOR tmp")

SELECT tmp
SCAN
    STORE 0 TO n列1, n列2, n列3, n列4
    FOR i = 1 TO n
        nRec = EVALUATE(FIELD(i, "tmp"))
        GO nRec IN "原表"
        n列1 = n列1 + 原表.列1
        n列2 = n列2 + 原表.列2
        n列3 = n列3 + 原表.列3
        n列4 = n列4 + 原表.列4
    ENDFOR
    IF (n列1 == n列2) AND ((n列3 + 7864320) == n列4)
        APPEND BLANK IN "记录表"
        sz记录号列表 = TRANSFORM(EVALUATE(FIELD(1, "tmp")))
        FOR i = 2 TO n
            sz记录号列表 = sz记录号列表 + "," + TRANSFORM(EVALUATE(FIELD(i, "tmp")))
        ENDFOR
        REPLACE 记录号列表 WITH sz记录号列表 IN "记录表"
    ENDIF
ENDSCAN
SELECT tmp
USE

ENDFOR
ENDFOR
ENDFOR

? DATETIME() - T1
SELECT 记录表 
BROWSE
CLOSE DATABASES ALL 
RETURN


[ 本帖最后由 吹水佬 于 2015-9-21 10:42 编辑 ]
2015-09-21 10:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
我的机上找(k1=1) 1开头的也要花成2个小时。
2015-09-21 10:44
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
也可用递归算法,就不受文件大小的限制(如果符合条件的组合不多),可以在获取各个记录组合时就求合计比较条件,只保存符合条件的记录组合。
2015-09-21 10:50
快速回复:请求表数据筛选问题
数据加载中...
 
   



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

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