User Tools

Site Tools


position_return_record_sequence_position_.htm
Navigation:  Language Reference > 13 - Built-in Functions > POINTER (return last queue entry position) >====== POSITION (return record sequence position) ====== Previous pageReturn to chapter overviewNext page

POSITION( sequence )

blk2blue.jpg

POSITION Identifies a record's unique position in a FILE or VIEW or QUEUE.
sequence The label of a VIEW, FILE, KEY, or INDEX or QUEUE declaration.

POSITION returns a STRING which identifies a record's unique position within the sequence. POSITION returns the position of the last record accessed in the file or VIEW. The POSITION procedure is used with RESET to temporarily suspend and resume sequential processing.

FILE usage

black.jpg

The value contained in the returned STRING and the length of that STRING are dependent on the file driver. As a general rule, for file systems that have record numbers, the size of the STRING returned by POSITION(file) is 4 bytes. The return string from POSITION(key) is 4 bytes plus the sum of the sizes of the fields in the key. For file systems that do not have record numbers, the size of the STRING returned by POSITION(file) is generally the sum of the sizes of the fields in the Primary Key (the first KEY on the FILE that does not have the DUP or OPT attribute). The return string from POSITION(key) is the sum of the sizes of the fields in the Primary Key plus the sum of the sizes of the fields in the key.

VIEW usage

black.jpg

The return string for POSITION(view) contains all the information required by the underlying file system to reset to the one specific position within the record set currently in the VIEW. It also contains the file system's POSITION return value for the primary file key and all secondary file linking keys. This allows POSITION(view) to accurately define a position for all related records in the VIEW.

QUEUE usage

black.jpg

POSITION(queue) returns a pointer to the first queue record with a matching key value (for current active sort order). If an exact match is not found, a pointer to the next entry greater to one given in the current queue buffer is returned. If all entries in the queue have a lower key, RECORDS(queue)+1 is returned.

Errors Posted:

35 Record Not Found
30 Entry Not Found (QUEUE specific)

Return Data Types:

LONG for POSITION(QUEUE)
STRING all others

Example of (POSITION(VIEW)):

ViewO VIEW(Customer)  !Declare VIEW structure
      PROJECT(Cus:AcctNumber,Cus:Name)
       JOIN(Hea:AcctKey,Cus:AcctNumber) !Join Header file
       PROJECT(Hea:OrderNumber)
        JOIN(Dtl:OrderKey,Hea:OrderNumber) !Join Detail file
        PROJECT(Det:Item,Det:Quantity)
         JOIN(Pro:ItemKey,Dtl:Item) !Join Product file
         PROJECT(Pro:Description,Pro:Price)
         END
        END
       END
      END
RecordQue  QUEUE,PRE(Que)
AcctNumber  LIKE(Cus:AcctNumber)
Name        LIKE(Cus:Name)
OrderNumber LIKE(Hea:OrderNumber)
Item        LIKE(Det:Item)
Quantity    LIKE(Det:Quantity)
Description LIKE(Pro:Description)
Price       LIKE(Pro:Price)
          END
SavPosition STRING(260)
  CODE
  OPEN(Customer,22h)
  OPEN(Header,22h)
  OPEN(Detail,22h)
  OPEN(Product,22h)
  SET(Cus:AcctKey)
  OPEN(ViewOrder)                    !Top of file in keyed sequence
  LOOP                               !Read all records in file
   NEXT(ViewOrder)                   !read a record sequentially
   IF ERRORCODE()  
      DO DisplayQue                  !Display the queue
      BREAK
   END
   RecordQue :=: Cus:Record          !Move record into queue
   RecordQue :=: Hea:Record          !Move record into queue
   RecordQue :=: Dtl:Record          !Move record into queue
   RecordQue :=: Pro:Record          !Move record into queue
   ADD(RecordQue)                    !and add it
   ASSERT(~ERRORCODE())
   IF RECORDS(RecordQue) = 20        !20 records in queue?
      DO DisplayQue                  !Display the queue
   END
  END
 
DisplayQue ROUTINE
  SavPosition = POSITION(ViewOrder)!Save record position
  DO ProcessQue                    !Display the queue
  FREE(RecordQue)                  !and free it
  RESET(ViewOrder,SavPosition)     !Reset the record pointer
  NEXT(ViewOrder)                  !and get the record again

Example (POSITION(QUEUE)):

TaxQ   QUEUE
LowPay      DECIMAL(9,2)
HighPay     DECIMAL(9,2)
TaxAmount   DECIMAL(9,2)
PlusPercent DECIMAL(5,2)
      END
Bracket     LONG,AUTO `
  CODE
  SORT(TaxQ, TaxQ.HighPay)         !Set sort order
  TaxQ.HighPay = PayCheck.GrossPay !Initialize QUEUE key field
  Bracket = POSITION(TaxQ)         !Find pay bracket 
  !If Queue was not SORTed, an ERRORCODE 30 will be posted here.
  IF Bracket > RECORDS(TaxQ)       !If value exceeds number of records
     Bracket = RECORDS(TaxQ)       !in QUEUE, set to highest value in QUEUE
  END
  GET(TaxQ,Bracket)                !read QUEUE entry
  Paycheck.Tax = TaxAmount + |     !calculation based on QUEUE entry
    (Paycheck.Gross-TaxQ.LowPay)*TaxQ.PlusPercent

See Also:

RESET

REGET

position_return_record_sequence_position_.htm.txt · Last modified: 2022/11/08 15:09 by carlbarnes