Understanding multiple dialogs
Multiple dialogs are defined with DIALOG blocks inside a
FUNCTION.
The concept of multiple dialogs refers to the usage of a procedural
        DIALOG block, to control several elements of a form. During the execution
      of a procedural dialog, no other window/form can be accessed: multiple dialogs are in the
      category of modal dialogs.
The DIALOG procedural instruction handles different parts of a form
      simultaneously, including simple display fields, simple input fields, read-only list of
      records, editable list of records, query by example fields, and action views. The
        DIALOG instruction acts as a collection of singular dialogs working in
      parallel.

"Singular interactive instructions" refer to INPUT,
        CONSTRUCT, DISPLAY ARRAY and INPUT ARRAY
      independent blocks not surrounded by the DIALOG / END DIALOG
      keywords. While the DIALOG instruction reuses some of the semantics and
      behaviors of singular interactive instructions, there are some differences.
Like the singular interactive instructions, DIALOG is
an interactive instruction. You can execute a DIALOG instruction
from one of the singular dialogs, or execute a singular dialog from
a DIALOG block. The parent dialog will be disabled
until the child dialog returns.
A DIALOG procedural instruction consist of several sub-dialog blocks declared
      inside the DIALOG instruction, or external dialog blocks declared in scope
      outside of the current function. The external dialogs are attached to the current dialog with
      the SUBDIALOG
      clause. 
The DIALOG instruction binds program variables
(such as simple records or arrays of records) with a screen-record
or screen-array defined in a form, allowing the user to view and update
application data.
When a DIALOG block executes, it activates the
current form (the form most    recently displayed or the form in the
current window). When the statement completes execution,    the form
is deactivated.
The syntax of the DIALOG instruction is very close
to singular dialogs, using    common triggers such as BEFORE
FIELD, ON ACTION, and so on.    Despite
the similarities, the behavior and semantics of DIALOG are
a bit    different from singular dialogs.
Understand that the DIALOG instruction is not provided to replace singular
      dialogs. Singular dialogs are still supported. It is recommended that you use singular dialogs
      if no multiple dialog is required.
Unlike singular dialogs, the DIALOG instruction does not use the
        INT_FLAG variable. You must implement ON ACTION accept or
        ON ACTION cancel to handle dialog validation or cancellation. These actions
      do not exist by default in DIALOG.
Unlike singular dialogs creating automatic accept and cancel actions, by default there is no
way to quit the DIALOG instruction. You must implement your own action handler and
execute EXIT DIALOG or ACCEPT DIALOG.
A good practice is to write a setup dialog function to centralize all field and action
activations for a specific context. Call that setup function at any place in the
DIALOG code where the field and action activation rules may change.
While static arrays are supported by the DIALOG instruction,
it is strongly    recommended that you use dynamic arrays instead.
With a dynamic array, the actual number of rows    is automatically
defined by the array variable, while static arrays need an additional
step to    define the total number of rows.
When needed, use the UNBUFFERED mode with multiple
dialogs to force model/view       synchronization, and use the FIELD
ORDER FORM option to follow the         TABINDEX definitions
in the form file.
DIALOG procedural instruction that includes both an
        INPUT and a DISPLAY ARRAY sub-dialog, plus a sub-dialog
      defined externally and included with the SUBDIALOG
      keyword:SCHEMA stores 
DEFINE p_customer RECORD LIKE customer.*
DEFINE p_orders DYNAMIC ARRAY OF RECORD LIKE order.*
FUNCTION customer_dialog()
  DIALOG ATTRIBUTES(UNBUFFERED, FIELD ORDER FORM)
    INPUT BY NAME p_customer.*
      AFTER FIELD cust_name 
        CALL setup_dialog(DIALOG)
    END INPUT
    DISPLAY ARRAY p_orders TO s_orders.*
      BEFORE ROW
        CALL setup_dialog(DIALOG)
    END DISPLAY
    SUBDIALOG common_footer
    ON ACTION close 
      EXIT DIALOG
  END DIALOG
END FUNCTIONAll elements of the dialog are active at the same time, so you
must handle tabbing order     properly. By default - as in singular
dialogs - the tabbing order is driven by the binding list     (order
of program variables). It is strongly recommended that you use the FIELD
ORDER      FORM option and the TABINDEX field
attributes instead.
Like the singular INPUT ARRAY instruction, DIALOG creates
automatic insert, append, and delete actions. These actions are only active when the focus is in the
list.
When the user moves from field to field, changes values, or browses a list, dialog control blocks such as BEFORE
FIELD, BEFORE ROW, BEFORE INPUT, BEFORE
DISPLAY are executed.
When the user clicks on an action view (button), or when an asynchronous event occurs, dialog interaction blocks like ON
ACTION are executed.
The code inside a DIALOG / END DIALOG dialog can use control instructions, dialog control functions, and the ui.Dialog class, to implement
the dialog behavior.