*&--------------------------------------------------------------------&* *& Report: Z_USEREXIT (V9) &* *& PJA Consultancy Services (www.pjas.com) &* *&--------------------------------------------------------------------&* *& This report attmpts to find Enhancements, Program-Exits, BADIs &* *& and Business Transaction Events in a particular program/tcode. &* *& Last updated: 09 May 2007 &* *&--------------------------------------------------------------------&* *& Selection Texts: *& P_ALV ALV format *& P_AUTH Include authority-check search *& P_BADI Display BADIs *& P_BTE Display business trans events *& P_DEVC Show development class exits *& P_EXIT Display user exits *& P_FUNC Show function modules *& P_LIMIT Limit no. of submits to search *& P_LST Standard list format *& P_PNAME Program name *& P_PROG Display program exits *& P_SUBM Show submits *& P_TCODE Transaction code *& P_TEXT Search for text *& P_WFLOW Display workflow links *&--------------------------------------------------------------------&* *& Text symbols: *& M01 Enter TCode or program *& M02 Enter at least one scope criteria *& S01 Selection data (TCode takes precedence over program name) *& S02 Scope criteria *& S03 Display criteria *&--------------------------------------------------------------------&* report z_userexit no standard page heading line-size 201 . tables : sxs_attr, tobjt, tstct, "TCode texts trdirt, "Program texts sxc_exit. "BADI exits type-pools: slis. "Globale Typen fьr generische Listbausteine data : tabix like sy-tabix, w_linnum type i , w_off type i , w_index like sy-tabix, w_include like trdir-name, w_prog like trdir-name, w_incl like trdir-name, w_area like rs38l-area, w_level, w_str(50) type c , w_cnt(2) type c , w_funcname like tfdir-funcname, w_fsel like sy-ucomm, " Determination of screen field w_gridtxt(70) type c . "ALV grid title constants : c_fmod(40) type c value ‘Function modules searched: ‘ , c_subm(40) type c value ‘Submit programs searched: ‘ , c_devc(60) type c value ‘User-exits from development classes in function modules‘ , c_col1(12) type c value ‘Enhanmt Type‘ , c_col2(40) type c value ‘Enhancement‘ , c_col3(30) type c value ‘Program/Include‘ , c_col4(20) type c value ‘Enhancement Name‘ , c_col5(40) type c value ‘Enhancement Description‘ , c_col6(8) type c value ‘Project‘ , c_col7(1) type c value ‘S‘ , c_col8(12) type c value ‘ChangeName‘ , c_col9(10) type c value ‘ChangeDate‘ , c_x type c value ‘X‘ . * Work Areas: ABAP Workbench data : begin of wa_d010inc. data : master type d010inc-master. data : end of wa_d010inc. data : begin of wa_tfdir. data : funcname type tfdir-funcname, pname type tfdir-pname, include type tfdir-include . data : end of wa_tfdir. data : begin of wa_tadir. data : devclass type tadir-devclass. data : end of wa_tadir. data : begin of wa_tstc. data : pgmna type tstc-pgmna. data : end of wa_tstc. data : begin of wa_tstcp. data : param type tstcp-param. data : end of wa_tstcp. data : begin of wa_enlfdir. data : area type enlfdir-area. data : end of wa_enlfdir. * Work Areas: BADIs data : begin of wa_sxs_attr. data : exit_name type sxs_attr-exit_name. data : end of wa_sxs_attr. data : begin of wa_sxs_attrt. data : text type sxs_attrt-text . data : end of wa_sxs_attrt. * Work Areas: Enhancements data : begin of wa_modsap. data : member type modsap-member. data : end of wa_modsap. data : begin of wa_modsapa. data : name type modsapa-name. data : end of wa_modsapa. data : begin of wa_modsapt. data : modtext type modsapt-modtext. data : end of wa_modsapt. * Work Areas: Business Transaction Events data : begin of wa_tbe01t. data : text1 type tbe01t-text1. data : end of wa_tbe01t. data : begin of wa_tps01t. data : text1 type tps01t-text1. data : end of wa_tps01t. * user-exits types : begin of ty_mod, member like modact-member, name like modact-name, status like modattr-status, anam like modattr-anam, adat like modattr-adat, end of ty_mod. data : w_mod type ty_mod. types : begin of t_userexit, type(12) type c, pname like trdir-name, txt(300), level type c , modname(30) type c , modtext(60) type c , modattr type ty_mod, colour(4) type c , end of t_userexit. data : i_userexit type standard table of t_userexit with header line . * Function module developmnet classes types : begin of t_devclass, clas like trdir-clas, end of t_devclass. data : i_devclass type standard table of t_devclass with header line . * Submit programs types : begin of t_submit, pname like trdir-name, level, done, end of t_submit. data : i_submit type standard table of t_submit with header line . * Source code types : begin of t_sourcetab, "#EC * (SLIN lьgt!) line(200), "#EC * (SLIN lьgt!) end of t_sourcetab. "#EC * (SLIN lьgt!) data : sourcetab type standard table of t_sourcetab with header line . data c_overflow(30000) type c . * Description of an ABAP/4 source analysis token *data: i_stoken type standard table of stokex with header line. data : i_stoken type standard table of stoken with header line . data wa_stoken like i_stoken. * Description of an ABAP/4 source analysis statement data : i_sstmnt type standard table of sstmnt with header line ."#EC NEEDED * keywords for searching ABAP code types : begin of t_keywords, word(30), end of t_keywords. data : keywords type standard table of t_keywords with header line . * function modules within program types : begin of t_fmodule, name like rs38l-name, pname like trdir-name, pname2 like trdir-name, level, bapi, done, end of t_fmodule. data : i_fmodule type standard table of t_fmodule with header line . * ALV definitions data i_fieldcat type slis_t_fieldcat_alv with header line . data i_layout type slis_layout_alv. data i_sort type slis_t_sortinfo_alv with header line . *&--------------------------------------------------------------------&* *& Selection Options &* *&--------------------------------------------------------------------&* selection-screen begin of block selscr1 with frame title text-s01. parameter : p_pname like trdir-name, p_tcode like syst-tcode, p_limit(4) type n default 500 . selection-screen skip . selection-screen end of block selscr1. selection-screen begin of block selscr2 with frame title text-s02. parameter : p_badi as checkbox default c_x, p_bte as checkbox default c_x, p_exit as checkbox default c_x, p_prog as checkbox default c_x, p_wflow as checkbox , p_auth as checkbox . selection-screen skip . parameter : p_text(40) type c . selection-screen end of block selscr2. selection-screen begin of block selscr3 with frame title text-s03. parameter : p_alv radiobutton group rad1 default ‘X‘ , p_lst radiobutton group rad1. selection-screen skip . parameter : p_devc like rihea-dy_ofn default ‘ ‘ modif id a01, p_func like rihea-dy_ofn default ‘ ‘ modif id a01, p_subm like rihea-dy_ofn default ‘ ‘ modif id a01. selection-screen end of block selscr3. *&--------------------------------------------------------------------&* *& START-OF-SELECTION &* *&--------------------------------------------------------------------&* start-of-selection. if p_pname is initial and p_tcode is initial . message i000(g01) with text-m01. stop . endif . if p_badi is initial and p_exit is initial and p_bte is initial and p_wflow is initial and p_auth is initial and p_prog is initial . message i000(g01) with text-m02. stop . endif . * ensure P_LIMIT is not zero. if p_limit = 0 . p_limit = 1 . endif . perform data_select. perform get_submit_data. perform get_fm_data. perform get_additional_data. perform data_display. *&--------------------------------------------------------------------&* *& Form DATA_SELECT &* *&--------------------------------------------------------------------&* *& &* *&--------------------------------------------------------------------&* form data_select. * data selection message to sap gui call function ‘SAPGUI_PROGRESS_INDICATOR‘ destination ‘SAPGUI‘ keeping logical unit of work EXPORTING text = ‘Get programs/includes‘ "#EC NOTEXT EXCEPTIONS system_failure communication_failure . "#EC * * get TCode name for ALV grid title clear w_gridtxt. if not p_tcode is initial . select single * from tstct where tcode = p_tcode and sprsl = sy-langu. concatenate ‘TCode:‘ p_tcode tstct-ttext into w_gridtxt separated by space. endif . * get program name for ALV grid title if not p_pname is initial . select single * from trdirt where name = p_pname and sprsl = sy-langu. concatenate ‘Program:‘ p_pname tstct-ttext into w_gridtxt separated by space. endif . * determine search words keywords-word = ‘CALL‘ . append keywords. keywords-word = ‘FORM‘ . append keywords. keywords-word = ‘PERFORM‘ . append keywords. keywords-word = ‘SUBMIT‘ . append keywords. keywords-word = ‘INCLUDE‘ . append keywords. keywords-word = ‘AUTHORITY-CHECK‘ . append keywords. if not p_tcode is initial . * get program name from TCode select single pgmna from tstc into wa_tstc-pgmna where tcode eq p_tcode. if not wa_tstc-pgmna is initial . p_pname = wa_tstc-pgmna. * TCode does not include program name, but does have reference TCode else . select single param from tstcp into wa_tstcp-param where tcode eq p_tcode. if sy-subrc = 0 . check wa_tstcp-param(1) = ‘/‘ . check wa_tstcp-param+1(1) = ‘*‘ . if wa_tstcp-param ca ‘ ‘ . endif . w_off = sy-fdpos + 1 . subtract 2 from sy-fdpos. if sy-fdpos gt 0 . p_tcode = wa_tstcp-param+2(sy-fdpos). endif . select single pgmna from tstc into wa_tstc-pgmna where tcode eq p_tcode. p_pname = wa_tstc-pgmna. if sy-subrc <> 0 . message s110(/saptrx/asc) with ‘No program found for: ‘ p_tcode."#EC NOTEXT stop . endif . else . message s110(/saptrx/asc) with ‘No program found for: ‘ p_tcode."#EC NOTEXT stop . endif . endif . endif . * Call customer-function aus Program coding read report p_pname into sourcetab. if sy-subrc > 0 . message e017(enhancement) with p_pname raising no_program."#EC * endif . *scan abap-source sourcetab tokens into i_stoken *statements into i_sstmnt *keywords from keywords *overflow into c_overflow *with ANALYSIS. "#EC ********************************** scan abap-source sourcetab tokens into i_stoken statements into i_sstmnt keywords from keywords overflow into c_overflow with includes. "#EC ********************************** if sy-subrc > 0 . "keine/syntakt. falsche Ablauflog./Fehler im Skanner message e130(enhancement) raising syntax_error. "#EC endif . * check I_STOKEN for entries clear w_linnum. describe table i_stoken lines w_linnum. if w_linnum gt 0 . w_level = ‘0‘ . w_prog = ‘‘ . w_incl = ‘‘ . perform data_search tables i_stoken using w_level w_prog w_incl. endif . endform . "DATA_SELECT *&--------------------------------------------------------------------&* *& Form GET_FM_DATA # &* *&--------------------------------------------------------------------&* *& &* *&--------------------------------------------------------------------&* form get_fm_data. * data selection message to sap gui call function ‘SAPGUI_PROGRESS_INDICATOR‘ destination ‘SAPGUI‘ keeping logical unit of work EXPORTING text = ‘Get function module data‘ "#EC NOTEXT EXCEPTIONS system_failure communication_failure . "#EC * * Function module data sort i_fmodule by name. delete adjacent duplicates from i_fmodule comparing name. loop at i_fmodule where done ne c_x. clear : i_stoken, i_sstmnt, sourcetab, wa_tfdir, w_include . refresh : i_stoken, i_sstmnt, sourcetab. clear wa_tfdir. select single funcname pname include from tfdir into wa_tfdir where funcname = i_fmodule-name. check sy-subrc = 0 . call function ‘FUNCTION_INCLUDE_SPLIT‘ EXPORTING program = wa_tfdir-pname IMPORTING group = w_area. concatenate ‘L‘ w_area ‘U‘ wa_tfdir-include into w_include. i_fmodule-pname = w_include. i_fmodule-pname2 = wa_tfdir-pname. modify i_fmodule. read report i_fmodule-pname into sourcetab. if sy-subrc = 0 . scan abap-source sourcetab tokens into i_stoken statements into i_sstmnt keywords from keywords with INCLUDES. if sy-subrc > 0 . message e130(enhancement) raising syntax_error. endif . * check i_stoken for entries clear w_linnum. describe table i_stoken lines w_linnum. if w_linnum gt 0 . w_level = ‘1‘ . w_prog = i_fmodule-pname2. w_incl = i_fmodule-pname. perform data_search tables i_stoken using w_level w_prog w_incl. endif . endif . endloop . * store development classes if p_devc = c_x. loop at i_fmodule. clear : wa_tadir, wa_enlfdir. select single area from enlfdir into wa_enlfdir-area where funcname = i_fmodule-name. check not wa_enlfdir-area is initial . select single devclass into wa_tadir-devclass from tadir where pgmid = ‘R3TR‘ and object = ‘FUGR‘ and obj_name = wa_enlfdir-area. check not wa_tadir-devclass is initial . move wa_tadir-devclass to i_devclass-clas. append i_devclass. i_fmodule-done = c_x. modify i_fmodule. endloop . sort i_devclass. delete adjacent duplicates from i_devclass. endif . endform . "GET_FM_DATA *&--------------------------------------------------------------------&* *& Form GET_SUBMIT_DATA &* *&--------------------------------------------------------------------&* *& &* *&--------------------------------------------------------------------&* form get_submit_data. * data selection message to sap gui call function ‘SAPGUI_PROGRESS_INDICATOR‘ destination ‘SAPGUI‘ keeping logical unit of work EXPORTING text = ‘Get submit data‘ "#EC NOTEXT EXCEPTIONS system_failure communication_failure . "#EC * sort i_submit. delete adjacent duplicates from i_submit comparing pname. w_level = ‘0‘ . loop at i_submit where done ne c_x. clear : i_stoken, i_sstmnt, sourcetab. refresh : i_stoken, i_sstmnt, sourcetab. read report i_submit-pname into sourcetab. if sy-subrc = 0 . scan abap-source sourcetab tokens into i_stoken statements into i_sstmnt keywords from keywords with includes. if sy-subrc > 0 . * message e130(enhancement) raising syntax_error. continue . endif . * check i_stoken for entries clear w_linnum. describe table i_stoken lines w_linnum. if w_linnum gt 0 . w_prog = i_submit-pname. w_incl = ‘‘ . perform data_search tables i_stoken using w_level w_prog w_incl. endif . endif . * restrict number of submit program selected for processing describe table i_submit lines w_linnum. if w_linnum ge p_limit. w_level = ‘1‘ . endif . i_submit-done = c_x. modify i_submit. endloop . endform . "GET_SUBMIT_DATA *&--------------------------------------------------------------------&* *& Form DATA_SEARCH &* *&--------------------------------------------------------------------&* *& &* *&--------------------------------------------------------------------&* form data_search tables p_stoken structure stoken using p_level l_prog l_incl. loop at p_stoken. clear i_userexit. * Workflow if p_wflow = c_x. if p_level eq ‘1‘ . " do not perform for function modules (2nd pass) if p_stoken-str+1(16) cs ‘SWE_EVENT_CREATE‘ . replace all occurrences of ‘‘‘‘ in p_stoken-str with ‘‘ . i_userexit-type = ‘WorkFlow‘ . i_userexit-txt = p_stoken-str. concatenate l_prog ‘/‘ l_incl into i_userexit-pname. append i_userexit. endif . endif . endif . tabix = sy-tabix + 1 . i_userexit-level = p_level. if i_userexit-level = ‘0‘ . if l_incl is initial . i_userexit-pname = p_pname. else . concatenate p_pname ‘-‘ l_incl into i_userexit-pname. endif . else . if l_incl is initial . i_userexit-pname = l_prog. else . concatenate l_prog ‘-‘ l_incl into i_userexit-pname. endif . endif . * AUTHORITY-CHECKS if p_auth = c_x. if p_stoken-str eq ‘AUTHORITY-CHECK‘ . check p_level eq ‘0‘ . " do not perform for function modules (2nd pass) w_index = sy-tabix + 2 . read table p_stoken index w_index into wa_stoken. check not wa_stoken-str cs ‘STRUCTURE‘ . check not wa_stoken-str cs ‘SYMBOL‘ . read table i_submit with key pname = wa_stoken-str. if sy-subrc <> 0 . i_userexit-pname = i_submit-pname. i_userexit-type = ‘AuthCheck‘ . i_userexit-txt = wa_stoken-str. replace all occurrences of ‘‘‘‘ in i_userexit-txt with space. clear tobjt. select single * from tobjt where object = i_userexit-txt and langu = sy-langu. i_userexit-modname = ‘AUTHORITY-CHECK‘ . i_userexit-modtext = tobjt-ttext. append i_userexit. endif . endif . endif . * Text searches if not p_text is initial . if p_stoken-str cs p_text. i_userexit-pname = i_submit-pname. i_userexit-type = ‘TextSearch‘ . i_userexit-txt = wa_stoken-str. i_userexit-modname = ‘Text Search‘ . i_userexit-modtext = p_stoken-str. append i_userexit. endif . endif . * Include (SE38) if p_stoken-str eq ‘INCLUDE‘ . check p_level eq ‘0‘ . " do not perform for function modules (2nd pass) w_index = sy-tabix + 1 . read table p_stoken index w_index into wa_stoken. check not wa_stoken-str cs ‘STRUCTURE‘ . check not wa_stoken-str cs ‘SYMBOL‘ . read table i_submit with key pname = wa_stoken-str. if sy-subrc <> 0 . i_submit-pname = wa_stoken-str. i_submit-level = p_level. append i_submit. endif . endif . * Enhancements (SMOD) if p_exit = c_x. if p_stoken-str eq ‘CUSTOMER-FUNCTION‘ . clear w_funcname. read table p_stoken index tabix. translate p_stoken-str using ‘‘‘ ‘ . condense p_stoken-str. if l_prog is initial . concatenate ‘EXIT‘ p_pname p_stoken-str into w_funcname separated by ‘_‘ . else . concatenate ‘EXIT‘ l_prog p_stoken-str into w_funcname separated by ‘_‘ . endif . select single member from modsap into wa_modsap-member where member = w_funcname. if sy-subrc = 0 . " check for valid enhancement i_userexit-type = ‘Enhancement‘ . i_userexit-txt = w_funcname. append i_userexit. else . clear wa_d010inc. select single master into wa_d010inc-master from d010inc where include = l_prog. concatenate ‘EXIT‘ wa_d010inc-master p_stoken-str into w_funcname separated by ‘_‘ . i_userexit-type = ‘Enhancement‘ . i_userexit-txt = w_funcname. endif . endif . endif . * BADIs (SE18) if p_badi = c_x. if p_stoken-str cs ‘cl_exithandler=‘ . w_index = sy-tabix + 4 . read table p_stoken index w_index into wa_stoken. i_userexit-txt = wa_stoken-str. replace all occurrences of ‘‘‘‘ in i_userexit-txt with space. i_userexit-type = ‘BADI‘ . clear sxs_attr. " ensure a real BADI select single * from sxs_attr where exit_name = i_userexit-txt. if sy-subrc = 0 . append i_userexit. endif . endif . endif . * Business transaction events (FIBF) if p_bte = c_x. if p_stoken-str cs ‘OPEN_FI_PERFORM‘ . i_userexit-type = ‘BusTrEvent‘ . i_userexit-txt = p_stoken-str. replace all occurrences of ‘‘‘‘ in i_userexit-txt with space. i_userexit-modname = i_userexit-txt+16(8). case i_userexit-txt+25(1). when ‘E‘ . clear wa_tbe01t. select single text1 into wa_tbe01t-text1 from tbe01t where event = i_userexit-txt+16(8) and spras = sy-langu. if wa_tbe01t-text1 is initial . i_userexit-modtext = ‘<Not active>‘ . "#EC NOTEXT else . i_userexit-modtext = wa_tbe01t-text1. endif . i_userexit-modname+8 = ‘/P&S‘ . "#EC NOTEXT when ‘P‘ . clear wa_tps01t. select single text1 into wa_tps01t-text1 from tps01t where procs = i_userexit-txt+16(8) and spras = sy-langu. i_userexit-modtext = wa_tps01t-text1. i_userexit-modname+8 = ‘/Process‘ . endcase . append i_userexit. endif . endif . * Program exits (SE38) if p_prog = c_x. if p_stoken-str cs ‘USEREXIT_‘ . check not p_stoken-str cs ‘-‘ . " ensure not USEREXIT_XX-XXX check not p_stoken-str cs ‘(‘ . " ensure not SUBMIT_XX(X) i_userexit-type = ‘Program Exit‘ . i_userexit-txt = p_stoken-str. replace all occurrences of ‘‘‘‘ in i_userexit-txt with space. append i_userexit. endif . endif . * Submit programs (SE38) if p_stoken-str cs ‘SUBMIT‘ . check p_level eq ‘0‘ . " do not perform for function modules (2nd pass) check not p_stoken-str cs ‘_‘ . " ensure not SUBMIT_XXX w_index = sy-tabix + 1 . read table p_stoken index w_index into wa_stoken. check not wa_stoken-str cs ‘_‘ . " ensure not SUBMIT_XXX replace all occurrences of ‘‘‘‘ in wa_stoken-str with space. read table i_submit with key pname = wa_stoken-str. if sy-subrc <> 0 . i_submit-pname = wa_stoken-str. i_submit-level = p_level. append i_submit. endif . endif . * Perform routines (which reference external programs) if p_stoken-str cs ‘PERFORM‘ . check p_level eq ‘0‘ . " do not perform for function modules (2nd pass) w_index = sy-tabix + 1 . read table p_stoken index w_index into wa_stoken. if not wa_stoken-ovfl is initial . w_off = wa_stoken-off1 + 10 . w_str = c_overflow+w_off(30). find ‘)‘ in w_str match offset w_off. if sy-subrc = 0 . w_off = w_off + 1 . wa_stoken-str = w_str(w_off). endif . endif . check wa_stoken-str cs ‘(‘ . w_off = 0 . while sy-subrc = 0 . if wa_stoken-str+w_off(1) eq ‘(‘ . replace section offset w_off length 1 of wa_stoken-str with ‘‘ . replace all occurrences of ‘)‘ in wa_stoken-str with space. read table i_submit with key pname = wa_stoken-str. if sy-subrc <> 0 . i_submit-pname = wa_stoken-str. append i_submit. endif . exit . else . replace section offset w_off length 1 of wa_stoken-str with ‘‘ . shift wa_stoken-str left deleting leading space. endif . endwhile . endif . * Function modules (SE37) if p_stoken-str cs ‘FUNCTION‘ . clear i_fmodule. if p_level eq ‘0‘ . " do not perform for function modules (2nd pass) w_index = sy-tabix + 1 . read table p_stoken index w_index into wa_stoken. if wa_stoken-str cs ‘BAPI‘ . i_fmodule-bapi = c_x. endif . replace first occurrence of ‘‘‘‘ in wa_stoken-str with space. replace first occurrence of ‘‘‘‘ in wa_stoken-str with space. if sy-subrc = 4 . " didn‘t find 2nd quote (ie name truncated) clear wa_tfdir. concatenate wa_stoken-str ‘%‘ into wa_stoken-str. select single funcname into wa_tfdir-funcname from tfdir where funcname like wa_stoken-str. if sy-subrc = 0 . i_fmodule-name = wa_tfdir-funcname. else . continue . endif . else . i_fmodule-name = wa_stoken-str. endif . i_fmodule-level = p_level. append i_fmodule. endif . endif . endloop . endform . "DATA_SEARCH *&--------------------------------------------------------------------&* *& Form GET_ADDITIONAL_DATA &* *&--------------------------------------------------------------------&* *& &* *&--------------------------------------------------------------------&* form get_additional_data. * data selection message to sap gui call function ‘SAPGUI_PROGRESS_INDICATOR‘ destination ‘SAPGUI‘ keeping logical unit of work EXPORTING text = ‘Get additional data‘ "#EC NOTEXT EXCEPTIONS system_failure communication_failure . "#EC * loop at i_userexit. * Workflow if i_userexit-type eq ‘WorkFlow‘ . continue . endif . * Enhancement data if i_userexit-type cs ‘Enh‘ . clear : wa_modsapa. select single name into wa_modsapa-name from modsap where member = i_userexit-txt. check sy-subrc = 0 . i_userexit-modname = wa_modsapa-name. clear wa_modsapt. select single modtext into wa_modsapt-modtext from modsapt where name = wa_modsapa-name and sprsl = sy-langu. i_userexit-modtext = wa_modsapt-modtext. * Get the CMOD project name clear w_mod. select single modact~member modact~name modattr~status modattr~anam modattr~adat into w_mod from modact inner join modattr on modattr~name = modact~name where modact~member = wa_modsapa-name and modact~typ = space. if sy-subrc = 0 . i_userexit-modattr = w_mod. endif . endif . * BADI data if i_userexit-type eq ‘BADI‘ . clear wa_sxs_attr. select single exit_name into wa_sxs_attr-exit_name from sxs_attr where exit_name = i_userexit-txt. if sy-subrc = 0 . i_userexit-modname = i_userexit-txt. else . i_userexit-modname = ‘Dynamic call‘ . "#EC NOTEXT endif . clear wa_sxs_attrt. select single text into wa_sxs_attrt-text from sxs_attrt where exit_name = wa_sxs_attr-exit_name and sprsl = sy-langu. i_userexit-modtext = wa_sxs_attrt-text . endif . * BADI Implementation if i_userexit-type eq ‘BADI‘ . clear sxc_exit. select COUNT( * ) from sxc_exit where exit_name = i_userexit-txt. w_cnt = sy-dbcnt. * determine id BADI is for interal or external use clear sxs_attr. select single * from sxs_attr where exit_name = i_userexit-txt. if sxs_attr-internal = ‘X‘ . wa_sxs_attrt-text = ‘SAP ‘ . else . wa_sxs_attrt-text = ‘CUST‘ . endif . * concatenate wa_sxs_attrt-text w_cnt into i_userexit-modattr-name * separated by space. write wa_sxs_attrt-text to i_userexit-modattr-name. write w_cnt to i_userexit-modattr-name+5 . endif . modify i_userexit. endloop . * get enhancements via program package clear wa_tadir. select single devclass into wa_tadir-devclass from tadir where pgmid = ‘R3TR‘ and object = ‘PROG‘ and obj_name = p_pname. if sy-subrc = 0 . clear : wa_modsapa, wa_modsapt. select name from modsapa into wa_modsapa-name where devclass = wa_tadir-devclass. select single modtext from modsapt into wa_modsapt-modtext where name = wa_modsapa-name and sprsl = sy-langu. clear i_userexit. read table i_userexit with key modname = wa_modsapa-name. if sy-subrc <> 0 . i_userexit-modtext = wa_modsapt-modtext. i_userexit-type = ‘Enhancement‘ . "#EC NOTEXT i_userexit-modname = wa_modsapa-name. i_userexit-txt = ‘Determined from program DevClass‘ ."#EC NOTEXT i_userexit-pname = ‘Unknown‘ . "#EC NOTEXT append i_userexit. endif . endselect . endif . * set row colour. loop at i_userexit. case i_userexit-type . when ‘BADI‘ . i_userexit-colour = ‘C601‘ . when ‘Enhancement‘ . i_userexit-colour = ‘C501‘ . when ‘Program Exit‘ . i_userexit-colour = ‘C401‘ . when ‘WorkFlow‘ . i_userexit-colour = ‘C301‘ . when ‘BusTrEvent‘ . i_userexit-colour = ‘C201‘ . endcase . modify i_userexit. endloop . endform . "GET_ADDITIONAL_DATA *&--------------------------------------------------------------------&* *& Form DATA_DISPLAY &* *&--------------------------------------------------------------------&* *& &* *&--------------------------------------------------------------------&* form data_display. * data selection message to sap gui call function ‘SAPGUI_PROGRESS_INDICATOR‘ destination ‘SAPGUI‘ keeping logical unit of work EXPORTING text = ‘Prepare screen for display‘ "#EC NOTEXT EXCEPTIONS system_failure communication_failure . "#EC * sort i_userexit by type txt modname. delete adjacent duplicates from i_userexit comparing txt pname modname. * ensure records selected. describe table i_userexit lines w_linnum. if w_linnum = 0 . message s003(g00). "No data records were selected exit . endif . if p_alv = ‘ ‘ . * format headings write : ‘Enhancements from main program: ‘ , p_pname. write : ‘Enhancements from TCode: ‘ , p_tcode. write : 201‘‘ . uline . format color col_heading. write : / sy-vline, (12) c_col1, "Enhanmt Type sy-vline, (40) c_col2, "Enhancement sy-vline, (30) c_col3, "Program/Include sy-vline, (20) c_col4, "Enhancement name sy-vline, (40) c_col5, "Enhancement description sy-vline, (8) c_col6, "Project sy-vline, (1) c_col7, "S sy-vline, (12) c_col8, "ChangeName sy-vline, (10) c_col9, "ChangeDate sy-vline. format reset . uline . * format lines loop at i_userexit. * set line colour case i_userexit-type . when ‘Enhancement‘ . format color 3 intensified off. when ‘BADI‘ . format color 4 intensified off. when ‘BusTrEvent‘ . format color 5 intensified off. when ‘Program Exit‘ . format color 6 intensified off. when others . format reset . endcase . write : / sy-vline, i_userexit-type , sy-vline, i_userexit-txt(40), sy-vline, i_userexit-pname(30), sy-vline, i_userexit-modname(20), sy-vline, i_userexit-modtext(40), sy-vline. write : i_userexit-modattr-name, sy-vline, i_userexit-modattr-status, sy-vline, i_userexit-modattr-anam, sy-vline, i_userexit-modattr-adat no-zero, sy-vline. hide : i_userexit-modname, i_userexit-type , i_userexit-modattr-name. endloop . format reset . uline . * user-exits from development class of function modules if p_devc = c_x. write : /. write : / c_devc. write : 201‘‘ . uline (90). write : 201‘‘ . loop at i_devclass. clear wa_modsapa. select name from modsapa into wa_modsapa where devclass = i_devclass-clas. select single name modtext into corresponding fields of wa_modsapt from modsapt where name = wa_modsapa-name and sprsl = sy-langu. format color 3 intensified off. write : / sy-vline, (12) ‘Enhancement‘ , sy-vline, wa_modsapa-name, sy-vline, wa_modsapt-modtext, sy-vline. endselect . endloop . write : 201‘‘ . uline (90). format reset . endif . * display fuction modules used in program write /. describe table i_fmodule lines w_linnum. write : / c_fmod , at 35 w_linnum. "#EC NOTEXT write : 201‘‘ . if p_func = c_x. uline (38). write : 201‘‘ . loop at i_fmodule. write : sy-vline, i_fmodule-name, sy-vline, i_fmodule-bapi, sy-vline. write : 201‘‘ . endloop . write : 201‘‘ . uline (38). endif . * display submit programs used in program write /. describe table i_submit lines w_linnum. write : / c_subm , at 35 w_linnum. "#EC NOTEXT write : 201‘‘ . if p_subm = c_x. uline (44). write : 201‘‘ . loop at i_submit. write : sy-vline, i_submit-pname, sy-vline. write : 201‘‘ . endloop . write : 201‘‘ . uline (44). endif . * issue message with number of user-exits displayed describe table i_userexit lines w_linnum. message s697(56) with w_linnum. else . " Show in alv format * issue message with number of user-exits displayed describe table i_userexit lines w_linnum. message s697(56) with w_linnum. * Create field catalog perform create_field_catalog using ‘TYPE‘ ‘T_USEREXIT‘ ‘ ‘ ‘Type‘ . perform create_field_catalog using ‘PNAME‘ ‘T_USEREXIT‘ ‘ ‘ ‘Prog#am name‘ . perform create_field_catalog using ‘TXT‘ ‘T_USEREXIT‘ ‘ ‘ ‘Enhancement‘ . perform create_field_catalog using ‘LEVEL‘ ‘T_USEREXIT‘ c_x ‘Level‘ . perform create_field_catalog using ‘MODNAME‘ ‘T_USEREXIT‘ ‘ ‘ ‘Enhancement name‘ . perform create_field_catalog using ‘MODTEXT‘ ‘T_USEREXIT‘ ‘ ‘ ‘Enhancement text‘ . perform create_field_catalog using ‘MODATTR-MEMBER‘ ‘T_USEREXIT‘ c_x ‘Member‘ . perform create_field_catalog using ‘MODATTR-NAME‘ ‘T_USEREXIT‘ ‘ ‘ ‘Project‘ . perform create_field_catalog using ‘MODATTR-STATUS‘ ‘T_USEREXIT‘ ‘ ‘ ‘Status‘ . perform create_field_catalog using ‘MODATTR-ANAM‘ ‘T_USEREXIT‘ ‘ ‘ ‘Changed by‘ . perform create_field_catalog using ‘MODATTR-ADAT‘ ‘T_USEREXIT‘ ‘ ‘ ‘Change date‘ . * Layout clear i_layout. i_layout-colwidth_optimize = c_x. i_layout-info_fieldname = ‘COLOUR‘ . * Sort clear i_sort. i_sort-fieldname = ‘TYPE‘ . i_sort-tabname = ‘T_USEREXIT‘ . i_sort-up = c_x. append i_sort. call function ‘REUSE_ALV_GRID_DISPLAY‘ EXPORTING i_callback_program = sy-cprog i_callback_user_command = ‘USER_COMMAND‘ is_layout = i_layout it_fieldcat = i_fieldcat[] it_sort = i_sort[] i_default = c_x i_save = ‘A‘ i_grid_title = w_gridtxt TABLES t_outtab = i_userexit. endif . * issue message with number of user-exits displayed describe table i_userexit lines w_linnum. message s697(56) with w_linnum. endform . "DATA_DISPLAY *&---------------------------------------------------------------------&* *& Form CREATE_FIELD_CATALOG &* *&---------------------------------------------------------------------&* form create_field_catalog using p_fieldname p_tabname p_hide p_text. i_fieldcat-fieldname = p_fieldname. i_fieldcat-tabname = p_tabname. i_fieldcat-no_out = p_hide. i_fieldcat-seltext_l = p_text. append i_fieldcat. endform . " CREATE_FIELD_CATALOG *&---------------------------------------------------------------------&* *& Form CREATE_FIELD_CATALOG &* *&---------------------------------------------------------------------&* form user_command using r_ucomm like sy-ucomm rs_selfield type slis_selfield. read table i_userexit index rs_selfield-tabindex. check sy-subrc = 0 . case r_ucomm. when ‘&IC1‘ . case rs_selfield-sel_tab_field. when ‘T_USEREXIT-MODNAME‘ . read table i_userexit index rs_selfield-tabindex. case i_userexit-type . when ‘Enhancement‘ . set parameter id ‘MON‘ field i_userexit-modname. call transaction ‘SMOD‘ . when ‘BADI‘ . set parameter id ‘EXN‘ field i_userexit-modname. call transaction ‘SE18‘ and skip first screen . when ‘BusTrEvent‘ . submit rfopfi00 with event = i_userexit-modname(8) and return . when others . message s030(cj). "Navigation not possible endcase . when ‘T_USEREXIT-MODATTR-NAME‘ . if not i_userexit-modattr-name is initial . set parameter id ‘MON_KUN‘ field i_userexit-modattr-name. call transaction ‘CMOD‘ . else . message s030(cj)."Navigation not possible endif . when others . message s030(cj)."Navigation not possible endcase . endcase . endform . "user_command *&--------------------------------------------------------------------&* *& AT LINE-SELECTION #* *&--------------------------------------------------------------------&* at line-selection. get cursor field w_fsel. case w_fsel. when ‘I_USEREXIT-MODNAME‘ . case i_userexit-type . when ‘Enhancement‘ . set parameter id ‘MON‘ field i_userexit-modname. call transaction ‘SMOD‘ . when ‘BADI‘ . set parameter id ‘EXN‘ field i_userexit-modname. call transaction ‘SE18‘ and skip first screen . when ‘BusTrEvent‘ . submit rfopfi00 with event = i_userexit-modname(8) and return . when others . message s030(cj)."Navigation not possible endcase . when ‘I_USEREXIT-MODATTR-NAME‘ . if not i_userexit-modattr-name is initial . set parameter id ‘MON_KUN‘ field i_userexit-modattr-name. call transaction ‘CMOD‘ . else . message s030(cj)."Navigation not possible endif . when others . message s030(cj)."Navigation not possible endcase . *&--------------------------------------------------------------------&* *& AT SELECTION-SCREEN &* *&--------------------------------------------------------------------&* at selection-screen on radiobutton group rad1. * grey-out checkboxes if ALV selected at selection-screen output . loop at screen . if p_alv = c_x. if screen-group1 = ‘A01‘ . screen-input = ‘0‘ . modify screen . endif . else . if screen-group1 = ‘A01‘ . screen-input = ‘1‘ . modify screen . endif . endif . endloop .
原文:http://www.cnblogs.com/charles-guo/p/4173179.html