回 帖 发 新 帖 刷新版面

主题:急!!!!请高手相助!!!

本人工作巳十年,好久没编程,而且当时学的还是FOXPRO2.0,现在工作需要现急编程,但不知怎的好像进入死循环,或者调用进程需要太多时间?两个文件均有10万行数据.现请高手指点;

进程如下:

sele 1
use c:\fpxs.dbf
index on nsrsbh to ls1.idx
set index to ls1.idx
sele 2
use c:\fpsf.dbf
index on nsrsbh to ls2.idx
set index to ls2.idx
sele 1
go top
ls4=1
do while .not.eof()
   ls1=alltrim(a.nsrsbh)
   ls2=alltrim(a.rq)
   ls3=alltrim(a.je)
   sele 2
   go top
   do while .not.eof()
       if ls1>alltrim(b.nsrsbh)
           dele
       endif       
       if ls1=alltrim(b.nsrsbh) .and. ls2=alltrim(b.yzfsrq) .and. ls3=alltrim(b.sjse)
          sele 1
          dele
          sele 2 
          exit
       endif
       skip
       if ls1<alltrim(nsrsbh)
          exit
       endif
    enddo
    sele 1
    ls4=ls4+1
    if ls4=10000 .or. ls4=20000 .or. ls4=30000 .or. ls4=40000 .or.ls4=50000 .or. ls4=60000 .or. ls4=70000 .or. ls4=80000 
    sele 2
     pack
    sele 1
    endif  
    skip
 enddo
 sele 1
 pack
 close all
 

回复列表 (共3个回复)

沙发

1、没有必要在程序中每次都建索引,只要在表建立时或在命令行形式下建立就行了。
2、用CDX比IDX好。第三行改为index on nsrsbh tag nsrsbh,在命令行下执行。set index to ls1.idx可以删除了,打开表时会自动打开CDX索引的。表2的改进类似。
3、在循环过程中不要进行PACK,处理完再PACK。SET dele on就行了。
4、不知道你的表是什么结构,如果总用字符函数去处理,特别是取字符的处理,对速度会有影响。

板凳

楼主想做什么?如果不是商业密秘,可否告知?也许有更简捷的代码可以实现

3 楼

分析下,大致如下即可完成你所要做的(试用前请备份你的数据库):

(只是不理解‘je’{可能是‘金额’}怎么是字符型)

USE table1 IN 0 EXCLUSIVE   && 在此把索引也打开(根据索引类型的语句也不同,你自己填)
USE table2 IN 0 EXCLUSIVE   && 同上

DELETE table2 FROM table1 a WHERE table2.nsrsbh<a.nsrsbh
PACK

SELECT table1
DELETE table1 FROM table2 a WHERE table1.nsrsbh=a.nsrsbh AND table1.rq=alltrim(a.yzfsrq) AND table1.je=alltrim(a.sjse)
PACK

USE
SELECT table2
USE

我来回复

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