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( ).
 

posted on 2007-06-04 14:43  毛小娃  阅读(141)  评论(0编辑  收藏  举报

导航