PM工单结算规则处理方法
侯志宇
2011-12-6
在订单中我们可以通过出口维护结算规则,这样可以避免用户手工维护结算规则
可以再IWO10027(生成用户定义的结算规则)出口中实现实现代码如下:
*&---------------------------------------------------------------------*
*& 包括 ZXWOCU24
*&---------------------------------------------------------------------*
*
*增强名称:试点-工单建立后,保存时直接填入一个虚拟的结算规则。(结算到科目9999999999)
*增强内容:工单保存时,全部自动赋给一个虚拟的结算规则:科目9999999999
DATA: S_PMDFU TYPE PMDFU.
S_PMDFU-KONTY = 'SK'."G/L = SK
S_PMDFU-FDIND = '9999999999'.
S_PMDFU-PERBZ = 'GES'."FUL
S_PMDFU-AQZIF = 0.
S_PMDFU-PROZS = 100.
APPEND S_PMDFU TO PMDFU_TAB.
.
IWO10027正常情况下在IW31中及其在IW32中单击结算规则选择默认时调用;
但是由于某些未知原因也可能导致此出口更新失败,这样我们就找了另一种更新结算规则的方法来进行补救,我将此方法写在IWO10009 (PM订单:对于'保存'事件的客户检查)出口中进行处理,在EXIT_SAPLCOIH_009中代码如下:
*>>>modify begin 2011.12.06*************************************
*修改方案:在非创建工单时如果还没有维护结算规则,就自动生成结算规则
*修改人:侯志宇
**************************************************
* 如果还没有维护结算规则,就自动生成结算规则 *
**************************************************
call function 'STATUS_CHECK'
exporting
* BYPASS_BUFFER = ' '
* CLIENT = SY-MANDT
OBJNR = CAUFVD_IMP-OBJNR
STATUS = 'I0028'"SETC in table TJ02T 结算规则己维护
exceptions
OBJECT_NOT_FOUND = 1
STATUS_NOT_ACTIVE = 2
others = 3.
if SY-SUBRC = 2 and CAUFVD_IMP-OBJNR+0(2) <> 'TM'."不是新建末保存的订单 STATUS_NOT_ACTIVE,
**************************************************
* 自动生成结算规则 开始 *
**************************************************
*************************
* Data Declaration *
*************************
data IT_OBJNR type standard table of IONRB with header line.
data IT_COBRA type standard table of COBRA with header line.
data IT_COBRB type standard table of COBRB with header line.
*.COBRA-BUFFER (SEE FM KOBS)
types: begin of TY_COBRA_BUF.
include structure COBRA.
types: UFLAG like DKOBR-UPD_FLAG,
end of TY_COBRA_BUF.
*.COBRB-PUFFER MIT ?NDERUNGSFLAG (SEE FM KOBS)
types: begin of TY_COBRB_BUF.
include structure COBRB.
types: UFLAG like DKOBR-UPD_FLAG,
end of TY_COBRB_BUF.
data L_MEM_COBRA type standard table of TY_COBRA_BUF with header line.
data L_MEM_COBRB type standard table of TY_COBRB_BUF with header line.
*************************
* Data Process *
*************************
IT_OBJNR-OBJNR = CAUFVD_IMP-OBJNR.
append IT_OBJNR.
call function 'K_SRULE_PRE_READ'
exporting
I_PFLEGE = ' '
tables
T_SENDER_OBJNR = IT_OBJNR
* T_COBRA =
exceptions
WRONG_PARAMETERS = 1
others = 2.
call function 'K_SETTLEMENT_RULE_EXISTENCE'
exporting
OBJNR = IT_OBJNR-OBJNR
* FLG_LOCAL = ' '
* IMPORTING
* E_COBRA =
exceptions
RULE_NOT_FOUND = 1
others = 2.
if SY-SUBRC = 1."如果没有结算规则,就创建
call function 'K_SRULE_CREATE'
exporting
I_OBJNR = IT_OBJNR-OBJNR
* I_CHECK_ONLY_LOCAL = ' '
* IMPORTING
* E_COBRA =
exceptions
RULE_ALREADY_EXISTS = 1
others = 2.
endif."如果没有结算规则,就创建
call function 'K_SETTLEMENT_RULE_GET'
exporting
OBJNR = IT_OBJNR-OBJNR
* X_ALL = ' '
tables
E_COBRA = IT_COBRA
E_COBRB = IT_COBRB
exceptions
NOT_FOUND = 1
others = 2.
call function 'K_SRULE_EXPORT_IMPORT'
exporting
I_MODE = 'EX'
exceptions
WRONG_MODE = 1
others = 2.
import L_MEM_COBRA L_MEM_COBRB from memory id 'K_SRULE'.
* 修改 IT_COBRA, IT_COBRB.
clear:L_MEM_COBRB,L_MEM_COBRB[].
L_MEM_COBRB-OBJNR = IT_OBJNR-OBJNR.
L_MEM_COBRB-LFDNR = 1.
L_MEM_COBRB-PERBZ = 'GES'."FUL "结算类型
* L_MEM_COBRB-URZUO = 'COS'. "原始分配
L_MEM_COBRB-PROZS = '100'. "百分比
L_MEM_COBRB-DFREG = 'PMU'. "缺省规则
L_MEM_COBRB-KONTY = 'SK'."G/L = SK "科目分配类别
L_MEM_COBRB-KOKRS = 'SEC0'. "成本控制范围
L_MEM_COBRB-BUKRS = CAUFVD_IMP-BUKRS. "公司代码
L_MEM_COBRB-HKONT = '9999999999'. "总帐科目
L_MEM_COBRB-KOSTL = CAUFVD_IMP-KOSTV. "成本中心
concatenate L_MEM_COBRB-KONTY L_MEM_COBRB-BUKRS L_MEM_COBRB-HKONT into L_MEM_COBRB-REC_OBJNR1.
L_MEM_COBRB-EXTNR = 1.
L_MEM_COBRB-UFLAG = 'I'.
append L_MEM_COBRB.
* L_MEM_COBRB-OBJNR = IT_OBJNR-OBJNR.
* L_MEM_COBRB-LFDNR = 2.
* L_MEM_COBRB-PERBZ = 'GES'. "结算类型
* L_MEM_COBRB-URZUO = 'REV'. "原始分配
* L_MEM_COBRB-PROZS = '100'. "百分比
* L_MEM_COBRB-DFREG = 'PMU'. "缺省规则
* L_MEM_COBRB-KONTY = 'SK'. "科目分配类别
* L_MEM_COBRB-KOKRS = '3333'. "成本控制范围
* L_MEM_COBRB-BUKRS = CAUFVD_IMP-BUKRS. "公司代码
* L_MEM_COBRB-HKONT = '6001010611'. "总帐科目
* L_MEM_COBRB-KOSTL = CAUFVD_IMP-KOSTV. "成本中心
* L_MEM_COBRB-PRCTR = CAUFVD_IMP-PRCTR. "利润中心
* L_MEM_COBRB-REC_OBJNR1 = 'SK31106001010611'. "结算接收方的对象号
* L_MEM_COBRB-EXTNR = 2.
* L_MEM_COBRB-UFLAG = 'I'.
*
* append L_MEM_COBRB.
export L_MEM_COBRA L_MEM_COBRB to memory id 'K_SRULE'.
call function 'K_SETTLEMENT_RULE_REFRESH'
exporting
OBJNR = IT_OBJNR-OBJNR.
call function 'K_SRULE_EXPORT_IMPORT'
exporting
I_MODE = 'IM'
exceptions
WRONG_MODE = 1
others = 2.
call function 'K_SETTLEMENT_RULE_CHECK'
exporting
* ADD_PARA = ' '
* APROF = ' '
OBJNR = IT_OBJNR-OBJNR
* TEST_BUKRS = ' '
* TEST_KOKRS = ' '
* RWIN_AUFRUF = 'X'
I_PFLEGE = 'X'"you can change the rule
* IVPRO = ' '
* XREVENUE = ' '
* XFUNCSAVE = ' '
* IMPORTING
* XSAVE =
exceptions
ERROR_OCCURRED = 1
NO_RULE_FOR_OBJNR = 2
WARNING_OCCURRED = 3
INTERNAL_PROBLEMS = 4
others = 5.
if SY-SUBRC = 0."保存结算规则,设置状态 SETC 结算规则己维护
call function 'K_SETTLEMENT_RULE_SAVE'
exporting
DIALOG = ''
OBJNR = IT_OBJNR-OBJNR
I_STATUS_UPDATE = 'X'
exceptions
NO_RULE_FOR_OBJNR = 1
others = 2.
data STATUS type standard table of JSTAT with header line.
STATUS-STAT = 'I0028'."SETC in table TJ02T 结算规则己维护
STATUS-INACT = ''.
append STATUS.
call function 'STATUS_CHANGE_INTERN'
exporting
* CHECK_ONLY = ' '
* CLIENT = SY-MANDT
OBJNR = IT_OBJNR-OBJNR
* ZEILE = ' '
* SET_CHGKZ =
* IMPORTING
* ERROR_OCCURRED =
* OBJECT_NOT_FOUND =
* STATUS_INCONSISTENT =
* STATUS_NOT_ALLOWED =
tables
STATUS = STATUS
exceptions
OBJECT_NOT_FOUND = 1
STATUS_INCONSISTENT = 2
STATUS_NOT_ALLOWED = 3
others = 4.
if SY-SUBRC = 0.
call function 'STATUS_UPDATE_ON_COMMIT'.
endif.
endif.
**************************************************
* 自动生成结算规则 结束 *
**************************************************
endif.
*>>>>END begin 2011.12.06