1、问题遇到的现象和发生背景
SAP 创建利润中心,保存报错,报错代码行
IF ld_rc <> 0.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
2、用代码块功能插入代码,请勿粘贴截图
完整代码:
---------------------------------------------------------------------
CLASS lcl_prctr_checker IMPLEMENTATION
CLASS lcl_prctr_checker IMPLEMENTATION.
---------------------------------- private class method AUTHORITY - *
METHOD authority.
DATA: ld_activity TYPE activ_auth,
ld_prctr TYPE prctr.
DATA: ld_setname TYPE sethier-shortname. "note 447948
begin note 541226
authority buffered?
Buffering deleted by note 963101
IF ms_auth = 'Y'.
p_success = true.
EXIT.
ENDIF.
IF ms_auth = 'N'.
p_success = false.
EXIT.
ENDIF.
end note 541226
temporary objects must not be checked "<-- Note1256558
IF mo_client->key-objnr CS '$TMP'.
p_success = true.
EXIT.
ENDIF. "-->Note 1256558
CASE p_mode.
WHEN co-mode_insert.
ld_activity = co-actvt_insert.
WHEN co-mode_update.
ld_activity = co-actvt_update.
WHEN co-mode_show.
ld_activity = co-actvt_show.
WHEN co-mode_delete.
ld_activity = co-actvt_delete.
ENDCASE.
begin of insertion note 447948
IF ld_activity = co-actvt_insert AND prct_v-khinr IS INITIAL.
START of CREATION of a PC (group name unknown)
authority check will be done later
p_success = true.
EXIT.
ENDIF.
end of insertion note 447948
ld_prctr = mo_client->key-objnr.
new authority check
1). check at first given profit center via
given responsibility Hierarchy
CALL FUNCTION 'K_PCA_RESP_AUTHORITY_CHECK'
EXPORTING
i_kokrs = mo_client->key-kokrs
i_prctr = ld_prctr
i_vorgn = 'STDT' "Master Data
i_actvt = ld_activity
i_no_dialog_message = 'X' "OSS 214797
EXCEPTIONS
no_authority = 1
data_missing = 2
OTHERS = 3.
IF sy-subrc = 0.
p_success = true.
EXIT. " <-- Note 1256558
ELSE.
check authority of Standard PC group
via given responsibility Hierarchy
IF ld_activity = co-actvt_update AND
prct_v-khinr IS INITIAL.
ld_setname = mo_client->get_field( p_fieldname = 'KHINR' ).
ELSE.
ld_setname = prct_v-khinr.
ENDIF.
IF NOT ld_setname IS INITIAL.
CALL FUNCTION 'K_PCA_RESP_AUTHORITY_CHECK'
EXPORTING
i_kokrs = mo_client->key-kokrs
i_pcgrp = ld_setname
i_vorgn = 'STDT' "Master Data
i_actvt = ld_activity
i_no_dialog_message = 'X'
EXCEPTIONS
no_authority = 1
data_missing = 2
OTHERS = 3.
IF sy-subrc = 0.
p_success = true.
EXIT.
ELSE.
IF st_msgid <> sy-msgid OR
st_msgno <> sy-msgno OR
st_msgv2 <> sy-msgv2 OR
st_msgv3 <> sy-msgv3.
st_msgid = sy-msgid.
st_msgno = sy-msgno.
st_msgv2 = sy-msgv2.
st_msgv3 = sy-msgv3.
Send S-Message only one time
vmessage sy-msgid 'S' sy-msgno
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
p_success = false.
ENDIF.
ELSE.
IF st_msgid <> sy-msgid OR
st_msgno <> sy-msgno OR
st_msgv2 <> sy-msgv2 OR
st_msgv3 <> sy-msgv3.
st_msgid = sy-msgid.
st_msgno = sy-msgno.
st_msgv2 = sy-msgv2.
st_msgv3 = sy-msgv3.
Send S-Message only one time
vmessage sy-msgid 'S' sy-msgno
sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
p_success = false.
ENDIF. " --> Note 1090429
ENDIF.
ENDMETHOD. "AUTHORITY
METHOD on_save.
DATA: lo_prctr_cc_buf TYPE REF TO lcl_prctr_ccode_buffer,
lt_ccodes TYPE lcl_prctr_ccode_buffer=>t_ccodes,
ls_ccodes LIKE LINE OF lt_ccodes,
ls_msg TYPE bapiret2,
ld_prctr TYPE prctr.
DATA: p_msg TYPE bapiret2.
ld_prctr = mo_client->key-objnr.
lo_prctr_cc_buf = lcl_prctr_ccode_buffer=>create(
p_kokrs = mo_client->key-kokrs
p_prctr = ld_prctr
p_version = lcl_act_state=>version-inactive ).
at least one ccode assigned ?
CALL METHOD lo_prctr_cc_buf->get_ccodes
IMPORTING
pt_ccodes = lt_ccodes[].
LOOP AT lt_ccodes INTO ls_ccodes.
IF ls_ccodes-assigned = true.
p_success = true.
EXIT.
ENDIF.
ENDLOOP.
IF p_success = false.
ls_msg-id = c_arbgb.
ls_msg-type = 'E'.
ls_msg-number = '392'.
PERFORM message_handle CHANGING ls_msg.
IF NOT ls_msg IS INITIAL.
vmessage ls_msg-id ls_msg-type ls_msg-number
ls_msg-message_v1 ls_msg-message_v2
ls_msg-message_v3 ls_msg-message_v4.
ENDIF.
ENDIF.
perform check_reorg_plan_003_on_1
using mo_client
abap_false
changing
p_msg
p_success.
IF p_success = false.
IF NOT p_msg IS INITIAL.
vmessage p_msg-id p_msg-type p_msg-number
p_msg-message_v1 p_msg-message_v2
p_msg-message_v3 p_msg-message_v4.
ENDIF.
ENDIF.
ENDMETHOD. " ON_SAVE
----------------------------------------- public method ON_DELETE - *
METHOD on_delete.
DATA: lo_prctr_ass_buf TYPE REF TO lcl_prctr_assignments_buffer,
ld_prctr TYPE prctr,
ls_msg TYPE bapiret2.
freshly created objects don't need to be checked
IF go_application->get_screen_mode( ) = co-mode_insert.
p_success = true.
EXIT.
ENDIF.
verify that there's no transaction data
p_success = verify_no_transaction_data(
p_datefrom = p_datab
p_dateto = p_datbi ).
IF p_success = false.
EXIT.
ENDIF.
verify that there are no assignments to the object
ld_prctr = mo_client->key-objnr.
lo_prctr_ass_buf = lcl_prctr_assignments_buffer=>create(
p_prctr = ld_prctr
p_kokrs = mo_client->key-kokrs
p_maxcount = 1 ).
IF NOT lo_prctr_ass_buf IS INITIAL.
CALL METHOD lo_prctr_ass_buf->on_prctr_delete
EXPORTING p_datab = p_datab
p_datbi = p_datbi
IMPORTING p_success = p_success
p_msg = ls_msg.
IF p_success = false.
vmessage ls_msg-id ls_msg-type ls_msg-number
ls_msg-message_v1 ls_msg-message_v2
ls_msg-message_v3 ls_msg-message_v4.
ENDIF.
ENDIF.
ENDMETHOD. "ON_DELETE
--------------------------------------- public method ON_ACTIVATE - *
METHOD on_activate.
DATA: ld_success TYPE boolean.
p_success = true.
ld_success = super->on_activate( ).
IF ld_success = false.
p_success = false.
ENDIF.
ld_success = ccodes_assignment_on_change( ).
IF ld_success = false.
p_success = false.
ENDIF.
ld_success = joint_venture_on_change( ).
IF ld_success = false.
p_success = false.
ENDIF.
ld_success = segment_reorg_on_activate( ).
IF ld_success = false.
p_success = false.
ENDIF.
ENDMETHOD. "ON_ACTIVATE
---------------------------------- private method PRCTR_ON_CHANGE - *
METHOD prctr_on_change.
DATA: ld_rc,
ld_prctr TYPE prctr.
DATA ls_newkey TYPE cgen_key.
ls_newkey-kokrs = mo_client->key-kokrs.
ls_newkey-objnr = p_value.
CALL METHOD mo_client->rename
EXPORTING
p_key = ls_newkey.
p_success = true.
ld_prctr = p_value.
PERFORM name_check USING ld_prctr
CHANGING ld_rc.
IF ld_rc <> 0.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
ENDIF.
ENDMETHOD. "PRCTR_ON_CHANGE
---------------------------------- private method KHINR_ON_CHANGE - *
METHOD khinr_on_change.
DATA: ld_rc(1) TYPE c,
ld_hier_group TYPE khinr,
lo_coarea TYPE REF TO lcl_controlling_area,
ld_from TYPE datab,
ld_to TYPE datbi.
lo_coarea = lcl_controlling_area=>create( mo_client->key-kokrs ).
ld_hier_group = p_value.
CALL METHOD go_application->focus->get_validity_range
IMPORTING
p_from = ld_from
p_to = ld_to.
IF go_application->get_screen_mode( ) <> co-mode_insert AND
NOT ( go_application->edit_window-from
= ld_from AND
go_application->edit_window-to
= ld_to ).
p_success = false.
vmessage 'KM' 'E' '020' space space space space.
ENDIF.
PERFORM hierarchy_check USING ld_hier_group
mo_client->key-kokrs
lo_coarea->tka01
mo_client->key-objnr
CHANGING ld_rc.
IF ld_rc <> 0.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
ENDIF.
ENDMETHOD. "KHINR_ON_CHANGE
------------------------------------------------------------------- *
---------------------------------- private method TXJCD_ON_CHANGE - *
------------------------------------------------------------------- *
METHOD txjcd_on_change.
DATA: lo_coarea TYPE REF TO lcl_controlling_area,
ls_t001 TYPE t001,
ld_bukrs TYPE bukrs, lt_bukrs TYPE TABLE OF bukrs,
ld_txjcd TYPE prct1-txjcd,
ld_rc,
ld_msg TYPE bapiret2.
ld_txjcd = p_value.
lo_coarea = lcl_controlling_area=>create( mo_client->key-kokrs ).
LOOP AT lo_coarea->t001_tab INTO ls_t001.
MOVE ls_t001-bukrs TO ld_bukrs.
APPEND ld_bukrs TO lt_bukrs.
ENDLOOP.
PERFORM taxjurcode_check USING mo_client->key-kokrs
ld_txjcd
lt_bukrs
CHANGING ld_rc
ld_msg.
IF ld_rc EQ 1.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
ENDIF.
ENDMETHOD. "TXJCD_ON_CHANGE
-------------------------- private method JOINT_VENTURE_ON_CHANGE - *
METHOD joint_venture_on_change.
DATA: lo_prctr_cc_buf TYPE REF TO lcl_prctr_ccode_buffer,
ld_prctr TYPE prctr.
ld_prctr = mo_client->key-objnr.
lo_prctr_cc_buf = lcl_prctr_ccode_buffer=>create(
p_kokrs = mo_client->key-kokrs
p_prctr = ld_prctr
p_version = lcl_act_state=>version-inactive ).
p_success = lo_prctr_cc_buf->check_jv_data( ).
ENDMETHOD. "JOINT_VENTURE_ON_CHANGE
---------------------- private method CCODES_ASSIGNMENT_ON_CHANGE - *
METHOD ccodes_assignment_on_change.
DATA: lo_prctr_cc_buf TYPE REF TO lcl_prctr_ccode_buffer,
ld_prctr TYPE prctr.
DATA: lt_ccodes TYPE lcl_prctr_ccode_buffer=>t_ccodes,
ls_ccodes LIKE LINE OF lt_ccodes,
ls_msg TYPE bapiret2.
ld_prctr = mo_client->key-objnr.
lo_prctr_cc_buf = lcl_prctr_ccode_buffer=>create(
p_kokrs = mo_client->key-kokrs
p_prctr = ld_prctr
p_version = lcl_act_state=>version-inactive ).
IF mo_client->upd_mode = co-mode_insert. "note 415074
CALL METHOD lo_prctr_cc_buf->get_ccodes
IMPORTING
pt_ccodes = lt_ccodes[].
LOOP AT lt_ccodes INTO ls_ccodes.
IF ls_ccodes-assigned = true.
p_success = true.
EXIT.
ENDIF.
ENDLOOP.
IF p_success = false.
ls_msg-id = 'KM'.
ls_msg-type = 'E'.
ls_msg-number = '392'.
PERFORM message_handle CHANGING ls_msg.
IF NOT ls_msg IS INITIAL.
vmessage ls_msg-id ls_msg-type ls_msg-number
ls_msg-message_v1 ls_msg-message_v2
ls_msg-message_v3 ls_msg-message_v4.
ENDIF.
ENDIF.
ELSE. "note 415074
p_success = lo_prctr_cc_buf->check_ccodes_assignment( ).
ENDIF. "note 415074
ENDMETHOD. "CCODES_ASSIGNMENT_ON_CHANGE
------------------------------------------------------------------- *
---------------------- private method SEGMENT_REORG_ON_ACTIVATE - *
METHOD segment_reorg_on_activate.
DATA:
ls_msg TYPE bapiret2.
perform check_reorg_plan_003_on_1
using mo_client
abap_true
changing
ls_msg
p_success.
ENDMETHOD. "SEGMENT_REORG_ON_ACTIVATE
------------------------------------------------------------------- *
------------------------------ private method LOGSYSTEM_ON_CHANGE - *
METHOD logsystem_on_change.
DATA: lo_coarea TYPE REF TO lcl_controlling_area,
ld_logsystem TYPE logsystem,
lt_logsystem TYPE TABLE OF logsystem,
lt_prct2 TYPE TABLE OF prct2,
ls_prct2 TYPE prct2,
ld_rc(1) TYPE c.
lo_coarea = lcl_controlling_area=>create( mo_client->key-kokrs ).
CALL METHOD lcl_builder=>get_all_data
EXPORTING
p_client = mo_client
IMPORTING
p_datatab = lt_prct2.
LOOP AT lt_prct2 INTO ls_prct2.
ld_logsystem = ls_prct2-logsystem.
APPEND ld_logsystem TO lt_logsystem.
ENDLOOP.
ld_logsystem = p_value.
PERFORM logsystem_check TABLES lt_logsystem
USING lo_coarea->tka01-pca_alemt
ld_logsystem
CHANGING ld_rc.
IF ld_rc <> 0.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
ENDIF.
ENDMETHOD. "LOGSYSTEM_ON_CHANGE
------------------------------------------------------------------- *
-------------------------------- private method LOCKIND_ON_CHANGE - *
METHOD lockind_on_change.
DATA: ld_prctr TYPE prctr,
lo_coarea TYPE REF TO lcl_controlling_area,
ld_lockind TYPE prct1-lock_ind.
ld_lockind = p_value.
IF ld_lockind = true.
ld_prctr = mo_client->key-objnr.
lo_coarea = lcl_controlling_area=>create( mo_client->key-kokrs ).
IF ld_prctr = lo_coarea->tka01-dprct.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
ENDIF.
ENDIF.
ENDMETHOD. "LOCKIND_ON_CHANGE
------------------------------------------------------------------- *
--------------------------- private method PCA_TEMPLATE_ON_CHANGE - *
METHOD pca_template_on_change.
DATA: ls_tpl_info TYPE tplic_tpl_info,
ld_rc.
IF p_value IS INITIAL.
p_success = true.
EXIT.
ENDIF.
PERFORM template_check USING mo_client->key-kokrs
p_value
CHANGING ld_rc.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
p_success = false.
ELSE.
p_success = true.
ENDIF.
ENDMETHOD. "PCA_TEMPLATE_ON_CHANGE
------------------------------------------------------------------- *
--------------------------------- public method ADDRESS_ON_CHANGE - *
METHOD address_on_change.
DATA: ld_land1 TYPE prct1-land1,
ld_regio TYPE prct1-regio,
ld_pstlz TYPE prct1-pstlz,
ld_pfach TYPE prct1-pfach,
ld_pstl2 TYPE prct1-pstl2,
ls_fieldvalue LIKE LINE OF p_fieldvaluetab,
ld_rc(1) TYPE c.
LOOP AT p_fieldvaluetab INTO ls_fieldvalue.
CASE ls_fieldvalue-fname.
WHEN 'LAND1'.
ld_land1 = ls_fieldvalue-fvalue.
WHEN 'REGIO'.
ld_regio = ls_fieldvalue-fvalue.
WHEN 'PSTLZ'.
ld_pstlz = ls_fieldvalue-fvalue.
WHEN 'PFACH'.
ld_pfach = ls_fieldvalue-fvalue.
WHEN 'PSTL2'.
ld_pstl2 = ls_fieldvalue-fvalue.
ENDCASE.
ENDLOOP.
PERFORM address_check USING ld_land1
ld_regio
ld_pstlz
ld_pfach
ld_pstl2
CHANGING ld_rc.
IF ld_rc <> 0.
p_success = false.
IF NOT msg IS INITIAL.
vmessage msg-msgid msg-msgty msg-msgno
msg-msgv1 msg-msgv2 msg-msgv3 msg-msgv4.
ENDIF.
ENDIF.
ENDMETHOD. "ADDRESS_ON_CHANGE
------------------------------------------------------------------- *
------------------------- public method ANALYSIS_PERIOD_ON_CHANGE - *
METHOD analysis_period_on_change.
ENDMETHOD. "ANALYSIS_PERIOD_ON_CHANGE
------------------------ public method VERIFY_NO_TRANSACTION_DATA - *
METHOD verify_no_transaction_data.
DATA: lo_coarea TYPE REF TO lcl_controlling_area,
ld_rc(1) TYPE c,
ld_prctr TYPE prctr,
ld_kokrs TYPE kokrs,
ld_year TYPE glpct-ryear,
ls_msg TYPE bapiret2.
ld_kokrs = mo_client->key-kokrs.
ld_prctr = mo_client->key-objnr.
lo_coarea = lcl_controlling_area=>create( ld_kokrs ).
PERFORM posted_data_check USING ld_prctr
ld_kokrs
p_datefrom
p_dateto
lo_coarea->tka01
CHANGING ld_year
ld_rc.
IF ld_rc = 0.
p_success = true.
ELSE.
IF NOT ld_year IS INITIAL.
p_success = false.
IF 1 = 2.
MESSAGE e721(km) WITH ld_prctr ld_year.
ENDIF.
ls_msg-type = 'E'.
ls_msg-id = c_arbgb.
ls_msg-number = '721'.
ls_msg-message_v1 = ld_prctr.
ls_msg-message_v2 = ld_year.
PERFORM message_handle USING ls_msg.
EXIT.
ENDIF.
p_success = false.
ENDIF.
CALL FUNCTION 'FAGL_CHECK_FIELD_USAGE_ACCIT'
EXPORTING
I_FIELDNAME = 'PRCTR'
IB_CHECK_SPLITTER = ' '
EXCEPTIONS
FIELD_USED = 1
INVALID_FIELDNAME = 2
OTHERS = 3.
IF SY-SUBRC = 1.
CALL FUNCTION 'FAGL_SEGMENT_CONTAINS_DATA'
EXPORTING
I_KOKRS = ld_kokrs
I_PRCTR = ld_prctr
I_SEGMENT = ''
I_DATBI = p_dateto
I_DATAB = p_datefrom
I_CHECK_PRCTR_ONLY = TRUE
EXCEPTIONS
PRCTR_CONTAINS_DATA = 1
OTHERS = 2
.
IF SY-SUBRC = 1.
p_success = false.
ls_msg-type = 'E'.
ls_msg-id = 'FAGL_ORG_UNITS'.
ls_msg-number = '013'.
ls_msg-message_v1 = ld_prctr.
PERFORM message_handle USING ls_msg.
EXIT.
ELSEIF SY-SUBRC > 1.
p_success = false.
ls_msg-type = sy-msgty.
ls_msg-id = sy-msgid.
ls_msg-number = sy-msgno.
ls_msg-message_v1 = sy-msgv1.
ls_msg-message_v2 = sy-msgv2.
ls_msg-message_v3 = sy-msgv3.
ls_msg-message_v4 = sy-msgv4.
PERFORM message_handle USING ls_msg.
EXIT.
ENDIF.
DATA: lv_reorg_subrc type sy-subrc.
PERFORM check_reorg_plan_003_del USING ld_prctr
ld_kokrs
p_datefrom
p_dateto
CHANGING lv_reorg_subrc
ls_msg.
IF lv_reorg_subrc <> 0.
p_success = false.
PERFORM message_handle USING ls_msg.
EXIT.
ENDIF.
ELSEIF SY-SUBRC = 2 OR
SY-SUBRC = 3.
p_success = false.
ls_msg-type = 'E'.
ls_msg-id = 'KM'.
ls_msg-number = '333'.
ls_msg-message_v1 = 'FAGL_CHECK_FIELD_USAGE_ACCIT'.
ENDIF.
ENDMETHOD. "VERIFY_NO_TRANSACTION_DATA
ENDCLASS. "LCL_PRCTR_CHECKER IMPLEMENTATION
帮忙看下是啥问题啊