Beruflich Dokumente
Kultur Dokumente
METHOD get_object_text.
STATICS: lt_object_text TYPE TABLE OF ko100,
lt_doktypes TYPE TABLE OF dd07v.
DATA: ls_object_text TYPE ko100,
ls_doktype TYPE dd07v.
CHECK NOT i_object IS INITIAL.
IF lt_object_text IS INITIAL.
CALL FUNCTION 'TR_OBJECT_TABLE'
TABLES
wt_object_text = lt_object_text.
SORT lt_object_text BY object.
CALL FUNCTION 'DDIF_DOMA_GET'
EXPORTING
name = 'DOK_ID'
langu = sy-langu
TABLES
dd07v_tab = lt_doktypes
EXCEPTIONS
OTHERS = 0.
SORT lt_doktypes BY domvalue_l.
ENDIF.
CASE i_object.
WHEN 'DOCU'.
IF i_obj_name CP 'FU*'.
SPLIT i_obj_name AT space INTO sy-lisel sy-lisel. "check if name con
taines two words.
IF sy-lisel IS INITIAL.
r_text = 'Documentation Function Module'. "#EC NOTEXT
ELSE.
r_text = 'Documentation Function Module Parameter'. "#EC NOTEXT
ENDIF.
ELSE.
READ TABLE lt_doktypes INTO ls_doktype BINARY SEARCH
WITH KEY domvalue_l = i_obj_name(2).
IF sy-subrc EQ 0.
CONCATENATE 'Documentation' ls_doktype-ddtext INTO r_text SEPARATED
BY space. "#EC NOTEXT
ELSE.
r_text = 'Documentation'. "#EC NOTEXT
ENDIF.
ENDIF.
WHEN 'FUNH'.
r_text = 'Function Module Release Status'. "#EC NOTEXT
WHEN 'PROC'.
r_text = 'HDB Stored Procedure'. "#EC NOTEXT
WHEN 'ALVV'.
r_text = 'ALV Standard Variant'. "#EC NOTEXT
WHEN OTHERS.
READ TABLE lt_object_text INTO ls_object_text BINARY SEARCH
WITH KEY object = i_object. "ignore PGMID!
IF sy-subrc EQ 0.
r_text = ls_object_text-text.
ENDIF.
ENDCASE.
CASE i_obj_name.
WHEN 'TNODEIMG' OR 'TNODEIMGT'.
r_text = gc_objtext-imgtree.
WHEN 'TMENU01' OR 'TMENU01T' OR 'TMENU01T'.
r_text = gc_objtext-areamenu.
ENDCASE.
ENDMETHOD. "get_object_text
METHOD get_function_pool_master.
"/SAPAPO/ABC => /SAPAPO/SAPLABC
"XYZ1 => SAPLXYZ1
r_master = i_area.
REPLACE '/' WITH '/SAPL' INTO r_master+1.
IF sy-subrc NE 0.
CONCATENATE 'SAPL' r_master INTO r_master.
ENDIF.
* CALL FUNCTION 'FUNCTION_INCLUDE_CONCATENATE'
* CHANGING
* program = r_master
* complete_area = i_area
* EXCEPTIONS
* OTHERS = 0.
ENDMETHOD. "get_docu_object
METHOD create_doma.
DATA: ls_dd01v TYPE dd01v,
lt_dd07v TYPE TABLE OF dd07v,
ls_dd07v TYPE dd07v,
l_update,
ls_domname LIKE LINE OF gr_domname VALUE 'IEQ'.
FIELD-SYMBOLS: <l_appendname> TYPE c,
<ls_dd07v> LIKE LINE OF lt_dd07v.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'DOMA'
i_obj_name = i_domname.
ls_domname-low = i_domname.
COLLECT ls_domname INTO gr_domname.
CALL FUNCTION 'DDIF_DOMA_GET'
EXPORTING
name = i_domname
langu = i_langu "reads all values, returns value without langua
ge/text if text does not exist in i_langu
state = 'M' "newest version (e.g. inactive)
IMPORTING
dd01v_wa = ls_dd01v
TABLES
dd07v_tab = lt_dd07v
EXCEPTIONS
OTHERS = 0.
IF ls_dd01v IS INITIAL OR
ls_dd01v-ddtext NE i_ddtext OR
ls_dd01v-domname NE i_domname OR
ls_dd01v-datatype NE i_datatype OR
ls_dd01v-leng NE i_leng OR
i_outputlen NE 0 AND i_outputlen NE ls_dd01v-outputlen OR
i_outputlen EQ 0 AND i_leng NE ls_dd01v-outputlen OR
ls_dd01v-convexit NE i_convexit OR
ls_dd01v-decimals NE i_decimals OR
ls_dd01v-lowercase NE i_lowercase OR
ls_dd01v-signflag NE i_signflag OR
ls_dd01v-entitytab NE i_entitytab.
l_update = 'X'.
ENDIF.
ls_dd01v-domname = i_domname.
ls_dd01v-datatype = i_datatype.
ls_dd01v-leng = i_leng.
IF i_outputlen IS INITIAL.
ls_dd01v-outputlen = i_leng.
ELSE.
ls_dd01v-outputlen = i_outputlen.
ENDIF.
ls_dd01v-convexit = i_convexit.
ASSIGN ('LS_DD01V-APPENDNAME') TO <l_appendname>.
IF sy-subrc EQ 0.
<l_appendname> = i_appendname.
ENDIF.
ls_dd01v-ddlanguage = i_langu.
ls_dd01v-ddtext = i_ddtext.
ls_dd01v-domname = i_domname.
ls_dd01v-datatype = i_datatype.
ls_dd01v-leng = i_leng.
ls_dd01v-outputlen = i_outputlen.
ls_dd01v-convexit = i_convexit.
ls_dd01v-decimals = i_decimals.
ls_dd01v-lowercase = i_lowercase.
ls_dd01v-signflag = i_signflag.
ls_dd01v-entitytab = i_entitytab.
IF i_domvalue IS SUPPLIED. "INITIAL value shall be possible fix value
READ TABLE lt_dd07v ASSIGNING <ls_dd07v> WITH KEY domvalue_l = i_domvalue.
IF sy-subrc EQ 0 AND <ls_dd07v>-valpos NE i_valpos.
DELETE lt_dd07v INDEX sy-tabix. "remove value from wrong position.
LOOP AT lt_dd07v ASSIGNING <ls_dd07v>.
<ls_dd07v>-valpos = sy-tabix.
ENDLOOP.
sy-subrc = 1. "trigger insertion of value at correct position
ENDIF.
IF sy-subrc EQ 0.
"value exists -> compare text and high value
IF <ls_dd07v>-ddtext NE i_valtext OR
<ls_dd07v>-domvalue_h NE i_domvalue_h.
<ls_dd07v>-ddlanguage = i_langu.
<ls_dd07v>-ddtext = i_valtext.
<ls_dd07v>-domvalue_h = i_domvalue_h.
l_update = 'X'.
ENDIF.
ELSE.
"value does not exist -> insert
READ TABLE lt_dd07v TRANSPORTING NO FIELDS WITH KEY valpos = i_valpos.
IF sy-subrc EQ 0.
"insert new value and increase valpos of exiting entries
LOOP AT lt_dd07v ASSIGNING <ls_dd07v> WHERE valpos GE i_valpos.
ADD 1 TO <ls_dd07v>-valpos.
ENDLOOP.
ENDIF.
CLEAR ls_dd07v.
ls_dd07v-domname = i_domname.
ls_dd07v-domvalue_l = i_domvalue.
ls_dd07v-domvalue_h = i_domvalue_h.
IF i_valpos IS INITIAL.
DESCRIBE TABLE lt_dd07v.
ls_dd07v-valpos = sy-tfill + 1.
ELSE.
ls_dd07v-valpos = i_valpos.
ENDIF.
ls_dd07v-ddlanguage = i_langu.
ls_dd07v-ddtext = i_valtext.
APPEND ls_dd07v TO lt_dd07v.
SORT lt_dd07v BY valpos.
l_update = 'X'.
ENDIF.
IF NOT lt_dd07v[] IS INITIAL.
ls_dd01v-valexi = 'X'.
ENDIF.
ENDIF.
IF l_update IS INITIAL.
IF i_domvalue IS SUPPLIED.
MESSAGE i666(01) WITH 'No update necessary for fix value' i_domvalue INT
O sy-lisel. "#EC *
CALL METHOD log_message.
ELSE.
MESSAGE i666(01) WITH 'No update necessary' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
RETURN.
ENDIF.
DATA: l_funcname TYPE funcname,
l_text TYPE tftit-stext,
l_namespace TYPE rs38l-namespace,
l_area TYPE tlibg-area.
DATA: lt_import TYPE TABLE OF rsimp,
ls_import TYPE rsimp,
lt_export TYPE TABLE OF rsexp,
ls_export TYPE rsexp,
lt_source TYPE TABLE OF rssource.
IF NOT i_convexit IS INITIAL.
"check if function group exist
CALL FUNCTION 'RPY_EXISTENCE_CHECK_FUGR'
EXPORTING
name = i_function_group
EXCEPTIONS
not_exist = 1
OTHERS = 2.
IF sy-subrc NE 0 AND NOT i_function_group IN gr_fugrname.
MESSAGE e666(01) WITH 'Function group' i_function_group 'does not exist.
' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
"check if function modules exist
DO 2 TIMES.
IF sy-index EQ 1.
CONCATENATE 'CONVERSION_EXIT_' i_convexit '_INPUT' INTO l_funcname. "#
EC NOTEXT
APPEND 'INPUT' TO lt_import. "#EC NOTEXT
APPEND 'OUTPUT' TO lt_export. "#EC NOTEXT
APPEND 'MOVE input TO output.' TO lt_source. "#EC NOTEXT
ELSE.
CONCATENATE 'CONVERSION_EXIT_' i_convexit '_OUTPUT' INTO l_funcname. "
#EC NOTEXT
ENDIF.
CALL FUNCTION 'FUNCTION_EXISTS'
EXPORTING
funcname = l_funcname
EXCEPTIONS
function_not_exist = 1
OTHERS = 0.
IF sy-subrc EQ 1.
"create empty function module on the fly
IF NOT testrun IS INITIAL.
MESSAGE s666(01) WITH 'Conversion exit function module' l_funcname '
will be created.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
CONTINUE.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'FUNC'
i_obj_name = l_funcname
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0.
l_text = l_funcname.
IF i_function_group+1 CA '/'.
ADD 2 TO sy-fdpos.
l_namespace = i_function_group(sy-fdpos).
l_area = i_function_group+sy-fdpos.
ELSE.
l_area = i_function_group.
ENDIF.
CALL FUNCTION 'RS_FUNCTIONMODULE_INSERT'
EXPORTING
funcname = l_funcname
function_pool = l_area
namespace = l_namespace
short_text = l_text
suppress_corr_check = ' '
suppress_language_check = 'X'
authority_check = 'X'
suppress_upgrade_check = 'X'
TABLES
import_parameter = lt_import
export_parameter = lt_export
source = lt_source
EXCEPTIONS
OTHERS = 1.
ENDIF.
IF sy-subrc EQ 0.
MESSAGE s666(01) WITH 'Search help exit function module' l_funcname
'has been created.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ELSE.
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
ENDDO.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'DOMA'
i_obj_name = i_domname
i_devclass = i_devclass
i_langu = i_langu
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
"align redundant field DOMMASTER with TADIR-MASTERLANG
SELECT SINGLE masterlang FROM tadir INTO ls_dd01v-dommaster
WHERE pgmid EQ 'R3TR'
AND object EQ 'DOMA'
AND obj_name EQ i_domname.
CALL FUNCTION 'DDIF_DOMA_PUT'
EXPORTING
name = i_domname
dd01v_wa = ls_dd01v
TABLES
dd07v_tab = lt_dd07v
EXCEPTIONS
doma_not_found = 1
name_inconsistent = 2
doma_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
MESSAGE e108(do) WITH i_domname INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
MESSAGE i666(01) WITH 'Update successful' INTO sy-lisel. "#EC *
CALL METHOD log_message.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'DOMA'
i_objname = i_domname.
ENDMETHOD. "create_doma
METHOD create_dtel.
DATA: ls_dd04v TYPE dd04v,
l_gotstate,
ls_rollname LIKE LINE OF gr_domname VALUE 'IEQ'.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'DTEL'
i_obj_name = i_rollname.
ls_rollname-low = i_rollname.
COLLECT ls_rollname INTO gr_rollname.
CALL FUNCTION 'DDIF_DTEL_GET'
EXPORTING
name = i_rollname
langu = i_langu
state = 'M' "newest version (e.g. inactive)
IMPORTING
dd04v_wa = ls_dd04v
gotstate = l_gotstate
EXCEPTIONS
OTHERS = 1.
IF sy-subrc EQ 0 AND
ls_dd04v-rollname EQ i_rollname AND
ls_dd04v-ddlanguage EQ i_langu AND
ls_dd04v-memoryid EQ i_memoryid AND
ls_dd04v-logflag EQ i_logflag AND
ls_dd04v-headlen EQ i_headlen AND
ls_dd04v-scrlen1 EQ i_scrlen1 AND
ls_dd04v-scrlen2 EQ i_scrlen2 AND
ls_dd04v-scrlen3 EQ i_scrlen3 AND
ls_dd04v-ddtext EQ i_ddtext AND
ls_dd04v-reptext EQ i_reptext AND
ls_dd04v-scrtext_m EQ i_scrtext_m AND
ls_dd04v-scrtext_l EQ i_scrtext_l AND
ls_dd04v-scrtext_s EQ i_scrtext_s AND
ls_dd04v-shlpname EQ i_shlpname AND
ls_dd04v-shlpfield EQ i_shlpfield AND
ls_dd04v-deffdname EQ i_deffdname AND
ls_dd04v-proxytype EQ i_proxytype AND ">=SAPB
ASIS640
( ls_dd04v-domname NE space AND ls_dd04v-datatype NE 'REF' OR
">=SAPBASIS640
ls_dd04v-refkind EQ i_refkind AND ls_dd04v-reftype EQ i_reftype ) AND
">=SAPBASIS640
( i_domname NE space AND ls_dd04v-domname EQ i_domname
OR
i_domname EQ space AND ls_dd04v-datatype EQ i_datatype AND
ls_dd04v-decimals EQ i_decimals AND
ls_dd04v-leng EQ i_leng ).
"data element already exists with that properties
MESSAGE i666(01) WITH 'No update necessary' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
"check whether domain exists
IF NOT i_domname IS INITIAL AND i_datatype NE 'REF'.
READ TABLE gr_domname TRANSPORTING NO FIELDS WITH KEY low = i_domname.
IF sy-subrc NE 0.
SELECT SINGLE domname FROM dd01l INTO sy-lisel WHERE domname EQ i_domnam
e.
ENDIF.
IF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Domain' i_domname 'does not exist' INTO sy-lisel.
"#EC *
CALL METHOD log_message.
IF testrun IS INITIAL.
RETURN.
ENDIF.
ENDIF.
ENDIF.
ls_dd04v-ddlanguage = i_langu.
ls_dd04v-ddtext = i_ddtext.
ls_dd04v-scrtext_s = i_scrtext_s.
ls_dd04v-scrlen1 = i_scrlen1.
ls_dd04v-scrtext_m = i_scrtext_m.
ls_dd04v-scrlen2 = i_scrlen2.
ls_dd04v-scrtext_l = i_scrtext_l.
ls_dd04v-scrlen3 = i_scrlen3.
IF NOT i_reptext IS INITIAL.
ls_dd04v-reptext = i_reptext.
IF i_headlen IS INITIAL.
ls_dd04v-headlen = strlen( i_reptext ).
ELSE.
ls_dd04v-headlen = i_headlen.
ENDIF.
ENDIF.
ls_dd04v-rollname = i_rollname.
ls_dd04v-domname = i_domname.
IF ls_dd04v-domname IS INITIAL.
ls_dd04v-datatype = i_datatype.
ls_dd04v-decimals = i_decimals.
ls_dd04v-leng = i_leng.
ENDIF.
ls_dd04v-shlpname = i_shlpname.
ls_dd04v-shlpfield = i_shlpfield.
ls_dd04v-deffdname = i_deffdname.
ls_dd04v-logflag = i_logflag.
ls_dd04v-memoryid = i_memoryid.
ls_dd04v-refkind = i_refkind. ">=
SAPBASIS640
ls_dd04v-reftype = i_reftype. ">=
SAPBASIS640
ls_dd04v-proxytype = i_proxytype. ">=
SAPBASIS640
CALL METHOD add_to_transport
EXPORTING
i_object = 'DTEL'
i_obj_name = i_rollname
i_devclass = i_devclass
i_langu = i_langu "masterlanguage (only relevant during first call)
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
"align redundant field DTELMASTER with TADIR-MASTERLANG
SELECT SINGLE masterlang FROM tadir INTO ls_dd04v-dtelmaster
WHERE pgmid EQ 'R3TR'
AND object EQ 'DTEL'
AND obj_name EQ i_rollname.
CALL FUNCTION 'DDIF_DTEL_PUT'
EXPORTING
name = i_rollname
dd04v_wa = ls_dd04v
EXCEPTIONS
dtel_not_found = 1
name_inconsistent = 2
dtel_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc NE 0.
CALL METHOD log_message.
RETURN.
ELSE.
MESSAGE i666(01) WITH 'Update successful' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'DTEL'
i_objname = i_rollname.
ENDMETHOD. "create_dtel
METHOD create_table_type.
DATA: ls_dd40v TYPE dd40v,
lt_dd42v TYPE tt_dd42v,
lt_dd43v TYPE tt_dd43v,
ls_ttypname LIKE LINE OF gr_ttypname VALUE 'IEQ'.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'TTYP'
i_obj_name = i_typename.
ls_ttypname-low = i_typename.
COLLECT ls_ttypname INTO gr_ttypname.
CALL FUNCTION 'DDIF_TTYP_GET'
EXPORTING
name = i_typename
state = 'M'
langu = i_langu "with text
IMPORTING
dd40v_wa = ls_dd40v
TABLES
dd42v_tab = lt_dd42v
* dd43v_tab = lt_dd43v
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc EQ 0 AND "exists
( ls_dd40v-ddtext = i_ddtext OR i_ddtext IS INITIAL ) AND
ls_dd40v-rowtype = i_rowtype AND
ls_dd40v-datatype = i_datatype AND
( ls_dd40v-leng = i_leng OR i_leng IS INITIAL ) AND
( ls_dd40v-decimals = i_decimals OR i_decimals IS INITIAL ) AND
ls_dd40v-rowkind = i_rowkind AND
ls_dd40v-accessmode = i_accessmode AND
ls_dd40v-keydef = i_keydef AND
ls_dd40v-keykind = i_keykind AND
ls_dd40v-generic = i_generic AND
ls_dd40v-proxytype = i_proxytype AND ">=S
APBASIS640
* ls_dd40v-furtherseckey = i_furtherseckey AND
lt_dd43v = it_dd43v AND
lt_dd42v = it_dd42v.
MESSAGE i666(01) WITH 'No update necessary' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
"basic consistency checks
IF i_rowkind EQ 'S'. "structure
READ TABLE gt_tabname TRANSPORTING NO FIELDS WITH KEY table_line = i_rowty
pe. "new structure
IF sy-subrc NE 0.
SELECT SINGLE tabname FROM dd02l INTO sy-lisel WHERE tabname EQ i_rowtyp
e. "existing structure
ENDIF.
IF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Structure' i_rowtype 'does not exist' INTO sy-lis
el. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
"now create/update
ls_dd40v-typename = i_typename.
ls_dd40v-rowtype = i_rowtype.
ls_dd40v-rowkind = i_rowkind.
ls_dd40v-ttypkind = i_ttypkind.
ls_dd40v-range_ctyp = i_range_ctyp.
ls_dd40v-datatype = i_datatype.
ls_dd40v-leng = i_leng.
ls_dd40v-decimals = i_decimals.
ls_dd40v-accessmode = i_accessmode.
ls_dd40v-keydef = i_keydef.
ls_dd40v-keykind = i_keykind.
ls_dd40v-proxytype = i_proxytype. ">=S
APBASIS640
ls_dd40v-generic = i_generic.
* ls_dd40v-furtherseckey = i_furtherseckey.
IF NOT i_ddtext IS INITIAL.
ls_dd40v-ddtext = i_ddtext.
ls_dd40v-ddlanguage = i_langu.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'TTYP'
i_langu = i_langu
i_obj_name = i_typename
i_devclass = i_devclass
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
CALL FUNCTION 'DDIF_TTYP_PUT'
EXPORTING
name = i_typename
dd40v_wa = ls_dd40v
TABLES
dd42v_tab = it_dd42v
* dd43v_tab = it_dd43v
EXCEPTIONS
ttyp_not_found = 1
name_inconsistent = 2
ttyp_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc NE 0.
CALL METHOD log_message.
RETURN.
ELSE.
MESSAGE i666(01) WITH 'Update successful' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'TTYP'
i_objname = i_typename.
ENDMETHOD. "create_table_type
METHOD create_table.
DATA: ls_dd02v TYPE dd02v,
ls_dd09l TYPE dd09l,
lt_dd03p TYPE TABLE OF dd03p,
lt_dd05m TYPE TABLE OF dd05m,
lt_dd08v TYPE TABLE OF dd08v,
lt_dd12v TYPE TABLE OF dd12v,
lt_dd17v TYPE TABLE OF dd17v,
lt_dd35v TYPE TABLE OF dd35v,
lt_dd36m TYPE TABLE OF dd36m,
l_treetype TYPE trobjtype,
l_technical_setting_changed,
ls_tabname LIKE LINE OF gr_tabname VALUE 'IEQ'.
DATA: BEGIN OF ls_dd09l_new, "field available release dependent
javaonly, "as of 700
roworcolst, "as of 740
END OF ls_dd09l_new.
DATA: BEGIN OF ls_dd02v_new, "field available release dependent
is_gtt, "as of 740
END OF ls_dd02v_new.
FIELD-SYMBOLS: <ls_dd09l_javaonly> TYPE char1,
<ls_dd09l_roworcolst> TYPE char1.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'TABD'
i_obj_name = i_tabname.
ls_tabname-low = i_tabname.
COLLECT ls_tabname INTO gr_tabname.
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = i_tabname
state = 'M' "newest version (e.g. inactive)
langu = i_langu
IMPORTING
* GOTSTATE = GOTSTATE
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
TABLES
dd03p_tab = lt_dd03p
dd05m_tab = lt_dd05m
dd08v_tab = lt_dd08v
dd12v_tab = lt_dd12v
dd17v_tab = lt_dd17v
dd35v_tab = lt_dd35v
dd36m_tab = lt_dd36m
EXCEPTIONS
illegal_input = 0 "checking ls_dd02v-tabname NE space
OTHERS = 0.
"handling of fields which do no exist in all releases:
ls_dd09l_new-roworcolst = i_roworcolst. "default: make equal to avoid unnec
cessary update
ls_dd09l_new-javaonly = i_javaonly. "default: make equal to avoid unnec
cessary update
MOVE-CORRESPONDING ls_dd09l TO ls_dd09l_new. "overwrite default with actual
value if exists
ls_dd02v_new-is_gtt = i_is_gtt.
MOVE-CORRESPONDING ls_dd02v TO ls_dd02v_new. "overwrite default with actual
value if exists
IF i_tabclass EQ 'INTTAB' AND ( ls_dd02v-tabclass EQ 'INTTAB' OR ls_dd02v-ta
bclass IS INITIAL ). "V5.73
l_technical_setting_changed = space. "structures do not have technical se
ttings
ELSEIF ls_dd02v-contflag EQ i_contflag AND
ls_dd02v-buffered EQ i_buffered AND
ls_dd09l-tabkat EQ i_tabkat AND
ls_dd09l-tabart EQ i_tabart AND
ls_dd09l-pufferung EQ i_pufferung AND
ls_dd09l-bufallow EQ i_bufallow AND
ls_dd09l-schfeldanz EQ i_schfeldanz AND
ls_dd09l-protokoll EQ i_protokoll AND
ls_dd09l-uebersetz EQ i_uebersetz AND
ls_dd09l_new-javaonly EQ i_javaonly AND
( ls_dd09l_new-roworcolst EQ i_roworcolst OR i_roworcolst IS INITIAL )
AND
( ls_dd02v_new-is_gtt EQ i_is_gtt OR i_is_gtt IS INITIAL )
AND
ls_dd09l-speichpuff EQ i_speichpuff. "do not check javaonly fie
ld
l_technical_setting_changed = space.
ELSE.
l_technical_setting_changed = 'X'.
ENDIF.
IF ls_dd02v-tabname NE space AND "existing.
ls_dd02v-ddtext EQ i_ddtext AND
ls_dd02v-exclass EQ i_exclass AND ">=SAPBAS
IS640
ls_dd02v-proxytype EQ i_proxytype AND ">=SAPBAS
IS640
ls_dd02v-tabclass EQ i_tabclass AND
ls_dd02v-authclass EQ i_authclass AND
ls_dd02v-mainflag EQ i_mainflag AND
ls_dd02v-sqltab EQ i_sqltab AND
l_technical_setting_changed IS INITIAL.
MESSAGE i666(01) WITH 'No update necessary' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
"new table
ls_dd02v-tabname = i_tabname.
ls_dd02v-ddlanguage = i_langu.
ls_dd02v-exclass = i_exclass. ">=SAP
BASIS640
ls_dd02v-proxytype = i_proxytype. ">=SAP
BASIS640
ls_dd02v-tabclass = i_tabclass.
ls_dd02v-authclass = i_authclass.
ls_dd02v-mainflag = i_mainflag.
ls_dd02v-sqltab = i_sqltab.
IF i_ddtext IS INITIAL.
ls_dd02v-ddtext = i_tabname.
ELSE.
ls_dd02v-ddtext = i_ddtext.
ENDIF.
IF ls_dd02v-tabclass EQ 'CLUSTER' OR "only for real database tables
ls_dd02v-tabclass EQ 'POOL' OR
ls_dd02v-tabclass EQ 'TRANSP'.
ls_dd02v-contflag = i_contflag.
ls_dd02v-buffered = i_buffered.
ls_dd09l-tabname = i_tabname.
ls_dd09l-tabkat = i_tabkat.
ls_dd09l-tabart = i_tabart.
ls_dd09l-pufferung = i_pufferung.
ls_dd09l-bufallow = i_bufallow.
ls_dd09l-schfeldanz = i_schfeldanz.
ls_dd09l-protokoll = i_protokoll.
ls_dd09l-uebersetz = i_uebersetz.
ls_dd09l-speichpuff = i_speichpuff.
ls_dd09l_new-javaonly = i_javaonly.
ls_dd09l_new-roworcolst = i_roworcolst.
MOVE-CORRESPONDING ls_dd09l_new TO ls_dd09l.
ls_dd02v_new-is_gtt = i_is_gtt.
MOVE-CORRESPONDING ls_dd02v_new TO ls_dd02v.
l_treetype = 'TABL'.
ELSE.
l_treetype = 'CDS'.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'TABL'
i_langu = i_langu
i_obj_name = i_tabname
i_devclass = i_devclass
i_edtflag = i_edtflag
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
IF l_technical_setting_changed EQ 'X'.
CALL METHOD add_to_transport
EXPORTING
i_object = 'TABT'
i_langu = i_langu
i_obj_name = i_tabname
i_devclass = i_devclass
i_edtflag = i_edtflag
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
ENDIF.
"update redundant field masterlang with TADIR value
SELECT SINGLE masterlang FROM tadir INTO ls_dd02v-masterlang
WHERE pgmid EQ 'R3TR'
AND object EQ 'TABL'
AND obj_name EQ i_tabname.
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name = i_tabname
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
TABLES
dd03p_tab = lt_dd03p
dd05m_tab = lt_dd05m
dd08v_tab = lt_dd08v
dd35v_tab = lt_dd35v
dd36m_tab = lt_dd36m
EXCEPTIONS
tabl_not_found = 1
name_inconsistent = 2
tabl_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
CALL METHOD log_message.
RETURN.
ENDIF.
MESSAGE i666(01) WITH 'Update successful' INTO sy-lisel. "#EC *
CALL METHOD log_message.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'TABL'
i_treetype = l_treetype
i_objname = i_tabname.
ENDMETHOD. "create_table
METHOD add_field_to_table.
DATA: ls_dd02v TYPE dd02v,
ls_dd09l TYPE dd09l,
lt_dd03p TYPE TABLE OF dd03p,
ls_dd05m TYPE dd05m,
lt_dd05m TYPE TABLE OF dd05m,
ls_dd08v TYPE dd08v,
lt_dd08v TYPE TABLE OF dd08v,
lt_dd12v TYPE TABLE OF dd12v,
lt_dd17v TYPE TABLE OF dd17v,
lt_dd35v TYPE TABLE OF dd35v,
lt_dd36m TYPE TABLE OF dd36m,
l_tabix TYPE sytabix,
l_state TYPE ddgotstate,
l_include TYPE fieldname,
l_type TYPE rollname,
ls_tabname LIKE LINE OF gr_tabname VALUE 'IEQ'.
FIELD-SYMBOLS: <ls_dd03p> TYPE dd03p.
IF i_remove IS INITIAL.
sy-lisel = 'Add field(s) to table'. "#EC NOTEXT
ELSE.
sy-lisel = 'Remove field(s) from table'. "#EC NOTEXT
ENDIF.
CALL METHOD set_context
EXPORTING
i_langu = space
i_text = sy-lisel
i_object = 'TABD'
i_obj_name = i_tabname.
ls_tabname-low = i_tabname.
COLLECT ls_tabname INTO gr_tabname.
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = i_tabname
state = 'M' "newest version (e.g. inactive)
IMPORTING
* GOTSTATE = GOTSTATE
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
TABLES
dd03p_tab = lt_dd03p
dd05m_tab = lt_dd05m
dd08v_tab = lt_dd08v
dd12v_tab = lt_dd12v
dd17v_tab = lt_dd17v
dd35v_tab = lt_dd35v
dd36m_tab = lt_dd36m
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc NE 0 OR ls_dd02v-tabname IS INITIAL. "not existing.
READ TABLE gr_tabname TRANSPORTING NO FIELDS WITH KEY low = i_tabname.
IF testrun IS INITIAL OR i_remove EQ 'X' OR sy-subrc NE 0. "'i_tabname NOT
IN gr_tabname' does not work since there might be database tables with sign = '
E'
MESSAGE e666(01) WITH 'Error while reading table' i_tabname INTO sy-lise
l. "#EC *
CALL METHOD log_message.
ENDIF.
RETURN.
ENDIF.
CASE ls_dd02v-tabclass.
WHEN 'CLUSTER' OR 'POOL' OR 'TRANSP'.
COLLECT ls_tabname INTO gr_dbtabname.
CALL FUNCTION 'DDIF_TABL_GET'
EXPORTING
name = i_tabname
state = 'A'
IMPORTING
gotstate = l_state
EXCEPTIONS
OTHERS = 0.
IF l_state EQ 'A'.
ls_tabname-sign = 'E'. "exclude from activation step 1
COLLECT ls_tabname INTO gr_tabname.
ENDIF.
IF ls_dd09l IS INITIAL. "technical settings are missing -> will give err
or in RS_DD_CHECK_ACTIVATE
MESSAGE e173(e2) INTO sy-lisel WITH 'TABL' i_tabname. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDCASE.
IF i_remove IS INITIAL.
"check length of fieldname.
DATA: ls_saac TYPE saanorm,
l_rclist TYPE char10.
ls_saac-saa_length = 'X'.
CALL FUNCTION 'DD_TABL_CHK_SAANORM'
EXPORTING
name = i_fieldname
saac = ls_saac
objecttype = 'TBFD' "table field
subtype = ls_dd02v-tabclass
IMPORTING
rclist = l_rclist.
IF NOT l_rclist IS INITIAL.
MESSAGE e102(ad) WITH i_fieldname INTO sy-lisel.
CALL METHOD log_message.
MESSAGE w666(01) WITH 'Please refer to note 1680583.' INTO sy-lisel. "#E
C *
CALL METHOD log_message.
RETURN.
ENDIF.
"check whether data element respectivly included/appended/referenced struc
ture exists
IF i_rollname NE space AND i_rollname NE 'DATA' AND i_rollname NE 'OBJECT
'. "type ref to DATA/OBJECT is always allowed
READ TABLE gr_rollname TRANSPORTING NO FIELDS WITH KEY low = i_rollnam
e. "new data element
IF sy-subrc NE 0.
READ TABLE gt_tabname TRANSPORTING NO FIELDS WITH KEY table_line = i_
rollname. "new structure
ENDIF.
IF sy-subrc NE 0.
READ TABLE gt_ttypname TRANSPORTING NO FIELDS WITH KEY table_line = i_
rollname. "new table type
ENDIF.
IF sy-subrc NE 0.
SELECT SINGLE rollname FROM dd04l INTO sy-lisel WHERE rollname EQ i_ro
llname. "#EC CI_GENBUFF
ENDIF.
IF sy-subrc NE 0.
SELECT SINGLE tabname FROM dd03l INTO sy-lisel WHERE tabname EQ i_rol
lname. "existing structure
ENDIF.
IF sy-subrc NE 0.
SELECT SINGLE typename FROM dd40l INTO sy-lisel WHERE typename EQ i_ro
llname. "existing table_type
ENDIF.
IF sy-subrc NE 0.
SELECT SINGLE clsname FROM seoclass INTO sy-lisel WHERE clsname EQ i_
rollname. "existing class
ENDIF.
IF sy-subrc NE 0.
IF i_rollname(3) EQ 'CL_'. "probably a class
MESSAGE w666(01) WITH 'Class' i_rollname 'does not exist (yet)' INTO
sy-lisel. "#EC *
CALL METHOD log_message.
ELSEIF i_fieldname(6) EQ c_include6 AND ( i_rollname(3) EQ 'CI_' OR i_
rollname(3) EQ 'SI_' ).
"Customer/industry include
ELSE.
MESSAGE e666(01) WITH 'Data Element or Structure' i_rollname 'does n
ot exist' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
ENDIF.
"Find field to insert/change
IF i_fieldname(6) EQ c_include6.
READ TABLE lt_dd03p ASSIGNING <ls_dd03p>
WITH KEY fieldname = i_fieldname
precfield = i_rollname.
IF sy-subrc EQ 0 AND <ls_dd03p>-groupname = i_groupname.
"INCLUDE already exists
MESSAGE i666(01) WITH 'Include ' i_rollname 'already part of table' i_
tabname INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ELSE.
READ TABLE lt_dd03p ASSIGNING <ls_dd03p>
WITH KEY fieldname = i_fieldname depth = 0.
IF sy-subrc EQ 0.
"extract foreign key relation ship for current field
DATA: lt_dd05m_h TYPE tt_dd05m,
it_dd05m_h TYPE tt_dd05m.
it_dd05m_h[] = it_dd05m[]. "one field
lt_dd05m_h[] = lt_dd05m[].
DELETE lt_dd05m_h WHERE fieldname NE i_fieldname. "now also one field
CLEAR ls_dd05m.
MODIFY lt_dd05m_h FROM ls_dd05m TRANSPORTING domname datatype leng WHE
RE NOT fieldname IS INITIAL.
MODIFY it_dd05m_h FROM ls_dd05m TRANSPORTING domname datatype leng WHE
RE NOT fieldname IS INITIAL.
CLEAR ls_dd08v.
READ TABLE lt_dd08v INTO ls_dd08v WITH KEY fieldname = i_fieldname.
"Check if fields already has data element
IF "i_context EQ l_context AND "not yet supported
i_rollname EQ <ls_dd03p>-rollname AND
( i_datatype EQ <ls_dd03p>-datatype OR i_datatype IS INITIAL ) AND
( i_decimals EQ <ls_dd03p>-decimals OR i_decimals IS INITIAL ) AND
( i_leng EQ <ls_dd03p>-leng OR i_leng IS INITIAL ) AND
i_keyflag EQ <ls_dd03p>-keyflag AND
i_languflag EQ <ls_dd03p>-languflag AND
">=SAPBASIS640
i_notnull EQ <ls_dd03p>-notnull AND
i_reftable EQ <ls_dd03p>-reftable AND
i_reffield EQ <ls_dd03p>-reffield AND
i_groupname EQ <ls_dd03p>-groupname AND
* i_reftype EQ <ls_dd03p>-reftype AND
( i_datatype NE c_type_ref_to OR <ls_dd03p>-reftype NE space ) AND
it_dd05m_h[] EQ lt_dd05m_h[] AND
is_dd08v EQ ls_dd08v.
"field already exists with correct data element, langu and foreign k
ey
IF i_datatype NE c_type_ref_to OR <ls_dd03p>-reftype NE space.
MESSAGE i666(01) WITH 'No update neccessary for field' i_fieldname
INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ELSE.
MESSAGE i666(01) WITH 'Properties of field' i_fieldname 'will be cha
nged' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
ENDIF.
ENDIF.
IF NOT <ls_dd03p> IS ASSIGNED. "new field
"Find context (one field is enough since fieldname is unique)
IF i_context EQ i_tabname.
l_tabix = 1. "table name as context -> insert at the very beginning
ELSEIF NOT i_context IS INITIAL.
SPLIT i_context AT space INTO l_include l_type.
IF NOT l_type IS INITIAL. ".include XYZ or .inclu-abc XYZ
READ TABLE lt_dd03p TRANSPORTING NO FIELDS "include name as context
WITH KEY fieldname = l_include
precfield = l_type.
ELSE.
READ TABLE lt_dd03p TRANSPORTING NO FIELDS
WITH KEY fieldname = i_context.
IF sy-subrc NE 0.
READ TABLE lt_dd03p TRANSPORTING NO FIELDS "include name as conte
xt (before version 4.25)
WITH KEY precfield = i_context.
ENDIF.
ENDIF.
IF sy-subrc NE 0 AND NOT lt_dd03p[] IS INITIAL.
READ TABLE gr_tabname TRANSPORTING NO FIELDS WITH KEY low = i_tabnam
e.
IF testrun IS INITIAL OR sy-subrc NE 0. "'i_tabname NOT IN gr_tabnam
e' does not work since there might be database tables with sign = 'E'
MESSAGE e666(01) WITH 'Context' i_context 'not found for field' i_
fieldname INTO sy-lisel. "#EC *
CALL METHOD log_message.
ELSE.
"missing context may be created during update hence give success m
essage in testrun
IF i_fieldname(6) EQ c_include6.
MESSAGE i666(01) WITH i_fieldname+1 i_rollname 'will be added' I
NTO sy-lisel. "#EC *
ELSE.
MESSAGE i666(01) WITH 'Field' i_fieldname 'will be added' INTO s
y-lisel. "#EC *
ENDIF.
CALL METHOD log_message.
ENDIF.
RETURN.
ENDIF.
"insert new field after context
l_tabix = sy-tabix + 1.
ELSE.
"no context -> insert field at end
DESCRIBE TABLE lt_dd03p LINES sy-tfill.
l_tabix = sy-tfill + 1.
ENDIF.
* INSERT INITIAL LINE INTO lt_dd03p INDEX l_tabix ASSIGNING <ls_dd03p>.
INSERT INITIAL LINE INTO lt_dd03p INDEX l_tabix. READ TABLE lt_dd03p IND
EX l_tabix ASSIGNING <ls_dd03p>. "46C
ENDIF.
<ls_dd03p>-tabname = i_tabname.
<ls_dd03p>-fieldname = i_fieldname.
<ls_dd03p>-groupname = i_groupname.
<ls_dd03p>-languflag = i_languflag. ">=SAPBASIS640
<ls_dd03p>-notnull = i_notnull.
<ls_dd03p>-keyflag = i_keyflag.
<ls_dd03p>-reftable = i_reftable.
<ls_dd03p>-reffield = i_reffield.
"initialize all attributes before populating them depending in use case
CLEAR: <ls_dd03p>-rollname,
<ls_dd03p>-datatype,
<ls_dd03p>-decimals,
<ls_dd03p>-leng,
<ls_dd03p>-ddtext,
<ls_dd03p>-ddlanguage,
<ls_dd03p>-precfield,
<ls_dd03p>-comptype.
IF i_fieldname(6) EQ c_include6.
<ls_dd03p>-precfield = i_rollname.
<ls_dd03p>-comptype = 'S'.
ELSEIF i_rollname IS INITIAL.
<ls_dd03p>-datatype = i_datatype.
<ls_dd03p>-decimals = i_decimals.
<ls_dd03p>-leng = i_leng.
IF i_ddtext NE space.
<ls_dd03p>-ddtext = i_ddtext.
<ls_dd03p>-ddlanguage = i_langu.
ENDIF.
ELSE.
<ls_dd03p>-rollname = i_rollname.
IF i_datatype EQ c_type_ref_to.
<ls_dd03p>-datatype = i_datatype.
<ls_dd03p>-comptype = 'R'.
ENDIF.
ENDIF.
LOOP AT lt_dd03p ASSIGNING <ls_dd03p> FROM l_tabix.
<ls_dd03p>-position = sy-tabix.
ENDLOOP.
"field will be added
IF i_fieldname(6) EQ c_include6.
MESSAGE i666(01) WITH i_fieldname+1 i_rollname 'will be added' INTO sy-l
isel. "#EC *
ELSE.
MESSAGE i666(01) WITH 'Field' i_fieldname 'will be added' INTO sy-lisel.
"#EC *
ENDIF.
CALL METHOD log_message.
DELETE lt_dd08v WHERE fieldname EQ i_fieldname.
DELETE lt_dd05m WHERE fieldname EQ i_fieldname.
LOOP AT it_dd05m INTO ls_dd05m WHERE NOT checktable IS INITIAL
AND NOT checkfield IS INITIAL.
APPEND ls_dd05m TO lt_dd05m.
ENDLOOP.
IF NOT is_dd08v IS INITIAL.
APPEND is_dd08v TO lt_dd08v.
ENDIF.
ELSEIF i_remove EQ 'X'.
IF i_fieldname(6) EQ c_include6.
DELETE lt_dd03p WHERE fieldname EQ i_fieldname AND precfield EQ i_rollna
me.
IF sy-subrc EQ 0.
MESSAGE i666(01) WITH i_fieldname+1 i_rollname 'will be removed' INTO
sy-lisel. "#EC *
CALL METHOD log_message.
ELSE.
MESSAGE s666(01) WITH 'No update neccessary for' i_fieldname+1 i_rolln
ame INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ELSE.
DELETE lt_dd03p WHERE fieldname EQ i_fieldname.
IF sy-subrc EQ 0.
MESSAGE i666(01) WITH 'Field' i_fieldname 'will be removed' INTO sy-li
sel. "#EC *
CALL METHOD log_message.
ELSE.
MESSAGE s666(01) WITH 'No update neccessary for field' i_fieldname INT
O sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
DELETE lt_dd05m WHERE fieldname EQ i_fieldname.
DELETE lt_dd08v WHERE fieldname EQ i_fieldname.
DELETE lt_dd35v WHERE fieldname EQ i_fieldname.
DELETE lt_dd36m WHERE fieldname EQ i_fieldname.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'TABL'
i_obj_name = i_tabname
i_edtflag = i_edtflag
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
CALL FUNCTION 'DDIF_TABL_PUT'
EXPORTING
name = i_tabname
dd02v_wa = ls_dd02v
dd09l_wa = ls_dd09l
TABLES
dd03p_tab = lt_dd03p
dd05m_tab = lt_dd05m
dd08v_tab = lt_dd08v
dd35v_tab = lt_dd35v
dd36m_tab = lt_dd36m
EXCEPTIONS
tabl_not_found = 1
name_inconsistent = 2
tabl_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
CALL METHOD log_message.
RETURN.
ENDIF.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'TABL'
i_objname = i_tabname.
ENDMETHOD. "add_field_to_table
METHOD create_view.
DATA: ls_dd25v TYPE dd25v,
ls_dd09l TYPE dd09l,
lt_dd26v TYPE TABLE OF dd26v,
lt_dd27p TYPE TABLE OF dd27p,
lt_dd28v TYPE TABLE OF dd28v.
DATA: ls_viewname LIKE LINE OF gr_viewname VALUE 'IEQ'.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'VIEW'
i_obj_name = i_viewname.
ls_viewname-low = i_viewname.
COLLECT ls_viewname INTO gr_viewname.
CALL FUNCTION 'DD_VIEW_GET'
EXPORTING
view_name = i_viewname
langu = i_langu
withtext = 'X'
IMPORTING
dd25v_wa_a = ls_dd25v
dd09l_wa_a = ls_dd09l
TABLES
dd26v_tab_a = lt_dd26v
dd27p_tab_a = lt_dd27p
dd28v_tab_a = lt_dd28v
EXCEPTIONS
access_failure = 1
OTHERS = 2.
IF sy-subrc <> 0.
IF testrun IS INITIAL OR NOT i_viewname IN gr_viewname.
MESSAGE e666(01) WITH 'Error while reading view' i_viewname INTO sy-lise
l. "#EC *
CALL METHOD log_message.
ENDIF.
RETURN.
ENDIF.
IF sy-subrc EQ 0 AND ls_dd25v-viewname NE space. "existing.
IF ls_dd25v-ddtext EQ i_ddtext AND
ls_dd25v-viewname EQ i_viewname AND
ls_dd25v-ddlanguage EQ i_langu AND
ls_dd25v-customauth EQ i_contflag AND
ls_dd25v-aggtype EQ i_aggtype AND
ls_dd25v-roottab EQ i_roottab AND
ls_dd25v-viewclass EQ i_viewclass AND
ls_dd25v-viewgrant EQ i_viewgrant AND
ls_dd25v-globalflag EQ i_globalflag AND
ls_dd25v-readonly EQ i_readonly AND
lt_dd26v[] EQ it_dd26v[] AND
lt_dd28v[] EQ it_dd28v[].
"exist
MESSAGE i666(01) WITH 'No update necessary' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
"new view
ls_dd25v-viewname = i_viewname.
ls_dd25v-ddlanguage = i_langu.
ls_dd25v-customauth = i_contflag.
ls_dd25v-aggtype = i_aggtype.
ls_dd25v-roottab = i_roottab.
ls_dd25v-viewclass = i_viewclass.
ls_dd25v-viewgrant = i_viewgrant.
ls_dd25v-globalflag = i_globalflag.
ls_dd25v-readonly = i_readonly.
IF i_ddtext IS INITIAL.
ls_dd25v-ddtext = i_viewname.
ELSE.
ls_dd25v-ddtext = i_ddtext.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'VIEW'
i_langu = i_langu
i_obj_name = i_viewname
i_devclass = i_devclass
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
"clear redundant field MASTERLANG, relevant is only TADIR-MASTERLANG
CLEAR ls_dd25v-masterlang.
CALL FUNCTION 'DD_VIEW_PUT'
EXPORTING
view_name = i_viewname
put_state = 'N' "new
dd25v_wa = ls_dd25v
dd09l_wa = ls_dd09l
TABLES
dd26v_tab = it_dd26v
dd27p_tab = lt_dd27p "fields: emtpy
dd28v_tab = it_dd28v
EXCEPTIONS
db_access_failure = 1
OTHERS = 2.
IF sy-subrc <> 0.
CALL METHOD log_message.
RETURN.
ENDIF.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'VIEW'
i_objname = i_viewname.
ENDMETHOD. "create_view
METHOD add_field_to_view.
DATA: ls_dd25v TYPE dd25v,
ls_dd09l TYPE dd09l,
lt_dd26v TYPE TABLE OF dd26v,
lt_dd27p TYPE TABLE OF dd27p,
lt_dd28j TYPE TABLE OF dd28j,
lt_dd28v TYPE TABLE OF dd28v,
l_state TYPE ddgotstate.
DATA: ls_sfw_viewfield TYPE t_sfw_viewfield.
FIELD-SYMBOLS: <ls_dd27p> LIKE LINE OF lt_dd27p.
DATA: l_viewfield LIKE i_viewfield,
l_rollname LIKE i_rollname,
l_tabix TYPE sytabix,
ls_viewname LIKE LINE OF gr_viewname VALUE 'IEQ'.
CALL METHOD set_context
EXPORTING
i_langu = space
i_text = 'Add Field(s) to View' "#EC NOTEXT
i_object = 'VIEW'
i_obj_name = i_viewname.
ls_viewname-low = i_viewname.
COLLECT ls_viewname INTO gr_viewname.
CALL FUNCTION 'DDIF_VIEW_GET'
EXPORTING
name = i_viewname
state = 'M' "most recent, e.g. inactive
IMPORTING
dd25v_wa = ls_dd25v
dd09l_wa = ls_dd09l
TABLES
dd26v_tab = lt_dd26v
dd27p_tab = lt_dd27p
dd28j_tab = lt_dd28j
dd28v_tab = lt_dd28v
EXCEPTIONS
illegal_input = 1
OTHERS = 2.
IF sy-subrc NE 0.
IF testrun IS INITIAL OR NOT i_viewname IN gr_viewname.
MESSAGE e666(01) WITH 'Error while reading view' i_viewname INTO sy-lise
l. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
IF ls_dd25v-viewclass EQ 'D'. "only for database view, not needed for Projec
tion view
COLLECT ls_viewname INTO gr_dbviewname. "can be used like database tables
CALL FUNCTION 'DDIF_VIEW_GET'
EXPORTING
name = i_viewname
state = 'A'
IMPORTING
gotstate = l_state
EXCEPTIONS
OTHERS = 0.
IF l_state EQ 'A'.
ls_viewname-sign = 'E'. "exclude from activation step 1
COLLECT ls_viewname INTO gr_viewname.
ENDIF.
ENDIF.
IF i_viewfield IS INITIAL.
l_viewfield = i_fieldname.
ELSE.
l_viewfield = i_viewfield.
ENDIF.
IF i_rollname IS INITIAL AND l_viewfield NE '*'.
SELECT SINGLE rollname FROM dd03l INTO l_rollname
WHERE tabname EQ i_tabname
AND fieldname EQ i_fieldname.
IF sy-subrc NE 0.
MESSAGE i666(01) WITH 'Field' i_fieldname 'not found in ' i_tabname INTO
sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ELSE.
l_rollname = i_rollname.
ENDIF.
IF i_remove IS INITIAL.
"Check if fields already exists
READ TABLE lt_dd27p ASSIGNING <ls_dd27p> WITH KEY viewfield = l_viewfield
tabname = i_tabname
fieldname = i_fieldname
.
IF sy-subrc EQ 0.
IF <ls_dd27p>-rollname EQ i_rollname AND
<ls_dd27p>-rdonly EQ i_rdonly AND
<ls_dd27p>-rollchange EQ i_rollchange AND
<ls_dd27p>-rollnamevi EQ l_rollname AND
<ls_dd27p>-keyflag EQ i_keyflag.
"field already exists
MESSAGE i666(01) WITH 'Field' l_viewfield 'already exists in view' i_v
iewname INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ELSE.
IF i_context IS INITIAL.
"append at the end
"APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
APPEND INITIAL LINE TO lt_dd27p. READ TABLE lt_dd27p INDEX sy-tabix AS
SIGNING <ls_dd27p>. "46C
ELSE.
"Find context (one field is enough since fieldname is unique)
READ TABLE lt_dd27p TRANSPORTING NO FIELDS
WITH KEY viewfield = i_context.
IF sy-subrc EQ 0.
"insert new field after context
l_tabix = sy-tabix + 1.
* INSERT INITIAL LINE INTO lt_dd27p INDEX l_tabix ASSIGNING <ls_dd27p>.
INSERT INITIAL LINE INTO lt_dd27p INDEX l_tabix. READ TABLE lt_dd27p
INDEX l_tabix ASSIGNING <ls_dd27p>. "46C
ELSE.
IF testrun IS INITIAL OR NOT i_viewname IN gr_viewname.
MESSAGE i666(01) WITH 'Context' i_context 'not found in VIED' i_vi
ewname INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
* APPEND INITIAL LINE TO lt_dd27p ASSIGNING <ls_dd27p>.
APPEND INITIAL LINE TO lt_dd27p. READ TABLE lt_dd27p INDEX sy-tabix
ASSIGNING <ls_dd27p>. "46C
ENDIF.
ENDIF.
ENDIF.
"check whether data element exists
IF l_rollname NE space AND l_viewfield NE '*' AND l_viewfield NE '-'.
READ TABLE gr_rollname TRANSPORTING NO FIELDS WITH KEY low = l_rollname.
IF sy-subrc NE 0.
SELECT SINGLE rollname FROM dd04l INTO sy-lisel WHERE rollname EQ l_ro
llname. "#EC CI_GENBUFF
ENDIF.
IF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Data Element' l_rollname 'does not exist' INTO
sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
<ls_dd27p>-viewname = i_viewname.
<ls_dd27p>-viewfield = l_viewfield.
<ls_dd27p>-tabname = i_tabname.
<ls_dd27p>-fieldname = i_fieldname.
<ls_dd27p>-rdonly = i_rdonly. "S/H/R
<ls_dd27p>-keyflag = i_keyflag.
<ls_dd27p>-rollchange = i_rollchange.
<ls_dd27p>-rollnamevi = l_rollname.
ELSE.
DELETE lt_dd27p WHERE viewfield EQ l_viewfield.
ENDIF.
LOOP AT lt_dd27p ASSIGNING <ls_dd27p> FROM l_tabix.
<ls_dd27p>-objpos = sy-tabix.
ENDLOOP.
IF NOT testrun IS INITIAL.
IF i_remove IS INITIAL.
MESSAGE i666(01) WITH 'Field' l_viewfield 'will be added to view' i_view
name INTO sy-lisel. "#EC *
ELSE.
MESSAGE i666(01) WITH 'Field' l_viewfield 'will be removed from view' i_
viewname INTO sy-lisel. "#EC *
ENDIF.
CALL METHOD log_message.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_object = 'VIEW'
i_obj_name = i_viewname
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
CALL FUNCTION 'DDIF_VIEW_PUT'
EXPORTING
name = i_viewname
dd25v_wa = ls_dd25v
dd09l_wa = ls_dd09l
TABLES
dd26v_tab = lt_dd26v
dd27p_tab = lt_dd27p
dd28j_tab = lt_dd28j
dd28v_tab = lt_dd28v
EXCEPTIONS
view_not_found = 1
name_inconsistent = 2
view_inconsistent = 3
put_failure = 4
put_refused = 5
OTHERS = 6.
IF sy-subrc <> 0.
CALL METHOD log_message.
RETURN.
ENDIF.
IF i_remove IS INITIAL.
MESSAGE i666(01) WITH 'Field' i_fieldname 'has been added to view' i_viewn
ame INTO sy-lisel. "#EC *
ELSE.
MESSAGE i666(01) WITH 'Field' i_fieldname 'has been removed from view' i_v
iewname INTO sy-lisel. "#EC *
ENDIF.
CALL METHOD log_message.
CALL METHOD register_inactive_object
EXPORTING
i_objtype = 'VIEW'
i_objname = i_viewname.
ENDMETHOD. "add_field_to_view
METHOD generate_maint_view. "call SE54, leave screens untouched
"generate or regenerate maintaince view via batch input of SE54
"assumptions:
"- new fields have been added
"- no screen changes needed or done via separate corr instruction
DATA: lt_bdc TYPE TABLE OF bdcdata,
ls_bdc TYPE bdcdata,
ls_bdcp TYPE bdcdata,
lt_message TYPE TABLE OF bdcmsgcoll,
ls_message TYPE bdcmsgcoll,
ls_radio LIKE ls_bdc-fnam,
ls_opt TYPE ctu_params.
DATA: ls_tvdir TYPE tvdir,
l_master TYPE progname,
l_screen TYPE d020s-dnum.
IF update IS NOT INITIAL AND genview IS INITIAL.
CALL METHOD set_context
EXPORTING
i_text = step3_object
i_langu = space
i_object = 'TOBJ'
i_obj_name = i_objectname.
EXIT.
ENDIF.
CASE i_objecttype.
WHEN 'V' OR 'S'. "view or table
CALL METHOD set_context
EXPORTING
i_langu = space
i_text = 'Generate Maintainance View' "#EC NOTEXT
i_object = 'TOBJ'
i_obj_name = i_objectname.
"check existence
CALL FUNCTION 'RPY_EXISTENCE_CHECK_FUGR'
EXPORTING
name = i_func_group
EXCEPTIONS
not_exist = 1
OTHERS = 2.
IF sy-subrc NE 0 AND NOT i_func_group IN gr_fugrname.
sy-msgty = 'E'.
CALL METHOD log_message.
RETURN.
ENDIF.
"try to lock function group
CALL FUNCTION 'RS_ACCESS_PERMISSION'
EXPORTING
authority_check = 'X'
global_lock = 'X'
mode = 'MODIFY'
object = i_func_group
object_class = 'FUGR'
suppress_corr_check = testrun
master_language = sy-langu
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
sy-msgty = 'E'.
CALL METHOD log_message.
RETURN.
ENDIF.
CALL FUNCTION 'RS_ACCESS_PERMISSION'
EXPORTING
mode = 'FREE'
object = i_func_group
object_class = 'FUGR'
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
sy-msgty = 'E'.
CALL METHOD log_message.
RETURN.
ENDIF.
"lock function group in advance to avoid transport popup during batch in
put
IF testrun IS INITIAL.
CALL METHOD add_to_transport
EXPORTING
i_object = 'FUGR'
i_obj_name = i_func_group
EXCEPTIONS
OTHERS = 1.
IF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Could not add to transport request' INTO sy-l
isel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
"-------------------------------------------
bdc_screen 'SAPMSVIM' '0050'.
bdc_field 'VIMDYNFLDS-VIEWNAME' i_objectname.
bdc_field 'VIMDYNFLDS-ELEM_GEN' 'X'.
bdc_field 'BDC_OKCODE' '=CRMO'.
"check existence to decide between create/change mode
SELECT SINGLE * FROM tvdir INTO ls_tvdir WHERE tabname EQ i_objectname.
IF sy-subrc EQ 0 AND NOT ls_tvdir-liste IS INITIAL.
l_master = lcl_wb=>get_function_pool_master( i_func_group ).
l_screen = ls_tvdir-liste.
CALL FUNCTION 'RPY_EXISTENCE_CHECK_DYNP'
EXPORTING
program = l_master
name = l_screen
EXCEPTIONS
not_exist = 1
OTHERS = 2.
ENDIF.
IF sy-subrc EQ 0.
r_mode = 'U'. "Update
MESSAGE i666(01) WITH 'Maintainance View' i_objectname 'will be regene
rated.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
"-------------------------------------------
bdc_screen 'SAPMSVIM' '0120'.
bdc_field 'BDC_OKCODE' '=RESE'.
"-------------------------------------------
bdc_screen 'SAPMSVIM' '1240'.
bdc_field 'VIMDYNFLDS-NEW_FIELD' 'X'.
bdc_field 'VIMDYNFLDS-DEL_FIELD' 'X'.
bdc_field 'VIMDYNFLDS-TEXT_ASS' 'X'.
IF i_objecttype EQ 'V'. "dynpro field visible only for View
bdc_field 'VIMDYNFLDS-CHANGE_SEL' 'X'.
bdc_field 'VIMDYNFLDS-CHANGE_SUB' 'X'.
bdc_field 'VIMDYNFLDS-READ_ONLY' 'X'.
bdc_field 'VIMDYNFLDS-CHANGE_HID' 'X'.
ENDIF.
bdc_field 'BDC_OKCODE' '=O.K.'.
"-------------------------------------------
bdc_screen 'SAPMSVIM' '1243'.
bdc_field 'VIMDYNFLDS-FIELD_NORM' 'X'.
bdc_field 'BDC_OKCODE' '=O.K.'.
"-------------------------------------------
bdc_screen 'SAPMSVIM' '0120'.
bdc_field 'BDC_OKCODE' '=BACK'.
"-------------------------------------------
bdc_screen 'SAPMSVIM' '0050'.
bdc_field 'BDC_OKCODE' '=BACK'.
ELSE.
r_mode = 'I'. "Insert
"-------------------------------------------
IF ls_tvdir IS INITIAL.
bdc_screen 'SAPLSPO1' '0300'. "Popup Create Modules?
bdc_field 'BDC_OKCODE' '=YES'.
ENDIF.
bdc_screen 'SAPMSVIM' '0120'.
bdc_field 'TDDAT-CCLASS' i_auth_group.
bdc_field 'TVDIR-LISTE' i_dynp_list.
IF i_dynp_detail IS INITIAL.
bdc_field 'VIMDYNFLDS-MTYPE1' 'X'. "einstufig
ELSE.
bdc_field 'VIMDYNFLDS-MTYPE2' 'X'. "zweistufig
bdc_field 'TVDIR-DETAIL' i_dynp_detail.
ENDIF.
bdc_field 'TVDIR-AREA' i_func_group.
bdc_field 'BDC_OKCODE' '=GENE'.
* bdc_screen 'SAPMSVIM' '0120'.
* bdc_field 'BDC_OKCODE' '/00'. "Warnung -> Enter
* "-------------------------------------------
"predict if popup "screen is already used (belongs to SAP)" will come
up -> FORM FREE_SCREEN_NUMBERS (MSVIMF43)
DATA: l_system_type TYPE df41s-parent_obj.
CALL FUNCTION 'RPY_CHECK_SYSTEM_TYPE_30'
IMPORTING
system_type = l_system_type.
IF l_system_type NE 'SAP' AND i_func_group NA 'YZ'.
IF i_dynp_list NE ls_tvdir-liste.
"Obsolete Popup "screen already assigned" triggered in SAPMSVIM D0
120_CHECK_DYNNRS2
bdc_screen 'SAPLSPO1' '0300'.
bdc_field 'BDC_OKCODE' '=YES'.
ENDIF.
IF NOT i_dynp_detail IS INITIAL AND i_dynp_detail NE ls_tvdir-detail
.
"Obsolete Popup "screen already assigned" triggered in SAPMSVIM D0
120_CHECK_DYNNRS3
bdc_screen 'SAPLSPO1' '0300'.
bdc_field 'BDC_OKCODE' '=YES'.
ENDIF.
ENDIF.
bdc_screen 'SAPMSVIM' '0120'.
bdc_field 'BDC_OKCODE' '=BACK'.
bdc_screen 'SAPMSVIM' '0050'.
bdc_field 'BDC_OKCODE' '=BACK'.
MESSAGE i666(01) WITH 'Maintainance View' i_objectname 'will be create
d.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
WHEN 'C'.
CALL METHOD set_context
EXPORTING
i_langu = space
i_text = 'Generate Viewcluster' "#EC NOTEXT
i_object = 'VCLS'
i_obj_name = i_objectname.
DATA: l_exitprog TYPE vcldir-exitprog.
SELECT SINGLE exitprog FROM vcldir INTO l_exitprog WHERE vclname EQ i_ob
jectname.
IF NOT l_exitprog IS INITIAL.
CALL FUNCTION 'RPY_EXISTENCE_CHECK_PROG'
EXPORTING
name = l_exitprog
EXCEPTIONS
not_exist = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE w666(01) WITH 'Program' l_exitprog 'does not exist yet and g
ets delivered separately.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
"put in an existing report to avoid errors during generation
IF testrun IS INITIAL.
UPDATE vcldir SET exitprog = sy-repid WHERE vclname EQ i_objectnam
e.
ENDIF.
ENDIF.
ENDIF.
bdc_screen 'SAPMSVIM' '0050' .
bdc_field 'BDC_OKCODE' '=CLUS'.
bdc_screen 'SAPMSVIM' '0052'.
bdc_field 'VIMDYNFLDS-VCLNAME' i_objectname.
bdc_field 'BDC_OKCODE' '=CLMN'. "Maintain
bdc_screen 'SAPL0SVM' '0101'.
bdc_field 'BDC_OKCODE' '=1AKT'. "Aktivieren
bdc_screen 'SAPLSPO1' '0100'. "Sollen die Pflegedialoge...?
bdc_field 'BDC_OKCODE' '=YES'.
bdc_screen 'SAPL0SVM' '0101'.
bdc_field 'BDC_OKCODE' '=UEBE'. "bernehmen
bdc_screen 'SAPMSVIM' '0052'.
bdc_field 'BDC_OKCODE' '=BACK'.
bdc_screen 'SAPMSVIM' '0050'.
bdc_field 'BDC_OKCODE' '=BACK'.
MESSAGE i666(01) WITH 'View cluster' i_objectname 'will be generated.' I
NTO sy-lisel. "#EC NOTEXT
CALL METHOD log_message.
WHEN OTHERS.
CALL METHOD set_context
EXPORTING
i_langu = space
i_text = space
i_object = space
i_obj_name = i_objectname.
MESSAGE e666(01) WITH 'Object type' i_objecttype 'not supported' INTO sy
-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDCASE.
"up to now nothing happened except populating the batch input table, now sta
rt with checks
CALL FUNCTION 'AUTHORITY_CHECK_TCODE'
EXPORTING
tcode = 'SE54'
EXCEPTIONS
ok = 0
OTHERS = 4.
IF sy-subrc NE 0.
sy-msgty = 'E'.
CALL METHOD log_message.
RETURN.
ENDIF.
IF testrun IS INITIAL.
DATA: ls_tadir TYPE tadir.
"CTO_TADIR_GET_OBJECT
CALL FUNCTION 'CTO_OBJECT_GET_TADIR_KEY'
EXPORTING
iv_objectname = i_objectname
iv_objecttype = i_objecttype
IMPORTING
ev_pgmid = ls_tadir-pgmid
ev_object = ls_tadir-object
ev_obj_name = ls_tadir-obj_name.
CALL METHOD add_to_transport "and create TADIR
EXPORTING
i_object = ls_tadir-object
i_obj_name = ls_tadir-obj_name
i_devclass = i_devclass
i_langu = i_masterlang
EXCEPTIONS
OTHERS = 1.
ls_opt-dismode = 'E'. " Dynpros nicht Anzeigen
ls_opt-dismode = 'Q'. " http://scn.sap.com/thread/82311
* ls_opt-DISMODE = 'A'. " Dynpros Anzeigen
* ls_opt-UPDMODE = 'A'. " Asynchrone Verbuchung
* ls_opt-CATTMODE = ' '. " Kein CATT aktiv
* ls_opt-DEFSIZE = ' '. " Keine Standard Fenster Gre
* ls_opt-NOBINPT = 'X'. " Batchinputmodus
* ls_opt-NOBIEND = 'X'. " Batchinputmodus nach Ende der BDC-Daten
ls_opt-racommit = 'X'. " Kein Stop nach Commit Work
MESSAGE s314(sv) INTO sy-lisel. "fill message variables with default mes
sage
CALL TRANSACTION 'SE54' USING lt_bdc OPTIONS FROM ls_opt MESSAGES INTO lt_
message. "#EC CI_CALLTA
IF sy-msgid EQ '00' AND sy-msgno = '344'. "no batch input data for screen
-> unexpected popup
ls_opt-dismode = 'E'. " try again while showing unexpected screens
CALL TRANSACTION 'SE54' USING lt_bdc OPTIONS FROM ls_opt MESSAGES INTO l
t_message. "#EC CI_CALLTA
ENDIF.
LOOP AT lt_message INTO ls_message.
MOVE-CORRESPONDING ls_message TO sy.
MOVE ls_message-msgnr TO sy-msgno.
MOVE ls_message-msgtyp TO sy-msgty.
IF sy-msgid EQ 'SV'.
CASE sy-msgno.
WHEN 352.
CONTINUE.
WHEN 314 OR 551.
sy-msgty = 'S'.
WHEN 178 OR 162 OR 304 OR 306 OR 308 OR 316 OR 321 OR 322 OR 325 OR
399 OR 439 OR 515 OR 586.
sy-msgty = 'E'. r_mode = 'E'. "no success -> return mode 'Error'
WHEN OTHERS.
sy-msgty = ls_message-msgtyp.
ENDCASE.
ELSEIF sy-msgid EQ '00' AND sy-msgno EQ 344.
sy-msgty = 'E'. r_mode = 'E'. "no success -> return mode 'Error'
ENDIF.
CALL METHOD log_message.
ENDLOOP.
"check whether generation was really succesful
CASE i_objecttype.
WHEN 'V' OR 'S'. "view or table
SELECT SINGLE tabname FROM tvdir INTO sy-lisel WHERE tabname EQ i_obje
ctname.
IF sy-subrc NE 0.
MESSAGE e600(sv) WITH i_objectname INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
WHEN 'C'.
SELECT SINGLE vclname FROM vcldir INTO sy-lisel WHERE vclname EQ i_obj
ectname.
IF sy-subrc NE 0.
MESSAGE e600(sv) WITH i_objectname INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
ENDCASE.
* "set some flag which cannot be set via batch input because this is done i
n SOBJ but not in SE54!
* UPDATE objh SET importable = i_compare_flag objtransp = i_transp_flag cur
setting = i_cursetting
* WHERE objectname EQ i_objectname AND objecttype EQ i_objecttype
.
IF i_objecttype EQ 'C' AND NOT l_exitprog IS INITIAL.
"restore original exit program of view cluster
UPDATE vcldir SET exitprog = l_exitprog WHERE vclname EQ i_objectname.
ENDIF.
ENDIF.
ENDMETHOD. "generate_maint_view
METHOD activate.
DATA: lt_dwinactiv TYPE TABLE OF dwinactiv,
lt_dwinactiv_ddic TYPE TABLE OF dwinactiv,
lv_answer,
l_logname TYPE ddprh-protname,
ls_job TYPE tbtcjob,
lv_rc TYPE sysubrc,
l_dref TYPE REF TO data,
l_message TYPE sy-lisel,
ls_tabname LIKE LINE OF gr_tabname.
DATA: lr_object TYPE RANGE OF dwinactiv-object,
lr_objname TYPE RANGE OF dwinactiv-obj_name.
DATA: lt_ascii TYPE TABLE OF soli,
lt_list TYPE TABLE OF abaplist,
lt_textpool TYPE TABLE OF textpool,
ls_textpool TYPE textpool.
FIELD-SYMBOLS: <ls_dwinactiv> LIKE LINE OF lt_dwinactiv.
METHOD execute_method.
DATA: ls_e070 TYPE e070,
ls_e071 TYPE e071,
lt_e071 TYPE TABLE OF e071,
lt_e071k TYPE TABLE OF e071k,
ls_trkey TYPE trkey.
DATA: lt_result TYPE scts_cl_results. ">=SAPBASIS700
DATA: lt_client TYPE trexe_t_client.
DATA: lt_trlog TYPE TABLE OF trlog,
ls_trlog TYPE trlog,
lv_trkorr TYPE trkorr,
lv_file TYPE tstrf01-file.
FIELD-SYMBOLS: <ls_method_call> TYPE trmtd_method_call.
CHECK NOT i_method IS INITIAL.
"get AFTER_IMP method
SORT gt_trkey.
DELETE ADJACENT DUPLICATES FROM gt_trkey COMPARING obj_type obj_name.
LOOP AT gt_trkey INTO ls_trkey.
ls_e071-pgmid = 'R3TR'.
ls_e071-object = ls_trkey-obj_type.
ls_e071-obj_name = ls_trkey-obj_name.
APPEND ls_e071 TO lt_e071.
ENDLOOP.
CALL FUNCTION 'TRINT_FREE_MEMORY'.
CONCATENATE sy-sysid 'K' sy-datum '_' sy-uzeit INTO lv_trkorr.
CALL FUNCTION 'TR_INITIALIZE_LOG' "Build temporary log file like DEV_201404
15_142649.SNOTE
EXPORTING
acttype = '_'
* DIRTYPE = 'T'
sysname = 'SNOTE' "lv_sysname
trkorr = lv_trkorr
IMPORTING
file = lv_file
EXCEPTIONS
wrong_call = 1
OTHERS = 2.
ASSERT sy-subrc EQ 0.
* CALL FUNCTION 'APPEND_PROTOCOL'. "here error occurs depending on previou
s statements
COMMIT WORK. "save what we have reached so far
DATA: trint_call_after_imp_method TYPE funcname VALUE 'TRINT_CALL_AFTER_IMP_
METHOD'.
IF sy-saprl >= '700'.
APPEND sy-mandt TO lt_result. ">=SAP
BASIS700
CALL FUNCTION trint_call_after_imp_method
EXPORTING
iv_trkorr = space
is_e070 = ls_e070
it_e071 = lt_e071[]
it_e071k = lt_e071k[]
iv_update_lockflag = '' "'X'
CHANGING ">=SAPB
ASIS700
it_client = lt_result ">=SAPBA
SIS700
EXCEPTIONS
error_message = 1.
ELSE.
APPEND sy-mandt TO lt_client.
CALL FUNCTION trint_call_after_imp_method
EXPORTING
iv_trkorr = space
is_e070 = ls_e070
it_e071 = lt_e071[]
it_e071k = lt_e071k[]
iv_update_lockflag = '' "'X'
it_client = lt_client
EXCEPTIONS
error_message = 1.
ENDIF.
IF sy-subrc NE 0.
CALL METHOD log_message.
ENDIF.
CALL FUNCTION 'TR_READ_LOG'
EXPORTING
iv_log_type = trlog_type_file
iv_logname_file = lv_file
TABLES
et_lines = lt_trlog
EXCEPTIONS
OTHERS = 0.
DELETE lt_trlog WHERE class EQ 'PU' AND number EQ '131'. "No objects requir
ing post-import methods exist
"append messages from method execution log
LOOP AT lt_trlog INTO ls_trlog.
CONCATENATE '(' ls_trlog-class '~' ls_trlog-number ')' INTO sy-msgv4. TRAN
SLATE sy-msgv4 USING '~ '.
MESSAGE i666(01) WITH ls_trlog-line(50) ls_trlog-line+50(50) ls_trlog-line
+100(31) sy-msgv4 INTO sy-lisel. "#EC *
IF ls_trlog-class EQ 'SCPR' AND ( ls_trlog-number EQ 707 OR ls_trlog-numbe
r EQ 871 ).
ls_trlog-severity = 'W'. "increase severity for some messages
ENDIF.
sy-msgty = ls_trlog-severity.
CALL METHOD log_message.
ENDLOOP.
CALL FUNCTION 'TR_DELETE_LOG'
EXPORTING
iv_log_type = 'FILE'
iv_logname_file = lv_file
EXCEPTIONS
OTHERS = 0.
ENDMETHOD. "execute_method
METHOD create_table_entries.
*
CONSTANTS lc_approved_system_table TYPE tabname VALUE 'APPROVED_SYSTEM_TABLE
'.
DATA: lt_ko200 TYPE TABLE OF ko200,
ls_ko200 TYPE ko200,
lt_e071k TYPE TABLE OF e071k,
ls_e071k TYPE e071k.
DATA: l_keylen TYPE sy-fleng,
ls_x030l TYPE x030l,
l_no_update,
l_object TYPE tadir-object,
l_approved_system_table.
FIELD-SYMBOLS: <ls_entry> TYPE any,
<lt_entries> TYPE STANDARD TABLE.
DATA: dref TYPE REF TO data.
IF i_logical_object IS INITIAL AND NOT it_entries[] IS INITIAL.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'TABU'
i_obj_name = i_tabname.
ENDIF.
IF i_logical_object EQ 'X'. "used in older version
SELECT SINGLE objectname INTO l_object FROM objs WHERE tabname EQ i_tabnam
e AND objecttype EQ 'L'.
ELSEIF i_logical_object IS NOT INITIAL.
l_object = i_logical_object.
ENDIF.
"Currently only a bunch of tables is supported:
" - client independent
" - system tables (S / E / W) and customizing of type G
" - key fields of data type char/numc
"--- basic checks
DATA: ls_dd02v TYPE dd02v,
lt_dd03p TYPE TABLE OF dd03p,
ls_state TYPE dctablget VALUE 'A',
l_rfcdest TYPE rfcdest.
CALL FUNCTION 'DD_TABL_GET' DESTINATION l_rfcdest
EXPORTING
get_state = ls_state
langu = space
tabl_name = i_tabname
IMPORTING
dd02v_wa_a = ls_dd02v
TABLES
dd03p_tab_a = lt_dd03p
EXCEPTIONS
system_failure = 98 MESSAGE sy-lisel
communication_failure = 99 MESSAGE sy-lisel
access_failure = 1
OTHERS = 2.
IF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Error reading table' i_tabname INTO sy-lisel. "#EC
*
RETURN.
ENDIF.
IF ls_dd02v IS INITIAL.
CALL METHOD lcl_wb=>set_context( i_object = 'TABU' i_obj_name = i_tabname
i_langu = space i_no_message = 'X' ).
MESSAGE w666(01) WITH 'Table' i_tabname 'does not exist (yet).' INTO sy-li
sel. "#EC *
CALL METHOD lcl_wb=>log_message.
CALL METHOD lcl_wb=>set_context( i_object = space i_obj_name = space i_lan
gu = space ).
ENDIF.
c_clidep = ls_dd02v-clidep.
c_contflag = ls_dd02v-contflag.
IF NOT ls_dd02v-clidep IS INITIAL.
IF i_logical_object EQ 'LODS' OR "approved_logical_objects
i_logical_object EQ 'LODE' OR
i_logical_object EQ 'LOIE' OR
i_logical_object EQ 'LODC' OR
i_logical_object EQ 'PCYS' OR
i_tabname(14) EQ '/FSPD/TCDIR_CA' OR
i_tabname(5) EQ 'APB_L' OR "LPDS??
i_tabname(12) EQ 'TBCA_PAY_GA_' OR
i_tabname(12) EQ 'TBCA_PAY_GA_' OR
i_tabname CP 'SMMW*PARAM*'.
"approved client dependent table
ELSE.
"do not allow update
IF NOT it_entries[] IS INITIAL. "not during initial call
MESSAGE e666(01) WITH 'Skipping table ' i_tabname 'because it is clien
t dependent.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
EXIT.
ENDIF.
ENDIF.
CASE ls_dd02v-contflag.
WHEN 'S' OR 'E' OR 'W'. "W for SCP2
"later: MODIFY (i_tabname) FROM TABLE it_entries.
WHEN 'G'.
"later: INSERT (i_tabname) FROM TABLE it_entries ACCEPTING DUPLICATE KEY
S.
WHEN OTHERS. "'W' OR 'L' OR 'A' OR 'C'.
IF NOT it_entries[] IS INITIAL. "not during initial call
MESSAGE e666(01) WITH 'Skipping table ' i_tabname 'because of delivery
class' ls_dd02v-contflag INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
EXIT.
ENDCASE.
"dynamic check for simple client independent system tables
IF ls_dd02v-clidep IS INITIAL AND ls_dd02v-contflag CA 'SE'.
DELETE lt_dd03p WHERE fieldname(6) EQ c_include6.
LOOP AT lt_dd03p TRANSPORTING NO FIELDS WHERE ( datatype NE 'CHAR' AND
datatype NE 'NUMC' AND
datatype NE 'CUKY' AND
datatype NE 'UNIT' AND
datatype NE 'TIMS' AND
datatype NE 'LANG' AND
datatype NE 'DATS' AND
datatype(3) NE 'INT' )
OR ( datatype(3) EQ 'INT' AND k
eyflag IS NOT INITIAL )
OR ( outputlen > 255 ).
EXIT.
ENDLOOP.
IF sy-subrc NE 0.
l_approved_system_table = 'X'.
ENDIF.
ENDIF.
CASE i_tabname.
"------- transported as TABU, update via MODIFY -> no deletions supporte
d
WHEN 'TVIMF' OR "view e
vents
'TRESC' OR "reserv
ed namespace
'T100S' OR 'T100SA' OR "variab
le messages
'THLPF' OR "assigm
ent DZ / screen fields
'IWREFERENC' OR "Keno Link in Release Note
'TRGTS_SOURCE' OR 'TRGTS_SOURCE_T' OR 'TKEDR' OR 'TKEDRT' OR "TARO p
roject
'ROMDDELTA' OR 'ROOHIECAT' OR 'ROOHIECOM' OR 'ROOSESRMAP' OR "OSOD D
atasource
'ROOSFIELD' OR 'ROOSOURCE' OR 'ROOSOURCET' OR 'ROOSSEG' OR "OSOD D
atasource
'BALOBJ' OR 'BALOBJT' OR 'BALSUB' OR 'BALSUBT' OR "CDAT A
PPL_LOG Application log defintion (SLG0)
'IDMX_DI_TXTOB' OR
'/PLMB/FRW_TABPRO' OR "VDAT /
PLMB/V_TABPRO
'/BA1/FU_KF_SAP' OR '/BA1/FU_KF_SAPT' OR
'MASSFLDLST' OR "Fields
allowed in transaction MASS
'SGT_CFUN_L' OR 'SGT_CFUN_T' OR "Segmen
tation
'CRMI_IMP_IOBJSM' OR 'CRMI_IMP_IOBJSMT' OR 'CRMI_MKTPL_FLDSM' OR "Inf
oObject Semantics
'AMPI_SRUNOBJ' OR 'AMPI_SDIM' OR 'AMPI_SDIM_T' OR 'AMPI_SMEAS' OR
'PPH_HANA_ACTIVE' OR "PPH
* IDOCs deactived 08.10.2015, example EBSK246971
* 'EDISDEF' OR 'EDISEGMENT' OR 'EDSAPPL' OR "TDAT
EDISEGMENT
* 'EDMSG' OR 'EDIMSG' OR 'EDIMSGT' OR "TDAT
BDBG, VDAT VEDI_EDMSG,
* 'EDIFCT' OR 'TBDBA' OR 'TBDBE' OR 'TBDBH' OR 'TBDBS' OR "TDAT
BDBG
'ARCH_USR' OR 'TBKKARCHEVENTS' OR "'AOBJ'
'TZK08' OR "Alloc
ation: Calculation type - KOPO fields
'TBCA_PAY_GA_SPLT' OR 'TBCA_PAY_GA_S_T' OR
'TZFB' OR 'TZFBT' OR
'CRMCHKMSG' OR 'CRMCHKMSGT' OR "Check
man/ATC customizing
'T185' OR 'T185D' OR 'T185T' OR 'T185F' OR 'T185V' OR 'TAXITABS' OR
"VFBS
'TC02' OR
'PPH_HANA_ACTIVE' OR "PPH
'TC33' OR 'TC34' OR 'T354B' OR "Status
handling
* 'T511K' or 'T512L' or 'T511P' or 'T511T' or 'T5QSG' or 'T5QTM' or 'T
5QTX' OR
IF i_logical_object IS INITIAL.
"transported via R3TR TABU with keys in E071K
CALL FUNCTION 'DDIF_NAMETAB_GET'
EXPORTING
tabname = i_tabname
IMPORTING
x030l_wa = ls_x030l
EXCEPTIONS
not_found = 1
OTHERS = 2.
l_keylen = ls_x030l-keylen / ls_x030l-unicodelg.
CLEAR ls_ko200.
ls_ko200-pgmid = 'R3TR'.
ls_ko200-object = 'TABU'.
ls_ko200-objfunc = 'K'.
ls_ko200-obj_name = i_tabname.
APPEND ls_ko200 TO lt_ko200.
CLEAR ls_e071k.
ls_e071k-pgmid = ls_ko200-pgmid.
ls_e071k-objname = ls_ko200-obj_name.
ls_e071k-object = ls_ko200-object.
ls_e071k-mastertype = ls_ko200-object.
ls_e071k-mastername = ls_ko200-obj_name.
LOOP AT it_entries ASSIGNING <ls_entry>.
ls_e071k-tabkey = <ls_entry>(l_keylen).
IF l_keylen <= 120. "entire key does fit into E071K-TABKEY (CHAR 120)
ELSEIF i_tabname EQ 'EDIFCT'.
IF ls_e071k-tabkey+91 CA '_'.
ADD 91 TO sy-fdpos.
ls_e071k-tabkey+sy-fdpos = '*'.
ELSE.
ls_e071k-tabkey+119 = '*'.
ENDIF.
ELSE.
MESSAGE e666(01) WITH 'Delivering entries for table' i_tabname 'is not
approved yet' INTO sy-lisel. "#EC *
c_deliver = gc_manual.
RETURN.
ENDIF.
APPEND ls_e071k TO lt_e071k.
ENDLOOP.
ENDIF.
CHECK NOT it_entries[] IS INITIAL.
IF i_delete IS INITIAL.
CHECK l_no_update IS INITIAL.
ENDIF.
IF testrun IS INITIAL.
IF i_logical_object IS INITIAL.
CALL FUNCTION 'TR_OBJECTS_CHECK'
TABLES
wt_ko200 = lt_ko200
* WT_E071K =
EXCEPTIONS
cancel_edit_other_error = 1
show_only_other_error = 2
OTHERS = 3.
IF sy-subrc EQ 0.
DATA: l_trkorr LIKE gv_trkorr.
CALL FUNCTION 'TR_OBJECTS_INSERT'
EXPORTING
wi_order = gv_trkorr
IMPORTING
we_order = l_trkorr
TABLES
wt_ko200 = lt_ko200
wt_e071k = lt_e071k
* TT_TADIR =
EXCEPTIONS
cancel_edit_other_error = 1
show_only_other_error = 2
OTHERS = 3.
IF sy-subrc EQ 0.
IF l_trkorr IS INITIAL.
MESSAGE w666(01) WITH 'Changes cannot be recorded in a transport r
equest.' 'You may have to logon to a different client.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
CLEAR sy-subrc. "go on without error code
ELSE.
gv_trkorr = l_trkorr.
ENDIF.
ENDIF.
ENDIF.
IF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Could not be added to transport request.' INTO
sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
ENDIF.
IF NOT it_entries[] IS INITIAL.
IF i_delete IS INITIAL.
CASE ls_dd02v-contflag.
WHEN 'S' OR 'E' OR 'W'.
MODIFY (i_tabname) FROM TABLE it_entries. "#EC CI_DYNTAB
WHEN 'G'.
INSERT (i_tabname) FROM TABLE it_entries ACCEPTING DUPLICATE KEYS.
"#EC CI_DYNTAB
WHEN OTHERS.
"should never happen because of "basic checks"
MESSAGE a666(01) WITH 'Table' i_tabname 'cannot be processed'. "#E
C *
ENDCASE.
MESSAGE i666(01) WITH sy-dbcnt 'entries were inserted into table' i_ta
bname INTO sy-lisel. "#EC *
ELSE.
DELETE (i_tabname) FROM TABLE it_entries. "#EC CI_DYNTAB
MESSAGE i666(01) WITH sy-dbcnt 'entries were deleted from table' i_ta
bname INTO sy-lisel. "#EC *
ENDIF.
CALL METHOD log_message.
ENDIF.
ELSE.
DESCRIBE TABLE it_entries.
IF i_delete IS INITIAL.
MESSAGE i666(01) WITH sy-tfill 'entries will be inserted into table' i_t
abname INTO sy-lisel. "#EC *
ELSE.
MESSAGE i666(01) WITH sy-tfill 'entries will be deleted from table' i_t
abname INTO sy-lisel. "#EC *
ENDIF.
CALL METHOD log_message.
ENDIF.
ENDMETHOD. "create_table_entries
METHOD add_to_transport.
STATICS: s_object LIKE i_object,
s_obj_name TYPE string,
s_msgty TYPE symsgty,
s_testrun LIKE testrun VALUE '-',
s_masterlang TYPE tadir-masterlang.
DATA: l_tadir_name TYPE tadir-obj_name,
l_new_devclass TYPE devclass,
l_object_name TYPE string,
l_object_class TYPE string,
l_extend,
l_global_lock,
ls_trkey TYPE trkey,
ls_t000 TYPE t000,
l_bcset_clients TYPE string.
CLEAR sy-subrc.
IF lcl_wb=>language_installed( i_langu ) IS INITIAL.
RAISE language_not_installed.
ENDIF.
IF gv_errors_occured EQ 'X'.
MESSAGE w666(01) WITH 'Skipped because of error in previous object' INTO s
y-lisel. "#EC *
CALL METHOD log_message.
RAISE error.
ELSEIF i_object EQ 'TABU'.
DATA: lt_ko200 TYPE TABLE OF ko200, ls_ko200 TYPE ko200,
lt_e071k TYPE TABLE OF e071k, ls_e071k TYPE e071k.
ls_ko200-pgmid = ls_e071k-pgmid = 'R3TR'.
ls_ko200-object = ls_e071k-object = ls_e071k-mastertype = 'TABU'.
ls_ko200-obj_name = ls_e071k-objname = ls_e071k-mastername = i_obj_name.
ls_ko200-objfunc = 'K'.
ls_e071k-tabkey = i_tabkey.
APPEND ls_ko200 TO lt_ko200.
APPEND ls_e071k TO lt_e071k.
CALL FUNCTION 'TR_OBJECTS_CHECK'
TABLES
wt_ko200 = lt_ko200
* WT_E071K =
EXCEPTIONS
cancel_edit_other_error = 1
show_only_other_error = 2
OTHERS = 3.
IF sy-subrc EQ 0.
CALL FUNCTION 'TR_OBJECTS_INSERT'
EXPORTING
wi_order = gv_trkorr
IMPORTING
we_order = gv_trkorr
TABLES
wt_ko200 = lt_ko200
wt_e071k = lt_e071k
EXCEPTIONS
cancel_edit_other_error = 1
show_only_other_error = 2
OTHERS = 3.
ENDIF.
IF sy-subrc NE 0.
RAISE error.
ENDIF.
RETURN.
ELSEIF i_object NE s_object OR
i_obj_name NE s_obj_name OR
testrun NE s_testrun.
s_object = i_object.
s_obj_name = i_obj_name.
s_testrun = testrun.
CLEAR s_msgty.
CHECK i_object NE space.
CASE i_object.
WHEN 'SCP1'.
WHEN 'SCP2'.
"check if there is any BCSet client.
SELECT mandt FROM t000 INTO ls_t000 WHERE ccorigcont EQ 'X'. "AND ccca
tegory EQ 'C' <- sometimes not customized as C but T, e.g. E27
CONCATENATE l_bcset_clients ls_t000-mandt INTO l_bcset_clients SEPAR
ATED BY space.
ENDSELECT.
IF NOT l_bcset_clients IS INITIAL.
"check if current client is a BCSet client
IF l_bcset_clients NS sy-mandt.
MESSAGE e666(01) WITH 'BCSets can only be changed in one' 'of the
following clients:' l_bcset_clients INTO sy-lisel. "#EC *
CALL METHOD log_message.
s_msgty = 'E'.
ENDIF.
ENDIF.
ENDCASE.
CASE i_object.
WHEN 'REPT' OR 'FUNC' OR 'CUAD' OR 'DOCU'.
l_object_class = i_object.
l_object_name = i_obj_name.
IF i_object EQ 'DOCU'.
l_extend = 'X'. "no SMODILOG for DOCU
ENDIF.
WHEN 'DOCV' OR 'DOCT' OR 'DSYS' OR 'STCS' OR 'MSAG' OR 'SOTR'
OR 'IWPR' OR 'IWMO' OR 'IWSV' OR 'IWOM' OR 'IWSG' OR 'SICF' "SEGW
OR 'SFRN' OR 'CUS0' OR 'CUS1' OR 'CUS2'. "IMG
l_object_class = i_object.
l_object_name = i_obj_name.
l_global_lock = 'X'.
l_extend = 'X'.
l_tadir_name = i_obj_name.
WHEN 'MESS'.
l_object_class = 'T100'.
l_object_name = i_obj_name.
WHEN 'CLAS' OR 'FUGR' OR 'PARA' OR 'VCLS' OR 'AUTH' OR 'TRAN' OR 'SUSO'
OR 'PROG'.
l_object_class = i_object.
l_object_name = i_obj_name.
l_tadir_name = i_obj_name.
l_global_lock = 'X'.
WHEN 'DOMA' OR 'DTEL' OR 'TABL' OR 'TABT' OR 'VIEW' OR 'INDX' OR 'XINX'
OR 'TTYP' OR 'SHLP' OR 'ENQU'.
l_object_class = 'DICT'.
CONCATENATE i_object i_obj_name INTO l_object_name.
IF i_object NE 'INDX'. "correct name will be determined by SCWB_GET_TA
DIR_REM
l_tadir_name = i_obj_name.
ENDIF.
WHEN 'DYNP'.
l_object_class = 'SCRP'.
l_object_name = i_obj_name.
WHEN 'TABU'.
WHEN OTHERS.
l_object_class = i_object.
l_object_name = i_obj_name.
SELECT SINGLE objectname FROM objh INTO sy-lisel
WHERE objectname EQ i_object
AND objecttype EQ 'L'.
IF sy-subrc EQ 0. "is a logical object
l_global_lock = 'X'.
l_extend = 'X'.
l_tadir_name = i_obj_name.
ENDIF.
ENDCASE.
"determine TADIR key and check for old TADIR entry
DATA: ls_e071 TYPE e071,
ls_tadir_key TYPE tadir,
ls_tadir_old TYPE tadir.
ls_e071-pgmid = 'LIMU'.
ls_e071-object = i_object.
ls_e071-obj_name = i_obj_name.
CALL FUNCTION 'SCWB_GET_TADIR_REM' "determines main object if i_object is
a part object, e.g REPT->PROG
EXPORTING
is_e071 = ls_e071
IMPORTING
es_tadir = ls_tadir_old
es_tadir_key = ls_tadir_key.
IF ls_tadir_key IS INITIAL.
ls_e071-pgmid = 'R3TR'.
CALL FUNCTION 'SCWB_GET_TADIR_REM'
EXPORTING
is_e071 = ls_e071
IMPORTING
es_tadir = ls_tadir_old
es_tadir_key = ls_tadir_key.
ENDIF.
IF ls_tadir_old-devclass IS INITIAL.
l_new_devclass = i_devclass.
ELSE.
l_new_devclass = ls_tadir_old-devclass.
ENDIF.
"create TADIR entry in advance avoid popup
IF NOT ls_tadir_key-obj_name IS INITIAL. "only if a name could be determ
ined, e.g. does not work for LIMU DOCU FU... if function group does not exist ye
t
ASSERT l_tadir_name IS INITIAL OR ls_tadir_key-obj_name EQ l_tadir_name.
"compatibility check
s_masterlang = ls_tadir_old-masterlang.
IF ls_tadir_old IS INITIAL. "V3.5
2
IF l_object_class EQ 'DICT' AND "V3.5
2
i_object NE 'INDX'. "V3.5
2
l_global_lock = 'X'. "similar to MSDXXBAS_FORMS 463 "V3.5
2
ENDIF. "V3.5
2
ELSEIF i_edtflag EQ 'X'. "iv_no_standard_editor
"temporary disable check of tadir-edtflag
UPDATE tadir SET edtflag = ' '
WHERE pgmid EQ ls_tadir_key-pgmid
AND object EQ ls_tadir_key-object
AND obj_name EQ ls_tadir_key-obj_name.
l_extend = 'X'. "no SMODILOG because object can't be reset to standa
rd
ENDIF. "V3.5
2
IF i_langu CA gv_master_languages.
IF ls_tadir_old IS INITIAL.
"for new objects check whether it exists globally to determine corre
ct package
DATA: ls_gtadir TYPE gtadir.
CALL FUNCTION 'TR_GTADIR_QUERY'
EXPORTING
iv_pgmid = ls_tadir_key-pgmid
iv_object = ls_tadir_key-object
iv_obj_name = ls_tadir_key-obj_name
IMPORTING
result = ls_gtadir
EXCEPTIONS
OTHERS = 0.
IF NOT ls_gtadir IS INITIAL AND testrun IS INITIAL.
CALL FUNCTION 'TRINT_TADIR_MODIFY'
EXPORTING
author = sy-uname
devclass = i_devclass "or from GTADIR
pgmid = ls_tadir_key-pgmid
object = ls_tadir_key-object
obj_name = ls_tadir_key-obj_name
masterlang = i_langu "no masterlang in GTADIR
srcsystem = ls_gtadir-srcsystem
change_masterlang = 'X'
* EDTFLAG = '~'
* GENFLAG = '~'
force_mode = space
EXCEPTIONS
OTHERS = 0.
ENDIF.
ENDIF.
"set correct language and package on first call per object
"skip this for other languages than EN/DE.
CALL FUNCTION 'TR_TADIR_INTERFACE'
EXPORTING
* WI_DELETE_TADIR_ENTRY = ' '
wi_test_modus = testrun
wi_tadir_pgmid = ls_tadir_key-pgmid
wi_tadir_object = ls_tadir_key-object
wi_tadir_obj_name = ls_tadir_key-obj_name
wi_tadir_devclass = l_new_devclass
wi_tadir_masterlang = i_langu
EXCEPTIONS
devclass_not_existing = 90
obj_specification_not_unique = 91
pgmid_object_not_allowed = 92
masterlanguage_not_specified = 93
devclass_not_specified = 94
tadir_entry_not_existing = 1
tadir_entry_ill_type = 2
no_systemname = 3
no_systemtype = 4
original_system_conflict = 5
object_reserved_for_devclass = 6
object_exists_global = 7
object_exists_local = 8
object_is_distributed = 9
no_authorization_to_delete = 11
simultanious_set_remove_repair = 13
order_missing = 14
no_modification_of_head_syst = 15
specify_owner_unique = 19
loc_priv_objs_no_repair = 20
gtadir_not_reached = 21
object_locked_for_order = 22
change_of_class_not_allowed = 23
no_change_from_sap_to_tmp = 24
OTHERS = 25.
IF sy-subrc EQ 90.
READ TABLE gr_devclass WITH KEY low = i_devclass TRANSPORTING NO FIE
LDS.
IF sy-subrc NE 0 OR testrun IS INITIAL.
CALL METHOD lcl_wb=>log_message.
s_msgty = 'E'.
ENDIF.
ELSEIF sy-subrc GT 90.
CALL METHOD lcl_wb=>log_message.
s_msgty = 'E'.
ENDIF.
ENDIF.
IF NOT i_devclass IS INITIAL.
"set correct package in memory
EXPORT current_devclass FROM i_devclass TO MEMORY ID 'EUK'.
SET PARAMETER ID 'EUK' FIELD i_devclass.
ENDIF.
ENDIF.
IF testrun IS INITIAL.
DATA: l_suppress_dialog.
IF i_devclass EQ '$TMP'. "perform all checks but suppress some popups
l_suppress_dialog = 'X'. "e.g. 'object can only be created in SAP p
ackage' 'system setting does not allow....'
ENDIF.
CALL FUNCTION 'RS_CORR_INSERT' "and create TADIR-entry
EXPORTING
object = l_object_name
object_class = l_object_class
global_lock = l_global_lock
devclass = i_devclass
korrnum = gv_trkorr
master_language = i_langu
extend = l_extend
suppress_dialog = l_suppress_dialog "currently only set for loca
l objects
* AUTHOR = ' '
* GENFLAG = ' '
* PROGRAM = ' '
* OBJECT_CLASS_SUPPORTS_MA = ' '
* MOD_LANGU = ' '
* ACTIVATION_CALL = ' '
IMPORTING
korrnum = gv_trkorr
* ORDERNUM =
* NEW_CORR_ENTRY =
* AUTHOR =
transport_key = ls_trkey
* NEW_EXTEND =
EXCEPTIONS
cancelled = 1
permission_failure = 2
unknown_objectclass = 3
OTHERS = 4.
IF sy-subrc NE 0.
s_msgty = 'E'.
gv_errors_occured = 'X'. "no change in further objects, skip activat
ion
ELSE.
"collect objects with update
COLLECT ls_trkey INTO gt_trkey.
"correct master language if neccessary
IF NOT ls_tadir_key IS INITIAL AND ls_tadir_old-masterlang IS INITIAL.
IF i_langu CA gv_master_languages.
IF ls_e071-pgmid EQ 'R3TR'.
UPDATE tadir SET masterlang = i_langu
WHERE pgmid EQ ls_tadir_key-pgmid
AND object EQ ls_tadir_key-object
AND obj_name EQ ls_tadir_key-obj_name
AND masterlang NE i_langu.
ELSEIF i_devclass NE '$TMP'.
"creation of LIMU where no TADIR existed before
** UPDATE tadir SET masterlang = space "clear language and let SCW
B/SNOTE set the correct language "erasing masterlang not enough->delete tadir?
"deactivated because copy PINF lost TADIR here: (20161124)
* DELETE FROM tadir WHERE pgmid EQ ls_tadir_key-pgmid AND object
EQ ls_tadir_key-object AND obj_name EQ ls_tadir_key-obj_name.
ENDIF.
s_masterlang = i_langu.
ENDIF.
ENDIF.
"set/restore tadir-edtflag
IF i_edtflag EQ 'X'. "iv_no_standard_editor
"temporary disable check of tadir-edtflag
UPDATE tadir SET edtflag = 'X'
WHERE pgmid EQ ls_tadir_key-pgmid
AND object EQ ls_tadir_key-object
AND obj_name EQ ls_tadir_key-obj_name.
ENDIF.
ENDIF.
ELSE.
CALL FUNCTION 'RS_CORR_CHECK'
EXPORTING
object = l_object_name
object_class = l_object_class
global_lock = l_global_lock
suppress_dialog = 'X' "e.g. 'object can only be created in SAP
package'
EXCEPTIONS
cancelled = 1
permission_failure = 2
unknown_objectclass = 3
OTHERS = 4.
IF sy-subrc NE 0.
CALL METHOD log_message.
s_msgty = 'E'.
ELSE.
s_msgty = 'W'.
ENDIF.
ENDIF.
ENDIF.
IF gv_trkorr IS NOT INITIAL.
READ TABLE gt_trkorr WITH KEY table_line = gv_trkorr TRANSPORTING NO FIELD
S.
IF sy-subrc NE 0.
APPEND gv_trkorr TO gt_trkorr.
ENDIF.
ENDIF.
e_masterlang = s_masterlang.
CASE s_msgty.
WHEN 'E'.
MESSAGE e666(01) WITH 'Could not add to transport request' INTO sy-lisel
. "#EC *
CALL METHOD log_message.
RAISE error.
WHEN 'W'.
RAISE simulation.
ENDCASE.
ENDMETHOD. "add_to_transport
METHOD register_inactive_object.
DATA: l_obj_name TYPE e071-obj_name.
l_obj_name = i_objname.
CALL FUNCTION 'RS_INSERT_INTO_WORKING_AREA'
EXPORTING
object = i_objtype
obj_name = l_obj_name
EXCEPTIONS
OTHERS = 0.
IF i_treetype IS SUPPLIED.
CHECK i_treetype NE space.
CALL FUNCTION 'RS_TREE_OBJECT_PLACEMENT'
EXPORTING
type = i_treetype
object = l_obj_name.
ELSE.
CALL FUNCTION 'RS_TREE_OBJECT_PLACEMENT'
EXPORTING
type = i_objtype
object = l_obj_name.
ENDIF.
ENDMETHOD. "register_inactive_object
METHOD create_message.
DATA: lt_bdc TYPE TABLE OF bdcdata,
ls_bdc TYPE bdcdata,
ls_bdcp TYPE bdcdata,
ls_opt TYPE ctu_params.
DATA: ls_t100 TYPE t100,
ls_t100a TYPE t100a,
ls_t100u TYPE t100u,
ls_t100x TYPE t100x,
ls_t100o TYPE t100o,
lt_activity TYPE tt_activity,
l_obj_name TYPE dokil-object,
ls_msg_class LIKE LINE OF gr_msg_class VALUE 'IEQ'.
ls_msg_class-low = i_msgid.
COLLECT ls_msg_class INTO gr_msg_class.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'MESS'
i_obj_name = i_msgid
i_obj_name2 = i_msgno.
IF gv_abap_in_eclipse EQ 'X'.
MESSAGE e666(01) WITH 'Creation/Copy not possible in Eclipse.' 'Please use
SAPGUI.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
SELECT SINGLE * FROM t100a INTO ls_t100a
WHERE arbgb EQ i_msgid.
IF sy-subrc NE 0.
IF testrun IS INITIAL OR NOT i_msgid IN gr_msg_class.
MESSAGE e509(eu) WITH i_msgid INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
RETURN.
ENDIF.
SELECT SINGLE masterlang FROM tadir INTO ls_t100a-masterlang
WHERE pgmid EQ 'R3TR'
AND object EQ 'MSAG'
AND obj_name EQ i_msgid.
SELECT SINGLE * FROM t100 INTO ls_t100
WHERE sprsl EQ i_langu
AND arbgb EQ i_msgid
AND msgnr EQ i_msgno.
SELECT SINGLE * FROM t100u INTO ls_t100u
WHERE arbgb EQ i_msgid
AND msgnr EQ i_msgno.
SELECT SINGLE auth_check FROM t100x INTO CORRESPONDING FIELDS OF ls_t100x
WHERE arbgb EQ i_msgid
AND msgnr EQ i_msgno.
SELECT activity FROM t100o INTO TABLE lt_activity "#EC CI_GENBUFF
WHERE arbgb EQ i_msgid "#EC CI_SGLSELECT
AND msgnr EQ i_msgno.
IF i_text EQ ls_t100-text AND
i_auth_check EQ ls_t100x-auth_check AND
it_activity EQ lt_activity.
IF i_selfdef IS INITIAL AND ls_t100u-selfdef IS INITIAL OR
">=SAPBASIS640
NOT i_selfdef IS INITIAL AND NOT ls_t100u-selfdef IS INITIAL.
">=SAPBASIS640
MESSAGE i666(01) WITH 'No update necessary' INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
">=SAPBASIS640
ENDIF.
CALL FUNCTION 'DOCU_OBJECT_NAME_CONCATENATE'
EXPORTING
docu_id = 'NA'
element = i_msgid
addition = i_msgno
IMPORTING
object = l_obj_name
EXCEPTIONS
OTHERS = 0.
CALL METHOD add_to_transport
EXPORTING
i_object = 'MESS'
i_obj_name = l_obj_name
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0.
IF i_langu EQ ls_t100a-masterlang.
"create or change message and write into transport request
"if sy-langu is different from master language SE91 will switch to master
lang
"-------------------------------------------
ls_bdcp-program = 'SAPLWBMESSAGES'.
ls_bdcp-dynpro = '0100'.
ls_bdcp-dynbegin = 'X'.
APPEND ls_bdcp TO lt_bdc.
* ls_bdc-fnam = 'BDC_CURSOR'.
* ls_bdc-fval = 'MSG_NUMMER'.
* APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'RSDAG-ARBGB'.
ls_bdc-fval = i_msgid.
APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'MSG_NUMMER'.
ls_bdc-fval = i_msgno.
APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'RSDAG-MSGFLAG'.
ls_bdc-fval = 'X'.
APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'BDC_OKCODE'.
ls_bdc-fval = '=WB_EDIT'.
APPEND ls_bdc TO lt_bdc.
"-------------------------------------------
ls_bdcp-dynpro = '1000'.
ls_bdcp-dynbegin = 'X'.
APPEND ls_bdcp TO lt_bdc.
ls_bdc-fnam = 'BDC_SUBSCR'.
ls_bdc-fval = 'SAPLWBMESSAGES 0101SUB'.
APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'T100-TEXT(01)'.
ls_bdc-fval = i_text.
APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'LISTTAB-DOKU_FLAG(01)'.
IF i_selfdef IS INITIAL.
ls_bdc-fval = ' '.
ELSE.
ls_bdc-fval = 'X'.
ENDIF.
APPEND ls_bdc TO lt_bdc.
ls_bdc-fnam = 'BDC_OKCODE'.
ls_bdc-fval = '=WB_SAVE'.
APPEND ls_bdc TO lt_bdc.
"-------------------------------------------
ls_bdcp-dynpro = '1000'.
ls_bdcp-dynbegin = 'X'.
APPEND ls_bdcp TO lt_bdc.
ls_bdc-fnam = 'BDC_OKCODE'.
ls_bdc-fval = '=WB_BACK'.
APPEND ls_bdc TO lt_bdc.
"-------------------------------------------
ls_bdcp-dynpro = '0100'.
ls_bdcp-dynbegin = 'X'.
APPEND ls_bdcp TO lt_bdc.
ls_bdc-fnam = 'BDC_OKCODE'.
ls_bdc-fval = '=WB_BACK'.
APPEND ls_bdc TO lt_bdc.
ls_opt-dismode = 'E'.
ls_opt-racommit = 'X'.
ls_opt-nobinpt = 'X'.
ls_opt-nobiend = 'X'.
"-------------------------------------------
CALL FUNCTION 'AUTHORITY_CHECK_TCODE'
EXPORTING
tcode = 'SE91'
EXCEPTIONS
ok = 0
not_ok = 2
OTHERS = 3.
IF sy-subrc NE 0.
CALL METHOD log_message.
ELSE.
CALL TRANSACTION 'SE91' USING lt_bdc OPTIONS FROM ls_opt. "#EC CI_CALLTA
ENDIF.
ELSE.
"update translation only
ls_t100-arbgb = i_msgid.
ls_t100-msgnr = i_msgno.
ls_t100-sprsl = i_langu.
ls_t100-text = i_text.
MODIFY t100 FROM ls_t100. "no activation needed
ENDIF.
IF i_auth_check EQ ls_t100x-auth_check OR i_auth_check IS NOT SUPPLIED.
ELSEIF i_auth_check IS INITIAL.
DELETE FROM t100x WHERE arbgb EQ i_msgid AND msgnr EQ i_msgno.
ELSE.
ls_t100x-arbgb = i_msgid.
ls_t100x-msgnr = i_msgno.
ls_t100x-auth_check = i_auth_check.
INSERT t100x FROM ls_t100x.
ENDIF.
IF it_activity NE lt_activity AND it_activity IS SUPPLIED.
DELETE FROM t100o WHERE arbgb EQ i_msgid AND msgnr EQ i_msgno.
LOOP AT it_activity INTO ls_t100o-activity.
ls_t100o-arbgb = i_msgid.
ls_t100o-msgnr = i_msgno.
INSERT t100o FROM ls_t100o.
ENDLOOP.
ENDIF.
MESSAGE i666(01) WITH 'Update successful' INTO sy-lisel. "#EC *
CALL METHOD log_message.
gv_translation = 'X'.
gv_repository_changed = 'X'.
ENDMETHOD. "create_message
METHOD create_screen.
DATA: l_obj_name TYPE e071-obj_name,
ls_header TYPE rpy_dyhead,
lt_containers TYPE dycatt_tab,
lt_fields TYPE dyfatc_tab,
lt_params TYPE tt_dypara,
lt_flow_logic TYPE tt_d022s. "dyn_flowlist.
CONCATENATE is_header-program is_header-screen INTO l_obj_name SEPARATED BY
space.
CALL METHOD set_context
EXPORTING
i_langu = is_header-language
i_object = 'DYNP'
i_obj_name = l_obj_name.
l_obj_name = is_header-program.
l_obj_name+40 = is_header-screen.
CALL METHOD add_to_transport
EXPORTING
i_devclass = i_devclass
i_langu = is_header-language
i_object = 'DYNP'
i_obj_name = l_obj_name
EXCEPTIONS
OTHERS = 1.
"work with local copies because RPY_DYNPRO_INSERT contains write access to t
hat fields
ls_header = is_header.
lt_containers = it_containers.
lt_fields = it_fields.
lt_params = it_params.
lt_flow_logic = it_flow_logic.
IF sy-subrc EQ 0.
CALL FUNCTION 'RPY_DYNPRO_INSERT' "also see type RPYTY_FORCE_OFF
EXPORTING
* SUPPRESS_CORR_CHECKS = ' '
* CORRNUM = ' '
suppress_exist_checks = 'X' "overwrite existing screen
* SUPPRESS_GENERATE = ' '
suppress_dict_support = 'X' "suppress detection of SET_PARAM, GET_
PARAM, FOREIGN_KEY, UP_LOWER
* SUPPRESS_EXTENDED_CHECKS = ' '
header = ls_header
* USE_CORRNUM_IMMEDIATEDLY = ' '
* SUPPRESS_COMMIT_WORK = ' '
TABLES
containers = lt_containers
fields_to_containers = lt_fields
flow_logic = lt_flow_logic
params = lt_params
EXCEPTIONS
cancelled = 1
already_exists = 2
program_not_exists = 3
not_executed = 4
missing_required_field = 5
illegal_field_value = 6
field_not_allowed = 7
not_generated = 8
illegal_field_position = 9
OTHERS = 10.
ENDIF.
IF sy-subrc EQ 0 OR NOT testrun IS INITIAL.
MESSAGE i666(01) WITH 'Update successful' INTO sy-lisel. "#EC *
ENDIF.
CALL METHOD log_message.
ENDMETHOD. "create_screen
METHOD create_program_text.
DATA: lt_textpool TYPE TABLE OF textpool,
lt_source TYPE TABLE OF abapsource,
l_text LIKE i_text,
ls_e071 TYPE e071,
ls_tadir TYPE tadir.
FIELD-SYMBOLS: <ls_textpool> TYPE textpool.
CALL METHOD set_context
EXPORTING
i_langu = i_langu
i_object = 'REPT'
i_obj_name = i_progname.
CALL FUNCTION 'RPY_PROGRAM_READ'
EXPORTING
language = i_langu
program_name = i_progname
with_includelist = space
only_texts = 'X'
read_latest_version = 'X'
with_lowercase = 'X'
TABLES
textelements = lt_textpool
source = lt_source "dummy for 46C
EXCEPTIONS
cancelled = 1
not_found = 2
permission_error = 3
OTHERS = 4.
IF sy-subrc EQ 2.
* READ TEXTPOOL i_progname INTO lt_textpool LANGUAGE i_langu.
IF i_progname NE gv_progname_rept. "show following message only once
MESSAGE i666(01) WITH 'Report Texts can not be created yet.' INTO sy-lis
el. "#EC *
CALL METHOD log_message.
ls_e071-pgmid = 'LIMU'.
ls_e071-object = 'REPT'.
ls_e071-obj_name = i_progname.
CALL FUNCTION 'SCWB_GET_TADIR_REM'
EXPORTING
is_e071 = ls_e071
IMPORTING
es_tadir_key = ls_tadir.
MESSAGE w666(01) WITH 'Please execute this report again when' ls_tadir-o
bject ls_tadir-obj_name 'has been created.' INTO sy-lisel. "#EC *
CALL METHOD log_message.
ENDIF.
gv_progname_rept = i_progname.
RETURN.
ELSEIF sy-subrc NE 0.
MESSAGE e666(01) WITH 'Error while reading program text' 'of program' i_pr
ogname INTO sy-lisel. "#EC *
CALL METHOD log_message.
RETURN.
ENDIF.
l_text = i_text.
IF i_id EQ 'S' AND i_text(8) NE space AND i_text NE c_ddic_ref.
"if selection text does note begin with 8 space -> insert them
SHIFT l_text LEFT DELETING LEADING space.
SHIFT l_text RIGHT BY 8 PLACES.
ENDIF.
READ TABLE lt_textpool ASSIGNING <ls_textpool>
WITH KEY id = i_id
key = i_key.
IF sy-subrc EQ 0. "already exists
IF l_text EQ <ls_textpool>-entry AND
i_length EQ <ls_textpool>-length.
MESSAGE i666(01) WITH 'No update necessary for program text' i_key INTO
sy-lisel. "#EC *
CALL METHOD log_message.
RETURN. "nothing to do
ELSE.
"update existing entry
<ls_textpool>-entry = l_text.
sy-fleng = strlen( l_text ).
IF i_length IS INITIAL OR i_length LT sy-fleng.
<ls_textpool>-length = strlen( l_text ).
ELSE.
<ls_textpool>-length = i_length.
ENDIF.
ENDIF.
ELSE.
"add new entry
* APPEND INITIAL LINE TO lt_textpool ASSIGNING <ls_textpool>.
APPEND INITIAL LINE TO lt_textpool. READ TABLE lt_textpool INDEX sy-tabix
ASSIGNING <ls_textpool>. "46C
<ls_textpool>-id = i_id.
<ls_textpool>-key = i_key.
<ls_textpool>-entry = l_text.
IF i_length IS INITIAL.
<ls_textpool>-length = strlen( l_text ).
ELSE.
<ls_textpool>-length = i_length.
ENDIF.
ENDIF.
CALL METHOD add_to_transport
EXPORTING
i_devclass = i_devclass
i_langu = i_langu
i_object = 'REPT'
i_obj_name = i_progname
EXCEPTIONS
OTHERS = 1.
CHECK sy-subrc EQ 0 OR i_progname EQ myrepid.
CALL FUNCTION 'RPY_TEXTELEMENTS_INSERT' "other funcs in version 00047
EXPORTING
development_class = i_devclass
language = i_langu
program_name = i_progname
temporary = 'X' "transport check was already done
transport_number = space
r2_flag = space
TABLES
source = lt_textpool
EXCEPTIONS
cancelled = 1
permission_error = 2
program_not_exists = 3
OTHERS = 4.
IF sy-subrc EQ 0.
MESSAGE i666(01) WITH 'Update successful for program text' i_key INTO sy-l
isel. "#EC *
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 s
y-msgv3 sy-msgv4 INTO sy-lisel. "#EC *
CALL METHOD log_message.
MESSAGE e666(01) WITH 'Update failed for program text' i_key INTO sy-lisel
. "#EC *
ENDIF.
CALL METHOD log_message.
ENDMETHOD. "create_program_text
METHOD log_message.
DATA: ls_msg TYPE bal_s_msg,
ls_key TYPE adir_key.
IF sy-msgno IS INITIAL OR sy-msgid IS INITIAL.
MESSAGE e666(01) WITH 'unknown error' INTO sy-lisel. "#EC *
ENDIF.
IF i_probclass IS INITIAL.
CASE sy-msgty. "change problem class (default is 4)
WHEN 'E' OR 'A'.
ls_msg-probclass = '2'.
WHEN 'W'.
ls_msg-probclass = '3'.
ENDCASE.
ENDIF.
MOVE-CORRESPONDING syst TO ls_msg.
IF i_object IS NOT INITIAL.
ls_key-object = i_object.
ls_key-obj_name = i_obj_name.
ls_msg-context-value = ls_key.
ls_msg-context-tabname = c_bal_context.
ENDIF.
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_log_handle = gv_log_handle
i_s_msg = ls_msg
EXCEPTIONS
OTHERS = 0.
IF ls_msg-msgty CA 'EA'.
gv_errors_occured = 'X'.
ENDIF.
ENDMETHOD. "log_message
METHOD display_log.
DATA: lt_log_handle TYPE bal_t_logh,
ls_profile TYPE bal_s_prof,
l_s_fcat TYPE bal_s_fcat,
lt_dfies TYPE TABLE OF dfies,
ls_dfies TYPE dfies.
DATA: lr_filter_client TYPE RANGE OF mandt,
ls_filter_client LIKE LINE OF lr_filter_client,
ls_filter TYPE bal_s_lfil,
lr_filter TYPE bal_s_extn, "range table
lr_extnumber TYPE bal_s_extn,
lt_log_header TYPE balhdr_t.
"Reset SNOTE & SCWB mode
CALL FUNCTION 'SCWG_TOOLFLAG_RESET'.
TRY. CALL METHOD ('CL_CWB_RUNTIME')=>set_finished. CATCH cx_sy_dyn_call_ille
gal_class. ENDTRY. ">=SAPBASIS640
CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'.
"if we come here the action (copy/read/generate/compare) has finshed without
dumps hence we reset the trace
"-------- build profile
IF 1 = 1.
"grid
CALL FUNCTION 'BAL_DSP_PROFILE_STANDARD_GET'
IMPORTING
e_s_display_profile = ls_profile
EXCEPTIONS
OTHERS = 0.
"Set profile
ls_profile-use_grid = 'X'.
ls_profile-tree_ontop = 'X'.
ls_profile-mess_mark = 'X'.
ls_profile-exp_level = 1.
ls_profile-show_all = 'X'.
ELSE.
"tree
CALL FUNCTION 'BAL_DSP_PROFILE_DETLEVEL_GET'
IMPORTING
e_s_display_profile = ls_profile
EXCEPTIONS
OTHERS = 0.
ENDIF.
"add own fields to field cat
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = c_bal_context
TABLES
dfies_tab = lt_dfies
EXCEPTIONS
not_found = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc NE 0.
MESSAGE a666(01) WITH 'Error in DDIF_FIELDINFO_GET for table:' c_bal_conte
xt. "#EC *
ENDIF.
LOOP AT lt_dfies INTO ls_dfies WHERE fieldname EQ 'OBJECT'
OR fieldname EQ 'OBJ_NAME'.
l_s_fcat-ref_table = c_bal_context.
l_s_fcat-ref_field = ls_dfies-fieldname.
l_s_fcat-outputlen = ls_dfies-outputlen + 1.
* l_s_fcat-col_pos = 100 + sy-tabix. "most rigth columns
APPEND l_s_fcat TO ls_profile-mess_fcat.
ENDLOOP.
IF sy-repid EQ myrepid.
"--------- Search only log files of UDO itself
CALL FUNCTION 'APPL_LOG_DISPLAY'
EXPORTING
object = c_bal_object
object_attribute = 0
subobject = c_bal_subobj
subobject_attribute = 0
external_number = ' '
external_number_attribute = 0
title_list_screen = ' '
title_selection_screen = ' '
date_from = sy-datum "#EC DOM_EQUAL
date_to = sy-datum "#EC DOM_EQUAL
time_to = '235959' "#EC DOM_EQUAL
external_number_display_length = 20
i_s_display_profile = ls_profile
i_variant_report = sy-repid
EXCEPTIONS
no_authority = 0.
RETURN.
ENDIF.
"--------- Search for log files of generated reports (also valid for copy)
lr_extnumber-low = sy-repid.
lr_extnumber-sign = 'I'.
lr_extnumber-option = 'EQ'.
APPEND lr_extnumber TO ls_filter-extnumber.
ls_filter_client-sign = 'I'.
ls_filter_client-option = 'EQ'.
ls_filter_client-low = sy-mandt.
APPEND ls_filter_client TO lr_filter_client.