Additional Blogs by SAP
cancel
Showing results for 
Search instead for 
Did you mean: 
onno_bagijn
Advisor
Advisor

I have updated the ABAPdoc application to generate function modules/groups in namespaces and to generate ABAP object API information. By means of this utility you can generate HTML files containing API information about selected Function Modules and ABAP Objects. These HTML files can be handy for developers who are using these function modules in their applications. For instance for Java developers who communicate via the JCo with SAP ERP. This utility generates HTML a bit like the JAVAdoc generator does, but however for function modules and ABAP classes.  *Introduction to ABAPdoc:* Make a selection for which packages and/or for which function group you want to create the ABAPdoc and set the ABAPdoc settings: *The result:* Execute the program. The result is HTML files containing information about the API of the selected Function Modules:


*&---------------------------------------------------------------------*
*& Report  ZABAPDOC v2.2
*&
*&---------------------------------------------------------------------*
*& This report generate HTML files containing the API information about
*& the selected function modules.
*& SDN http://www.sdn.sap.com/irj/scn/weblogs?blog=/pub/wlg/17971
*& This program has been developed via the ABAP Eclipse Editor
*&---------------------------------------------------------------------*
REPORT  zabapdoc MESSAGE-ID eu.
TYPE-POOLS:
   sscr,
   seoc.
TABLES:
   tadir,
   tlibt,
   trdir,
   seoclass.
TYPES:
BEGIN OF ts_objects,
     pgmid          TYPE pgmid,
     object  TYPE trobjtype,
     obj_name  TYPE sobj_name,
END OF ts_objects.
CLASS:
   lcl_source_scan DEFINITION DEFERRED.
DATA:
   lo_sscan   TYPE REF TO lcl_source_scan,
   lv_appl    TYPE taplt-appl,
   tofolder_string TYPE string,
   texttr     TYPE string VALUE `/~`,
   filename   TYPE string,
   gv_project TYPE char255,
   lv_type    TYPE ddobjname,
   lt_fields  TYPE TABLE OF dfies,
   lv_field   TYPE dfies,
   lv_dd40v   TYPE dd40v.
SELECTION-SCREEN: BEGIN OF BLOCK a11 WITH FRAME TITLE a11.
SELECT-OPTIONS:      funcgrp  FOR tlibt-area .
SELECTION-SCREEN: END OF BLOCK a11,
                    BEGIN OF BLOCK a12 WITH FRAME TITLE a12.
SELECT-OPTIONS:        clazz  FOR seoclass-clsname.
SELECTION-SCREEN: END OF BLOCK a12,
                    BEGIN OF BLOCK a13 WITH FRAME TITLE a13.
SELECT-OPTIONS:       devclass FOR tadir-devclass.
SELECTION-SCREEN: END OF BLOCK a13,
                   BEGIN OF BLOCK a20 WITH FRAME TITLE a20.
PARAMETERS:           tofolder    TYPE char255 DEFAULT 'C:\TEMP'.
SELECTION-SCREEN: END OF BLOCK a20.
SELECTION-SCREEN: BEGIN OF BLOCK a21 WITH FRAME TITLE a21.
PARAMETERS:           project    TYPE char255 LOWER CASE DEFAULT 'ABAPdoc- '.
SELECTION-SCREEN: END OF BLOCK a21.
*----------------------------------------------------------------------*
*       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 ts_objects,
       gt_vrsd       TYPE HASHED TABLE OF vrsd
                       WITH UNIQUE KEY objname versno,
       gt_results    TYPE TABLE OF ts_comment_tab,
       gt_mtdkey     TYPE  seocpdkey
                       .
     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
           iv_where      TYPE i,
       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,
       generateinfomethpage
           IMPORTING
               iv_incl TYPE sobj_name
               iv_class TYPE seoclsname
               iv_meth TYPE seocpdname
               ,
       generateinfoclasspage
           IMPORTING
               iv_class TYPE sobj_name
               ,
       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,
       get_parameterdecltype
          IMPORTING
            is_type TYPE seopardecl
          RETURNING VALUE(rv_type) TYPE string,
       get_attdecltype
          IMPORTING
            is_type TYPE seopardecl
          RETURNING VALUE(rv_type) TYPE string,
       get_parametertyptype
          IMPORTING
            is_type TYPE seotyptype
          RETURNING VALUE(rv_type) TYPE string.
ENDCLASS.                    "lcl_source_scan DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_source_scan IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_source_scan IMPLEMENTATION.
   METHOD constructor.
     DATA:
       ls_restrict    TYPE sscr_restrict,
       ls_opt_list    TYPE sscr_opt_list,
       ls_association TYPE sscr_***.
     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-***_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 ts_objects.
     LOOP AT gt_object ASSIGNING <lv_obj>.
       READ REPORT <lv_obj>-obj_name INTO lt_abap.
       IF sy-subrc IS NOT INITIAL.
         CONTINUE.
       ENDIF.
       search_source( it_source = lt_abap
                      iv_report = <lv_obj>-obj_name ).
     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(6) = 'METHOD' ).
           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.
         ELSEIF ( sy-tabix > 1 AND lv_line = '' ).
           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 ts_objects,
      lt_inc_tmp TYPE STANDARD TABLE OF sobj_name,
      lv_inc_tmp LIKE LINE OF lt_inc_tmp,
      lv_inc     LIKE LINE OF lt_inc,
      lv_program TYPE sy-repid,
      lv_counter TYPE i.
     FIELD-SYMBOLS:
       <lv_obj> TYPE ts_objects.
     LOOP AT gt_object ASSIGNING <lv_obj>.
       lv_counter = sy-tabix + 1.
       IF <lv_obj>-object = 'CLAS'.
         me->get_method_includes( iv_class_name = <lv_obj>-obj_name iv_where = lv_counter ).
       ELSE.
         REFRESH lt_inc_tmp.
         lv_program = <lv_obj>-obj_name.
         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.
         LOOP AT lt_inc_tmp INTO lv_inc_tmp.
           CLEAR lv_inc.
           lv_inc-obj_name = lv_inc_tmp.
           APPEND lv_inc TO lt_inc.
         ENDLOOP.
       ENDIF.
     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 ts_objects.
     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-object = 'METH'.
       lv_obj-obj_name = <ls_method>-incname.
       INSERT lv_obj INTO gt_object INDEX iv_where.
     ENDLOOP.
   ENDMETHOD.                    "get_method_includes
   METHOD get_report_names.
     SELECT pgmid object 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 ts_objects,
       lv_obj     TYPE ts_objects,
       lv_fgroup  TYPE rs38l-area,
       lv_program TYPE progname.
     FIELD-SYMBOLS:
       <lv_obj> LIKE LINE OF lt_obj.
     IF NOT funcgrp[] IS INITIAL OR NOT devclass IS INITIAL.
       SELECT pgmid object 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>-obj_name.
         CLEAR lv_program.
         CALL FUNCTION 'FUNCTION_INCLUDE_INFO'
          IMPORTING
*           FUNCTAB                   =
*           NAMESPACE                 =
            pname                     = lv_program
          CHANGING
*           FUNCNAME                  =
             group                     = lv_fgroup
*           INCLUDE                   =
          EXCEPTIONS
            function_not_exists       = 1
            include_not_exists        = 2
            group_not_exists          = 3
            no_selections             = 4
            no_function_include       = 5
            OTHERS                    = 6
                   .
         CHECK sy-subrc IS INITIAL AND lv_program IS NOT INITIAL.
         lv_obj-obj_name = lv_program.
         APPEND lv_obj TO gt_object.
       ENDLOOP.
     ENDIF.
     IF NOT clazz IS INITIAL OR NOT devclass IS INITIAL.
       SELECT pgmid object obj_name APPENDING TABLE gt_object
         FROM tadir
         WHERE pgmid  = 'R3TR'
         AND   object = 'CLAS'
         AND   devclass IN devclass
         AND   obj_name IN clazz.                      "#EC CI_SGLSELECT
     ENDIF.
   ENDMETHOD.                    "get_function_names
   METHOD get_source_names.
     IF NOT devclass[] IS INITIAL OR NOT clazz[] IS INITIAL OR NOT funcgrp[] IS INITIAL.
       "get_report_names( ).
       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.
     generateindex( ).
     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,
           lv_obj TYPE ts_objects,
           lv_objclass TYPE ts_objects.
*   Generate HTML index file.
     CONCATENATE '<HTML><HEAD><TITLE>' gv_project '</TITLE></HEAD>' INTO lv_string.
     APPEND lv_string 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.
     CONCATENATE '<HTML><HEAD><TITLE>' gv_project '</TITLE></HEAD><BODY><br/><CENTER><B>' INTO lv_string.
     APPEND lv_string TO lt_string.
     APPEND gv_project 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.
     IF NOT funcgrp IS INITIAL.
       APPEND '<FONT CLASS="FrameHeadingFont"><B>' TO lt_string.
       APPEND 'All Function Modules of ' TO lt_string.
       APPEND funcgrp+3 TO lt_string.
       APPEND '</B></FONT><BR/><BR/><BR/>' TO lt_string.
     ELSEIF NOT devclass IS INITIAL.
       APPEND '<FONT CLASS="FrameHeadingFont"><B>' TO lt_string.
       APPEND 'All Function Modules and Classes of package ' TO lt_string.
       APPEND devclass+3 TO lt_string.
       APPEND '</B></FONT><BR/><BR/><BR/>' TO lt_string.
     ENDIF.
     LOOP AT gt_object INTO lv_obj.
       IF lv_obj-object = 'METH'.
         CALL FUNCTION 'SEO_METHOD_GET_NAME_BY_INCLUDE'
           EXPORTING
             progname = lv_obj-obj_name
           IMPORTING
             mtdkey   = gt_mtdkey.
         filename = lv_obj-obj_name.
         TRANSLATE filename USING texttr.
         CONCATENATE '- <A HREF="abapdoc_' filename '.html" TARGET="classFrame">' gt_mtdkey-cpdname '</A><br/>' INTO lv_string.
         APPEND lv_string TO lt_string.
         generateinfomethpage( iv_incl = lv_obj-obj_name iv_class = gt_mtdkey-clsname iv_meth = gt_mtdkey-cpdname ).
       ELSEIF lv_obj-object = 'CLAS'..
         APPEND '<BR/><FONT CLASS="FrameHeadingFont"><B>' TO lt_string.
         APPEND 'Class '  TO lt_string.
         filename = lv_obj-obj_name.
         TRANSLATE filename USING texttr.
         CONCATENATE '<A HREF="abapdoc_' filename '.html" TARGET="classFrame">' lv_obj-obj_name '</A><br/>' INTO lv_string.
         APPEND lv_string TO lt_string.
         APPEND '</B></FONT><BR/>' TO lt_string.
         generateinfoclasspage( iv_class = lv_obj-obj_name ).
         lv_objclass = lv_obj.
       ELSE.
         lv_include = lv_obj-obj_name.
         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.
           filename = lv_funcname.
           TRANSLATE filename USING texttr.
           CONCATENATE '<A HREF="abapdoc_' filename '.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.
       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 generateinfomethpage.
     DATA: filename            TYPE string,
           lv_string           TYPE string,
           lt_string           TYPE TABLE OF string,
           lv_method           TYPE  vseomethod,
           lt_parameters       TYPE  seos_parameters_r,
           lv_parameter        TYPE  seos_parameter_r,
           lt_exceps           TYPE  seos_exceptions_r,
           lv_key              TYPE  seocpdkey.
     lv_key-cpdname = iv_meth.
     lv_key-clsname = iv_class.
     CALL FUNCTION 'SEO_COMPONENT_SIGNATURE_GET'
       EXPORTING
         cpdkey             = lv_key
         version            = seoc_version_active
*       STATE              = 1
      IMPORTING
        parameters         = lt_parameters
        exceps             = lt_exceps
        method             = lv_method
*       EVENT              =
      EXCEPTIONS
        not_existing       = 1
        is_type            = 2
        is_attribute       = 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>Method: <B>' iv_meth '</B></td></tr></table><BR/>' INTO lv_string.
     APPEND lv_string TO lt_string.
     CONCATENATE '<BR/>Description: <b>' lv_method-descript '</B><BR/>' INTO lv_string SEPARATED BY space.
     APPEND lv_string TO lt_string.
     IF lv_method-exposure = '0'.
       APPEND 'Visibility: <b>Private </B><BR/>' TO lt_string.
     ELSEIF lv_method-exposure = '1'.
       APPEND 'Visibility: <b>Protected </B><BR/>' TO lt_string.
     ELSEIF lv_method-exposure = '2'.
       APPEND 'Visibility: <b>Public </B><BR/>' TO lt_string.
     ENDIF.
     IF lv_method-mtddecltyp = '0'.
       APPEND 'Method declaration level: <b>Instance method </B><BR/>' TO lt_string.
     ELSEIF lv_method-mtddecltyp = '1'.
       APPEND 'Method declaration level: <b>Static method </B><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</TD><td>Type</td><TD width="5%">Pass by Value</TD><TD>Optional</TD><TD width="5%">Typing Method</TD>' TO lt_string.
     APPEND '<TD width="5%">Associated Type</TD><TD width="5%">Default value</TD><TD width="20%">Description</TD></TR>' TO lt_string.
     LOOP AT lt_parameters INTO lv_parameter.
       APPEND '<TR><TD>' TO lt_string.
       APPEND lv_parameter-sconame TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       lv_string = get_parameterdecltype( is_type = lv_parameter-pardecltyp ).
       APPEND lv_string TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       IF NOT lv_parameter-parpasstyp = '1'.
         lv_string = 'X'.
         APPEND lv_string TO lt_string.
       ENDIF.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_parameter-paroptionl TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       lv_string = get_parametertyptype( is_type = lv_parameter-typtype  ).
       APPEND lv_string TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_parameter-type TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_parameter-parvalue TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_parameter-descript TO lt_string.
       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>Method documentation header: </B><BR/>' TO lt_string.
     LOOP AT gt_results INTO lv_com_results WHERE report = iv_incl.
       APPEND lv_com_results-source+1(200) TO lt_string.
       APPEND '<BR/>' TO lt_string.
     ENDLOOP.
     APPEND '</HTML>' TO lt_string.
     CONCATENATE tofolder '\abapdoc_' iv_incl '.html' INTO filename.
     TRANSLATE filename USING texttr.
     CALL FUNCTION 'GUI_DOWNLOAD'
       EXPORTING
         filename = filename
         filetype = 'ASC'
       TABLES
         data_tab = lt_string.
     IF sy-subrc <> 0.
     ENDIF.
   ENDMETHOD.                    "generateinfomethpage
   METHOD generateinfoclasspage.
     DATA: filename            TYPE string,
           lv_string           TYPE string,
           lt_string           TYPE TABLE OF string,
           lv_method           TYPE  vseomethod,
           lt_parameters       TYPE  seos_parameters_r,
           lv_parameter        TYPE  seos_parameter_r,
           lt_exceps           TYPE  seos_exceptions_r,
           lv_key              TYPE  seoclskey,
           lv_class            TYPE  vseoclass,
           lt_attributes       TYPE  seoo_attributes_r,
           lv_attribute        TYPE  seoo_attribute_r.
     lv_key-clsname = iv_class.
     CALL FUNCTION 'SEO_CLASS_TYPEINFO_GET'
       EXPORTING
         clskey                              = lv_key
         version                             = seoc_version_active
*       STATE                               = '1'
         with_descriptions                   = seox_true
*       RESOLVE_EVENTHANDLER_TYPEINFO       = SEOX_FALSE
*       WITH_MASTER_LANGUAGE                = SEOX_FALSE
*       WITH_ENHANCEMENTS                   = SEOX_FALSE
*       READ_ACTIVE_ENHA                    = SEOX_FALSE
*       ENHA_ACTION                         = SEOX_FALSE
*       IGNORE_SWITCHES                     = 'X'
       IMPORTING
        class                               = lv_class
        attributes                          = lt_attributes
*       METHODS                             =
*       EVENTS                              =
*       TYPES                               =
*       PARAMETERS                          =
*       EXCEPS                              =
*       IMPLEMENTINGS                       =
*       INHERITANCE                         =
*       REDEFINITIONS                       =
*       IMPL_DETAILS                        =
*       FRIENDSHIPS                         =
*       TYPEPUSAGES                         =
*       CLSDEFERRDS                         =
*       INTDEFERRDS                         =
*       EXPLORE_INHERITANCE                 =
*       EXPLORE_IMPLEMENTINGS               =
*       ALIASES                             =
*       ENHANCEMENT_METHODS                 =
*       ENHANCEMENT_ATTRIBUTES              =
*       ENHANCEMENT_EVENTS                  =
*       ENHANCEMENT_IMPLEMENTINGS           =
*     EXCEPTIONS
*       NOT_EXISTING                        = 1
*       IS_INTERFACE                        = 2
*       MODEL_ONLY                          = 3
*       OTHERS                              = 4
               .
     IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
     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>Class: <B>' lv_class-clsname '</B></td></tr></table><BR/>' INTO lv_string.
     APPEND lv_string TO lt_string.
     CONCATENATE '<BR/>Description: <b>' lv_class-descript '</B><BR/>' INTO lv_string SEPARATED BY space.
     APPEND lv_string TO lt_string.
     IF lv_class-exposure = '0'.
       APPEND 'Visibility: <b>Private </B><BR/>' TO lt_string.
     ELSEIF lv_class-exposure = '1'.
       APPEND 'Visibility: <b>Protected </B><BR/>' TO lt_string.
     ELSEIF lv_class-exposure = '2'.
       APPEND 'Visibility: <b>Public </B><BR/>' TO lt_string.
     ENDIF.
     APPEND '<BR/><B>Attributes:</B><BR/>' TO lt_string.
     APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="20%">Attribute</TD><td>Level</td><TD width="20%">Visibility</TD><TD>Read-Only</TD><TD width="5%">Typing</TD>' TO lt_string.
     APPEND '<TD width="5%">Associated Type</TD><TD width="5%">Description</TD><TD width="20%">Initial value</TD></TR>' TO lt_string.
     LOOP AT lt_attributes INTO lv_attribute.
       APPEND '<TR><TD>' TO lt_string.
       APPEND lv_attribute-cmpname TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       lv_string = get_attdecltype( is_type = lv_attribute-attdecltyp ).
       APPEND lv_string TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_attribute-attexpvirt TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_attribute-attrdonly TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       lv_string = get_parametertyptype( is_type = lv_attribute-typtype  ).
       APPEND lv_string TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_attribute-type TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_attribute-descript TO lt_string.
       APPEND '</TD><TD>' TO lt_string.
       APPEND lv_attribute-attvalue TO lt_string.
       APPEND '</TD></TR>' TO lt_string.
     ENDLOOP.
     APPEND '</TABLE>' TO lt_string.
     APPEND '</HTML>' TO lt_string.
     CONCATENATE tofolder '\abapdoc_' iv_class '.html' INTO filename.
     TRANSLATE filename USING texttr.
     CALL FUNCTION 'GUI_DOWNLOAD'
       EXPORTING
         filename = filename
         filetype = 'ASC'
       TABLES
         data_tab = lt_string.
     IF sy-subrc <> 0.
     ENDIF.
   ENDMETHOD.                    "generateinfoclasspage
   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.
     APPEND '<BR/><B>Fields of import stuctures:</B><BR/>' TO lt_string.
     APPEND '<TABLE width="100%" border=0><TR class="top"><TD width="20%">Parameter Name (Type)</TD><td width="15%">Field Name</td><TD>Description</TD><TD width="10%">Data type</TD><TD width="10%">Length</TD></TR>' TO lt_string.
     LOOP AT lt_import_parameter INTO lv_import_parameter.
       IF NOT lv_import_parameter-typ IS INITIAL.
         lv_type = lv_import_parameter-typ.
         CALL FUNCTION 'DDIF_FIELDINFO_GET'
           EXPORTING
             tabname              = lv_type
*           FIELDNAME            = ' '
             langu                = 'E'
*           LFIELDNAME           = ' '
*           ALL_TYPES            = ' '
*           GROUP_NAMES          = ' '
*           UCLEN                =
*           DO_NOT_WRITE         = ' '
*         IMPORTING
*           X030L_WA             =
*           DDOBJTYPE            =
*           DFIES_WA             =
*           LINES_DESCR          =
          TABLES
            dfies_tab            = lt_fields
*           FIXED_VALUES         =
          EXCEPTIONS
            not_found            = 1
            internal_error       = 2
            OTHERS               = 3
                   .
         IF sy-subrc = 0.
           LOOP AT lt_fields INTO lv_field.
             APPEND '<TR><TD>' TO lt_string.
             APPEND lv_import_parameter-parameter TO lt_string.
             APPEND '(' TO lt_string.
             APPEND lv_type TO lt_string.
             APPEND ')' TO lt_string.
             APPEND '</TD><TD>' TO lt_string.
             APPEND lv_field-fieldname TO lt_string.
             APPEND '</TD><TD>' TO lt_string.
             APPEND lv_field-fieldtext TO lt_string.
             APPEND '</TD><TD>' TO lt_string.
             APPEND lv_field-datatype TO lt_string.
             APPEND '</TD><TD>' TO lt_string.
             APPEND lv_field-leng TO lt_string.
             APPEND '</TD></TR>' TO lt_string.
           ENDLOOP.
         ELSEIF sy-subrc = 1.
           CALL FUNCTION 'DDIF_TTYP_GET'
             EXPORTING
               name                = lv_type
*             STATE               = 'A'
               langu               = 'E'
            IMPORTING
*             GOTSTATE            =
              dd40v_wa            = lv_dd40v
*           TABLES
*             DD42V_TAB           =
*             DD43V_TAB           =
            EXCEPTIONS
              illegal_input       = 1
              OTHERS              = 2
                     .
           IF sy-subrc = 0.
             IF NOT lv_dd40v-rowtype IS INITIAL.
               lv_type = lv_dd40v-rowtype.
               CALL FUNCTION 'DDIF_FIELDINFO_GET'
                 EXPORTING
                   tabname              = lv_type
*                 FIELDNAME            = ' '
                   langu                = 'E'
*                 LFIELDNAME           = ' '
*                 ALL_TYPES            = ' '
*                 GROUP_NAMES          = ' '
*                 UCLEN                =
*                 DO_NOT_WRITE         = ' '
*               IMPORTING
*                 X030L_WA             =
*                 DDOBJTYPE            =
*                 DFIES_WA             =
*                 LINES_DESCR          =
                TABLES
                  dfies_tab            = lt_fields
*                 FIXED_VALUES         =
                EXCEPTIONS
                  not_found            = 1
                  internal_error       = 2
                  OTHERS               = 3
                         .
               LOOP AT lt_fields INTO lv_field.
                 APPEND '<TR><TD>' TO lt_string.
                 APPEND lv_import_parameter-parameter TO lt_string.
                 APPEND '(' TO lt_string.
                 APPEND lv_type TO lt_string.
                 APPEND ')' TO lt_string.
                 APPEND '</TD><TD>' TO lt_string.
                 APPEND lv_field-fieldname TO lt_string.
                 APPEND '</TD><TD>' TO lt_string.
                 APPEND lv_field-fieldtext TO lt_string.
                 APPEND '</TD><TD>' TO lt_string.
                 APPEND lv_field-datatype TO lt_string.
                 APPEND '</TD><TD>' TO lt_string.
                 APPEND lv_field-leng TO lt_string.
                 APPEND '</TD></TR>' TO lt_string.
               ENDLOOP.
             ENDIF.
           ENDIF.
         ENDIF.
       ENDIF.
     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.
     TRANSLATE filename USING texttr.
     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
   METHOD get_parameterdecltype.
     IF is_type = '0'.
       rv_type = 'Importing'.
     ELSEIF is_type = '1'.
       rv_type = 'Exporting'.
     ELSEIF is_type = '2'.
       rv_type = 'Changing'.
     ELSEIF is_type = '3'.
       rv_type = 'Returning'.
     ENDIF.
   ENDMETHOD.                    "get_parameterdecltype
   METHOD get_attdecltype.
     IF is_type = '0'.
       rv_type = 'Static Atribute'.
     ELSEIF is_type = '1'.
       rv_type = 'Instance Attribute'.
     ENDIF.
   ENDMETHOD.                    "get_attdecltype
   METHOD get_parametertyptype.
     IF is_type = '0'.
       rv_type = 'Like'.
     ELSEIF is_type = '1'.
       rv_type = 'Type'.
     ELSEIF is_type = '3'.
       rv_type = 'Type Ref To'.
     ENDIF.
   ENDMETHOD.                    "get_parametertyptype
ENDCLASS.                    "lcl_source_scan IMPLEMENTATION
INITIALIZATION.
   CREATE OBJECT lo_sscan.
   a11 = 'Function Module Selection'(a11).
   a12 = 'Class Selection'(a12).
   a13 = 'Package Selection'(a12).
   a20 = 'Generate ABAPdoc settings'(a20).
   a21 = 'Project Name'(a21).
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.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR clazz-low.
   lo_sscan->f4_class( CHANGING cv_class_name = clazz-low ).
START-OF-SELECTION.
   gv_project = project.
   lo_sscan->start( ).
6 Comments