首页 > 技术文章 > 通用函数接口日志

sapSB 2017-03-22 15:59 原文

即插即用^_^

 使用时:

ZLYLOG 'ZLYTEST01' '01'."FM开头

ZLYLOG 'ZLYTEST01' '02'."FM结尾

 

TABLE:ZLOGDATA(此表是来存储所有LOG,字段可自由调整,此处只留有日期,时间,函数名)

 

INCLUDE ZLYLOG,复制,激活(此INCLUDE是LOG主要部分,用来处理函数参数并记录Log以及log展示)

 在函数中使用时,需要将此INCLUDE加入函数主程序的最前方。如果有命名冲突,可修改。

TABLES:TFDIR,TRDIR,ENLFDIR,RS38L,RFCDES,T100,TLIBG.

"BEGIN
DATA:BEGIN OF LS_HEAD,
       NAME   TYPE RS38L_FNAM,
       ERDAT  TYPE ERDAT,
       ZEIT   TYPE UZEIT,
       INDX   TYPE NUMC2,
       FDNAME TYPE RS38L_PAR_,
       AREA   TYPE RS38L_AREA,
       ERNAM  TYPE UNAME,
       RTYPE  TYPE BAPI_MTYPE,
*       TCODE  TYPE TCODE,
*       ADDR   TYPE NI_NODEADDR,
     END OF LS_HEAD.
DATA:BEGIN OF CELL_HEADER OCCURS 0,
       HTEXT     TYPE STRING,
       WIDTH     TYPE I,
       NO_OUT,
       NO_ZERO,
       JUSTIFIED,
     END OF CELL_HEADER.
DATA:  LV_PNAME_GD         TYPE TFDIR-PNAME,
       LS_HEADER_GD        TYPE HEADER_FB,
       LT_TABLES_GD        TYPE RSFB_PARA,
       LT_IMPORT_GD        TYPE RSFB_PARA,
       LT_EXPORT_GD        TYPE RSFB_PARA,
       LT_CHANGE_GD        TYPE RSFB_PARA,
       LV_PROGNAME_GD      TYPE TRDIR-NAME,
       LV_PARANAME_GD(100).

FIELD-SYMBOLS: <LS_PARA>    TYPE RSFBPARA,
               <LV_PARAFLD> TYPE ANY,
               <LV_PARAVAL> TYPE ANY,
               <DYN_TABLE>  TYPE STANDARD TABLE,
               <LT_PARAFLD> TYPE ANY TABLE,
               <LT_PARAVAL> TYPE ANY TABLE.


DATA:LV_HEAD TYPE ZLOGDATA.

DATA:GT_TAB TYPE TABLE OF ZLOGDATA,
     GV_TAB LIKE LINE OF GT_TAB,
     GW_TAB LIKE LINE OF GT_TAB.

DATA:DY_TABLE TYPE REF TO DATA,
     DY_LINE  TYPE REF TO DATA.


INCLUDE MS38LCOM.
DATA: DOCUMENTATION LIKE FUNCT OCCURS 0 WITH HEADER LINE.

DATA: TESTSTEP(3) VALUE 'PBO'.
DATA : BEGIN OF FDESC OCCURS 10,
         NAME(30),                     "Feldname
         TABLE(40),                    "Tabellenname
         TYPE(1),                      "Datentyp
         LENGTH(5),                    "Länge
         ILENGTH(5),                   "Eingabelänge
         HLENGTH    TYPE P,               "Eingabelänge
         FTYPE(3),                     "Typ fdt_...
         VALUE      TYPE STRING,
         "I IMPORT
         "E EXPORT
         "C CHANGING
         "S STRUCTURE
         "Y TYPE
         "T TABLE
         NUMBER     TYPE I,                "Referenz, wessen Struktur
       END OF FDESC.

DATA: MAX_FIELD_LENGTH_PAI TYPE I,
      MAX_FIELD_LENGTH     TYPE I,         " Maximale Feldlaenge
      FDESC_INDEX          LIKE SY-TABIX,
      PARAM_VALUE(220),
      V_PARAM_VALUE(220),
      D100_IOHIDE.

DATA: STRUC_INFO_TABLE_ENTRY TYPE NF2TY_STRUC_INFO_TABLE_ENTRY,
      STRUC_INFO_TABLE       TYPE NF2TY_STRUC_INFO_TABLE,
      STRUC_INFO_TABLE_COPY  TYPE NF2TY_STRUC_INFO_TABLE.
INCLUDE: <ICON>.

FIELD-SYMBOLS: <F>.
DATA:GV_FLAG TYPE C.




*&---------------------------------------------------------------------*
*&      Form  IN_DESCRIBE_FIELDS
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM IN_DESCRIBE_INTERFACE USING P_FNAME.
  REFRESH FDESC.
  CLEAR: MAX_FIELD_LENGTH, MAX_FIELD_LENGTH_PAI.

* --Importfelder : Name, Länge und Typ bestimmen
  LOOP AT IF_IMPORT.
    AT LAST .
      GV_FLAG = 'X'.
    ENDAT.

*    perform prm_write_header using text-130.
    PERFORM IN_DESCRIBE_FIELDS USING P_FNAME
                                     IF_IMPORT-PARAMETER
                                     IF_IMPORT-TYP
                                     IF_IMPORT-DBFIELD
                                     'I'
                                     TEXT-130.
  ENDLOOP.
* --Changefelder : Name, Länge und Typ bestimmen
  LOOP AT IF_CHANGE.
    AT LAST .
      GV_FLAG = 'X'.
    ENDAT.
    PERFORM IN_DESCRIBE_FIELDS USING P_FNAME
                                     IF_CHANGE-PARAMETER
                                     IF_CHANGE-TYP
                                     IF_CHANGE-DBFIELD
                                     'C'
                                     TEXT-132.
  ENDLOOP.
* --Exportfelder : Name, Länge und Typ bestimmen
  IF GV_TAB-INDX = '02'.
    LOOP AT IF_EXPORT.                   "keine neue Beschreibung wenn
      AT LAST .
        GV_FLAG = 'X'.
      ENDAT.
      READ TABLE FDESC WITH KEY IF_EXPORT-PARAMETER.  "schon IMPORT
      IF SY-SUBRC = 0.                   "Schon Input-Parameter ?
        IF FDESC-FTYPE = 'I'.            "nur Typ entsprechend ändern
          FDESC-FTYPE = 'IO'.
        ELSEIF FDESC-FTYPE = 'IS'.
          FDESC-FTYPE = 'IOS'.
        ENDIF.
        MODIFY FDESC INDEX SY-TABIX.
      ELSE.
        PERFORM IN_DESCRIBE_FIELDS USING P_FNAME
                                         IF_EXPORT-PARAMETER
                                         IF_EXPORT-TYP
                                         IF_EXPORT-DBFIELD
                                         'O'
                                         TEXT-140.
      ENDIF.
    ENDLOOP.
  ENDIF.
* --Tablesfelder : Name, Länge und Typ bestimmen
  LOOP AT IF_TABLES.
    AT LAST .
      GV_FLAG = 'X'.
    ENDAT.
    PERFORM IN_DESCRIBE_FIELDS USING P_FNAME
                                     IF_TABLES-PARAMETER
                                     IF_TABLES-TYP
                                     IF_TABLES-DBSTRUCT
                                     'T'
                                     TEXT-160.
  ENDLOOP.
* --Exceptions : Nix zu Bestimmen
  LOOP AT IF_EXCEPT.
    CLEAR FDESC.
    FDESC-NAME = IF_EXCEPT-EXCEPTION.
    APPEND FDESC.
  ENDLOOP.

* Abtrennen
  CLEAR FDESC.
  FDESC-NAME = '*'.
  APPEND FDESC.
  MAX_FIELD_LENGTH = MAX_FIELD_LENGTH + 35.
  IF MAX_FIELD_LENGTH < 80.
    MAX_FIELD_LENGTH = 80.
  ENDIF.
  MAX_FIELD_LENGTH_PAI = MAX_FIELD_LENGTH_PAI + 35.
  IF MAX_FIELD_LENGTH_PAI < 80.
    MAX_FIELD_LENGTH_PAI = 80.
  ENDIF.


ENDFORM.                               " IN_DESCRIBE_FIELDS

*---------------------------------------------------------------------*
*       FORM IN_DESCRIBE_FIELDS                                       *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  P_PARAMETER                                                   *
*  -->  P_TYP                                                         *
*  -->  P_STRUC                                                       *
*  -->  P_KIND                                                        *
*---------------------------------------------------------------------*
FORM IN_DESCRIBE_FIELDS USING    P_FNAME
                                 P_PARAMETER
                                 P_TYP
                                 P_STRUC
                                 P_KIND
                                 P_TEXT.
  DATA: L_SLINE TYPE NF2TY_INFO_ENTRY.
  DATA: OFFSET    LIKE SY-FDPOS,
        D_TYPE(1) TYPE C VALUE 'I'.
  DATA: O_PARAM_VALUE    LIKE PARAM_VALUE,
        RESULT_TEXT(250).
  FIELD-SYMBOLS: <F>, <F1>.

  CASE P_KIND.
    WHEN 'I'.
      READ TABLE LT_IMPORT_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = P_PARAMETER.
    WHEN 'O'.
      READ TABLE LT_EXPORT_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = P_PARAMETER.
    WHEN 'C'.
      READ TABLE LT_CHANGE_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = P_PARAMETER.
    WHEN 'T'.
      READ TABLE LT_TABLES_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = P_PARAMETER.
    WHEN OTHERS.
  ENDCASE.
  IF <LS_PARA>-STRUCTURE IS INITIAL.
    ASSIGN <LS_PARA>-PARAMETER TO <LV_PARAFLD>.
  ELSE.
    CREATE DATA DY_TABLE TYPE TABLE OF (<LS_PARA>-STRUCTURE).
    ASSIGN DY_TABLE->* TO <DYN_TABLE>.
    IF P_KIND = 'T'.
      ASSIGN DY_TABLE->* TO <LV_PARAFLD>.
    ELSE.
      CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>.
      ASSIGN DY_LINE->* TO <LV_PARAFLD>.
    ENDIF.

  ENDIF.

  CHECK <LV_PARAFLD> IS ASSIGNED.
  LOOP AT GT_TAB INTO GW_TAB WHERE NAME = GV_TAB-NAME AND ERDAT = GV_TAB-ERDAT
                             AND   ZEIT = GV_TAB-ZEIT AND ERNAM = GV_TAB-ERNAM
                             AND   AREA = GV_TAB-AREA AND FDNAME = <LS_PARA>-PARAMETER.
    MOVE-CORRESPONDING GW_TAB TO LS_HEAD.
    TRY .
        IMPORT LS_HEAD-FDNAME = <LV_PARAFLD> FROM DATABASE ZLOGDATA(FL) ID LS_HEAD IGNORING CONVERSION ERRORS .
      CATCH CX_SY_IMPORT_MISMATCH_ERROR.
*        MESSAGE '参数有变更' TYPE 'S'.
        MESSAGE S101(ZCRM_MSG).
*        EXIT.
    ENDTRY.

  ENDLOOP.

  CLEAR FDESC.
  PERFORM CB_CALLBACK_DESCRIBE USING <LV_PARAFLD> P_PARAMETER P_KIND.


  FDESC-NAME = P_PARAMETER.
  IF NOT P_TYP IS INITIAL.
    FDESC-TABLE = P_TYP.
    CASE P_TYP.
      WHEN 'I' OR 'C' OR 'N' OR 'P' OR 'F' OR 'b' OR 's' OR 'T'
           OR 'D' OR 'X' OR 'STRING' OR 'XSTRING'.
        FDESC-VALUE = <LV_PARAFLD>.
        CONCATENATE '''' P_TYP '''' INTO FDESC-TABLE.
      WHEN 'TABLE' OR 'STANDARD TABLE' OR 'HASHED TABLE' OR
           'SORTED TABLE' OR 'INDEX TABLE'.
      WHEN 'ANY'.
        CLEAR FDESC-TABLE.
      WHEN OTHERS.
    ENDCASE.
  ELSE.
    FDESC-TABLE = P_STRUC.
  ENDIF.
  READ TABLE STRUC_INFO_TABLE_ENTRY-TYPE_INFO INDEX 1 INTO L_SLINE.
  FDESC-TYPE = L_SLINE-STRUC_TYPE.
  IF L_SLINE-VLENGTH > 200.
    L_SLINE-VLENGTH = 200.
  ENDIF.
  IF FDESC-TYPE = 'y' OR FDESC-TYPE = 'g'.
*   Strings auf char 200
    L_SLINE-VLENGTH = 200.
  ENDIF.
  FDESC-LENGTH = L_SLINE-VLENGTH.
  FDESC-HLENGTH = L_SLINE-VLENGTH.
  FDESC-ILENGTH = L_SLINE-VLENGTH.
  IF L_SLINE-VLENGTH > MAX_FIELD_LENGTH.
    MAX_FIELD_LENGTH = L_SLINE-VLENGTH.
    MAX_FIELD_LENGTH_PAI = L_SLINE-VLENGTH.
  ENDIF.
  IF P_STRUC IS INITIAL.
    CASE FDESC-TYPE.
***JR 14.9.98
      WHEN 'h' OR 'v' OR IF_WB_CONSTANTS=>FLAG_STRUC OR 'u'.
*      when 'h' or 'v' or 'T' or IF_WB_CONSTANTS=>flag_struc or 'u'.
        CONCATENATE P_KIND FDESC-TYPE INTO FDESC-FTYPE.
      WHEN OTHERS.
        FDESC-FTYPE = P_KIND.
    ENDCASE.
  ELSE.
    CONCATENATE P_KIND 'S' INTO FDESC-FTYPE.
  ENDIF.
  IF FDESC-VALUE IS INITIAL.
    IF FDESC-TYPE CA '%hvu'.
      FDESC-VALUE = '?'.
    ELSE.
      FDESC-VALUE = <LV_PARAFLD>.
    ENDIF.
  ENDIF.

  APPEND FDESC.

  IF GV_FLAG = 'X'.

    FORMAT COLOR 1 INTENSIFIED ON.
    ASSIGN SY-ULINE(MAX_FIELD_LENGTH) TO <F>.
    WRITE:/ <F>.
    WRITE :/ SY-VLINE, P_TEXT, 34 SY-VLINE,
           35 TEXT-131.
    POSITION MAX_FIELD_LENGTH.
    WRITE SY-VLINE.
    WRITE:/ <F>.

    GV_FLAG = ''.

    LOOP AT FDESC WHERE FTYPE(1) = P_KIND.
      CHECK NOT FDESC-TYPE = 'l'.        "Datenreferenz
      FDESC_INDEX = SY-TABIX.            "wird für Zugriff gehided
      D100_IOHIDE = 'I'.                 "Hide für späteren Zugriff
      CLEAR PARAM_VALUE. CLEAR O_PARAM_VALUE.
      IF P_KIND = 'T' OR P_KIND = 'C'.
        D_TYPE = 'O'.
      ENDIF.
      IF FDESC-VALUE = '?'.
      ELSE.
        O_PARAM_VALUE = PARAM_VALUE = FDESC-VALUE.
      ENDIF.

      IF PARAM_VALUE CO ' '. ENDIF.      ".+-E1234567890' AND
      IF ( FDESC-TYPE = 'I' OR           " Integer
           FDESC-TYPE = 'F' OR           " Float
           FDESC-TYPE = 'h' ).           " Tabelle
* Die schreib er nämlich hinten hin
*        offset = sy-fdpos.             "219 - FDESC-ILENGTH.
        SHIFT PARAM_VALUE LEFT BY SY-FDPOS PLACES.
        IF O_PARAM_VALUE CO ' '. ENDIF.
        SHIFT O_PARAM_VALUE LEFT BY SY-FDPOS PLACES.
      ELSE.
        OFFSET = 0.
      ENDIF.
      IF FDESC-ILENGTH > 0.
        ASSIGN PARAM_VALUE+OFFSET(FDESC-ILENGTH) TO <F1>.
      ENDIF.
*   perform te_set_input_prompter using <f1>.
      FORMAT RESET.
      IF FDESC-TYPE = 'u' OR FDESC-TYPE = 'h' OR FDESC-TYPE = 'v' OR
         FDESC-TYPE = 'S' OR FDESC-TYPE = IF_WB_CONSTANTS=>FLAG_STRUC OR
         FDESC-TYPE = 'r' OR
         FDESC-FTYPE(1) = 'T'.                            " ec ftype = T
* Nicht eingabebereit, da sowieso nicht komplett oder Typgerecht pflegb.
        IF FDESC-TYPE = 'h' OR FDESC-FTYPE(1) = 'T'.
*       Sonst gibt es bei 5 Byte Tabellen '0 Eint'
*          ASSIGN PARAM_VALUE+OFFSET(25) TO <F1>.
          ASSIGN FDESC-VALUE TO <F1>.
          WRITE : / SY-VLINE, 3 FDESC-NAME, 34 SY-VLINE,
                  35 ICON_LIST AS ICON QUICKINFO TEXT-010 HOTSPOT ON,
                  38  <F1> HOTSPOT ON.
        ELSEIF FDESC-TYPE = 'r'.
          IF FDESC-TABLE(7) = 'REF TO '.                    "#EC NOTEXT
            ASSIGN PARAM_VALUE TO <F1>.
            WRITE : / SY-VLINE, 3 FDESC-NAME, 34 SY-VLINE,
                    35 ICON_OO_CLASS AS ICON QUICKINFO TEXT-010 HOTSPOT ON,
                    38  <F1> HOTSPOT ON.
          ELSE.
            WRITE : / SY-VLINE, 3 FDESC-NAME, 34 SY-VLINE,
                    35 ICON_OO_CLASS AS ICON QUICKINFO TEXT-158,
                    38  <F1>.
          ENDIF.
        ELSE.
          WRITE : / SY-VLINE, 3 FDESC-NAME, 34 SY-VLINE,
             35 ICON_DETAIL AS ICON QUICKINFO TEXT-010 HOTSPOT ON,
             38  <F1> HOTSPOT ON.
        ENDIF.
      ELSE.
        WRITE : / SY-VLINE, 3 FDESC-NAME, 34 SY-VLINE,
            35  <F1> INPUT ON.
      ENDIF.
      HIDE : FDESC_INDEX, D100_IOHIDE.
      POSITION MAX_FIELD_LENGTH.
      WRITE SY-VLINE.
    ENDLOOP.
    WRITE:/ <F>.
    FORMAT RESET.

  ENDIF.
ENDFORM.                               " IN_DESCRIBE_FIELDS
*&---------------------------------------------------------------------*
*&      Form  IN_IMPORT_INTERFACE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM IN_IMPORT_INTERFACE USING P_FUNCNAME.
  DATA ENHA_IMP TYPE RSFB_IMP.
  DATA ENHA_EXP TYPE RSFB_EXP.
  DATA ENHA_CHA TYPE RSFB_CHA.
  DATA ENHA_TBL TYPE RSFB_TBL.
  DATA ENHA_DOCU TYPE TABLE OF RSFDO.

  REFRESH: IF_IMPORT, IF_EXPORT, IF_CHANGE, IF_TABLES, IF_EXCEPT,
           DOCUMENTATION.

*ec Sept. 2004 wg. SFW, Switches sollen noch berücksichtigt werden
  CALL FUNCTION 'FUNCTION_IMPORT_DOKU'
    EXPORTING
      FUNCNAME           = P_FUNCNAME
      WITH_ENHANCEMENTS  = 'X'
    TABLES
      EXCEPTION_LIST     = IF_EXCEPT
      EXPORT_PARAMETER   = IF_EXPORT
      IMPORT_PARAMETER   = IF_IMPORT
      CHANGING_PARAMETER = IF_CHANGE
      TABLES_PARAMETER   = IF_TABLES
      DOKUMENTATION      = DOCUMENTATION
    EXCEPTIONS
      ERROR_MESSAGE      = 1
      FUNCTION_NOT_FOUND = 2
      INVALID_NAME       = 3
      OTHERS             = 4.
  LOOP AT DOCUMENTATION.
    MOVE-CORRESPONDING DOCUMENTATION TO PARAM_DOCU.
    APPEND PARAM_DOCU.
  ENDLOOP.

ENDFORM.                               " IN_IMPORT_INTERFACE
*---------------------------------------------------------------------*
*       FORM CB_CALLBACK_DESCRIBE                                     *
*---------------------------------------------------------------------*
*       ........                                                      *
*---------------------------------------------------------------------*
*  -->  P_VALUE                                                       *
*  -->  P_NAME                                                        *
*---------------------------------------------------------------------*
FORM CB_CALLBACK_DESCRIBE USING P_VALUE
                                P_NAME
                                P_KIND.
  DATA: L_TYPE_INFO TYPE  NF2TY_STRUC_INFO.
  DATA:S_TYPE_INFO LIKE LINE OF L_TYPE_INFO.
  DATA:LV_I TYPE N.
  FIELD-SYMBOLS:<F1> TYPE ANY TABLE.

  CALL FUNCTION 'RS_COMPLEX_OBJECT_TYPEINFO_GET'
    EXPORTING
      OBJECT_NAME = P_NAME
      OBJECT      = P_VALUE
    IMPORTING
      TYPE_INFO   = L_TYPE_INFO
    EXCEPTIONS
      OTHERS      = 0.
  STRUC_INFO_TABLE_ENTRY-PARAM_NAME = P_NAME.
  STRUC_INFO_TABLE_ENTRY-TYPE_INFO  = L_TYPE_INFO.
  APPEND STRUC_INFO_TABLE_ENTRY TO STRUC_INFO_TABLE.

  READ TABLE L_TYPE_INFO INDEX 1 INTO S_TYPE_INFO.
  IF SY-SUBRC = 0 .
    FDESC-TYPE = S_TYPE_INFO-STRUC_TYPE.
    IF ( FDESC-TYPE = 'h' OR FDESC-FTYPE(1) = 'T' ) OR ( P_KIND = 'T' AND FDESC-TYPE = '%' ).
      ASSIGN P_VALUE TO <F1>.
      DESCRIBE TABLE <F1> LINES LV_I.
      CONCATENATE LV_I '条目' INTO FDESC-VALUE.
    ENDIF.
  ENDIF.
ENDFORM.                    "cb_callback_describe









DEFINE ZLYLOG.

  LS_HEAD-NAME = &1.
  LS_HEAD-ERDAT = SY-DATUM.
  LS_HEAD-ZEIT = SY-UZEIT.
  LS_HEAD-INDX = &2.
  LS_HEAD-RTYPE = &3.
  LS_HEAD-ERNAM = SY-UNAME.


  LS_HEADER_GD-NAME = &1.

*  IF &1 = 'AUTH_CHECK_TCODE'.
*    LS_HEAD-TCODE = SY-TCODE.
*    CALL FUNCTION 'TH_USER_INFO'
*     IMPORTING
*       ADDRSTR   =  LS_HEAD-ADDR.
*  ENDIF.


*  read function-pool
    SELECT SINGLE PNAME
           FROM TFDIR
           INTO  LV_PNAME_GD
           WHERE FUNCNAME =  LS_HEADER_GD-NAME.
    CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
      EXPORTING
        PROGRAM   = LV_PNAME_GD
      IMPORTING
        GROUP     = LS_HEADER_GD-AREA
        NAMESPACE = LS_HEADER_GD-NAMESPACE.

    LS_HEAD-AREA = LS_HEADER_GD-AREA.
*  insert namespace (e.g. /AFS/)
    CONCATENATE LS_HEADER_GD-NAMESPACE LS_HEADER_GD-AREA
           INTO LS_HEADER_GD-AREA.
*  read parameter of function module
    CALL METHOD CL_FB_PARAMETER_DB=>READ
      IMPORTING
        TABLES = LT_TABLES_GD[]
        IMPORT = LT_IMPORT_GD[]
        EXPORT = LT_EXPORT_GD[]
        CHANGE = LT_CHANGE_GD[]
      CHANGING
        HEADER = LS_HEADER_GD.

    LV_PROGNAME_GD =  LS_HEADER_GD-NAME.
    TRANSLATE  LV_PROGNAME_GD USING ' ='.
    LV_PROGNAME_GD+30 = 'FT'.

    LOOP AT  LT_IMPORT_GD ASSIGNING <LS_PARA>.
      CONCATENATE '(' LV_PROGNAME_GD ')%_I' <LS_PARA>-PARAMETER
                   INTO LV_PARANAME_GD.
      ASSIGN (LV_PARANAME_GD) TO <LV_PARAFLD>.
      CHECK SY-SUBRC = 0.
      LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
      MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
      EXPORT LS_HEAD-FDNAME = <LV_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
    ENDLOOP.

    IF &2 = '02'.
      LOOP AT  LT_EXPORT_GD ASSIGNING <LS_PARA>.
        CONCATENATE '(' LV_PROGNAME_GD ')%_O' <LS_PARA>-PARAMETER
                     INTO LV_PARANAME_GD.
        ASSIGN (LV_PARANAME_GD) TO <LV_PARAFLD>.
        CHECK SY-SUBRC = 0.
        LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
        MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
        EXPORT LS_HEAD-FDNAME = <LV_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
      ENDLOOP.
    ENDIF.
    LOOP AT  LT_CHANGE_GD ASSIGNING <LS_PARA>.
      CONCATENATE '(' LV_PROGNAME_GD ')%_I' <LS_PARA>-PARAMETER
                   INTO LV_PARANAME_GD.
      ASSIGN (LV_PARANAME_GD) TO <LV_PARAFLD>.
      CHECK SY-SUBRC = 0.
      LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
      MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
      EXPORT LS_HEAD-FDNAME = <LV_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
    ENDLOOP.
    LOOP AT  LT_TABLES_GD ASSIGNING <LS_PARA>.
      CONCATENATE '(' LV_PROGNAME_GD ')%_I'
                  <LS_PARA>-PARAMETER '[]'
                  INTO LV_PARANAME_GD.
      IF &2 = '02'.
      CONCATENATE '(' LV_PROGNAME_GD ')%_O'
                <LS_PARA>-PARAMETER '[]'
                INTO LV_PARANAME_GD.
      ENDIF.
      ASSIGN (LV_PARANAME_GD) TO <LT_PARAFLD>.
      CHECK SY-SUBRC = 0.
      LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
      MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
      EXPORT LS_HEAD-FDNAME = <LT_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
      CONCATENATE <LS_PARA>-PARAMETER '[]' INTO LV_PARANAME_GD.
    ENDLOOP.
END-OF-DEFINITION.
FORM ZLYLOG USING GV_FM LV_C LV_T.

  DATA:  LV_PNAME_GD         TYPE TFDIR-PNAME,
         LS_HEADER_GD        TYPE HEADER_FB,
         LT_TABLES_GD        TYPE RSFB_PARA,
         LT_IMPORT_GD        TYPE RSFB_PARA,
         LT_EXPORT_GD        TYPE RSFB_PARA,
         LT_CHANGE_GD        TYPE RSFB_PARA,
         LV_PROGNAME_GD      TYPE TRDIR-NAME,
         LV_PARANAME_GD(100).

  FIELD-SYMBOLS: <LS_PARA>    TYPE RSFBPARA,
                 <LV_PARAFLD> TYPE ANY,
                 <LV_PARAVAL> TYPE ANY,
                 <LT_PARAFLD> TYPE ANY TABLE,
                 <LT_PARAVAL> TYPE ANY TABLE.

*  DATA:LS_HEAD TYPE TY_HEAD.
  LS_HEAD-NAME = GV_FM.
  LS_HEAD-ERDAT = SY-DATUM.
  LS_HEAD-ZEIT = SY-UZEIT.
  LS_HEAD-INDX = LV_C.
  LS_HEAD-RTYPE = LV_T.
  LS_HEAD-ERNAM = SY-UNAME.

  DATA:LV_HEAD TYPE ZLOGDATA.

  LS_HEADER_GD-NAME = GV_FM.

*  read function-pool
  SELECT SINGLE PNAME
         FROM TFDIR
         INTO  LV_PNAME_GD
         WHERE FUNCNAME =  LS_HEADER_GD-NAME.
  CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
    EXPORTING
      PROGRAM   = LV_PNAME_GD
    IMPORTING
      GROUP     = LS_HEADER_GD-AREA
      NAMESPACE = LS_HEADER_GD-NAMESPACE.

  LS_HEAD-AREA = LS_HEADER_GD-AREA.
*  insert namespace (e.g. /AFS/)
  CONCATENATE LS_HEADER_GD-NAMESPACE LS_HEADER_GD-AREA
         INTO LS_HEADER_GD-AREA.
*  read parameter of function module
  CALL METHOD CL_FB_PARAMETER_DB=>READ
    IMPORTING
      TABLES = LT_TABLES_GD[]
      IMPORT = LT_IMPORT_GD[]
      EXPORT = LT_EXPORT_GD[]
      CHANGE = LT_CHANGE_GD[]
    CHANGING
      HEADER = LS_HEADER_GD.

  LV_PROGNAME_GD =  LS_HEADER_GD-NAME.
  TRANSLATE  LV_PROGNAME_GD USING ' ='.
  LV_PROGNAME_GD+30 = 'FT'.

  LOOP AT  LT_IMPORT_GD ASSIGNING <LS_PARA>.
    CONCATENATE '(' LV_PROGNAME_GD ')%_I' <LS_PARA>-PARAMETER
                 INTO LV_PARANAME_GD.
    ASSIGN (LV_PARANAME_GD) TO <LV_PARAFLD>.
    CHECK SY-SUBRC = 0.
    LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
    MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
    EXPORT LS_HEAD-FDNAME = <LV_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
  ENDLOOP.

  IF LV_C = '02'.
    LOOP AT  LT_EXPORT_GD ASSIGNING <LS_PARA>.
      CONCATENATE '(' LV_PROGNAME_GD ')%_O' <LS_PARA>-PARAMETER
                   INTO LV_PARANAME_GD.
      ASSIGN (LV_PARANAME_GD) TO <LV_PARAFLD>.
      CHECK SY-SUBRC = 0.
      LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
      MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
      EXPORT LS_HEAD-FDNAME = <LV_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
    ENDLOOP.
  ENDIF.
  LOOP AT  LT_CHANGE_GD ASSIGNING <LS_PARA>.
    CONCATENATE '(' LV_PROGNAME_GD ')%_I' <LS_PARA>-PARAMETER
                 INTO LV_PARANAME_GD.
    ASSIGN (LV_PARANAME_GD) TO <LV_PARAFLD>.
    CHECK SY-SUBRC = 0.
    LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
    MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
    EXPORT LS_HEAD-FDNAME = <LV_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
  ENDLOOP.
  LOOP AT  LT_TABLES_GD ASSIGNING <LS_PARA>.
    CONCATENATE '(' LV_PROGNAME_GD ')%_I'
                <LS_PARA>-PARAMETER '[]'
                INTO LV_PARANAME_GD.
    IF LV_C = '02'.
      CONCATENATE '(' LV_PROGNAME_GD ')%_O'
                <LS_PARA>-PARAMETER '[]'
                INTO LV_PARANAME_GD.
    ENDIF.
    ASSIGN (LV_PARANAME_GD) TO <LT_PARAFLD>.
    CHECK SY-SUBRC = 0.
    LS_HEAD-FDNAME = <LS_PARA>-PARAMETER.
    MOVE-CORRESPONDING LS_HEAD TO LV_HEAD.
    EXPORT LS_HEAD-FDNAME = <LT_PARAFLD> TO DATABASE ZLOGDATA(FL) FROM LV_HEAD ID LS_HEAD.
    CONCATENATE <LS_PARA>-PARAMETER '[]' INTO LV_PARANAME_GD.
  ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PRM_SELECT_DETAIL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PRM_SELECT_DETAIL .
  READ TABLE FDESC INDEX FDESC_INDEX.
  CHECK FDESC-TYPE = '%' OR FDESC-TYPE = 'h' OR FDESC-TYPE = 'T'.
  CASE FDESC-FTYPE+0(1).
    WHEN 'I'.
      READ TABLE LT_IMPORT_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = FDESC-NAME..
    WHEN 'C'.
      READ TABLE LT_CHANGE_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = FDESC-NAME..
    WHEN 'O'.
      READ TABLE LT_EXPORT_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = FDESC-NAME..
    WHEN 'T'.
      READ TABLE LT_TABLES_GD ASSIGNING <LS_PARA> WITH KEY PARAMETER = FDESC-NAME..
    WHEN OTHERS.
  ENDCASE.

  CHECK <LS_PARA> IS ASSIGNED.

  CREATE DATA DY_TABLE TYPE TABLE OF (<LS_PARA>-STRUCTURE).
  ASSIGN DY_TABLE->* TO <DYN_TABLE>.
  IF FDESC-FTYPE+0(1) = 'T'.
    ASSIGN <DYN_TABLE> TO <LV_PARAFLD>.
  ELSE.
    CREATE DATA DY_LINE LIKE LINE OF <DYN_TABLE>.
    ASSIGN DY_LINE->* TO <LV_PARAFLD>.
  ENDIF.

  LOOP AT GT_TAB INTO GW_TAB WHERE NAME = GV_TAB-NAME AND ERDAT = GV_TAB-ERDAT
                              AND   ZEIT = GV_TAB-ZEIT AND INDX = GV_TAB-INDX
                              AND   ERNAM = GV_TAB-ERNAM AND AREA = GV_TAB-AREA AND FDNAME = <LS_PARA>-PARAMETER.
    MOVE-CORRESPONDING GW_TAB TO LS_HEAD.
    TRY .
        IMPORT LS_HEAD-FDNAME = <LV_PARAFLD> FROM DATABASE ZLOGDATA(FL) ID LS_HEAD IGNORING CONVERSION ERRORS .
      CATCH CX_SY_IMPORT_MISMATCH_ERROR.
        MESSAGE '函数结构已变更' TYPE 'S'.
    ENDTRY.

  ENDLOOP.
  CALL FUNCTION 'RS_COMPLEX_OBJECT_EDIT'
    EXPORTING
      OBJECT_NAME          = FDESC-NAME
      MODE                 = ' '
      INSERT_TAB           = 'X'
      UPPER_CASE           = 'X'
      POPUP                = ' '
*     DISPLAY_ACCESSIBLE   = ' '
    CHANGING
      OBJECT               = <LV_PARAFLD>
    EXCEPTIONS
      OBJECT_NOT_SUPPORTED = 1.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PRM_GET_INTERFACE_PARA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_GV_TAB_NAME  text
*----------------------------------------------------------------------*
FORM PRM_GET_INTERFACE_PARA  USING    P_GV_TAB_NAME.
  LS_HEADER_GD-NAME = P_GV_TAB_NAME.
  SELECT SINGLE PNAME
        FROM TFDIR
        INTO  LV_PNAME_GD
  WHERE FUNCNAME =  LS_HEADER_GD-NAME.
  CALL FUNCTION 'FUNCTION_INCLUDE_SPLIT'
    EXPORTING
      PROGRAM   = LV_PNAME_GD
    IMPORTING
      GROUP     = LS_HEADER_GD-AREA
      NAMESPACE = LS_HEADER_GD-NAMESPACE.

  LS_HEAD-AREA = LS_HEADER_GD-AREA.
*  insert namespace (e.g. /AFS/)
  CONCATENATE LS_HEADER_GD-NAMESPACE LS_HEADER_GD-AREA
         INTO LS_HEADER_GD-AREA.

  CALL METHOD CL_FB_PARAMETER_DB=>READ
    IMPORTING
      TABLES = LT_TABLES_GD[]
      IMPORT = LT_IMPORT_GD[]
      EXPORT = LT_EXPORT_GD[]
      CHANGE = LT_CHANGE_GD[]
    CHANGING
      HEADER = LS_HEADER_GD.

  LV_PROGNAME_GD =  LS_HEADER_GD-NAME.
ENDFORM.
FORM APPENDHEAD USING TEXT WIDTH NO_OUT NO_ZERO JUSTIFIED.
  CELL_HEADER-HTEXT = TEXT.
  CELL_HEADER-WIDTH = WIDTH.
  CELL_HEADER-NO_OUT = NO_OUT.
  CELL_HEADER-NO_ZERO = NO_ZERO.
  CELL_HEADER-JUSTIFIED = JUSTIFIED.
  APPEND CELL_HEADER.
ENDFORM.
FORM WRITE_CELL TABLES HEADER STRUCTURE CELL_HEADER
                       ITEM TYPE STANDARD TABLE
                 USING   FISRTCOL.
  DATA:ULENGTH TYPE I,
       COL_NUM TYPE I.
  DATA:STR(1000),
       STR_IDX   TYPE STRING,
       F_INDEX   TYPE I.
  FIELD-SYMBOLS:<F_FIELD>.

  DESCRIBE TABLE HEADER LINES COL_NUM.
  LOOP AT HEADER WHERE NO_OUT = '' OR NO_OUT = 'Z'.
    ULENGTH = ULENGTH + HEADER-WIDTH + 1.
  ENDLOOP.
  ULENGTH = ULENGTH + 1.

  WRITE AT /FISRTCOL(ULENGTH) SY-ULINE.

  NEW-LINE.POSITION FISRTCOL.
  LOOP AT HEADER WHERE NO_OUT = '' OR NO_OUT = 'Z'.
    WRITE '|' NO-GAP.
    WRITE : AT (HEADER-WIDTH) HEADER-HTEXT CENTERED NO-GAP.
  ENDLOOP.
  WRITE '|' NO-GAP.
  WRITE AT /FISRTCOL(ULENGTH) SY-ULINE.

  LOOP AT ITEM.
    NEW-LINE.POSITION FISRTCOL.


    DO COL_NUM TIMES.
      READ TABLE HEADER INDEX SY-INDEX.
      ASSIGN COMPONENT SY-INDEX OF STRUCTURE ITEM TO <F_FIELD>.
      IF SY-SUBRC <> 0.
        EXIT.
      ELSE.
        STR_IDX = SY-INDEX.
        CONDENSE STR_IDX.
        F_INDEX = SY-INDEX - 1.
        IF HEADER-NO_OUT = ''.
          IF HEADER-NO_ZERO = 'X'.
            WRITE <F_FIELD> TO STR LEFT-JUSTIFIED.
          ENDIF.
          IF HEADER-JUSTIFIED = 'R'.
            WRITE : '|' NO-GAP,AT (HEADER-WIDTH) STR RIGHT-JUSTIFIED NO-GAP.
          ELSE.
            WRITE : '|' NO-GAP,AT (HEADER-WIDTH) STR LEFT-JUSTIFIED NO-GAP.
          ENDIF.
        ENDIF.
      ENDIF.

    ENDDO.

    WRITE '|' NO-GAP.
    WRITE AT /FISRTCOL(ULENGTH) SY-ULINE.

  ENDLOOP.

ENDFORM.

 

 

REPORT ZLYLOGP,显示:

"
REPORT ZLYLOGP NO STANDARD PAGE HEADING.
INCLUDE ZLYLOG.
DATA:GT_SHOW TYPE TABLE OF ZLOGDATA.

DATA:GT_FIELDCAT TYPE LVC_T_FCAT.
DATA GS_FIELDCAT LIKE LINE OF GT_FIELDCAT.
DATA LS_LAYOUT TYPE LVC_S_LAYO.

DEFINE APPEND_FIELDCAT .
  CLEAR GS_FIELDCAT.
  GS_FIELDCAT-FIELDNAME = &1.
  GS_FIELDCAT-SCRTEXT_L = &2.
  GS_FIELDCAT-OUTPUTLEN = &3.
  GS_FIELDCAT-NO_ZERO = &4.
  APPEND GS_FIELDCAT TO GT_FIELDCAT."GT_FIELDCAT.
END-OF-DEFINITION.

SELECTION-SCREEN:BEGIN OF BLOCK BLK01 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:S_NAME FOR ZLOGDATA-NAME.
SELECT-OPTIONS:S_ERDAT FOR ZLOGDATA-ERDAT.
SELECT-OPTIONS:S_ZEIT FOR ZLOGDATA-ZEIT.
SELECT-OPTIONS:S_AREA FOR ZLOGDATA-AREA.
SELECT-OPTIONS:S_ERNAM FOR ZLOGDATA-ERNAM.
SELECTION-SCREEN END OF BLOCK BLK01.


START-OF-SELECTION.


  SELECT * INTO CORRESPONDING FIELDS OF TABLE GT_TAB
      FROM ZLOGDATA
      WHERE NAME IN S_NAME
      AND   ERDAT IN S_ERDAT
      AND   ZEIT  IN S_ZEIT
      AND   AREA  IN S_AREA
      AND   ERNAM IN S_ERNAM.



  CHECK GT_TAB[] IS NOT INITIAL.

  GT_SHOW[] = GT_TAB[].

  SORT GT_SHOW BY RELID AREA NAME ERDAT ZEIT INDX ERNAM.
  DELETE ADJACENT DUPLICATES FROM GT_SHOW COMPARING RELID AREA NAME ERDAT ZEIT INDX ERNAM.


  PERFORM PRM_SHOW.

END-OF-SELECTION.



AT LINE-SELECTION.
  PERFORM PRM_SELECT_DETAIL.

TOP-OF-PAGE." DURING LINE-SELECTION.
  DATA:GV_STR TYPE STRING.
  DATA:GV_C(8) TYPE C.
  IF GV_TAB-INDX = '01'.
    GV_C = '传入参数'.
  ELSE.
    GV_C = '传出参数'.
  ENDIF.
  CONCATENATE '函数组:' GV_TAB-AREA '函数:' GV_TAB-NAME '用户' GV_TAB-ERNAM INTO GV_STR SEPARATED BY ' '.
  WRITE:GV_STR,GV_TAB-ERDAT,GV_TAB-ZEIT, SPACE, GV_C.
  ULINE /0(135).
*&---------------------------------------------------------------------*
*&      Form  PRM_SHOW
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PRM_SHOW .
  PERFORM PRM_SET_FIELD.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      I_CALLBACK_PROGRAM       = SY-REPID
      IS_LAYOUT_LVC            = LS_LAYOUT
      IT_FIELDCAT_LVC          = GT_FIELDCAT[]
      I_CALLBACK_PF_STATUS_SET = 'PRM_SET_STATUS'
      I_CALLBACK_USER_COMMAND  = 'PRM_USER_COMMAND'
*     I_STRUCTURE_NAME         = 'ZLOGDATA'
      I_DEFAULT                = 'X'
      I_SAVE                   = 'A'
    TABLES
      T_OUTTAB                 = GT_SHOW
    EXCEPTIONS
      PROGRAM_ERROR            = 1
      OTHERS                   = 2.
  IF SY-SUBRC <> 0.
* Implement suitable error handling here
  ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  PRM_SET_FIELD
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM PRM_SET_FIELD .
  REFRESH GT_FIELDCAT.
*  LS_LAYOUT-CWIDTH_OPT    = 'X'. "优化列宽选项是否设置
  LS_LAYOUT-ZEBRA         = 'X'.

  APPEND_FIELDCAT:
                  'NAME'               '函数名称'             30      'X',
                  'AREA'               '函数组'               26     '',
                  'ERDAT'              '日期'                 10     'X',
                  'ZEIT'               '时间'                 8     'X',
                  'ERNAM'              '用户名'               16     'X',
                  'RTYPE'              '消息类型'             8     '',
                  'INDX'               '序号'                 5     'X',
                  'RTMSG'              '消息内容'             60     ''.
ENDFORM.
FORM PRM_SET_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB..
  SET PF-STATUS 'ZSTAT' EXCLUDING RT_EXTAB.
ENDFORM.                    "PRM_SET_STATUS
FORM PRM_USER_COMMAND USING P_UCOMM    LIKE SY-UCOMM
                        P_SELFIELD TYPE SLIS_SELFIELD.
*  DATA:LV_DYN TYPE SY-DYNNR VALUE SY-DYNNR.
  IF P_UCOMM = '&IC1'.
    READ TABLE GT_SHOW INTO GV_TAB INDEX P_SELFIELD-TABINDEX.
    IF SY-SUBRC = 0.
      PERFORM PRM_GET_INTERFACE_PARA USING GV_TAB-NAME.
      PERFORM IN_IMPORT_INTERFACE USING GV_TAB-NAME."GET IMPORT INTERFACE
*      PERFORM IN_DESCRIBE_INTERFACE USING GV_TAB-NAME."GET IDESC INTERFACE
      CALL SCREEN 9000."这个屏幕需要创建,空屏幕只包含一个PBO
      SET SCREEN 0500."这个是alv屏幕^_^
    ENDIF.
  ENDIF.
ENDFORM.                    "PRM_USER_COMMAND
*&---------------------------------------------------------------------*
*&      Module  STATUS_9000  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_9000 OUTPUT.
*  SET PF-STATUS 'xxxxxxxx'.

*  SET TITLEBAR 'xxx'.
  LEAVE TO LIST-PROCESSING AND RETURN TO SCREEN 0.
  SET PF-STATUS SPACE.
  SUPPRESS DIALOG.
  PERFORM IN_DESCRIBE_INTERFACE USING GV_TAB-NAME."GET IDESC INTERFACE
ENDMODULE.

 

 

T-code使用日志

https://archive.sap.com/discussions/thread/1450444

 

推荐阅读