Giving the focus to a form element

How to force the focus to move or stay in a specific form element using program code.

Use the NEXT FIELD instruction to force the focus to a specific field or screen record (list). The NEXT FIELD instruction expects a form field name.

In a DIALOG block, when the specified field is the first column identifier of a sub-dialog driven by a DISPLAY ARRAY block, the read-only list gets the focus. If the field name is not known at compile time, you can alternatively use the ui.Dialog.nextfield() method.
DIALOG ATTRIBUTES(UNBUFFERED)
   INPUT BY NAME p_cust ATTRIBUTES(NAME="cust")
     ...
   END DISPLAY
   DISPLAY ARRAY p_orders TO orders.*
     ...
   END DISPLAY
   ON ACTION go_to_header 
      NEXT FIELD cust_num 
   ON ACTION go_to_detail 
      NEXT FIELD order_lineno 
   ...
END DIALOG
When a BUTTON exists in the form layout, it can get the focus if the DIALOG block defines a COMMAND clause as action handler. Currently there is no way to give the focus to a BUTTON by program.
DIALOG ATTRIBUTES(UNBUFFERED)
   ...
   COMMAND "print" 
      CALL print_order()
   ...
END DIALOG
In rare cases (especially when using folder tabs), it may be required to show a part of the form that is not controlled by the dialog, when there is no active field or button that can get the focus in that part of the form, and when the above techniques cannot work. In this case, in order to show temporarily a given part of the form that cannot get the focus, you use the ui.Form.ensureFieldVisible or ui.Form.ensureElementVisible methods.
DEFINE form ui.Form
...
DIALOG ATTRIBUTES(UNBUFFERED)
   ...
   BEFORE DIALOG
      LET form = DIALOG.getForm()
   ...
   ON ACTION show_image1 
      CALL form.ensureElementVisible("image1")
   ...
END DIALOG

When using the FOCUSONFIELD attribute of DISPLAY ARRAY, you can set the focus to a specific cell by using the NEXT FIELD instruction or the ui.Dialog.nextField() method, in conjunction with the ui.Dialog.setCurrentRow() method. For more details, see Field-level focus in DISPLAY ARRAY.