分享

如何在VFP中随机抽取表的N个记录

 lygcw9603 2011-12-23

如何在VFP中随机抽取表的N个记录_红虎

1    ******************************************************
2    ***  本HTML页面由红虎工作室的 PRG2HTML 生成器产生  ***
3    ***  生成器版本 共享版 1.0 build0922 (Honghoo.NET) ***
4    ******************************************************
5      
6    *-- 首先打开你要抽取的表,并将它的别名以参数的形式传入
7    *-- 再加上要抽取的记录数
8    DO GetRandRecord WITH "table1",10
9      
10    *-- 随机从一个表获取N个不重复的记录
11    *-- 红虎 于 2008.04.21
12    PROCEDURE GetRandRecord
13        LPARAMETERS tcSourceTable , tnRecordN
14        *-- 参数说明:源表,就是从哪个表取纪录
15        *              记录数,就是随机要取得个数
16      
17        IF PARAMETERS() <> 2
18            MESSAGEBOX("参数个数不正确!",48,"参数错误")
19            RETURN
20        ENDIF
21        
22        IF TYPE("tcSourceTable") <> "C"
23            MESSAGEBOX("第一个参数需要传递一个源数据表名!",64,"参数提示")
24            RETURN  
25        ENDIF
26        
27        IF TYPE("tnRecordN") <> "N"
28            MESSAGEBOX("第二个参数需要传递一个需要取的记录数 N !",64,"参数提示")
29            RETURN
30        ENDIF
31            
32        IF !USED("&tcSourceTable")
33            MESSAGEBOX("源表没有打开!",48,"警告")
34            RETURN  
35        ELSE
36            SELECT &tcSourceTable
37            IF RECCOUNT() < tnRecordN
38                MESSAGEBOX("数据源的记录总数还没有要取得数量多,不能继续!",16,"错误")
39                RETURN
40            ENDIF        
41        ENDIF
42        
43        *-- 定义变量
44        LOCAL lcTempTable        && 用来存放取到的记录号,也可用数组实现
45        LOCAL lcResultTable     && 用来存放取到的记录
46        LOCAL lnRandRecord        && 随机的数    
47        LOCAL lnSourceCount        && 数据源的总数
48        LOCAL i
49        
50        lcTempTable = "temp" + SYS(2015)
51        lcResultTable = "Result" + SYS(2015)
52        
53        lnSourceCount = RECCOUNT(tcSourceTable)
54        
55        *-- 创建临时表用来存放记录号
56        CREATE CURSOR &lcTempTable ( RecordNo n (10) )
57        *-- 创建结果表
58        SELECT &tcSourceTable
59        COPY STRUCTURE TO &lcResultTable
60        USE &lcResultTable ALIAS &lcResultTable IN 0
61        
62        *-- 开始循环找N个记录出来
63        i=1
64        DO WHILE i<=tnRecordN
65        
66            WAIT WINDOW "正在抽取第 " + ALLTRIM(STR(i)) + " 个随机记录..." NOWAIT  
67        
68            *-- 得到一个0到源记录数的一个随机数
69            lnRandRecord = INT(RAND() * lnSourceCount)
70        
71            *-- 为零的不要
72            IF lnRandRecord = 0  
73                LOOP  
74            ENDIF
75            
76            *-- 已有的不要
77            SELECT &lcTempTable
78            LOCATE FOR RecordNo = lnRandRecord
79            IF FOUND()
80                LOOP
81            ENDIF
82            
83            *-- 剩下的是有用的
84            SELECT &tcSourceTable
85            GOTO lnRandRecord
86            SCATTER TO memv memo
87            
88            SELECT &lcTempTable
89            APPEND BLANK
90            REPLACE RecordNo WITH lnRandRecord
91            
92            SELECT &lcResultTable
93            APPEND BLANK
94            GATHER FROM memv memo
95            
96            i = i + 1    
97        ENDDO
98        
99        WAIT WINDOW "抽取 " + ALLTRIM(STR(tnRecordN)) + " 个随机记录完毕!" nowait
100            
101        SELECT &lcResultTable
102        BROWSE TITLE "抽到的结果"
103        
104    ENDPROC  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多