Saturday, 28 September 2013

Dynamic Selection Fields using FM : 'FREE_SELECTIONS_INIT & FREE_SELECTIONS_DIALOG'

TYPE-POOLS           rsds.
TABLES                : sscrfields.

DATA tadir_wa                   TYPE tadir.
DATA selid                         TYPE  rsdynsel-selid.
DATA field_tab                   TYPE TABLE OF rsdsfields.
DATA table_tab                  TYPE TABLE OF rsdstabs.
DATA table                         LIKE LINE OF table_tab.
DATA cond_tab                   TYPE  rsds_twhere.
DATA cond                          LIKE LINE OF cond_tab.
DATA dref                          TYPE REF TO data.
DATA alv                            TYPE REF TO cl_salv_table.
DATA lv_count                    TYPE i.

FIELD-SYMBOLS <fs_table> TYPE STANDARD TABLE.

INITIALIZATION.

  SELECTION-SCREEN: FUNCTION KEY 1.

  sscrfields-functxt_01 = 'Number of entries'.


AT SELECTION-SCREEN.

  SELECT SINGLE *
         FROM tadir
         INTO tadir_wa
         WHERE pgmid = 'R3TR' AND
               object = 'TABL' AND
               obj_name = dbtab.
  IF sy-subrc <> 0.
    MESSAGE 'Database not found' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
  ENDIF.

  table-prim_tab = dbtab.
  APPEND table TO table_tab.

  CASE sscrfields-ucomm.
    WHEN 'FC01'.
      SELECT COUNT(*) INTO lv_count FROM (dbtab).
      MESSAGE i000 WITH lv_count.
  ENDCASE.

START-OF-SELECTION.

  CALL FUNCTION 'FREE_SELECTIONS_INIT'
    EXPORTING
      kind         = 'T'
    IMPORTING
      selection_id = selid
    TABLES
      tables_tab   = table_tab
    EXCEPTIONS
      OTHERS       = 4.
  IF sy-subrc <> 0.
    MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
  ENDIF.

  CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
    EXPORTING
      selection_id  = selid
      title         = 'Free Selection'
      as_window     = ' '
    IMPORTING
      where_clauses = cond_tab
    TABLES
      fields_tab    = field_tab
    EXCEPTIONS
      OTHERS        = 4.
  IF sy-subrc <> 0.
    MESSAGE 'No free selection created' TYPE 'I'.
    LEAVE PROGRAM.
  ENDIF.

  READ TABLE cond_tab WITH KEY tablename = dbtab INTO cond.
  IF sy-subrc <> 0.
    MESSAGE 'Error in condition' TYPE 'I' DISPLAY LIKE 'E'.
    LEAVE PROGRAM.
  ENDIF.

  CREATE DATA dref TYPE TABLE OF (dbtab).
  ASSIGN dref->* TO <fs_table> .

  TRY.
      SELECT *
             FROM (dbtab)
             INTO TABLE  <fs_table> WHERE (cond-where_tab).
    CATCH cx_sy_dynamic_osql_error.
      MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
      LEAVE PROGRAM.
  ENDTRY.

END-OF-SELECTION.

  TRY.
      cl_salv_table=>factory(
        IMPORTING r_salv_table = alv
        CHANGING  t_table      = <fs_table> ).
      alv->display( ).
    CATCH cx_salv_msg.
      MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'.
  ENDTRY.

No comments:

Post a Comment

Note: only a member of this blog may post a comment.