[<<Previous Entry] [^^Up^^] [Next Entry>>] [Menu] [About The Guide]
 DBSETORDER()
 Bug in workarea buffering
----------------------------------------------------------------------------------

 The problem is that Clipper 5.2c NTX driver does not properly update
 the record pointer when indexorder is changed.  See examples below:

 An apparent fix is to add DBGOTO( RECNO() ) after SET ORDER / DBSETORDER()

  FIELD Date, Code, Qty
  LOCAL n := 1, nRec
  dbCreate( "Test", ;
   { {"Date", "D", 8, 0}, {"Code" , "C", 4, 0}, {"Qty"  , "N", 4, 0} } )
  CLS
  USE Test NEW
  dbAppend() ; Date := DATE()     ; Code := "001" ; Qty := 100
  dbAppend() ; Date := DATE() + 1 ; Code := "002" ; Qty := 200
  dbAppend() ; Date := DATE() + 2 ; Code := "003" ; Qty := 300
  dbAppend() ; Date := DATE() + 3 ; Code := "004" ; Qty := 400
  INDEX ON Date TO Test1 ; INDEX ON Code TO Test2
  SET INDEX TO Test1, Test2
  WHILE n < 3
    SET ORDER TO 2
    * DBGOTO( RECNO() )      // Uncomment to fix.
    ? nRec := RECNO()
    dbSkip() ; dbSkip(-1)
    ?? RECNO()
    IF( n == 2, QQOUT( " <- Should be 2" ), )
    SET ORDER TO 1
    * DBGOTO( RECNO() )      // Uncomment to fix.
    Qty := 0.0
    n ++
    dbSkip()
  END
  USE

  EXAMPLE 2
  FIELD Date, Code, Qty
  LOCAL nRec, cCode, dDate := CTOD("06/08/92")
  DBCREATE( "Test", ;
   { {"Date", "D", 8, 0}, {"Code" , "C", 3, 0}, {"Qty"  , "N", 4, 0} } )
  CLS
  USE Test NEW
  dbAppend() ; Date := CTOD("05/27/92") ; Code := "001" ; Qty := 100
  dbAppend() ; Date := CTOD("05/27/92") ; Code := "002" ; Qty := 200
  dbAppend() ; Date := CTOD("05/27/92") ; Code := "003" ; Qty := 300
  dbAppend() ; Date := CTOD("06/08/92") ; Code := "001" ; Qty := 100
  dbAppend() ; Date := CTOD("06/08/92") ; Code := "002" ; Qty := 200
  dbAppend() ; Date := CTOD("06/08/92") ; Code := "003" ; Qty := 300
  INDEX ON DTOS(Date) + Code TO Index1
  INDEX ON Code + DTOS(Date) TO index2
  SET INDEX TO Index1, Index2
  SEEK DTOS( dDate )
  WHILE Date == dDate
    nRec := RECNO()  ;  cCode := Code
    SET ORDER TO 2
    * DBGOTO( RECNO() )      // Uncomment to fix.
    QOUT(  Date, Code, RECNO(), " " )
    DBSKIP( -1 )
    * Code := cCode     // Uncomment for more trouble.
    QQOUT( Date, Code, RECNO(), " " )
    QQOUT( IF( Code == cCode, "Ok     ", "Problem" ) )
    DBGOTO( nRec )
    SET ORDER TO 1
    * DBGOTO( RECNO() )      // Uncomment to fix.
    Qty := 0
    DBSKIP()
    QQOUT( RECNO() )     // Should never be less than 5.
  ENDDO
  QOUT( "-------------------" )
  LIST Date, Code, Qty
  USE
  ?

  (Modified Submittal from Peter Birch, 70473,552, 6/93)
  (jwf 9/1/93)

.

This page created by ng2html v1.05, the Norton guide to HTML conversion utility. Written by Dave Pearson