zoukankan      html  css  js  c++  java
  • ABAP一个不错的函数模块的文档生成程序

    *&---------------------------------------------------------------------*
    *& Report  ZABAPDOC
    *&
    *&---------------------------------------------------------------------*
    *& This report generate HTML files containing the API information about
    *& the selected function modules.
    *& SDN https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/u/251708914
    *& This program has been developed via the ABAP Eclipse Editor
    *&---------------------------------------------------------------------*

    REPORT  zabapdoc MESSAGE-ID eu.

    TYPE-POOLS:
      sscr.

    TABLES:
      tadir,
      tlibt,
      trdir.

    CLASS:
      lcl_source_scan DEFINITION DEFERRED.

    DATA:
      lo_sscan   TYPE REF TO lcl_source_scan,
      lv_appl    TYPE taplt-appl,
      tofolder_string TYPE string.

    SELECTION-SCREEN: BEGIN OF BLOCK a11 WITH FRAME TITLE a11.
    SELECT-OPTIONS:    devclass FOR tadir-devclass,
                       funcgrp  FOR tlibt-area.
    SELECTION-SCREEN: END OF BLOCK a11,
                      BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
    PARAMETERS:       funcmod     TYPE xfeld AS CHECKBOX DEFAULT 'X' ,
                      tofolder    TYPE char255 DEFAULT 'C:/TEMP'.
    SELECTION-SCREEN: END OF BLOCK a20.

    *----------------------------------------------------------------------*
    *       CLASS lcx_scan_exceptions DEFINITION
    *----------------------------------------------------------------------*
    *       Exceptions for source scanning
    *----------------------------------------------------------------------*
    CLASS lcx_scan_exceptions DEFINITION INHERITING FROM cx_static_check.
    ENDCLASS.                    "lcx_scan_exceptions DEFINITION

    *----------------------------------------------------------------------*
    *       CLASS lcl_source_scan DEFINITION
    *----------------------------------------------------------------------*
    *       ABAP source scanner
    *----------------------------------------------------------------------*
    CLASS lcl_source_scan DEFINITION.
      PUBLIC SECTION.
        METHODS:
          constructor,

          f4_class
            CHANGING
              cv_class_name TYPE clike,

          f4_function_group
            IMPORTING
              iv_group_name TYPE clike,

          f4_repname
            CHANGING
              cv_repname TYPE clike,

          start.

      PROTECTED SECTION.
        TYPES:
          BEGIN OF ty_ls_objname,
            report TYPE sy-repid,
            dynnr  TYPE sy-dynnr,
          END OF ty_ls_objname.

        TYPES:
          BEGIN OF ts_comment_tab,
            report TYPE sy-repid,
            source TYPE abaptxt255,
          END OF ts_comment_tab.

        DATA:
          gv_hit_count  TYPE i,
          gv_sstring    TYPE string,
          gv_dynp_found TYPE xfeld,
          gv_vers_found TYPE xfeld,
          gt_object     TYPE STANDARD TABLE OF tadir-obj_name,
          gt_vrsd       TYPE HASHED TABLE OF vrsd
                          WITH UNIQUE KEY objname versno,
          gt_results    TYPE TABLE OF ts_comment_tab
                          .


        CONSTANTS:
          gc_x TYPE xfeld VALUE 'X'.

        METHODS:

          display,

          get_version_numbers
            IMPORTING
              iv_report TYPE clike
              iv_dynpro TYPE clike OPTIONAL
            RETURNING value(rt_vrsd) LIKE gt_vrsd,

          get_source_names,

          get_source_by_version
            IMPORTING
              iv_report TYPE clike
              iv_dynpro TYPE clike OPTIONAL
              iv_versno TYPE vrsd-versno
            RETURNING value(rt_abap) TYPE abaptxt255_tab,

          get_report_names,
          get_function_names,
          get_includes,

          get_method_includes
            IMPORTING
              iv_class_name TYPE clike,

          search_abap_source   RAISING lcx_scan_exceptions,

          search_source
            IMPORTING
              it_source TYPE abaptxt255_tab
              iv_report TYPE clike
              iv_dynpro TYPE clike OPTIONAL
            RAISING lcx_scan_exceptions,

          generateindex,

          generateinfopage
              IMPORTING
                  iv_fm TYPE rs38l_fnam
                  iv_report TYPE progname OPTIONAL,

          get_parametertype
              IMPORTING
                  is_eparameter TYPE rsexp OPTIONAL
                  is_iparameter TYPE rsimp OPTIONAL
                  is_cparameter TYPE rscha OPTIONAL
                  is_tparameter TYPE rstbl OPTIONAL
              RETURNING value(rl_type) TYPE string,

          get_parametertypename
              IMPORTING
                  is_eparameter TYPE rsexp OPTIONAL
                  is_iparameter TYPE rsimp OPTIONAL
                  is_cparameter TYPE rscha OPTIONAL
                  is_tparameter TYPE rstbl OPTIONAL
              RETURNING value(rl_type) TYPE string.

    ENDCLASS.                    "lcl_source_scan DEFINITION

    *----------------------------------------------------------------------*
    *       CLASS lcl_source_scan IMPLEMENTATION
    *----------------------------------------------------------------------*
    *       ABAP source scanner
    *----------------------------------------------------------------------*
    CLASS lcl_source_scan IMPLEMENTATION.

      METHOD constructor.
        DATA:
          ls_restrict    TYPE sscr_restrict,
          ls_opt_list    TYPE sscr_opt_list,
          ls_association TYPE sscr_ass.

        ls_opt_list-name       = 'RESTRICT'.
        ls_opt_list-options-cp = gc_x.
        ls_opt_list-options-eq = gc_x.

        APPEND ls_opt_list TO ls_restrict-opt_list_tab.

        ls_association-kind    = 'S'.
        ls_association-name    = 'SSTRING'.
        ls_association-sg_main = 'I'.
        ls_association-op_main = ls_association-op_addy = 'RESTRICT'.

        APPEND ls_association TO ls_restrict-ass_tab.

        CALL FUNCTION 'SELECT_OPTIONS_RESTRICT'
          EXPORTING
            program                = sy-repid
            restriction            = ls_restrict
          EXCEPTIONS
            too_late               = 1
            repeated               = 2
            selopt_without_options = 3
            selopt_without_signs   = 4
            invalid_sign           = 5
            empty_option_list      = 6
            invalid_kind           = 7
            repeated_kind_a        = 8
            OTHERS                 = 9.

      ENDMETHOD.                    "constructor

      METHOD f4_repname.
        CALL FUNCTION 'REPOSITORY_INFO_SYSTEM_F4'
          EXPORTING
            object_type          = 'PROG'
            object_name          = cv_repname
            suppress_selection   = 'X'
          IMPORTING
            object_name_selected = cv_repname
          EXCEPTIONS
            cancel               = 1.
      ENDMETHOD.                                                "f4_repname

      METHOD f4_function_group.
        DATA:
          lv_fname TYPE dynfnam.

        lv_fname = iv_group_name.

        CALL FUNCTION 'RS_HELP_HANDLING'
          EXPORTING
            dynpfield                 = lv_fname
            dynpname                  = sy-dynnr
            object                    = 'FG  '
            progname                  = sy-repid
            suppress_selection_screen = 'X'.

      ENDMETHOD.                    "f4_function_group

      METHOD f4_class.
        CALL FUNCTION 'F4_DD_ALLTYPES'
          EXPORTING
            object               = cv_class_name
            suppress_selection   = gc_x
            display_only         = space
            only_types_for_clifs = gc_x
          IMPORTING
            RESULT               = cv_class_name.
      ENDMETHOD.                                                "f4_class

      METHOD display.
        DATA lv_filename TYPE string.

        WRITE: / 'API information files have been generated.'.
        CONCATENATE tofolder '/abapdoc_index.html' INTO lv_filename.
        WRITE: / 'Open',  lv_filename, 'in your browser to view the ABAPdoc.'.

      ENDMETHOD.                    "display


      METHOD get_source_by_version.
        DATA:
          lv_object_name TYPE versobjnam,
          ls_object_name TYPE ty_ls_objname,
          lt_trdir       TYPE STANDARD TABLE OF trdir,
          lt_d022s       TYPE STANDARD TABLE OF d022s.

        IF iv_dynpro IS INITIAL.
          lv_object_name = iv_report.

          CALL FUNCTION 'SVRS_GET_REPS_FROM_OBJECT'
            EXPORTING
              object_name                  = lv_object_name
              object_type                  = 'REPS'
              versno                       = iv_versno
              iv_no_release_transformation = 'X'
            TABLES
              repos_tab                    = rt_abap
              trdir_tab                    = lt_trdir
            EXCEPTIONS
              no_version                   = 1
              OTHERS                       = 2.
        ELSE.
          ls_object_name-report = iv_report.
          ls_object_name-dynnr  = iv_dynpro.

          lv_object_name = ls_object_name.

          CALL FUNCTION 'SVRS_GET_VERSION_DYNP_40'
            EXPORTING
              object_name = lv_object_name
              versno      = iv_versno
            TABLES
              d022s_tab   = lt_d022s
            EXCEPTIONS
              no_version  = 01
              OTHERS      = 02.

          CHECK sy-subrc IS INITIAL AND lt_d022s IS NOT INITIAL.

          APPEND LINES OF lt_d022s TO rt_abap.

        ENDIF.
      ENDMETHOD.                    "get_source_by_version

      METHOD get_version_numbers.
        DATA:
          ls_objname TYPE ty_ls_objname,
          lv_objtype TYPE vrsd-objtype,
          lv_objname TYPE versobjnam,
          lv_versno  TYPE versno,
          lt_vrsn    TYPE STANDARD TABLE OF vrsn,
          lt_vrsd    TYPE STANDARD TABLE OF vrsd.

        ls_objname-report = iv_report.
        ls_objname-dynnr  = iv_dynpro.
        lv_objname        = ls_objname.

        IF iv_dynpro IS INITIAL.
          lv_objtype = 'REPS'.
        ELSE.
          lv_objtype = 'DYNP'.
        ENDIF.

        CALL FUNCTION 'SVRS_GET_VERSION_DIRECTORY_46'
          EXPORTING
            objname                = lv_objname
            objtype                = lv_objtype
          TABLES
            lversno_list           = lt_vrsn
            version_list           = lt_vrsd
          EXCEPTIONS
            no_entry               = 1
            communication_failure_ = 2
            system_failure         = 3
            OTHERS                 = 4.

        CHECK sy-subrc IS INITIAL .

        SORT lt_vrsd BY objname versno.
        DELETE ADJACENT DUPLICATES FROM lt_vrsd COMPARING objname versno.

        rt_vrsd = lt_vrsd.

        DELETE TABLE rt_vrsd WITH TABLE KEY objname = lv_objname
                                            versno  = lv_versno.

        SORT rt_vrsd.

        CHECK iv_dynpro IS NOT INITIAL.
    *   For dynpros we need to save the version information for the version display
    *   this is not required for source code
        INSERT LINES OF rt_vrsd INTO TABLE gt_vrsd.

      ENDMETHOD.                    "get_version_Numbers

      METHOD search_abap_source.
        DATA:
          lt_abap TYPE abaptxt255_tab.

        FIELD-SYMBOLS:
         <lv_obj> TYPE tadir-obj_name.

        LOOP AT gt_object ASSIGNING <lv_obj>.
          READ REPORT <lv_obj> INTO lt_abap.
          IF sy-subrc IS NOT INITIAL.
            CONTINUE.
          ENDIF.

          search_source( it_source = lt_abap
                         iv_report = <lv_obj> ).

        ENDLOOP.

        "FREE gt_object.

      ENDMETHOD.                    "search_abap_source

      METHOD search_source.
        DATA:
          lt_source       TYPE abaptxt255_tab,
          lt_source_vers  TYPE abaptxt255_tab,
          lt_vrsd         TYPE STANDARD TABLE OF vrsd,
          ls_vrsd         LIKE LINE OF lt_vrsd,
          lv_number       TYPE i,
          lv_index        TYPE i.

        lt_source = it_source.

        lv_number = 1.

        DO lv_number TIMES.

          IF sy-index = 1.
            CLEAR ls_vrsd.
          ELSE.
            lv_index = sy-index - 1.
            READ TABLE lt_vrsd INDEX lv_index INTO ls_vrsd.
            CHECK sy-subrc IS INITIAL.

            lt_source_vers = get_source_by_version( iv_report = iv_report
                                                    iv_dynpro = iv_dynpro
                                                    iv_versno = ls_vrsd-versno ).

            IF lt_source_vers IS NOT INITIAL.
              lt_source = lt_source_vers.
            ELSE.
              CONTINUE.
            ENDIF.
          ENDIF.

          DATA: tokens       TYPE TABLE OF stokesx,
                token        TYPE stokesx,
                tokenource   TYPE stokesx,
                statement    TYPE sstmnt,
                statements   TYPE TABLE OF sstmnt,
                selectsource TYPE string,
                mat_res      TYPE ts_comment_tab,
                lv_line      TYPE abaptxt255.

          LOOP AT lt_source INTO lv_line.
            IF ( sy-tabix = 1 AND lv_line(8) = 'FUNCTION' ).
              CONTINUE.
            ELSEIF ( sy-tabix > 1 and lv_line(1) = '*' ).
                  mat_res-source = lv_line.
                  mat_res-report = iv_report.
                  INSERT mat_res INTO TABLE gt_results.
            ELSE.
              RETURN.
            ENDIF.
          ENDLOOP.
        ENDDO.
      ENDMETHOD.                    "search_source

      METHOD get_includes.
        DATA:
         lt_inc     TYPE STANDARD TABLE OF tadir-obj_name,
         lt_inc_tmp LIKE lt_inc,
         lv_program TYPE sy-repid,
         lv_old     TYPE xfeld.

        FIELD-SYMBOLS:
          <lv_obj> TYPE tadir-obj_name.

        LOOP AT gt_object ASSIGNING <lv_obj>
          WHERE table_line(2) <> 'CL'.    "for classes we already have the includes

          REFRESH lt_inc_tmp.

          IF lv_old IS NOT INITIAL.
            CALL FUNCTION 'GET_INCLUDES'
              EXPORTING
                progname = <lv_obj>
              TABLES
                incltab  = lt_inc_tmp.

          ELSE.
            lv_program = <lv_obj>.

            CALL FUNCTION 'RS_GET_ALL_INCLUDES'
              EXPORTING
                program      = lv_program
              TABLES
                includetab   = lt_inc_tmp
              EXCEPTIONS
                not_existent = 1
                no_program   = 2
                OTHERS       = 3.

            CHECK sy-subrc IS INITIAL.
          ENDIF.

          APPEND LINES OF lt_inc_tmp TO lt_inc.
        ENDLOOP.

        SORT lt_inc.
        DELETE ADJACENT DUPLICATES FROM lt_inc.

        APPEND LINES OF lt_inc TO gt_object.

      ENDMETHOD.                    "get_includes

      METHOD get_method_includes.
        DATA: lo_name     TYPE REF TO cl_oo_include_naming,
              lo_name_tmp TYPE REF TO if_oo_clif_incl_naming,
              lt_method   TYPE seop_methods_w_include,
              lv_obj      TYPE tadir-obj_name.

        FIELD-SYMBOLS:
         <ls_method> LIKE LINE OF lt_method.

        CALL METHOD cl_oo_include_naming=>get_instance_by_name
          EXPORTING
            name           = iv_class_name
          RECEIVING
            cifref         = lo_name_tmp
          EXCEPTIONS
            no_objecttype  = 1
            internal_error = 2
            OTHERS         = 3.

        CHECK sy-subrc IS INITIAL.

        lo_name ?= lo_name_tmp.

        CALL METHOD lo_name->if_oo_class_incl_naming~get_all_method_includes
          RECEIVING
            methods_w_include           = lt_method
          EXCEPTIONS
            internal_class_not_existing = 1
            OTHERS                      = 2.

        LOOP AT lt_method ASSIGNING <ls_method>.
          lv_obj = <ls_method>-incname.
          APPEND lv_obj TO gt_object.
        ENDLOOP.
      ENDMETHOD.                    "get_method_includes

      METHOD get_report_names.
        SELECT obj_name INTO TABLE gt_object
          FROM tadir
          WHERE pgmid  = 'R3TR'
          AND   object = 'PROG'
          AND   devclass IN devclass.                     "#EC CI_SGLSELECT
      ENDMETHOD.                    "get_report_names

      METHOD get_function_names.
        DATA:
          lt_obj     TYPE STANDARD TABLE OF tadir-obj_name,
          lv_obj     TYPE tadir-obj_name,
          lv_fgroup  TYPE rs38l-area,
          lv_program TYPE progname.

        FIELD-SYMBOLS:
          <lv_obj> LIKE LINE OF lt_obj.

        SELECT obj_name INTO TABLE lt_obj
          FROM tadir
          WHERE pgmid  = 'R3TR'
          AND   object = 'FUGR'
          AND   devclass IN devclass
          AND   obj_name IN funcgrp.                      "#EC CI_SGLSELECT

        LOOP AT lt_obj ASSIGNING <lv_obj>.
          lv_fgroup = <lv_obj>.
          CLEAR lv_program.

          CALL FUNCTION 'FUNCTION_INCLUDE_CONCATENATE'
            CHANGING
              program                  = lv_program
              group                    = lv_fgroup
            EXCEPTIONS
              not_enough_input         = 1
              no_function_pool         = 2
              delimiter_wrong_position = 3
              OTHERS                   = 4.

          CHECK sy-subrc IS INITIAL AND lv_program IS NOT INITIAL.

          lv_obj = lv_program.
          APPEND lv_obj TO gt_object.
        ENDLOOP.
      ENDMETHOD.                    "get_function_names

      METHOD get_source_names.

        IF devclass[] IS NOT INITIAL.
          "get_report_names( ).
          get_function_names( ).
        ENDIF.

        IF funcgrp[] IS NOT INITIAL.
          get_function_names( ).
        ENDIF.

      ENDMETHOD.                    "get_source_names

      METHOD start.

        get_source_names( ).
        get_includes( ).

        TRY.
            search_abap_source( ).
          CATCH lcx_scan_exceptions.
            RETURN.
        ENDTRY.

        IF funcmod = 'X'. " Generate HTML files for function modules API
          generateindex( ).
        ENDIF.

        display( ).
      ENDMETHOD.                    "start
      METHOD generateindex.
        DATA: lv_string   TYPE string,
              lt_string   TYPE TABLE OF string,
              lv_funcname TYPE  rs38l_fnam,
              lv_include  TYPE  progname,
              lv_filename TYPE string.

    *   Generate HTML index file.
        APPEND '<HTML><HEAD><TITLE>ABAPdoc</TITLE></HEAD>' TO lt_string.
        APPEND '<FRAMESET cols="20%,80%">' TO lt_string.
        APPEND '<FRAME src="abapdoc_all-frame.html" name="packageFrame">' TO lt_string.
        APPEND '<FRAME src="abapdoc_main.html" name="classFrame">' TO lt_string.
        APPEND '</FRAMESET></HTML>' TO lt_string.

        CONCATENATE tofolder '/abapdoc_index.html' INTO lv_filename.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename = lv_filename
            filetype = 'ASC'
          TABLES
            data_tab = lt_string.
        IF sy-subrc <> 0.
        ENDIF.

        CLEAR lt_string.

    *   Generate HTML index file.
        APPEND '<HTML><HEAD><TITLE>ABAPdoc</TITLE></HEAD><BODY><br/><CENTER><B>' TO lt_string.
        APPEND 'ABAPdoc has been created via the <a href="http://www.ceon.nl/abapeclipse">ABAP Eclipse Editor</a>' TO lt_string.
        APPEND '</B></CENTER></BODY></HTML>' TO lt_string.

        CONCATENATE tofolder '/abapdoc_main.html' INTO lv_filename.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename = lv_filename
            filetype = 'ASC'
          TABLES
            data_tab = lt_string.
        IF sy-subrc <> 0.
        ENDIF.

        CLEAR lt_string.

        APPEND '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Frameset//EN""http://www.w3.org/TR/REC-html40/frameset.dtd"><HTML><HEAD>' TO lt_string.

        IF NOT funcgrp IS INITIAL.
          APPEND '<TITLE>All Function Modules of ' TO lt_string.
          APPEND funcgrp TO lt_string.
          APPEND '</TITLE>' TO lt_string.
        ENDIF.
        "append '<TITLE>All Function Modules of ' to lt_string.

        APPEND '<STYLE>body.allclasses { background-color: #4C4C4C; font-family: arial, sans-serif; font-size: 9pt; letter-spacing: 1px; font-weight: 500; color: white; }' TO lt_string.
        APPEND 'a { font-family: arial, sans-serif; font-size: 9pt; letter-spacing: 1px; font-weight: 500; color: white; }</STYLE>' TO lt_string.
        APPEND '</HEAD><BODY CLASS="allclasses">' TO lt_string.
        APPEND '<FONT CLASS="FrameHeadingFont"><B>' TO lt_string.
        IF NOT funcgrp IS INITIAL.
          APPEND 'All Function Modules of ' TO lt_string.
          APPEND funcgrp+3 TO lt_string.
        ENDIF.
        IF NOT devclass IS INITIAL.
          APPEND 'All Function Modules of package ' TO lt_string.
          APPEND devclass+3 TO lt_string.
        ENDIF.

        APPEND '</B></FONT><BR/><BR/><BR/>' TO lt_string.

        FIELD-SYMBOLS:
         <lv_obj> TYPE tadir-obj_name.

        LOOP AT gt_object ASSIGNING <lv_obj>.
          lv_include = <lv_obj>.
          CLEAR lv_funcname.
          CALL FUNCTION 'FUNCTION_INCLUDE_INFO'
            CHANGING
              funcname            = lv_funcname
              include             = lv_include
            EXCEPTIONS
              function_not_exists = 1
              include_not_exists  = 2
              group_not_exists    = 3
              no_selections       = 4
              no_function_include = 5
              OTHERS              = 6.
          IF sy-subrc = 0 AND lv_funcname IS NOT INITIAL.
            CONCATENATE '<A HREF="abapdoc_' lv_funcname '.html" TARGET="classFrame">' lv_funcname '</A><br/>' INTO lv_string.
            APPEND lv_string TO lt_string.
            generateinfopage( iv_fm = lv_funcname iv_report = lv_include ).
          ENDIF.

        ENDLOOP.

        APPEND '</BODY></HTML>' TO lt_string.

        CONCATENATE tofolder '/abapdoc_all-frame.html' INTO lv_filename.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename = lv_filename
            filetype = 'ASC'
          TABLES
            data_tab = lt_string.
        IF sy-subrc <> 0.
        ENDIF.


      ENDMETHOD.                    "generateindex
      METHOD generateinfopage.
        DATA: filename            TYPE string,
              lv_string           TYPE string,
              lt_string           TYPE TABLE OF string,
              lv_funcname         TYPE  rs38l_fnam,
              lv_include          TYPE  progname,
              lv_remote_call      TYPE rs38l-remote,
              lv_update_task      TYPE rs38l-utask,
              lv_exception_list   TYPE rsexc,
              lv_export_parameter TYPE rsexp,
              lv_import_parameter TYPE rsimp,
              lv_changing_parameter TYPE rscha,
              lv_tables_parameter TYPE rstbl,
              lv_p_docu           TYPE funct,
              lt_exception_list   TYPE TABLE OF rsexc,
              lt_export_parameter TYPE TABLE OF rsexp,
              lt_import_parameter TYPE TABLE OF rsimp,
              lt_changing_parameter TYPE TABLE OF rscha,
              lt_tables_parameter TYPE TABLE OF rstbl,
              lt_p_docu           TYPE TABLE OF funct,
              lv_stext            TYPE rs38l_ftxt.

        lv_funcname = iv_fm.

        CALL FUNCTION 'FUNCTION_IMPORT_DOKU'
          EXPORTING
            funcname                 = lv_funcname
            language                 = sy-langu
         IMPORTING
    *       GLOBAL_FLAG              =
            remote_call              = lv_remote_call
            update_task              = lv_update_task
            short_text               = lv_stext
    *       FREEDATE                 =
    *       EXCEPTION_CLASS          =
          TABLES
            dokumentation            = lt_p_docu
            exception_list           = lt_exception_list
            export_parameter         = lt_export_parameter
            import_parameter         = lt_import_parameter
            changing_parameter       = lt_changing_parameter
            tables_parameter         = lt_tables_parameter
         EXCEPTIONS
           error_message            = 1
           function_not_found       = 2
           invalid_name             = 3
           OTHERS                   = 4
                  .

        IF sy-subrc <> 0.
          RETURN.
        ENDIF.

        APPEND '<HTML><HEAD><TITLE>ABAPdoc</TITLE></HEAD>' TO lt_string.
        APPEND '<STYLE> body {font-family: arial, sans-serif; font-size: 9pt;} table{ border-collapse: collapse; } td, th{ border: 1px solid #CCCCCC; font-family: arial, sans-serif; font-size: 9pt; } tr.top { background-color: #EAFDFF; } </STYLE>' TO
    lt_string.

        CONCATENATE '<BODY><table width="100%" bgcolor="#EEEEFF"><tr><td>Function Module: <B>' iv_fm '</B></td></tr></table><BR/>' INTO lv_string.
        APPEND lv_string TO lt_string.

        CONCATENATE 'Description:' lv_stext '</B><BR/>' INTO lv_string SEPARATED BY space.
        APPEND lv_string TO lt_string.

        IF lv_remote_call = 'R'.
          APPEND 'This is a remote function module<BR/>' TO lt_string.
        ENDIF.

        IF lv_update_task = 'X'.
          APPEND 'This is a update task<BR/>' TO lt_string.
        ENDIF.

        APPEND '<BR/><B>Import Parameters:</B><BR/>' TO lt_string.
        APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="20%">Parameter Name</TD><td>Typing</td><TD width="20%">Associated Type</TD><TD>Default value</TD><TD width="5%">Optional</TD>' TO lt_string.
        APPEND '<TD width="5%">Pass Value</TD><TD width="20%">Short text</TD></TR>' TO lt_string.
        LOOP AT lt_import_parameter INTO lv_import_parameter.
          APPEND '<TR><TD>' TO lt_string.
          APPEND lv_import_parameter-parameter TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertype( is_iparameter = lv_import_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertypename( is_iparameter = lv_import_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          APPEND lv_import_parameter-default TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          APPEND lv_import_parameter-optional TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          IF lv_import_parameter-reference = ''.
            APPEND 'Yes' TO lt_string.
          ENDIF.
          APPEND '</TD><TD>' TO lt_string.
          READ TABLE lt_p_docu INTO lv_p_docu WITH KEY parameter = lv_import_parameter-parameter.
          IF sy-subrc = 0.
            APPEND lv_p_docu-stext TO lt_string.
          ENDIF.
          APPEND '</TD></TR>' TO lt_string.
        ENDLOOP.
        APPEND '</TABLE>' TO lt_string.

    *   Export Parameters
        APPEND '<BR/><B>Export Parameters:</B><BR/>' TO lt_string.
        APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="30%">Parameter Name</TD><TD width="10%">Typing</TD><TD width="30%">Associated Type</TD><TD width="10%">Pass Value</TD><TD width="20%">Short text</TD></TR>' TO lt_string.
        LOOP AT lt_export_parameter INTO lv_export_parameter.
          APPEND '<TR><TD>' TO lt_string.
          APPEND lv_export_parameter-parameter TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertype( is_eparameter = lv_export_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertypename( is_eparameter = lv_export_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          IF lv_export_parameter-reference = ''.
            APPEND 'Yes' TO lt_string.
          ENDIF.
          APPEND '</TD><TD>' TO lt_string.
          READ TABLE lt_p_docu INTO lv_p_docu WITH KEY parameter = lv_export_parameter-parameter.
          IF sy-subrc = 0.
            APPEND lv_p_docu-stext TO lt_string.
          ENDIF.
          APPEND '</TD></TR>' TO lt_string.
        ENDLOOP.
        APPEND '</TABLE>' TO lt_string.

    *   Changing Parameters
        APPEND '<BR/><B>Changing Parameters:</B><BR/>' TO lt_string.
        APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="30%">Parameter Name</TD><TD width="10%">Typing</TD><TD width="30%">Associated Type</TD><TD>Default value</TD><TD>Optional</TD><TD>Pass Value</TD><TD width="20%">Short text</TD></TR>'
        TO lt_string.
        LOOP AT lt_changing_parameter INTO lv_changing_parameter.
          APPEND '<TR><TD>' TO lt_string.
          APPEND lv_changing_parameter-parameter TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertype( is_cparameter = lv_changing_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertypename( is_cparameter = lv_changing_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          APPEND lv_changing_parameter-default TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          APPEND lv_changing_parameter-optional TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          IF lv_changing_parameter-reference = ''.
            APPEND 'Yes' TO lt_string.
          ENDIF.
          APPEND '</TD><TD>' TO lt_string.
          READ TABLE lt_p_docu INTO lv_p_docu WITH KEY parameter = lv_changing_parameter-parameter.
          IF sy-subrc = 0.
            APPEND lv_p_docu-stext TO lt_string.
          ENDIF.
          APPEND '</TD></TR>' TO lt_string.
        ENDLOOP.
        APPEND '</TABLE>' TO lt_string.

    *   Tables
        APPEND '<BR/><B>Table Parameters:</B><BR/>' TO lt_string.
        APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="30%">Parameter Name</TD><TD width="10%">Typing</TD><TD width="30%">Associated Type</TD><TD>Optional</TD><TD width="20%">Short text</TD></TR>'
        TO lt_string.
        LOOP AT lt_tables_parameter INTO lv_tables_parameter.
          APPEND '<TR><TD>' TO lt_string.
          APPEND lv_tables_parameter-parameter TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertype( is_tparameter = lv_tables_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          lv_string = get_parametertypename( is_tparameter = lv_tables_parameter ).
          APPEND lv_string TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          APPEND lv_tables_parameter-optional TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          READ TABLE lt_p_docu INTO lv_p_docu WITH KEY parameter = lv_tables_parameter-parameter.
          IF sy-subrc = 0.
            APPEND lv_p_docu-stext TO lt_string.
          ENDIF.
          APPEND '</TD></TR>' TO lt_string.
        ENDLOOP.
        APPEND '</TABLE>' TO lt_string.

    *   Tables
        APPEND '<BR/><B>Exceptions:</B><BR/>' TO lt_string.
        APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="30%">Exception</TD><TD width="20%">Short text</TD></TR>'
        TO lt_string.
        LOOP AT lt_exception_list INTO lv_exception_list.
          APPEND '<TR><TD>' TO lt_string.
          APPEND lv_exception_list-exception TO lt_string.
          APPEND '</TD><TD>' TO lt_string.
          READ TABLE lt_p_docu INTO lv_p_docu WITH KEY parameter = lv_exception_list-exception.
          IF sy-subrc = 0.
            APPEND lv_p_docu-stext TO lt_string.
          ENDIF.
          APPEND '</TD></TR>' TO lt_string.
        ENDLOOP.
        APPEND '</TABLE>' TO lt_string.

    *   Report top comment
        DATA: lv_com_results    TYPE ts_comment_tab.
        APPEND '<BR/><B>Function module comment header:</B><BR/>' TO lt_string.
        LOOP AT gt_results INTO lv_com_results WHERE report = iv_report.
          APPEND lv_com_results-source TO lt_string.
          APPEND '<BR/>' TO lt_string.
        ENDLOOP.
        APPEND '</TABLE>' TO lt_string.

        APPEND '</HTML>' TO lt_string.


        CONCATENATE tofolder '/abapdoc_' iv_fm '.html' INTO filename.
        CALL FUNCTION 'GUI_DOWNLOAD'
          EXPORTING
            filename = filename
            filetype = 'ASC'
          TABLES
            data_tab = lt_string.
        IF sy-subrc <> 0.
        ENDIF.
      ENDMETHOD.                    "generateindex
      METHOD get_parametertype.
        DATA ls_iparameter TYPE rsimp.
        IF NOT is_eparameter IS INITIAL.
          MOVE-CORRESPONDING is_eparameter TO ls_iparameter.
        ELSEIF NOT is_iparameter IS INITIAL.
          MOVE-CORRESPONDING is_iparameter TO ls_iparameter.
        ELSEIF NOT is_cparameter IS INITIAL.
          MOVE-CORRESPONDING is_cparameter TO ls_iparameter.
        ELSEIF NOT is_tparameter IS INITIAL.
          MOVE-CORRESPONDING is_tparameter TO ls_iparameter.
        ENDIF.
        IF ls_iparameter-types = 'X' OR ls_iparameter-reference = 'X'.
          rl_type = 'TYPE'.
          RETURN.
        ENDIF.
        IF NOT ls_iparameter-dbfield IS INITIAL.
          rl_type = 'LIKE'.
          RETURN.
        ENDIF.
        rl_type = 'TYPE'.
      ENDMETHOD.                    "get_parametertype
      METHOD get_parametertypename.
        DATA ls_iparameter TYPE rsimp.
        IF NOT is_eparameter IS INITIAL.
          MOVE-CORRESPONDING is_eparameter TO ls_iparameter.
        ELSEIF NOT is_iparameter IS INITIAL.
          MOVE-CORRESPONDING is_iparameter TO ls_iparameter.
        ELSEIF NOT is_cparameter IS INITIAL.
          MOVE-CORRESPONDING is_cparameter TO ls_iparameter.
        ELSEIF NOT is_tparameter IS INITIAL.
          rl_type = is_tparameter-dbstruct.
          RETURN.
        ENDIF.

        IF NOT ls_iparameter-typ IS INITIAL.
          rl_type = ls_iparameter-typ.
        ELSEIF NOT ls_iparameter-dbfield IS INITIAL.
          rl_type = ls_iparameter-dbfield.
        ENDIF.
      ENDMETHOD.                    "get_parametertype
    ENDCLASS.                    "lcl_source_scan IMPLEMENTATION

    INITIALIZATION.
      CREATE OBJECT lo_sscan.

      a11 = 'Function Module Selection'(a11).
      a20 = 'Generate ABAPdoc settings'(a20).

    AT SELECTION-SCREEN ON VALUE-REQUEST FOR funcgrp-low.
      lo_sscan->f4_function_group( 'FUNCGRP-LOW' ).

    AT SELECTION-SCREEN ON VALUE-REQUEST FOR funcgrp-high.
      lo_sscan->f4_function_group( 'FUNCGRP-HIGH' ).

    AT SELECTION-SCREEN ON VALUE-REQUEST FOR tofolder.
      tofolder_string = tofolder.
      CALL METHOD cl_gui_frontend_services=>directory_browse
        EXPORTING
          window_title         = 'Select a folder'
          initial_folder       = tofolder_string
        CHANGING
          selected_folder      = tofolder_string
        EXCEPTIONS
          cntl_error           = 1
          error_no_gui         = 2
          not_supported_by_gui = 3
          OTHERS               = 4.
      IF sy-subrc = 0.
        tofolder = tofolder_string.
      ENDIF.


    START-OF-SELECTION.
      lo_sscan->start( ).
     

  • 相关阅读:
    [iOS]Xcode+GitHub远程代码托管(GIT, SVN)
    [iOS]Xcode处理过时方法的警告
    [iOS]@synthesize和@dynamic关键字
    [iOS]图片高清度太高, 导致内存过大Crash
    [软件]Xcode查找系统framework所在路径
    [软件]在浏览器里添加MarkDown Here(插件)
    [PHP]利用XAMPP搭建本地服务器, 然后利用iOS客户端上传数据到本地服务器中(四. iOS端代码实现)
    ios -Unity3D的EasyAR集成到已经有项目中。
    iOS创建安全的单例
    阿里云轻量应用服务器 配置mysql详解(转载)
  • 原文地址:https://www.cnblogs.com/xiaomaohai/p/6157325.html
Copyright © 2011-2022 走看看