Creating selection screens dynamically - kazumov/abap GitHub Wiki
https://blogs.sap.com/2006/11/25/creating-selection-screens-dynamically/
REPORT zsdn_dynselscr.
*&———————————————————————*
* Global Data
*&———————————————————————*
DATA gt_scrflds TYPE TABLE OF zscrflds.
DATA wa_scrflds TYPE zscrflds.
DATA gt_prog TYPE TABLE OF abaptext.
DATA wa_prog LIKE LINE OF gt_prog.
*&———————————————————————*
* Start of Selection
*&———————————————————————*
START-OF-SELECTION.
DATA gt_tmpflds TYPE TABLE OF zscrflds.
DATA wa_tmpflds TYPE zscrflds.
DATA w_type(60) TYPE c.
DATA w_ctbix(10) TYPE c.
DATA w_desc(10) TYPE c.
* Retrive the required fields from the table
SELECT *
FROM zscrflds
INTO TABLE gt_scrflds.
* Build dynamic report code
wa_prog = ‘REPORT zdynselscr.’.
APPEND wa_prog TO gt_prog.
**Code for building TABLES section
* Copy to a temporary internal table
gt_tmpflds[] = gt_scrflds[].
* Delete screen fields for parameters in the temp table
DELETE gt_tmpflds WHERE basictyp NE ‘S’.
SORT gt_tmpflds BY reftable.
* Remove duplicates
DELETE ADJACENT DUPLICATES FROM gt_tmpflds COMPARING reftable.
* Build TABLES… code for table workarea
LOOP AT gt_tmpflds INTO wa_tmpflds.
CONCATENATE ‘TABLES’ wa_tmpflds-reftable ‘.’
INTO wa_prog
SEPARATED BY space.
APPEND wa_prog TO gt_prog.
ENDLOOP.
* Build Selection screen field definition
LOOP AT gt_scrflds INTO wa_scrflds.
w_ctbix = sy-tabix.
CONDENSE w_ctbix.
wa_prog = ‘SELECTION-SCREEN BEGIN OF LINE.’.
APPEND wa_prog TO gt_prog.
* Comments field in the selection field
CONCATENATE
‘SELECTION-SCREEN COMMENT 1(20) cmt’ w_ctbix ‘.’
INTO wa_prog.
APPEND wa_prog TO gt_prog.
* Concatenate ref. tablename and fieldname
* Eg. : MARA / MATNR into MARA-MATNR
CONCATENATE wa_scrflds-reftable wa_scrflds-reffield
INTO w_type
SEPARATED BY ‘-‘.
* Code generation for PARAMETERS type
IF wa_scrflds-basictyp EQ ‘P’.
CONCATENATE
‘PARAMETERS’ wa_scrflds-fieldname ‘LIKE’ w_type ‘.’
INTO wa_prog
SEPARATED BY space.
ENDIF.
* Code generation for SELECT-OPTIONS type
IF wa_scrflds-basictyp EQ ‘S’.
CONCATENATE
‘SELECT-OPTIONS’ wa_scrflds-fieldname ‘FOR’ w_type ‘.’
INTO wa_prog
SEPARATED BY space.
ENDIF.
APPEND wa_prog TO gt_prog.
wa_prog = ‘SELECTION-SCREEN END OF LINE.’.
APPEND wa_prog TO gt_prog.
ENDLOOP.
* End of code generation for selection screen
* Generate Initialization event code
* Initialize the comments fields defined in the selection screen
wa_prog = ‘INITIALIZATION.’.
APPEND wa_prog TO gt_prog.
LOOP AT gt_scrflds INTO wa_scrflds.
w_ctbix = sy-tabix.
CONDENSE w_ctbix.
CONCATENATE ‘cmt’ w_ctbix
INTO w_ctbix.
* Get the description from the table DDFTX
SELECT SINGLE scrtext_s
FROM ddftx
INTO w_desc
WHERE tabname EQ wa_scrflds-reftable
AND fieldname EQ wa_scrflds-reffield
AND ddlanguage EQ sy-langu.
CONCATENATE w_ctbix ‘ = ”’ w_desc ”’.’
INTO wa_prog.
APPEND wa_prog TO gt_prog.
ENDLOOP.
* Generate Start of selection event code
wa_prog = ‘START-OF-SELECTION.’.
APPEND wa_prog TO gt_prog.
* Data types for shared objects
wa_prog = ‘DATA t_ranges TYPE ACE_FIELD_RANGES_T.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘DATA wa_ranges LIKE LINE OF t_ranges.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘DATA t_fldrange TYPE ACE_GENERIC_RANGE_T.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘DATA wa_fldrange TYPE ACE_GENERIC_RANGE.’.
APPEND wa_prog TO gt_prog.
* Read the input from the selection screen and
* store it in Shared Objects
LOOP AT gt_scrflds INTO wa_scrflds.
* Assign the fieldname in the variable
CONCATENATE ‘wa_ranges-fieldname = ”’
wa_scrflds-fieldname ”’.’
INTO wa_prog SEPARATED BY space.
APPEND wa_prog TO gt_prog.
wa_prog = ‘REFRESH t_fldrange.’.
APPEND wa_prog TO gt_prog.
* Processing for SELECT-OPTIONS
* Loop and move data to the shared memory
IF wa_scrflds-basictyp EQ ‘S’.
CONCATENATE ‘LOOP AT ‘ wa_scrflds-fieldname ‘.’
INTO wa_prog SEPARATED BY space.
APPEND wa_prog TO gt_prog.
wa_prog = ‘CLEAR wa_fldrange.’.
APPEND wa_prog TO gt_prog.
CONCATENATE ‘MOVE-CORRESPONDING ‘ wa_scrflds-fieldname ‘TO’ ‘wa_fldrange.’
INTO wa_prog SEPARATED BY space.
APPEND wa_prog TO gt_prog.
wa_prog = ‘APPEND wa_fldrange TO t_fldrange.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘ENDLOOP.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘wa_ranges-fieldrange[] = t_fldrange[].’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘APPEND wa_ranges TO t_ranges.’.
APPEND wa_prog TO gt_prog.
ELSEIF wa_scrflds-basictyp EQ ‘P’.
* Processing for PARAMETERS
wa_prog = ‘CLEAR wa_fldrange.’.
APPEND wa_prog TO gt_prog.
* Process if the parameter is not initial
CONCATENATE ‘IF ‘ wa_scrflds-fieldname ‘IS NOT INITIAL.’
INTO wa_prog SEPARATED BY space.
APPEND wa_prog TO gt_prog.
wa_prog = ‘wa_fldrange-sign = ”I”.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘wa_fldrange-option = ”EQ”.’.
APPEND wa_prog TO gt_prog.
CONCATENATE ‘wa_fldrange-low = ‘ wa_scrflds-fieldname ‘.’
INTO wa_prog SEPARATED BY space.
APPEND wa_prog TO gt_prog.
wa_prog = ‘APPEND wa_fldrange TO t_fldrange.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘ENDIF.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘wa_ranges-fieldrange[] = t_fldrange[].’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘APPEND wa_ranges TO t_ranges.’.
APPEND wa_prog TO gt_prog.
ENDIF.
ENDLOOP.
wa_prog = ‘DATA: area type ref to ZSELAREA.’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘DATA root type REF to ZCL_SELSCR.’.
APPEND wa_prog TO gt_prog.
* Get ref to the shared memory
wa_prog = ‘area = zselarea=>attach_for_write( ).’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘create object root area handle area.’.
APPEND wa_prog TO gt_prog.
* Store the value in the memory
wa_prog = ‘root->set_fields( t_ranges ).’.
APPEND wa_prog TO gt_prog.
wa_prog = ‘area->set_root( root ).’.
APPEND wa_prog TO gt_prog.
* Commit and detatch
wa_prog = ‘area->detach_commit( ).’.
APPEND wa_prog TO gt_prog.
* Quit the program: Return to the main code
wa_prog = ‘LEAVE PROGRAM.’.
APPEND wa_prog TO gt_prog.
* Generate the report program
INSERT REPORT ‘ZDYNSELSCR’ FROM gt_prog.
COMMIT WORK.
* Execute the report
SUBMIT zdynselscr VIA SELECTION-SCREEN AND RETURN.
* Read the data from the shared memory
DATA area TYPE REF TO zselarea.
area = zselarea=>attach_for_read( ).
DATA t_ranges TYPE ace_field_ranges_t.
t_ranges = area->root->get_fields( ).
area->detach( ).
TYPES cond(72) TYPE c.
DATA it_vbak TYPE TABLE OF vbak.
DATA wa_vbak LIKE LINE OF it_vbak.
DATA t_cond TYPE TABLE OF cond WITH HEADER LINE.
DATA wa_ranges LIKE LINE OF t_ranges.
DATA wa_fieldrange LIKE LINE OF wa_ranges-fieldrange.
DATA dref TYPE REF TO data.
LOOP AT t_ranges INTO wa_ranges.
WRITE / wa_ranges-fieldname COLOR COL_HEADING.
ULINE AT /8(68).
LOOP AT wa_ranges-fieldrange INTO wa_fieldrange.
WRITE :/8 sy-vline, 10 wa_fieldrange-sign,
14 sy-vline, 15 wa_fieldrange-option,
19 sy-vline, 20 wa_fieldrange-low, 42 sy-vline, 75 sy-vline.
IF wa_fieldrange-high IS NOT INITIAL.
WRITE AT 43 wa_fieldrange-high.
WRITE AT 75 sy-vline.
ENDIF.
ENDLOOP.
ULINE AT /8(68).
ENDLOOP.
Needs to be explored:
https://wiki.scn.sap.com/wiki/display/Snippets/ABAP+Program+to+generate+select-options+dynamically