Hi all,
Here is a mystery that I have been beating my head against a wall with. This code
processes about 8,000 records just fine then, with about 2,000 records to go, goes
into a infinite loop where variables have to have the same value but do not. if I
reverse the sort order, the problem happens after about 300 records.
P800, 512MB Ram, Windows XP Pro, R:Base 6.5++ 1.864xRT03.
Suddenly the second while loop starts evaluating as False, even though the values are
being set immediately above it to insure a True evaluation. I have even inserted
diagnostic code to check the length (SLEN) of the values which has shown that the
variables do contain the same text information of the same length but they are being
evaluated as different. In one variation of the diagnostics I checked all three
values in an IF statement, if one was false I checked each one individually to
determine which one. The check of the 3 indicated that 1 was false, the individual
check found all to be True ... go figure.
Any Ideas?
Thanks,
Michael
Michael Moser
EXAQ Micro Services
Phone: 916-768-7656
Fax: 916-966-8313
(Note: the quotes change allows me to insert a text value for "Id" using the 'text'
format.)
SET QUOTES="
SET V WhereClause = +
("Where id IS NOT NULL and Qty < 0 and SvcCode <> 10")
SET QUOTES='
DECLARE PTR1 CURSOR FOR SELECT +
Id,tDate,SvcCode,SvcDesc,Qty,SvcPr,SvcTot,SCS,Paid,tDOE +
FROM Transactions ORDER BY SCS=A, id, SvcCode &WhereClause
OPEN PTR1
SET V LastId TEXT = 'NONE'
FETCH PTR1 INTO +
oscId X1, osctDate X1, oscSvcCode X1, oscSvcDesc X1, oscQty X1, +
oscSvcPr X1, oscSvcTot X1, oscSCS X1, oscPaid X1, osctDOE X1
IF SQLCODE <> 100 THEN
SET V LoopStatus = 'RUN'
ELSE
SET V LoopStatus = 'STOP'
ENDIF
WHILE LoopStatus <> 'STOP' THEN
IF oscId = .LastId AND oscSCS = .LastSCS AND LoopStatus = 'RUN' THEN
-- this should NEVER happen but it does.
write 'error 1'
ENDIF
-- ... more code here
SET V LastSCS TEXT = .oscSCS
SET V LastId = .oscId
WHILE oscId = .LastId AND oscSCS = .LastSCS AND LoopStatus = 'RUN' THEN
-- ... more code here
FETCH PTR1 INTO +
oscId X1, osctDate X1, oscSvcCode X1, oscSvcDesc X1, oscQty X1, +
oscSvcPr X1, oscSvcTot X1, oscSCS X1, oscPaid X1, osctDOE X1
IF SQLCODE <> 100 THEN
SET V LoopStatus = 'RUN'
ELSE
SET V LoopStatus = 'STOP'
ENDIF
IF oscId <> .LastId OR oscSCS <> .LastSCS OR LoopStatus <> 'RUN' THEN
write 'message 1, ok to exit exit loop'
ENDIF
ENDWHILE
ENDWHILE
DROP CURSOR PTR1
RETURN