Consultor Eletrônico



Kbase 18961: ADM2. Procedure to implement Incremental Search on Browse Widget
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   16/10/2008
Status: Unverified

GOAL:

How to implement an incremental search on a browse widget.

FACT(s) (Environment):

Progress 7.X
Progress 8.X
Progress 9.X
ADM2

FIX:

A radio-set allows shifting the search to be either numeric (customer number), or alphabetic (customer name).

DEFINE VARIABLE intVar AS INTEGER NO-UNDO.
DEFINE VARIABLE RADIO-SET-1 AS INTEGER
LABEL "Sort By/Search By"
VIEW-AS RADIO-SET VERTICAL
RADIO-BUTTONS "Customer Number",1,"Customer Name", 2 NO-UNDO.
DEFINE BUFFER Buff_Cust FOR CUSTOMER.
DEFINE VARIABLE FILL-IN-1 AS CHARACTER FORMAT "x(20)"
LABEL "Enter Search String"
VIEW-AS FILL-IN NO-UNDO.
DEFINE QUERY q_cust FOR Customer SCROLLING.
DEFINE BROWSE b_cust QUERY q_cust
DISPLAY Customer.Cust-Num
Customer.Name
WITH SIZE 50 BY 8.

DEFINE FRAME F-Main RADIO-SET-1 AT 1
FILL-IN-1 AT 30 SKIP(1)
b_cust AT 15
WITH CENTERED ROW 5 WIDTH 80.

MAIN-BLOCK:
DO:
ASSIGN SESSION:DATA-ENTRY-RETURN = FALSE.
OPEN QUERY q_cust FOR EACH CUSTOMER NO-LOCK.
ENABLE ALL WITH FRAME F-Main.
STATUS INPUT "Searching by Customer Number".
END.

ON VALUE-CHANGED OF RADIO-SET-1 IN FRAME F-Main DO:
CASE RADIO-SET-1:SCREEN-VALUE.
WHEN "1" THEN DO:
STATUS INPUT "Searching by Customer Number".
OPEN QUERY q_cust FOR EACH Customer
NO-LOCK BY Customer.Cust-Num.
END.
WHEN "2" THEN DO:
STATUS INPUT "Searching by Customer Name".
OPEN QUERY q_cust FOR EACH Customer
NO-LOCK BY Customer.Name.
END.
END.
END.

ON ANY-PRINTABLE OF FILL-IN-1 IN FRAME F-Main DO:
ASSIGN SELF:SCREEN-VALUE IN FRAME F-Main =
SELF:SCREEN-VALUE IN FRAME F-Main + CHR(LASTKEY).
RUN REPOSQUERY.
APPLY "CURSOR-RIGHT":U TO FILL-IN-1 IN FRAME F-Main.
RETURN NO-APPLY.
END.

ON RETURN OF FILL-IN-1 IN FRAME F-Main DO:
RUN REPOSQUERY.
APPLY "ENTRY" TO FILL-IN-1 IN FRAME F-Main.
DO intVar = 1 TO LENGTH(FILL-IN-1:SCREEN-VALUE IN FRAME F-Main):
APPLY "CURSOR-RIGHT" TO FILL-IN-1 IN FRAME F-Main.
END.
END.

WAIT-FOR "ENDKEY","GO" OF THIS-PROCEDURE.

PROCEDURE REPOSQUERY:
IF RADIO-SET-1:SCREEN-VALUE IN FRAME F-Main = "2" THEN DO:
FIND FIRST Buff_Cust WHERE Buff_Cust.Name BEGINS
FILL-IN-1:SCREEN-VALUE IN FRAME F-Main
NO-LOCK NO-ERROR.

IF AVAILABLE Buff_Cust THEN DO:
REPOSITION q_cust TO RECID RECID(Buff_Cust).
END.
END.
IF RADIO-SET-1:SCREEN-VALUE IN FRAME F-Main = "1" THEN DO:
FIND FIRST Buff_Cust WHERE Buff_Cust.Cust-Num
>= INTEGER(FILL-IN-1:SCREEN-VALUE IN FRAME F-Main)
NO-LOCK NO-ERROR.

IF AVAILABLE Buff_Cust THEN DO:
REPOSITION q_cust TO RECID RECID(Buff_Cust).
END.
END.
END.