Selection screens are generated from (abap) coding and generally sometimes need a little tweeking to make it do what you need it to do. This article is about such tweek: fetch information that has been typed on the screen, but the user has not pressed "enter" yet.
A classic example is processing you're own F4 logic: the user fills in a value like ABC*, then presses F4 and your logic is started. You'll find that the actual screen parameter doesn't have value "ABC*" just yet. Pick it up with function module DYNP_VALUES_READ
!
DATA: gt_DYNPVALUETAB type standard table of DYNPREAD. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING DYNAME = SY-REPID DYNUMB = SY-DYNNR TABLES DYNPFIELDS = gt_DYNPFIELDS.
The field or fields for which a value is required, will need to be specified on the gt_DYNPFIELD
table before you call the function module. It operates as a work instruction list and it does not return all field values of the whole dynpro. Make sure you fill in gt_DYNPFIELD
first !
There is also a DYNP_VALUES_UPDATE
which is very useful to confuse the end user - e.g. by finishing what he/she is typing. Best left alone.
Method screen reader
To capture this logic in a method, this is my solution:.
In the definition (static method):
CLASS-METHODS: screen_reader importing fieldname type any returning value(fieldvalue) type string.
The actual method
METHOD screen_reader. data: lt_DYNPREAD type standard table of DYNPREAD, lw_DYNPREAD type DYNPREAD. clear: lt_dynpread[], lw_dynpread. lw_dynpread-fieldname = fieldname. append lw_dynpread to lt_dynpread. CALL FUNCTION 'DYNP_VALUES_READ' EXPORTING DYNAME = sy-repid DYNUMB = sy-dynnr TABLES DYNPFIELDS = lt_dynpread EXCEPTIONS OTHERS = 4. if sy-subrc = 0. read table lt_dynpread into lw_dynpread index 1. fieldvalue = lw_dynpread-FIELDVALUE. endif. ENDMETHOD.
An implementation example:
MODULE choose_matnr_01 INPUT. gw_materials_2200-MATNR01 = lcl_BlueBox=>screen_reader( 'GW_MATERIALS_2200-MATNR01' ). lcl_BlueBox=>choose_material( changing material = gw_materials_2200-MATNR01 ). ENDMODULE.