Consultor Eletrônico



Kbase P129040: How to use SET-SORT-ARROWS method to identify sort order
Autor   Progress Software Corporation - Progress
Acesso   Público
Publicação   18/02/2008
Status: Unverified

GOAL:

How to use SET-SORT-ARROWS method to identify sort order

FACT(s) (Environment):

Windows 32 Intel
OpenEdge 10.1B
OpenEdge Category: Language (4GL/ABL)

FIX:

OpenEdge 10.1B introduced a new feature that allows ABL programmers to
display one or more sort arrows on browse column labels to indicate the
column(s) and direction of the sort of the browse query.
This feature allows the browse to display one or more arrows in browse column labels showing a number indicating the sort priority; i.e. the order in which the columns were specified in the query's sort phrase. The following code shows a best practices example of code that allows a user to click on a column label in a browse to sort and reverse the sort of the browse query. This example only demonstrates single column sorting for simplicity. DEFINE VARIABLE gcColumns AS CHARACTER NO-UNDO.
DEFINE VARIABLE gcLastColumn AS CHARACTER NO-UNDO.
DEFINE VARIABLE gcWhere AS CHARACTER NO-UNDO
INITIAL "". DEFINE VARIABLE hColumn AS HANDLE NO-UNDO. DEFINE VARIABLE iCust AS INTEGER NO-UNDO. DEFINE TEMP-TABLE Cust NO-UNDO
FIELD custnum AS INTEGER LABEL "Cust Num"
FIELD name AS CHARACTER LABEL "Customer" FORMAT "x(30)"
FIELD state AS CHARACTER LABEL "State"
FIELD salesrep AS CHARACTER LABEL "Sales Rep" FORMAT "x(12)"
INDEX custnum IS PRIMARY UNIQUE custnum. DEFINE QUERY browCust FOR Cust SCROLLING. DEFINE BROWSE browCust QUERY browCust
DISPLAY custnum WIDTH 18
name
state
salesrep
WITH 5 DOWN WIDTH 75. DEFINE FRAME fCust browCust. ON START-SEARCH OF browCust DO:
DEFINE VARIABLE cCurrentColumn AS CHARACTER NO-UNDO. /* Clear arrows for next usage */
SELF:CLEAR-SORT-ARROW().
cCurrentColumn = SELF:CURRENT-COLUMN:NAME. RUN resortQuery ( INPUT SELF:QUERY,
INPUT cCurrentColumn ). /* Set the current sort direction on the current column */
SELF:SET-SORT-ARROW(LOOKUP(cCurrentColumn,
gcColumns),
(gcLastColumn NE cCurrentColumn)). APPLY "END-SEARCH" TO SELF. /* Store current column and direction for next sort */
IF gcLastColumn EQ cCurrentColumn THEN
gcLastColumn = cCurrentColumn + " DESC".
ELSE
gcLastColumn = cCurrentColumn.
END. DO ON ERROR UNDO, LEAVE:
DO iCust = 1 TO 100:
CREATE Cust.
ASSIGN custnum = iCust
name = "Customer" + STRING(iCust)
state = (IF (iCust MOD 2) EQ 0 THEN "NH" ELSE "MA")
salesrep = (IF (iCust MOD 2) EQ 0 THEN "BBB" ELSE "HXM").
END. /* Save of a list of columns */
hColumn = BROWSE browCust:FIRST-COLUMN.
&nb.sp; DO WHILE VALID-HANDLE(hColumn):
gcColumns = gcColumns + (IF (gcColumns GT "") EQ TRUE THEN ","
ELSE "") +
hColumn:NAME.
hColumn = hColumn:NEXT-COLUMN.
END. /* Setup best browse sorting options */
ASSIGN BROWSE browCust:ALLOW-COLUMN-SEARCHING = TRUE
gcLastColumn = "custnum".
BROWSE browCust:SET-REPOSITIONED-ROW(INTEGER(ABSOLUTE(BROWSE browCust:DOWN / 2)),
"CONDITIONAL").
BROWSE browCust:SET-SORT-ARROW(1,TRUE). OPEN QUERY browCust FOR EACH Cust.
ENABLE ALL WITH FRAME fCust.
WAIT-FOR CLOSE OF THIS-PROCEDURE.
END. PROCEDURE resortQuery:
DEFINE INPUT PARAMETER phQuery AS HANDLE NO-UNDO.
DEFINE INPUT PARAMETER pcSortField AS CHARACTER NO-UNDO. DEFINE VARIABLE cPredicate AS CHARACTER NO-UNDO. DEFINE VARIABLE iBuffer AS INTEGER NO-UNDO. DEFINE VARIABLE lAscending AS LOGICAL NO-UNDO. DEFINE VARIABLE hBuffer AS HANDLE NO-UNDO EXTENT 18. DEFINE VARIABLE rowRepos AS ROWID NO-UNDO EXTENT 18. lAscending = (pcSortField NE gcLastColumn). /* Extract direction */
DO iBuffer = 1 TO phQuery:NUM-BUFFERS: /* Build query predicate */
ASSIGN hBuffer[iBuffer] = phQuery:GET-BUFFER-HANDLE(iBuffer)
cPredicate = cPredicate + (IF iBuffer EQ 1 THEN
"FOR EACH "
ELSE ", FIRST ") +
hBuffer[iBuffer]:NAME +
(IF (ENTRY(iBuffer,gcWhere,CHR(1)) GT "") EQ TRUE THEN
" WHERE " + ENTRY(iBuffer,gcWhere,CHR(1))
ELSE "") +
(IF (pcSortField GT "") EQ TRUE THEN
&nbsp.; " BY " + pcSortField +
(IF NOT lAscending THEN
" DESC"
ELSE "")
ELSE "")
rowRepos[iBuffer] = (IF hBuffer[iBuffer]:AVAILABLE THEN
hBuffer[iBuffer]:ROWID
ELSE ?).

END.

phQuery:QUERY-CLOSE().
phQuery:QUERY-PREPARE(cPredicate).
phQuery:QUERY-OPEN(). IF rowRepos[1] NE ? THEN
phQuery:REPOSITION-TO-ROWID(rowRepos).
END PROCEDURE..