Actions bound to the current row

Actions can be configured with the ROWBOUND attribute depending on whether there is a current row.

When using a DISPLAY ARRAY or INPUT ARRAY dialog to control a table view, actions can get the ROWBOUND attribute, in order to make the action only available when there is a current row in the list.

The ROWBOUND attribute is typically used with TABLE and TREE containers, but can also by used with SCROLLGRID and static lists in GRID containers (however in last case there will be no row-specific decoration of the action views)

Note: The main purpose of the ROWBOUND attribute is to have the corresponding action enabled and disabled automatically by the runtime system, depending on the existence of a row. The default decoration of such action is front-end platform driven and is the consequence of using the ROWBOUND action attribute. A DISPLAY ARRAY or INPUT ARRAY can be used with a plain form that show a single row at a time. The rowbound actions can also be used in such case, using form buttons as action views for example. These buttons will be automatically enabled/disabled according to the list content.

In DISPLAY ARRAY, the actions created from modification triggers ON UPDATE and ON DELETE are automatically defined as rowbound actions. Actions for ON INSERT and ON APPEND are not considered as specific to a row.

The actions defined with the ROWBOUND attribute will be available by selecting the three-dots button on the right of a table row.

If the action is disabled, the corresponding rowbound action view of the three-dots button will not be displayed.

In the following example, the DISPLAY ARRAY dialog implements three actions:
  • The "refresh" action is not "rowbound", and will always be available (active/visible), even if the list is empty.
  • The "check" action is rowbound, and will only be available if there is a (current) row in the list.
  • The "delete" action created by the ON DELETE modification trigger is implicitly "rowbounded".
DISPLAY ARRAY a_orders TO sr.* ATTRIBUTES(UNBUFFERED)
   ...
   ON ACTION refresh -- not rowbound
      CALL fetch_orders()
   ON ACTION check ATTRIBUTES(ROWBOUND,TEXT="Check")
      CALL check_order(arr_curr())
   ON DELETE -- implicitly rowbound (text defined in default.4ad)
      CALL delete_order(arr_curr())
   ...
END DISPLAY