main logo
Subject: Re: R e a l l y S L O W execution...
Author: Jose Constant
Posted: 2002/10/30 09:29:21
 
View Entire Thread
New Search


<i><font color="#663300">Hi all,

Good to see some activity here again! I'm replacing an old Clipper app (not mine)with VFP7/CB6.2. Still a relative newbe to vfp (I remember when I could write apps and proceedures that mostly worked first time :( ). Anyway, I've developed a form to convert the data tables to the new app, but it's running gawd awful slow--about 10 minutes to convert a table of about 1200 records to a new table with the same amount of records and a child with up to 4 times as many records. Following is a code snippet. Can anyone spot my malfunction?
**********************************
PROCEEDURE PopulateLoanTable()
LOCAL lnOldSelect, lcSelection, lcFile, lcField, lnPass, lnLNR, lnAmt
This.SetPrimaryBizobj(This.boLoan)
lnOldSelect = SELECT(0)

SELECT 0

FOR lnPass = 1 TO 4
DO CASE
CASE lnPass = 1
This.DisplayStatus('Converting from NPAWN!LOAN to EUPS!LOAN...')
lcSelection = 'LOAN.*'
lcFile = ALLTRIM(This.txtPath.value) + 'LOAN'
lcField = 'LOAN.CNR'
[snip]
ENDCASE

SELECT (lcSelection), Client.iID ;
FROM (lcFile) LEFT OUTER JOIN EUPS!Client ;
ON &lcField # 0 .AND. &lcField = Client.cnr ;
INTO CURSOR OLD

SCAN
This.New()
REPLACE v_LoanE.cAgent WITH OLD.INIT ;
v_LoanE.cLoanNr WITH PADL(ALLTRIM(STR(OLD.LNR)), 8) ;
v_LoanE.dDueDate WITH OLD.DUE ;
v_LoanE.dLoanDate WITH OLD.LDT ;
v_LoanE.iClientID WITH IIF(!ISNULL(OLD.iID), OLD.iID, 0) ;
v_LoanE.lClientOnly WITH .T. ;
v_LoanE.yMonthlySC WITH NTOM(OLD.IAMT) ;
v_LoanE.yPrincipleAmt WITH NTOM(OLD.LAMT)

IF lnPass = 3 .OR. lnPass = 4
REPLACE v_LoanE.lPaidOff WITH .T. ;
v_LoanE.dDispDate WITH OLD.POFF
ENDIF

This.PopulateLoanItemsTable(.F.)
This.save()
ENDSCAN

USE
This.DisplayStatus('done')
ENDFOR
[snip]
************************

PROCEEDURE PopulateLoanItemsTable()
LPARAMETERS lINV
LOCAL x, lcMak, lcMod, lcSer, lcDes

IF lINV
[snip]
ELSE
*code to break out items from NPAWN!LOAN
FOR x = 1 TO 4
lcMak = 'OLD.MAK' + STR(x,1)
lcMod = 'OLD.MOD' + STR(x,1)
lcSer = 'OLD.SER' + STR(x,1)
lcDes = 'OLD.DES' + STR(x,1)

IF EMPTY(&lcMak) .AND. EMPTY(&lcMod) .AND. ;
EMPTY(&lcSer) .AND. EMPTY(&lcDes)
LOOP
ENDIF

This.boLoanItems.new()
REPLACE v_LItems.cDescription WITH &lcDes ;
v_LItems.cInventoryNr WITH cbnewid('INVENTORYNR') ;
v_LItems.cMake WITH &lcMak ;
v_LItems.cModel WITH &lcMod ;
v_LItems.cSerial WITH &lcSer ;
v_LItems.iQty WITH 1 ;
v_LItems.mNotes WITH OLD.DESC + ' ' + &lcDes
ENDFOR
ENDIF

RETURN
****************************
Thanks, Virgil</font></i>

Virgil,

I did not examine all your code in detail. Anyway, do you really need a form to perform this? Wouldn't a straight procedure be enough? I'm pretty sure you'd gain lots of seconds.

If you need to keep the form, reexamine your code. You could probably make your views table buffered and save all at once. Also avoid to display to much info to the user :)

Jose
Jose Constant
Constant Software Systems
Belgium
<a href=http://www.constant.be/css target=_blank>Jose's Web Site</a>
 
©2002 Jose Constant
<-- Prior Message New Search Next Message -->