请教!数据统计速度太慢,如何提高?
如题!需求:
统计18.01.01-18.05.31之间,每个学生的交费总额;
说明:
sysxsdatol:是学生信息表;
sysxsdabjjl:是交费记录表;
两个表中的xh和xm是连接数据的对应关系。
我之前的解决思路:
1、先读取18.01.01-18.05.31之间的交费记录数据;
2、之后以交费记录表为准,删除学生信息表中不在范围内的学生信息;
3、最后以学生信息表为准,在交费记录表中统计每个学生的具体交费总额;并保存在jf字段中。
因为数据涉及量较大,速度很慢,能不能提速!?请各位大神指导!
程序代码:close all
clear all
PUBLIC syswindir,SYSCURUSER,sysdatebeginvar ,sysdateendvar
syswindir = ''
SYSCURUSER='李'
sysdatebeginvar = ctod('2018.05.01')
sysdateendvar = ctod('2018.05.31')
? sysdatebeginvar , sysdateendvar
********************************************************获取系统目录
DECLARE LONG GetWindowsDirectory IN WIN32API STRING @ lcWinDir, LONG
LOCAL lcWinDir, lnStringLen
lcWinDir = SPACE(200) + CHR(0)
lnStringLen = GetWindowsDirectory(@lcWinDir, 200)
syswindir = LEFT(lcWinDir,lnStringLen) + '\LkySharedTemp'
CLEAR DLLS
IF .NOT. DIRECTORY(syswindir)
MD &syswindir
ENDIF
***********************************************************************************************************************************************
public oldsec
oldsec=SECONDS( )
valoldsec=SECONDS( )
tempdbfnamevar1=tempdbffileverify()
SELECT * FROM sysxsdatol INTO TABLE &tempdbfnamevar1 ORDER BY xh asc , xm asc
use
sele sysxsdatol
use
******************************************************获取统计时间段内有交费记录的学生
tempdbfnamevar2=tempdbffileverify()
SELECT * FROM sysxsdabjjl INTO TABLE &tempdbfnamevar2 WHERE jfrq>=sysdatebeginvar and jfrq<=sysdateendvar ORDER BY xh asc , xm asc
use
sele sysxsdabjjl
use
oldseccc=alltrim(str(SECONDS( )-valoldsec))
valoldsec=SECONDS( )
? '准备数据用时[ '+oldseccc+' ]秒!'
sele 1
use &tempdbfnamevar1 EXCLUSIVE &&tol
replace bj with .f. all
go top
sele 2
use &tempdbfnamevar2 EXCLUSIVE &&bjjl
crecc=alltrim(str(reccount()))
scan
WAIT WINDOW '进程:' + ALLTRIM (STR (RECNO ()))+ "/" + crecc NOWAIT
sele 1
replace bj with .t. for (alltrim(xh)==alltrim(B->xh) .and. alltrim(xm)==alltrim(B->xm))
sele 2
endscan
sele 1
delete for !bj
pack
oldseccc=alltrim(str(SECONDS( )-valoldsec))
valoldsec=SECONDS( )
? '清查数据用时[ '+oldseccc+' ]秒!'
***************************************************************************************合计交费记录
crecc=alltrim(str(reccount()))
jfjecc=0.00
scan
WAIT WINDOW '进程:' + ALLTRIM (STR (RECNO ()))+ "/" + crecc NOWAIT
jfjecc=0.00
sele 2
sum jfje to jfjecc for alltrim(xh)==alltrim(A->xh) and alltrim(xm)==alltrim(A->xm)
sele 1
replace jf with jfjecc , tjrq with date()
endscan
sele 2
sum jfje to cacc
? cacc
sele 1
sum jf to facc
? facc
? facc-cacc
oldseccc=alltrim(str(SECONDS( )-valoldsec))
valoldsec=SECONDS( )
? '合计用时[ '+oldseccc+' ]秒!'
oldseccc=alltrim(str(SECONDS( )-oldsec))
? '总用时[ '+oldseccc+' ]秒!'
********************************************************************************************************************************************************************************************
PROCEDURE lockdbf
wait window "文件被其他用户锁定,正常排队...请稍候!" nowait
do while !flock()
enddo
wait clear
endproc
********************************************************核查临时表,存放在本地系统盘
PROCEDURE tempdbffileverify
if .not. directory(syswindir)
md &syswindir
endif
tempdbfnamevar0=syswindir+'\'+left(alltri(sys(0)),at('#',alltrim(sys(0)))-2)+right(Chrtran(Dtoc(Date()),'.',''),6)+Chrtran(Chrtran(time(0),':',''),'.','')+SYSCURUSER+'.dbf'
do while file(tempdbfnamevar0)
tempdbfnamevar0=syswindir+'\'+left(alltri(sys(0)),at('#',alltrim(sys(0)))-2)+right(Chrtran(Dtoc(Date()),'.',''),6)+Chrtran(Chrtran(time(0),':',''),'.','')+SYSCURUSER+'.dbf'
enddo
return(tempdbfnamevar0)
endproc
[此贴子已经被作者于2018-7-2 16:40编辑过]


