ABAP--一个不错的函数模块的文档生成程序
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( ).
總結
以上是生活随笔為你收集整理的ABAP--一个不错的函数模块的文档生成程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 负数的负号前置显示
- 下一篇: ABAP实例之ALV