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

Reply via email to