Posted: Tue Jan 15, 2008 2:48 pm Post subject: Generating API documentation in HTML format from FM
ABAPdoc
Onno Bagijn
The ABAPDoc Utility ABAPdoc is a tool for generating API documentation in HTML format from Function Modules settings and source code.
By means of this utility you can generate HTML files containing API information about selected Function Modules. 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.
Code:
*&---------------------------------------------------------------------*
*& 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_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.
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.
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.
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.
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.
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.
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.
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.
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.
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
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.