메뉴 건너뛰기

SAP 한국 커뮤니티



REPORT z_alv_shdb_doc

노름마치 2007.11.05 21:52 조회 수 : 3558

REPORT z_alv_shdb_doc.
*---------------------------------------------------------------------*
* This report generates and displays a documentation for a SHDB record*
*---------------------------------------------------------------------*
* Author : Michel PIOUD                                               *
* Email : mpioud@yahoo.fr  HomePage : http://www.geocities.com/mpioud *
*---------------------------------------------------------------------*
* Macro definition
DEFINE m_append.
  add 1 to g_j.
  gt_data-colx = g_i.
  gt_data-colj = g_j.
  append gt_data.
  clear gt_data.
END-OF-DEFINITION.


CONSTANTS c_%bdc(4) VALUE '%BDC'.


TABLES apqi.                           " Queue info definition


SELECTION-SCREEN :
  SKIP, BEGIN OF LINE, COMMENT 10(20) v_1 FOR FIELD p_grpid."#EC NEEDED
* SHDB Group name
PARAMETERS p_grpid LIKE apqi-groupid OBLIGATORY.
SELECTION-SCREEN END OF LINE.


DATA:
* SHDB Queue identification (unique key)
  p_qid LIKE apqi-qid,


  BEGIN OF gs_field,
    ddtext      LIKE dd04v-ddtext,
    type        LIKE dd03l-datatype,
    length      LIKE dd03l-leng,
    decimal     LIKE dd03l-decimals,
    tab_control LIKE dd03l-checktable,
  END OF gs_field,


* Data to display
  BEGIN OF gt_data OCCURS 0,
    colx TYPE i,
    colj TYPE i,
    col0(40),
    col1(100),
    col2(100),
    col3(3),
    col4(3),
    col5(4),
    col6(40),
    color(4),
    box,
  END OF gt_data,


  g_descript(100),                      " Work field (column 3)
  g_prog TYPE progname,
  g_i    TYPE i,
  g_j    TYPE i,
* Internal table of data from SHDB record
  gt_dynprotab LIKE bdcdata OCCURS 0 WITH HEADER LINE.


*---------------------------------------------------------------------*
INITIALIZATION.


  v_1 = 'SHDB record'.


*---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_grpid.


  PERFORM f_choose_shdb USING 'GROUPID'
                              'P_GRPID'
                     CHANGING p_grpid.


  CHECK NOT p_grpid IS INITIAL.


  SELECT qid INTO p_qid FROM apqi UP TO 2 ROWS
                       WHERE groupid = p_grpid
                         AND mandant = sy-mandt
                         AND datatyp = c_%bdc.
  ENDSELECT.


  CHECK sy-dbcnt = 2.


  PERFORM f_choose_shdb USING 'QID' ''
                     CHANGING p_qid.


*---------------------------------------------------------------------*
AT SELECTION-SCREEN.


  IF NOT p_qid IS INITIAL.
*   SHDB record exists ?
    SELECT qid INTO p_qid FROM apqi UP TO 1 ROWS
                         WHERE qid     = p_qid
                           AND groupid = p_grpid
                           AND mandant = sy-mandt
                           AND datatyp = c_%bdc.
    ENDSELECT.
    CHECK sy-subrc NE 0.
  ENDIF.
* SHDB record exists ?
  SELECT qid INTO p_qid FROM apqi UP TO 1 ROWS
                       WHERE groupid = p_grpid
                         AND mandant = sy-mandt
                         AND datatyp = c_%bdc.
  ENDSELECT.
  CHECK sy-subrc NE 0.
* Recording & is not available
  MESSAGE i627(ms) WITH p_grpid.
  STOP.


*---------------------------------------------------------------------*
START-OF-SELECTION.


* Read SHDB record
  CALL FUNCTION 'BDC_OBJECT_READ'
       EXPORTING
            queue_id         = p_qid
       TABLES
            dynprotab        = gt_dynprotab
       EXCEPTIONS
            not_found        = 1
            system_failure   = 2
            invalid_datatype = 3
            OTHERS           = 4.


  IF sy-subrc >< 0.
*   Recording & is not available
    MESSAGE s627(ms) WITH p_qid.
    EXIT.
  ENDIF.


  CLEAR apqi.
  SELECT * FROM apqi UP TO 1 ROWS WHERE qid     = p_qid
                                    AND datatyp = c_%bdc
                                    AND mandant = sy-mandt.
  ENDSELECT.


  CHECK sy-subrc EQ 0.


* SHDB properties
  CLEAR g_descript.
  WRITE apqi-credate TO g_descript DD/MM/YY.
  CONCATENATE 'Created on :' g_descript '-'
         INTO g_descript SEPARATED BY space.
  WRITE apqi-cretime TO g_descript+22.
  CONCATENATE g_descript 'by' apqi-creator
         INTO g_descript SEPARATED BY space.


  ADD 1 TO g_i.
  gt_data-col0  = 'Object name'.
  gt_data-col1  = apqi-groupid.
  gt_data-col2  = g_descript.
  gt_data-color = 'C110'.
  m_append.


  LOOP AT gt_dynprotab.
    CLEAR g_descript.
    CASE gt_dynprotab-dynbegin.
      WHEN 'T'.                        " New transaction
        PERFORM transaction.
      WHEN 'X'.                        " New dynpro
        PERFORM dynpro.
      WHEN space.                      " Dynpro field
        IF gt_dynprotab-fnam(10) = 'BDC_OKCODE'.
          PERFORM okcode.
        ELSEIF gt_dynprotab-fnam(10) = 'BDC_CURSOR'.
          PERFORM cursor.
        ELSEIF gt_dynprotab-fnam(10) = 'BDC_SUBSCR'.
          PERFORM subscr.
        ELSE.
          PERFORM f_field.
        ENDIF.
    ENDCASE.
  ENDLOOP.


  PERFORM f_display.


*---------------------------------------------------------------------*
*    Form COMPLETE                                                    *
*---------------------------------------------------------------------*
FORM complete USING u_field TYPE c.


  DATA :
    l_table LIKE dd03l-tabname,        " Table name
    l_field LIKE dd03l-fieldname,      " Field Name
    l_temp  LIKE dd03l-fieldname,                           "#EC NEEDED


    lt_dd03l LIKE dd03l OCCURS 0 WITH HEADER LINE,
    lt_dd04v LIKE dd04v OCCURS 0 WITH HEADER LINE.


  CLEAR gs_field.


  SPLIT u_field AT '-' INTO l_table l_field.
  IF l_table(1) = '*'.
    SHIFT l_table.
  ENDIF.


  IF l_field CA '('.
    SPLIT l_field AT '(' INTO l_field l_temp.
  ENDIF.


* Get text for field
  CALL FUNCTION 'FIELDNAME_ROLLNAME_TEXT'
       EXPORTING
            i_as4local          = 'A'
            i_fieldname         = l_field
            i_tabname           = l_table
       TABLES
            e_dd03l             = lt_dd03l
            e_dd04v             = lt_dd04v
       EXCEPTIONS
            error_in_parameters = 1
            not_found           = 2
            OTHERS              = 3.


  CHECK sy-subrc EQ 0.
  CLEAR : lt_dd03l, lt_dd04v, gs_field.
  READ TABLE lt_dd03l INDEX 1.
  READ TABLE lt_dd04v INDEX 1.
  MOVE lt_dd03l-leng       TO gs_field-length.
  MOVE lt_dd03l-datatype   TO gs_field-type.
  MOVE lt_dd03l-checktable TO gs_field-tab_control.
  MOVE lt_dd04v-ddtext     TO gs_field-ddtext.
  MOVE lt_dd03l-decimals   TO gs_field-decimal.


ENDFORM.                               " COMPLETE
*---------------------------------------------------------------------*
*       Form  TRANSACTION
*---------------------------------------------------------------------*
FORM transaction.


* Read transaction text
  SELECT SINGLE ttext INTO g_descript FROM tstct
                                     WHERE tcode = gt_dynprotab-fnam
                                       AND sprsl = sy-langu.
  IF sy-subrc NE 0.
*   Read transaction text
    SELECT ttext INTO g_descript FROM tstct UP TO 1 ROWS
                                WHERE tcode = gt_dynprotab-fnam.
    ENDSELECT.
    IF sy-subrc NE 0.
      g_descript = 'Text of transaction unkowned'.          "#EC *
    ENDIF.
  ENDIF.


  ADD 1 TO g_i.
  CLEAR g_j.
  gt_data-col0 = 'Transaction'.
  gt_data-col1 = gt_dynprotab-fnam.
  gt_data-col2 = g_descript.
  gt_data-color = 'C100'.
  m_append.


  gt_data-col0  = 'Name'.
  gt_data-col1  = 'Value'.
  gt_data-col2  = 'Description'.
  gt_data-col3  = 'Lng'.
  gt_data-col4  = 'Dec'.
  gt_data-col5  = 'Type'.
  gt_data-col6  = 'TbCtrl'.                                 "#EC *
  gt_data-color = 'C100'.
  m_append.


ENDFORM.                               " TRANSACTION
*---------------------------------------------------------------------*
*       Form  DYNPRO
*---------------------------------------------------------------------*
FORM dynpro.


* Read dynpro text
  SELECT SINGLE dtxt INTO g_descript FROM d020t
                    WHERE prog = gt_dynprotab-program
                      AND dynr = gt_dynprotab-dynpro
                      AND lang = sy-langu.
  IF sy-subrc NE 0.
*   Read dynpro text
    SELECT dtxt INTO g_descript FROM d020t UP TO 1 ROWS
               WHERE prog = gt_dynprotab-program
                 AND dynr = gt_dynprotab-dynpro.
    ENDSELECT.
    IF sy-subrc NE 0.
      g_descript = 'Unkowned'.                              "#EC *
    ENDIF.
  ENDIF.


  IF g_j = 2.
    ADD 1 TO g_i.
  ELSE.
    m_append.
  ENDIF.
  gt_data-col0 = gt_dynprotab-program.
  g_prog       = gt_dynprotab-program.
  gt_data-col1 = gt_dynprotab-dynpro.
  gt_data-col2 = g_descript.
  m_append.


ENDFORM.                               " DYNPRO
*---------------------------------------------------------------------*
*       Form  OKCODE
*---------------------------------------------------------------------*
FORM okcode.


  DATA l_code LIKE sy-tcode.


  l_code = gt_dynprotab-fval.
  IF l_code(1) EQ '='.
    SHIFT l_code LEFT.
  ENDIF.


* Read OKcode text
  SELECT text INTO gt_data-col2 UP TO 1 ROWS
              FROM rsmptexts
             WHERE progname = g_prog
               AND sprsl    = sy-langu
               AND obj_code = l_code.
  ENDSELECT.
  IF sy-subrc NE 0.
*   Read OKcode text
    SELECT text INTO gt_data-col2 UP TO 1 ROWS
                FROM rsmptexts
               WHERE progname = g_prog
                 AND obj_code = l_code.
    ENDSELECT.
  ENDIF.


  gt_data-col0 = gt_dynprotab-fnam.
  gt_data-col1 = gt_dynprotab-fval.
  m_append.


ENDFORM.                               " OKCODE
*---------------------------------------------------------------------*
*       Form  cursor
*---------------------------------------------------------------------*
FORM cursor.


  IF gt_dynprotab-fval CA '-'.
    PERFORM complete USING gt_dynprotab-fval.
  ENDIF.


  CHECK gt_dynprotab-fval CA '-'.


  gt_data-col0 = gt_dynprotab-fnam.
  gt_data-col1 = gt_dynprotab-fval.
  gt_data-col2 = gs_field-ddtext(60).
  m_append.


ENDFORM.                               " CURSOR
*---------------------------------------------------------------------*
*       Form  subscr
*---------------------------------------------------------------------*
FORM subscr.


  DATA : l_prog TYPE progname,
         l_dynp TYPE dynnr.


  l_prog = gt_dynprotab-fval.
  l_dynp = gt_dynprotab-fval+40(4).


* Read Subscr text
  SELECT SINGLE dtxt INTO g_descript FROM d020t
                    WHERE prog = l_prog
                      AND dynr = l_dynp
                      AND lang = sy-langu.
  IF sy-subrc NE 0.
*   Read Subscr text
    SELECT dtxt INTO g_descript FROM d020t UP TO 1 ROWS
               WHERE prog = l_prog
                 AND dynr = l_dynp.
    ENDSELECT.
    IF sy-subrc NE 0.
      g_descript = 'Unkwoned'.                              "#EC *
    ENDIF.
  ENDIF.
  CONDENSE gt_dynprotab-fval.
  gt_data-col0 = gt_dynprotab-fnam.
  gt_data-col1 = gt_dynprotab-fval.
  gt_data-col2 = g_descript.
  m_append.


ENDFORM.                               " SUBSCR
*---------------------------------------------------------------------*
*       Form  F_FIELD
*---------------------------------------------------------------------*
FORM f_field.


  IF gt_dynprotab-fnam CA '-'.
    PERFORM complete USING gt_dynprotab-fnam.
  ENDIF.


  CHECK gt_dynprotab-fnam CA '-'.


  gt_data-col0 = gt_dynprotab-fnam.
  gt_data-col1 = gt_dynprotab-fval(40).
  gt_data-col2 = gs_field-ddtext(60).
  WRITE gs_field-length+3(3) TO gt_data-col3 NO-ZERO RIGHT-JUSTIFIED.
  WRITE gs_field-decimal+3(3)  TO gt_data-col4 NO-ZERO RIGHT-JUSTIFIED.
  gt_data-col5 = gs_field-type.
  gt_data-col6 = gs_field-tab_control.
  m_append.


ENDFORM.                               " F_FIELD
*---------------------------------------------------------------------*
*       FORM F_DISPLAY                                                *
*---------------------------------------------------------------------*
FORM f_display.


  TYPE-POOLS: slis.                    " Generic list types


  DATA :
    ls_layout        TYPE slis_layout_alv,
    ls_print         TYPE slis_print_alv,
    ls_fieldcat      TYPE slis_fieldcat_alv,
    lt_fieldcat      TYPE slis_t_fieldcat_alv,
    lt_sort          TYPE slis_t_sortinfo_alv,
    ls_sort          TYPE slis_sortinfo_alv,
    ls_grid_settings TYPE lvc_s_glay,
    lt_excluding     TYPE slis_t_extab.


  ls_grid_settings-top_p_only = 'X'.


  ls_layout-group_change_edit = 'X'.
  ls_layout-colwidth_optimize = 'X'.
  ls_layout-zebra             = 'X'.
  ls_layout-cell_merge        = 'X'.
  ls_layout-detail_popup      = 'X'.
  ls_layout-get_selinfos      = 'X'.
  ls_layout-no_colhead        = 'X'.
  ls_layout-no_sumchoice      = 'X'.
  ls_layout-no_totalline      = 'X'.
  ls_layout-info_fieldname    = 'COLOR'.
  ls_layout-box_fieldname     = 'BOX'.


  ls_print-no_print_selinfos  = 'X'.   " Display no selection infos
  ls_print-no_print_listinfos = 'X'.   " Display no listinfos


* Exclude CUA functions
  APPEND '&OUP' TO lt_excluding.
  APPEND '&ODN' TO lt_excluding.
  APPEND '&ILT' TO lt_excluding.


* Build field catalog
  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
       EXPORTING
            i_program_name     = sy-cprog
            i_internal_tabname = 'GT_DATA'
            i_inclname         = sy-cprog
       CHANGING
            ct_fieldcat        = lt_fieldcat.


  ls_fieldcat-just = 'R'.
  MODIFY lt_fieldcat FROM ls_fieldcat
  TRANSPORTING just WHERE fieldname = 'COL3' OR fieldname = 'COL4'.


  ls_fieldcat-tech = 'X'.
  MODIFY lt_fieldcat FROM ls_fieldcat
  TRANSPORTING tech WHERE fieldname = 'COLX'  OR fieldname = 'COLJ'
                       OR fieldname = 'COLOR' OR fieldname = 'BOX'.


* Build sort table
  CLEAR ls_sort.
  ls_sort-fieldname = 'COLX'.
  ls_sort-up        = 'X'.
  ls_sort-group     = 'UL'.            " Underline
  APPEND ls_sort TO lt_sort.


  CLEAR ls_sort.
  ls_sort-fieldname = 'COLJ'.
  ls_sort-up        = 'X'.             " Sort
  APPEND ls_sort TO lt_sort.


  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
       EXPORTING
            i_interface_check  = ' '
            i_buffer_active    = ' '
            i_callback_program = sy-cprog
            i_grid_settings    = ls_grid_settings
            is_layout          = ls_layout
            it_fieldcat        = lt_fieldcat
            it_excluding       = lt_excluding
            it_sort            = lt_sort
            i_default          = ' '
            i_save             = 'A'
            is_print           = ls_print
       TABLES
            t_outtab           = gt_data
       EXCEPTIONS
            program_error      = 1
            OTHERS             = 2.


  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


ENDFORM.
*---------------------------------------------------------------------*
*      Form  F_CHOOSE_SHDB
*---------------------------------------------------------------------*
FORM f_choose_shdb USING u_value1 TYPE fieldname
                         u_value2 TYPE dynfnam
                CHANGING u_val.


  TYPES:
    BEGIN OF ty_s_values,
      qid      TYPE apq_quid,
      groupid  TYPE apq_grpn,
      creator  TYPE apq_mapn,
      credate  TYPE apq_crda,
      cretime  TYPE apq_crti,
      transcnt TYPE apq_tran,
      msgcnt   TYPE apq_reco,
    END OF ty_s_values.


  DATA:
    lt_values  TYPE TABLE OF ty_s_values,
    Lt_return  TYPE HRRETURN_TAB WITH HEADER LINE,
    l_progname TYPE sy-repid,
    l_dynnum   TYPE sy-dynnr.


  l_progname = sy-repid.
  l_dynnum   = sy-dynnr.


  IF u_value1 = 'GROUPID'.
    SELECT *
      FROM apqi
      INTO CORRESPONDING FIELDS OF TABLE lt_values
     WHERE datatyp = c_%bdc
       AND mandant = sy-mandt.
  ELSE.
    SELECT *
      FROM apqi
      INTO CORRESPONDING FIELDS OF TABLE lt_values
     WHERE datatyp = c_%bdc
       AND mandant = sy-mandt
       AND groupid = p_grpid.
  ENDIF.


* F4 help
  CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
       EXPORTING
            retfield        = u_value1
            dynpprog        = l_progname
            dynpnr          = l_dynnum
            dynprofield     = u_value2
            value_org       = 'S'
       TABLES
            value_tab       = lt_values
            return_tab      = lt_return
       EXCEPTIONS
            parameter_error = 1
            no_values_found = 2
            OTHERS          = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.


  CHECK NOT lt_return[] IS INITIAL.
  READ TABLE lt_return INDEX 1.
  u_val = lt_return-fieldval.


ENDFORM.                               " F_CHOOSE_SHDB
***************** END OF PROGRAM Z_ALV_SHDB_DOC ***********************