Query and control the current row in a read-only or editable list of
records.
Get the current row
To query the current row of a list, use either
the ui.Dialog.getCurrentRow() method or the ARR_CURR() built-in function,
according to the context.
The
getCurrentRow() method can be used inside or
outside the context of the
DISPLAY ARRAY or
INPUT ARRAY dialog.
The method takes the name of the screen array as the argument to identify the list. For example,
when implementing a
DIALOG block with two
DISPLAY ARRAY
subdialogs, you can query the current row of a list in the code block of the other list
controller:
DIALOG ...
DISPLAY ARRAY arr1 TO sa1.*
ON ACTION check
IF arr2[DIALOG.getCurrentRow("sa2")].value > 0 THEN
...
END IF
END DISPLAY
DISPLAY ARRAY arr2 TO sa2.*
END DISPLAY
END DIALOG
The
ARR_CURR() function must be used in the context of the current
DISPLAY
ARRAY or
INPUT ARRAY dialog, or just after executing such a dialog. For
example, when implementing modification triggers in a
DISPLAY ARRAY dialog, the
current row and the current screen line can be queried respectively with the
ARR_CURR() and
SCR_LINE()
functions:
DISPLAY ARRAY arr TO sa.*
ON UPDATE
INPUT arr[arr_curr()].* WITHOUT DEFAULTS FROM sa[scr_line()].* ;
END DISPLAY
The
ARR_CURR() function returns the current row index for the last executed dialog,
until a new list dialog is started.
Set the current row
To set the current row in a list controlled by a
DISPLAY ARRAY or
INPUT ARRAY, use the
ui.Dialog.setCurrentRow() method. This method takes the name of the screen
array and the new row index as
parameters:
DISPLAY ARRAY p_items TO sa.*
...
ON ACTION next_empty
LET row = findEmptyRow(p_items)
CALL DIALOG.setCurrentRow("sa", row)
...
END DISPLAY
Calling the
DIALOG.setCurrentRow() method will not execute control
blocks such as
BEFORE ROW and
AFTER ROW, and will not set the
focus. If you want to set the focus to the list, you must use the
NEXT FIELD
instruction. This works with
DISPLAY ARRAY as well as with
INPUT
ARRAY.
Tip: Use this method with care. Let the dialog handle normal navigation
automatically, and jump to a specific row only in the context of an ON ACTION
block.
The
FGL_SET_ARR_CURR() function can also be used. This function must be called
in the context of the current list having the focus.
Note:
FGL_SET_ARR_CURR() triggers control blocks such as BEFORE ROW,
while DIALOG.setCurrentRow() does not trigger any control blocks.
Converting visual index to/from program array index
When the end user sorts rows in a table, the program array index
(arr_curr()) may differ from the visual row index (the row position
as seen by the user).
The ui.Dialog class provides methods to convert between these
contexts:
The
ui.Dialog.arrayToVisualIndex method converts a
program array index to a visual index. It can be used, for example, to display a
typical list position message (Row:
current-row /
total-rows). The current row
(
arr_curr()/
getCurrentRow()) is a program
array index that must be converted to a visual index. Note that you need to display
such messages in the
BEFORE ROW trigger and
ON
SORT
trigger:
FUNCTION disp_row(d,n)
DEFINE d ui.DIALOG, n STRING
MESSAGE SFMT("Row: %1/%2",
d.arrayToVisualIndex(n,d.getCurrentRow(n)),
d.getArrayLength(n))
END FUNCTION
...
DISPLAY ARRAY arr TO sr.*
...
BEFORE ROW
CALL disp_row(DIALOG,"sr")
ON SORT
CALL disp_row(DIALOG,"sr")
...
END DISPLAY
The
ui.Dialog.visualToArrayIndex method converts a
visual index to a program array index. It can be used for example to ask the user
for a row position (visual index), and make that row current by using
DIALOG.setCurrentRow() after converting to the program array
index:
DEFINE i INTEGER
...
DISPLAY ARRAY arr TO sr.*
...
ON ACTION move_to
PROMPT "Enter row index:" FOR i
CALL DIALOG.setCurrentRow( "sr", DIALOG.visualToArrayIndex("sr", i))
...
END DISPLAY