Sunteți pe pagina 1din 11

REPORT zabap_pretty_report .

TABLES: e071 , Objects of a request or task (E070) tadir , Catalog of R/3 Repository objects trdir , System table TRDIR dd02t . R/3-DD: SAP Table Texts DATA: BEGIN OF mtab_old_prog OCCURS 0, line(72) TYPE c, END OF mtab_old_prog. DATA: BEGIN OF mtab_new_prog OCCURS 0, line(72) TYPE c, END OF mtab_new_prog. DATA: BEGIN OF mtab_statement OCCURS 0, line(72) TYPE c, END OF mtab_statement. DATA: * Hold an entire statement, even if it spans multiple lines BEGIN OF mtab_long_line OCCURS 0, start TYPE i, end TYPE i, code(5000) TYPE c, END OF mtab_long_line. DATA: BEGIN OF mtab_tabname OCCURS 0, tabname LIKE dd02t-tabname, Table name tabdesc LIKE dd02t-ddtext, Short text describing ABAP/4 Dictio END OF mtab_tabname. * Queue to hold list of internal table names for commenting the ENDLOOP * line DATA: BEGIN OF mtab_itab_names OCCURS 0, tabname(40) TYPE c, END OF mtab_itab_names. * Queue to hold list of table names for commenting the ENDSELECT line DATA: BEGIN OF mtab_tab_names OCCURS 0, tabname(40) TYPE c, END OF mtab_tab_names. DATA: BEGIN OF mtab_form_names OCCURS 0, tabname(40) TYPE c, END OF mtab_form_names. PARAMETERS: p_report LIKE sy-repid, Program: Name of ABAP/4 program p_test AS CHECKBOX DEFAULT X. START-OF-SELECTION. PERFORM get_program_code TABLES mtab_old_prog USING p_report. END-OF-SELECTION. PERFORM create_condensed_table TABLES mtab_old_prog mtab_long_line. PERFORM format_program. CALL FUNCTION PRETTY_PRINTER EXPORTING inctoo = space TABLES ntext = mtab_new_prog otext = mtab_new_prog EXCEPTIONS enqueue_table_full = 1 include_enqueued = 2 include_readerror = 3 include_writeerror = 4 OTHERS = 5.

IF p_test = space. PERFORM save_program. ENDIF. LOOP AT mtab_new_prog. IF mtab_new_prog = space. SKIP 1. ENDIF. WRITE: / mtab_new_prog. ENDLOOP. LOOP AT MTAB_NEW_PROG ** * FORM GET_PROGRAM_CODE * ** * > FTAB_OLD_PROG * * > F_REPORT * ** FORM get_program_code TABLES ftab_old_prog STRUCTURE mtab_old_prog USING f_report. * Read the program code into an internal table REFRESH ftab_old_prog. READ REPORT f_report INTO ftab_old_prog. SELECT SINGLE * FROM trdir WHERE name = f_report. IF sy-subrc NE 0. WRITE: / Unable to read report:, f_report. WRITE: / Exiting program. ENDIF. ENDFORM. FORM GET_PROGRAM_CODE ** * FORM CREATE_CONDENSED_TABLE * ** * Create a table that has all statements condensed onto 1 line * ** * > FTAB_OLD_PROG * * > FTAB_long_line * ** FORM create_condensed_table TABLES ftab_old_prog STRUCTURE mtab_old_prog ftab_long_line STRUCTURE mtab_long_line. DATA: * Structure to hold program code/comment BEGIN OF fstr_line, code(72) TYPE c, Program Code comment(72) TYPE c, Inline comments END OF fstr_line. LOOP AT ftab_old_prog. IF ftab_long_line-start = 0. ftab_long_line-start = ftab_long_line-end + 1. CLEAR ftab_long_line-end. ENDIF. * Strip off any inline comments so they do not get in the way * If comments are not separated, then words in the comments could * look like keywords, and cause problems SPLIT ftab_old_prog-line AT INTO fstr_line-code fstr_line-comment. * Align all statements to be left justified SHIFT fstr_line-code LEFT DELETING LEADING space. * Put all lines that make up a single statement into one field * This will make it easier to isolate key words. For example, if you * want to process a TABLES statement, but exclude the TABLES part * of a function call, or a subroutine call. CONCATENATE ftab_long_line-code

fstr_line-code INTO ftab_long_line-code SEPARATED BY space. IF fstr_line-code CA . OR Period means end of statement fstr_line-code(1) = * OR Comment Line fstr_line-code CO space. Blank Line * Keep track of the table index that the statement ends on ftab_long_line-end = sy-tabix. * Remove delimiter from concatenation of fields SHIFT ftab_long_line-code LEFT BY 1 PLACES. APPEND ftab_long_line. CLEAR: ftab_long_line-code, ftab_long_line-start. * Dont clear out fstr_long_line-end yet. It is used to calc * fstr_long_line-start. ENDIF. ENDLOOP. LOOP AT FTAB_OLD_PROG ENDFORM. FORM CREATE_CONDENSED_TABLE ** * FORM FORMAT_PROGRAM * ** * .. * ** FORM format_program. DATA: lstr_old_prog LIKE mtab_old_prog. LOOP AT mtab_long_line. TRANSLATE mtab_long_line-code TO UPPER CASE. IF mtab_long_line-code(1) EQ *. Do not modify Comment Lines LOOP AT mtab_old_prog FROM mtab_long_line-start TO mtab_long_line-end. mtab_new_prog-line = mtab_old_prog-line. APPEND mtab_new_prog. ENDLOOP. LOOP AT MTAB_OLD_PROG ELSEIF mtab_long_line-code(6) EQ TABLES. * Reformat any TABLES statements. Will only reformat when TABLES * is at the start of the statement. Will not try to get table * descriptions for CALL FUNCTIONS or FORM/PERFORMs * Get the table names from mstr_long_line. PERFORM get_table_names_from_statement TABLES mtab_tabname USING mtab_long_line-code. * Find the descriptions for each table PERFORM get_table_descriptions TABLES mtab_tabname. * create the new statement PERFORM build_new_tables_statement USING mtab_long_line. ELSE. All other modifications to the code handled here LOOP AT mtab_old_prog FROM mtab_long_line-start TO mtab_long_line-end. * Remove extra spaces from line for comparisons lstr_old_prog = mtab_old_prog. CONDENSE lstr_old_prog. TRANSLATE lstr_old_prog TO UPPER CASE. IF lstr_old_prog-line CS . Comments mtab_new_prog-line = mtab_old_prog-line. ELSE. IF lstr_old_prog-line CS LIKE OR lstr_old_prog-line CS FOR . PERFORM get_for_like_comment USING mtab_old_prog CHANGING mtab_new_prog. ELSEIF lstr_old_prog-line(7) = LOOP AT . * save table name into a queue PERFORM enqueue_itab_name USING mtab_long_line-code.

mtab_new_prog-line = mtab_old_prog-line. ELSEIF lstr_old_prog-line(7) = ENDLOOP. * get name off of queue and add it as a comment to the ENDLOOP line PERFORM add_comment_to_endloop USING mtab_old_prog-line CHANGING mtab_new_prog-line. ELSEIF lstr_old_prog-line(7) EQ SELECT AND lstr_old_prog-line(13) NE SELECT SINGLE. * save table name into a queue PERFORM enqueue_tab_name USING mtab_old_prog-line. mtab_new_prog-line = mtab_old_prog-line. ELSEIF lstr_old_prog-line(9) = ENDSELECT. * get name off of queue and add it as a comment to the ENDSELECT PERFORM add_comment_to_select USING mtab_old_prog-line CHANGING mtab_new_prog-line. ELSEIF lstr_old_prog-line(5) = FORM . * save form name into a queue PERFORM enqueue_form_name USING mtab_old_prog-line. mtab_new_prog-line = mtab_old_prog-line. ELSEIF lstr_old_prog-line(7) = ENDFORM. * get name off of queue and add it as a comment to the ENDFORM PERFORM add_comment_to_endform USING mtab_old_prog-line CHANGING mtab_new_prog-line. ELSE. Any other lines mtab_new_prog-line = mtab_old_prog-line. ENDIF. ENDIF. PERFORM format_comments CHANGING mtab_new_prog-line. APPEND mtab_new_prog. ENDLOOP. LOOP AT MTAB_OLD_PROG ENDIF. ENDLOOP. LOOP AT MTAB_LONG_LINE ENDFORM. FORM CREATE_CONDENSED_TABLE ** * FORM GET_TABLE_NAMES_FROM_STATEMENT * ** * .. * ** * > FTAB_TABNAME * * > FC_STATEMENT * ** FORM get_table_names_from_statement TABLES ftab_tabname STRUCTURE mtab_tabname USING fc_statement. CLEAR ftab_tabname. REFRESH ftab_tabname. REPLACE TABLES WITH space INTO fc_statement. TRANSLATE fc_statement USING . . Replace periods TRANSLATE fc_statement USING , . Replace commas TRANSLATE fc_statement USING : . Replace colons CONDENSE fc_statement. Remove all extra spaces SPLIT fc_statement AT space INTO TABLE ftab_tabname. ENDFORM. FORM GET_TABLE_NAMES_FROM_STATEMENT ** * FORM GET_TABLE_DESCRIPTIONS * ** * .. * ** * > FTAB_TABNAME * * > LOOP * * > AT*

* > FTAB_TABNAME * ** FORM get_table_descriptions TABLES ftab_tabname STRUCTURE mtab_tabname. LOOP AT ftab_tabname. SELECT SINGLE * FROM dd02t WHERE tabname = ftab_tabname-tabname AND ddlanguage = sy-langu. IF sy-subrc = 0. ftab_tabname-tabdesc = dd02t-ddtext. MODIFY ftab_tabname. ENDIF. ENDLOOP. LOOP AT FTAB_TABNAME ENDFORM. FORM GET_TABLE_DESCRIPTIONS ** * FORM BUILD_NEW_TABLES_STATEMENT * ** * .. * ** * > FSTR_LONG_LINE * ** FORM build_new_tables_statement USING fstr_long_line LIKE mtab_long_line. DATA: lc_sep(1) TYPE c, li_rows TYPE i. DESCRIBE TABLE mtab_tabname LINES li_rows. mtab_new_prog-line = TABLES:. APPEND mtab_new_prog. LOOP AT mtab_tabname. IF sy-tabix = li_rows. lc_sep = .. ELSE. lc_sep = ,. ENDIF. CONCATENATE ~~ mtab_tabname-tabname lc_sep mtab_tabname-tabdesc INTO mtab_new_prog SEPARATED BY space. TRANSLATE mtab_new_prog USING ~ . APPEND mtab_new_prog. ENDLOOP. LOOP AT MTAB_TABNAME ENDFORM. FORM BUILD_NEW_TABLES_STATEMENT ** * FORM GET_FOR/LIKE_COMMENT * ** * .. * ** * > F_OLD_PROG * * > F_NEW_PROG * ** FORM get_for_like_comment USING value(f_old_prog) LIKE mtab_old_prog CHANGING f_new_prog. DATA: lc_dummy(1) TYPE c, lc_tabname(40) TYPE c, ltab_nametab LIKE dntab OCCURS 0 WITH HEADER LINE, BEGIN OF lstr_field, tabname LIKE dd02t-tabname, Table name fldname LIKE dd02t-tabname, Table name

END OF lstr_field. IF f_old_prog-line CA OR Line already commented f_old_prog-line(1) = *. f_new_prog = f_old_prog. EXIT. ELSEIF f_old_prog CS LIKE . SPLIT f_old_prog AT LIKE INTO lc_dummy lc_tabname. ELSEIF f_old_prog CS FOR . SPLIT f_old_prog AT FOR INTO lc_dummy lc_tabname. ELSE. f_new_prog = f_old_prog. EXIT. ENDIF. * If there is anything following the table-field in a LIKE or FOR * clause it will be removed so that only the table-field remains SPLIT lc_tabname AT space INTO lc_tabname lc_dummy. TRANSLATE lc_tabname USING . . Remove periods TRANSLATE lc_tabname USING , . Remove commas CONDENSE lc_tabname. Remove extra white space SPLIT lc_tabname AT - INTO lstr_field-tabname lstr_field-fldname. * The system variables are actually defined in DDIC structure SYST IF lstr_field-tabname = SY. lstr_field-tabname = SYST. ENDIF. CALL FUNCTION NAMETAB_GET EXPORTING langu = sy-langu only = tabname = lstr_field-tabname TABLES nametab = ltab_nametab EXCEPTIONS OTHERS = 4. READ TABLE ltab_nametab WITH KEY tabname = lstr_field-tabname fieldname = lstr_field-fldname. IF sy-subrc = 0. CONCATENATE f_old_prog ltab_nametab-fieldtext INTO f_new_prog SEPARATED BY space. ELSE. f_new_prog = f_old_prog. ENDIF. ENDFORM. FORM BUILD_NEW_TABLES_STATEMENT ** * FORM SAVE_PROGRAM * ** * .. * ** FORM save_program. DATA: lc_saveok(1) TYPE c. DATA: lstr_message LIKE message. * Check to see if the program is a local private object ($TMP)

SELECT SINGLE * FROM tadir WHERE pgmid = R3TR AND object = PROG AND obj_name = p_report. IF sy-subrc = 0. IF tadir-devclass = $TMP. Local Private Object lc_saveok = X. ELSE. * Check to see if the person trying to update the source is the * same one who last changed the program SELECT SINGLE * FROM trdir WHERE name = p_report. IF sy-subrc = 0 AND trdir-unam <> sy-uname. lc_saveok = space. MESSAGE ID ZSK TYPE I NUMBER 000 WITH You are not the user who last changed this program. Program changes not saved.. ELSE. * Check to see if the program is on a request. If it is not, * do not allow it to be updated. If the user cannot update the * program, then this program wont either. SELECT SINGLE * FROM e071 WHERE ( ( pgmid = R3TR AND object = PROG ) OR ( pgmid = LIMU AND object = REPS ) ) AND obj_name = p_report AND lockflag = X. IF sy-subrc = 0 AND e071-lockflag = X. lc_saveok = X. ELSE. lc_saveok = space. MESSAGE ID ZSK TYPE I NUMBER 000 WITH Program must be on a transport, or be a local private object. Program changes not saved.. ENDIF. ENDIF. ENDIF. ELSE. lc_saveok = space. MESSAGE ID ZSK TYPE I NUMBER 000 WITH Program not saved. ENDIF. CHECK lc_saveok = X. * Check to see if the program is locked CALL FUNCTION ENQUEUE_ESRDIRE EXPORTING mode_trdir = X Exclusive Lock name = p_report EXCEPTIONS foreign_lock = 1 system_failure = 2 OTHERS = 3. CASE sy-subrc. WHEN 0. OK INSERT REPORT p_report FROM mtab_new_prog. IF sy-subrc = 0. FORMAT COLOR COL_POSITIVE. WRITE: / Program now has fields commented.. ELSE. FORMAT COLOR COL_NEGATIVE.

WRITE: / Error saving program. ENDIF. CALL FUNCTION DEQUEUE_ESRDIRE EXPORTING mode_trdir = E name = p_report. WHEN 1. Locked by another user CALL FUNCTION WRITE_MESSAGE EXPORTING msgid = EU msgno = 510 msgty = S msgv1 = sy-msgv1 msgv2 = sy-msgv2 msgv3 = sy-msgv3 msgv4 = sy-msgv4 msgv5 = space IMPORTING messg = lstr_message EXCEPTIONS OTHERS = 1. IF sy-subrc = 0. FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF. WRITE: / lstr_message-msgtx, / No changes made to program, p_report. ENDIF. WHEN 2. CALL FUNCTION WRITE_MESSAGE EXPORTING msgid = EU msgno = 510 msgty = S msgv1 = sy-msgv1 msgv2 = sy-msgv2 msgv3 = sy-msgv3 msgv4 = sy-msgv4 msgv5 = space IMPORTING messg = lstr_message EXCEPTIONS OTHERS = 1. IF sy-subrc = 0. FORMAT COLOR COL_NEGATIVE INTENSIFIED OFF. WRITE: / lstr_message-msgtx, / No changes made to program, p_report. ENDIF. ENDCASE. FORMAT COLOR COL_NORMAL. SKIP 2. ENDFORM. FORM SAVE_PROGRAM ** * FORM ENQUEUE_ITAB_NAME* ** * .. * ** * > F_LINE * ** FORM enqueue_itab_name USING value(f_line) LIKE mtab_long_line-code. DATA: lc_dummy(1) TYPE c,

lc_itab(40) TYPE c. TRANSLATE f_line TO UPPER CASE. SPLIT f_line AT LOOP AT INTO lc_dummy lc_itab. SPLIT lc_itab AT space INTO lc_itab lc_dummy. TRANSLATE lc_itab USING . . CONDENSE lc_itab. mtab_itab_names = lc_itab. * Always have the most recent LOOP AT table as the first entry in the * queue INSERT mtab_itab_names INDEX 1. ENDFORM. ENQUEUE_ITAB_NAME ** * FORM ADD_COMMENT_TO_ENDLOOP * ** * .. * ** * > FSTR_LONG_LINE * * > F_PROG_LINE * ** FORM add_comment_to_endloop USING fstr_long_line LIKE mtab_old_prog-line CHANGING f_prog_line. IF mtab_old_prog-line NA . No comments * Get the internal table from the queue READ TABLE mtab_itab_names INDEX 1. CONCATENATE mtab_old_prog-line LOOP AT mtab_itab_names-tabname INTO f_prog_line SEPARATED BY space. * Dequeue the itab name DELETE mtab_itab_names INDEX 1. ELSE. f_prog_line = mtab_old_prog-line. ENDIF. ENDFORM. FORM SAVE_PROGRAM ** * FORM ENQUEUE_TAB_NAME * ** * .. * ** * > F_LINE * ** FORM enqueue_tab_name USING f_line LIKE mtab_old_prog-line. DATA: lc_dummy(1) TYPE c, lc_tab(40) TYPE c. TRANSLATE f_line TO UPPER CASE. SPLIT f_line AT FROM INTO lc_dummy lc_tab. CONDENSE lc_tab. Remove leading/trailing extra spaces SPLIT lc_tab AT space INTO lc_tab lc_dummy. TRANSLATE lc_tab USING . . CONDENSE lc_tab. mtab_tab_names = lc_tab. * Always have the most recent LOOP AT table as the first entry in the * queue INSERT mtab_tab_names INDEX 1.

ENDFORM. FORM BUILD_NEW_TABLES_STATEMENT ** * FORM ADD_COMMENT_TO_SELECT * ** * .. * ** * > FSTR_LONG_LINE * * > F_PROG_LINE * ** FORM add_comment_to_select USING fstr_long_line LIKE mtab_old_prog-line CHANGING f_prog_line. IF mtab_old_prog-line NA . No comments * Get the table from the queue READ TABLE mtab_tab_names INDEX 1. CONCATENATE mtab_old_prog-line SELECT FROM mtab_tab_names-tabname INTO f_prog_line SEPARATED BY space. * Dequeue the tab name DELETE mtab_tab_names INDEX 1. ELSE. f_prog_line = mtab_old_prog-line. ENDIF. ENDFORM. FORM SAVE_PROGRAM ** * FORM ADD_COMMENT_TO_ENDFORM * ** * .. * ** * > FSTR_LONG_LINE * * > F_NEW_PROG * ** FORM add_comment_to_endform USING fstr_long_line LIKE mtab_old_prog-line CHANGING f_prog_line. IF mtab_old_prog-line NA . No comments * Get the table from the queue READ TABLE mtab_form_names INDEX 1. CONCATENATE mtab_old_prog-line FORM mtab_form_names-tabname INTO f_prog_line SEPARATED BY space. * Dequeue the form name DELETE mtab_form_names INDEX 1. ELSE. f_prog_line = mtab_old_prog-line. ENDIF. ENDFORM. FORM SAVE_PROGRAM ** * FORM ENQUEUE_FORM_NAME* ** * .. * ** * > F_LINE * ** FORM enqueue_form_name USING f_line. DATA: lc_dummy(1) TYPE c, lc_tab(40) TYPE c.

TRANSLATE f_line TO UPPER CASE. SPLIT f_line AT FORM INTO lc_dummy lc_tab. CONDENSE lc_tab. Remove leading/trailing extra spaces SPLIT lc_tab AT space INTO lc_tab lc_dummy. TRANSLATE lc_tab USING . . CONDENSE lc_tab. mtab_form_names = lc_tab. * Always have the most recent LOOP AT table as the first entry in the * queue INSERT mtab_form_names INDEX 1. ENDFORM. FORM ENQUEUE_FORM_NAME ** * FORM format_comments * ** * This routine has not been well tested, so there may be * * some unanticipated features present! * ** * > F_PROGLINE * ** FORM format_comments CHANGING f_progline LIKE mtab_new_prog-line. DATA: li_pos TYPE i, li_code_len TYPE i, Length of the code li_comm_len TYPE i, length of the comment lc_line LIKE mtab_new_prog-line, lc_comment LIKE mtab_new_prog-line. * Make sure there is an inline comment on the line CHECK f_progline CS . * Separate program code from comments SPLIT f_progline AT INTO lc_line lc_comment. CONCATENATE lc_comment INTO lc_comment SEPARATED BY space. f_progline = lc_line. li_code_len = STRLEN( lc_line ). li_comm_len = STRLEN( lc_comment ). li_pos = 70 li_code_len li_comm_len. IF li_pos GE 45 AND li_pos GT li_code_len. f_progline+li_pos = lc_comment. ENDIF. ENDFORM. format_comments

S-ar putea să vă placă și