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