`
Par2: Locator on a queue 2001-04-27 -- Robert Pupazzoni it's not necessary to loop thru the entire queue searching for a partial match... If a queue GET() fails to locate an exact match, you simply ADD() a "dummy" record to the queue, primed with the appropriate search fields, then immediately DELETE() it. The POSITION() function will then return the index where the record *would have been found* (had it actually been there). I have successfully used this technique to implement entry and incremental locators on queue-based browses. Here is an actual code snippet which implements an entry search on a queue-based browse with multiple sort orders: !------------------------------------------------------------------------- EntrySearch ROUTINE !------------------------------------------------------------------------- ! First, try to find exact match sLocator = UPPER(sLocator) CASE CHOICE(?sSortOrder) OF 1 qList.INH:Invoice_No = sLocator GET(qList, -qList.INH:Invoice_No) OF 2 qList.INH:Inv_Date = DEFORMAT(sLocator, @d2) GET(qList, -qList.INH:Inv_Date) OF 3 qList.INH:BL_Number = sLocator GET(qList, -qList.INH:BL_Number) END ! Clarion docs incorrectly claim POINTER() is set to closest match on failed ! lookup. Let's workaround by adding and immediately deleting a dummy entry IF ERRORCODE() ! Could not find exact match, add a "dummy" record, primed with the search parameter CASE CHOICE(?sSortOrder) OF 1 qList.INH:Invoice_No = CLIP(qList.INH:Invoice_No) & ALL('<255>') ADD(qList, -qList.INH:Invoice_No) OF 2 qList.INH:Inv_Date += 1 ADD(qList, -qList.INH:Inv_Date) OF 3 qList.INH:BL_Number = CLIP(qList.INH:BL_Number) & ALL('<255>') ADD(qList, -qList.INH:BL_Number) END ! Delete the "dummy" record DELETE(qList) END ! Now that POINTER() is set correctly, move the hilite bar to closest matching location SELECT(?List, POINTER(qList)) Printed November 23, 2024, 5:14 pm This article has been viewed/printed 35251 times. |