23
SAP AG 2005, Title of Presentation / Speaker Name / 1 Introduction Modifying the context structure at runtime Modifying the UI Element hierarchy at runtime The use of dynamic actions Contents: Dynamic Modifications at Runtime

dynamic runtime modifs

Embed Size (px)

DESCRIPTION

webdynpro

Citation preview

Page 1: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 1

Introduction Modifying the context structure at runtime Modifying the UI Element hierarchy at runtime The use of dynamic actions

Contents:

Dynamic Modifications at Runtime

Page 2: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 2

Dynamic Modifications at Runtime: Unit Objectives

After completing this unit, you will be able to: Understand what is dynamic programming Dynamically modify and create UI elements Dynamically create context elements Dynamically bind UI element values to context

elements Dynamically create actions

Page 3: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 3

Dynamic Runtime Modifications

What is type of dynamic modifications can be made at runtime?

Dynamic Context ManipulationThe creation, modification and deletion of context nodes and attributes

Dynamic UI ManipulationThe creation, modification and deletion of UI elements

Dynamic Assignment of Actions to UI Elements

Page 4: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 4

Dynamic Runtime Modifications

There are several situations in which type of coding could be required:

When the structure of your data is not known until runtime When you want the behaviour of a screen to be generic – and

therefore dynamic When you are writing utility components that must function in

a generic manner Etc…

Under what circumstances should I write coding that performs dynamic modifications?

Page 5: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 5

Dynamic Context Data Creation

Example of context metadata to be created dynamically?Context Root (c=1..1, s=true)

FLIGHTS (c=0..n, s=true)

Context Metadata to be created at runtime

BOOKINGS (c=0..n, s=false)

PRICE

CARRID

CONNID

FLDATE

BOOKID

CUSTOMID

CLASS

PASSNAME

Page 6: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 6

Coding steps:

Obtain a reference to the metadata of the context node that will act as the new node’s parent. In this case, we are creating an independent node, therefore we get a reference to the metadata of the root node.

Call static method create_nodeinfo_from_struct( ) from helper class cl_wd_dynamic_tool

A DDIC Structure can be used for the attribute creation.

Dynamic Node Creation (1)

Context Root (c=1..1, s=true)

FLIGHTS (c=0..n, s=true)

Context Metadata to be created at runtime

BOOKINGS (c=0..n, s=false)

PRICE

CARRID

CONNID

FLDATE

BOOKID

CUSTOMID

CLASS

PASSNAME

DDIC Structure SFLIGHT

Page 7: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 7

Dynamic Node Creation related to a structure

Coding steps:

Obtain a reference to the metadata of the context node that will act as the new node’s parent.

Call static method create_nodeinfo_from_struct( ) from helper class cl_wd_dynamic_tool to create from a DDIC structure a node.

DATA: rootnode_info TYPE REF TO if_wd_context_node_info, table_name type string value 'SFLIGHT', node_name type string value 'CONNECTIONS'.

* get root node info of context rootnode_info = wd_context->get_node_info( ).

* create node named CONNECTIONS of sflight cl_wd_dynamic_tool=>create_nodeinfo_from_struct( parent_info = rootnode_info node_name = node_name structure_name = table_name is_multiple = abap_false is_mandatory = abap_true ).

Cardinality 1…1

Page 8: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 8

Dynamic Sub Node Creation related to a structure

DATA: dyn_node type ref to if_wd_context_node, dyn_node_info TYPE REF TO if_wd_context_node_info, node_name TYPE string value 'FLIGHTS', . . . * navigate from <CONTEXT> to <FLIGHTS> via lead selection dyn_node = wd_Context->get_Child_Node( Name = node_name ). dyn_node_info = dyn_node->get_node_info( ).

* create sub node named BOOKINGS of sbook cl_wd_dynamic_tool=>create_nodeinfo_from_struct( parent_info = dyn_node_info node_name = 'BOOKINGS' structure_name = 'SBOOK' is_multiple = abap_true is_mandatory = abap_false ).

Context Root (c=1..1, s=true)

FLIGHTS (c=0..n, s=true)

BOOKINGS (c=0..n,s=false)

PRICE

CARRID

CONNID

FLDATE

BOOKID

CUSTOMID

CLASS

PASSNAME

Structure SBOOK

Coding steps:

Obtain a reference to node and reference to the metadata of the context node that will act as the new node’s parent

Call static method create_nodeinfo_from_struct( ) to create from a DDIC structure a node

Page 9: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 9

Add a Dynamic Attribute to a Node

Context Root (c=1..1, s=true)

UI_ATTRIBUTES

BUTTON_VISIBILITY

TEXT_VISIBILITY

* add context attribute to node data: Ui_Attributes_info type ref to If_Wd_Context_Node_info. data: ls_att type WDR_CONTEXT_ATTRIBUTE_INFO.

* get node info of context Ui_Attributes_info = Node_Ui_Attributes->get_node_info( ).

ls_att-name = `TEXT_VISIBILITY`. ls_att-TYPE_NAME = 'WDUI_VISIBILITY'.

Ui_Attributes_info->add_attribute( ATTRIBUTE_INFO = ls_att ).

Coding steps:

Obtain a reference to the metadata of the parent node that will contain the attribute

Fill structure ( WDR_CONTEXT_ATTRIBUTE_INFO ) with attribute properties

Add attribute to parent node

Page 10: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 10

Standard Hook Method – View controller

Only a view controller has these hook methods.

The method WDDOMODIFYVIEW will only be called if:

The view is part of the current view assembly and this is the first time the view is required, or

The view is part of the current view assembly and an action belonging to the same view controller has been processed.

Page 11: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 11

Principles of UI element manipulation

The following coding principles must be adhered to during UI element manipulation:

1. Only perform direct manipulation of UI element objects when it is not possible to control their behaviour through context binding.

2. UI manipulation is only permitted within the wdDoModifyView() method of a view controller.

3. wdDoModifyView() has a boolean parameter called firstTime. Typically, you will only build a dynamic UI element hierarchy when firstTime == true. This avoids rebuilding the UI element hierarchy unnecessarily.

4. Do NOT implement any coding in wdDoModifyView() that modifies the context! The context should be considered “read-only” during the execution of this method.

Page 12: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 12

Dynamic UI manipulation (1)

Context RootConnections

PRICE

CARRID

CONNID

FLDATE

Context Metadata UI Element Hierarchy to be created at runtime

RootUIElementContainer

CARRIDLabel

CARRIDInput

CONNIDLabel

CONNIDInput

FLDATELabel

FLDATEInput

PRICELabel

PRICEInput

Page 13: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 13

Dynamic UI manipulation (2)

Coding steps:

Check that this is the first time the view has been rendered

Obtain a reference to the root UI element container

UI Element Hierarchy to be created at runtime

RootUIElementContainer

Context RootConnections

PRICE

CARRID

CONNID

FLDATE

Context Metadata

method WDDOMODIFYVIEW . data: wd_container type ref to cl_wd_uielement_container, . . .

* Check if first time check first_time = abap_true.

wd_container ?= view->get_element( 'ROOTUIELEMENTCONTAINER' ).

Page 14: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 14

Dynamic UI manipulation (3)

Coding steps:

Create a new InputField UI element object (bind to context attribute

Create a new Label UI element object

Set the Label’s properties as required

Add the Label object to the UI element container

Set the InputField’s properties as required

Add the InputField to the UI element container

InputField

UI Element Hierarchy to be created at runtime

RootUIElementContainer

InputField

Label

Label

bind

add

Context RootConnections

PRICE

CARRID

CONNID

FLDATE

Context Metadata

Page 15: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 15

* Create label and input field** create a input field wd_input_field = cl_wd_input_field=>new_input_field( view = view bind_value = 'CONNECTIONS.CARRID').** create a label for the input field wd_label = cl_wd_label=>new_label( label_for = wd_input_field->id ).

** set matrix_head_data for the label cl_wd_matrix_head_data=>new_matrix_head_data( element = wd_label ).

** add label to container wd_container->add_child( wd_label ).

** set matrix_data for the input_field cl_wd_matrix_data=>new_matrix_data( element = wd_input_field ).

** add input field to container wd_container->add_child( wd_input_field ).

Dynamic UI manipulation (4)

Page 16: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 16

Dynamic Actions

Certain UI elements can trigger client-side events (e.g. pressing enter in an InputField, toggling a CheckBox or selecting the row of a table).

In order for the client-side event to trigger the execution of a server-side method, Web Dynpro uses the concept of Actions.

Actions can either be assigned declaratively to UI element events at design time, or dynamically at runtime.

Actions assigned dynamically can only refer to existing server-side action handler methods. It is not possible to define the coding of an action event handler dynamically; only to define which existing action handler will be called when a client-side event is trapped.

Page 17: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 17

Action Declaration

Declared action

Coding required for dynamic

assigned action

Page 18: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 18

* Create button** create button UI element wd_button = cl_wd_button=>new_button( text = 'Show Flights' on_action = 'SELECT_FLIGHTS' ).** set matrix_head_data for the label cl_wd_matrix_head_data=>new_matrix_head_data( element = wd_button ).** add button to container wd_container->add_child( wd_button ).

Create a Dynamic Button

Coding steps:

Create a new Button UI element object (assign an predefined action)

Set the Button properties as required

Add the Button to the UI element container

Button

UI Element Hierarchy to be created at runtime

RootUIElementContainer

InputField

Label

Context Root

Connections

PRICE

CARRID

CONNID

FLDATE

Context Metadata

Button

Page 19: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 19

Was this a good approach?

Development Principle

Only if the required functionality of your application does not permit design time declarations, then use a dynamic modification approach.

All context node/attribute and UI elements which can be created during design time should be created during design time.

Page 20: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 20

Example for Dynamic Programming

Display the content of ANY table

Dynamic Context

Dynamic table UI element

Dynamic data retrieval

Page 21: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 21

Example for Dynamic Programming I

DATA: group_1 TYPE REF TO cl_wd_uielement_container, new_tab TYPE REF TO cl_wd_table, dyn_node TYPE REF TO if_wd_context_node, tabname_node TYPE REF TO if_wd_context_node, rootnode_info TYPE REF TO if_wd_context_node_info, stru_tab TYPE REF TO data, tablename TYPE string.

FIELD-SYMBOLS <tab> TYPE table.

* get node info of context root node rootnode_info = wd_context->get_node_info( ).

* Get the name of the table to be created tabname_node = wd_context->get_child_node( name = 'TABLE_DATA' ). tabname_node->get_attribute( EXPORTING name = 'NAME' IMPORTING value = tablename ). translate tablename to upper case.

* create sub node of structure (tablename) cl_wd_dynamic_tool=>create_nodeinfo_from_struct( parent_info = rootnode_info node_name = tablename structure_name = tablename is_multiple = abap_true ).

Page 22: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 22

Example for Dynamic Programming II * remove "old" table UI element from view , if necessary group_1 ?= view->get_element( 'GROUP_1' ). group_1->remove_child( id = 'TESTTAB' ).

* * get instance of new node dyn_node = wd_context->get_child_node( name = tablename ).

DATA new_tab TYPE REF TO cl_wd_table.

* create new UI element table new_tab = cl_wd_dynamic_tool=>create_table_from_node( ui_parent = group_1 table_id = 'TESTTAB' node = dyn_node ).

** fill context node with data* create internal table of (tabletype) CREATE DATA stru_tab TYPE TABLE OF (tablename). ASSIGN stru_tab->* TO <tab>.

* Get table content SELECT * FROM (tablename) INTO CORRESPONDING FIELDS OF TABLE <tab>.

* Bind internal table to context node dyn_node->bind_table( <tab> ).

Page 23: dynamic runtime modifs

SAP AG 2005, Title of Presentation / Speaker Name / 23

You should now be able to: Understand what is dynamic programming Dynamically modify and create UI elements Dynamically create context elements Dynamically bind UI element values to context

elements Dynamically create actions

Web Dynpro Dynamic Programming: Unit Summary