BAPI_CONTRACT_GETDETAIL采购合同修改
...
BAPI_CONTRACT_GETDETAIL采购合同修改
遇到问题
价格关联表A016->KONP
不能直接更改EKPO-NETPR合同净价字段,前台也不能更改很好理解
通过调用BAPI_CONTRACT_GETDETAIL函数,传参ITEM_CONDITION。
但如果要更改合同条件记录,要先传ITEM_COND_VALIDITY。确定条件的有效期间,要传。
另外GT_ITEM_CONDITION有个参数CHANGE_ID要传U是更改,SERIAL_ID不用传
虽然只更改价格,GT_ITEM_CONDITIONX可以只传价格字段的X,
但GT_ITEM_CONDITION需要其他字段不然价格不会更改,并且那条信息记录会被打上删除标记。(可能因为价格还和单位啊属于什么PB00这种,传入的时候要传,不然他不知道改哪个?)

GS_ITEM_COND_VALIDITYX-ITEM_NOX和GS_ITEM_CONDITIONX-ITEM_NOX要传X不知道这个字段是什么意思。
代码实现
FUNCTION ZMMFU041.
*"----------------------------------------------------------------------
*"*"本地接口:
*" IMPORTING
*" VALUE(IS_REQ) TYPE /ZJT/SAPPO_REQ_INFO OPTIONAL
*" VALUE(EQ_EBELN) TYPE EBELN OPTIONAL
*" VALUE(IS_HEAD) TYPE ZMMS028 OPTIONAL
*" EXPORTING
*" VALUE(ES_EBELN) TYPE EBELN
*" VALUE(ES_RET) TYPE /ZJT/SAPPO_RET_INFO
*" TABLES
*" GT_DATA STRUCTURE ZMMS029 OPTIONAL
*"----------------------------------------------------------------------
DATA GS_HEADER TYPE BAPIMEOUTHEADER.
DATA GS_HEADERX TYPE BAPIMEOUTHEADERX.
DATA GS_ITEM TYPE BAPIMEOUTITEM.
DATA GT_ITEM LIKE TABLE OF BAPIMEOUTITEM.
DATA GS_ITEMX TYPE BAPIMEOUTITEMX.
DATA GT_ITEMX LIKE TABLE OF BAPIMEOUTITEMX.
DATA GS_ACCOUNT TYPE BAPIMEOUTACCOUNT.
DATA GT_ACCOUNT LIKE TABLE OF BAPIMEOUTACCOUNT.
DATA GS_ACCOUNTX TYPE BAPIMEOUTACCOUNTX.
DATA GT_ACCOUNTX LIKE TABLE OF BAPIMEOUTACCOUNTX.
DATA GS_ITEM_COND_VALIDITY TYPE BAPIMEOUTVALIDITY.
DATA GT_ITEM_COND_VALIDITY LIKE TABLE OF BAPIMEOUTVALIDITY.
DATA GS_ITEM_COND_VALIDITYX TYPE BAPIMEOUTVALIDITYX.
DATA GT_ITEM_COND_VALIDITYX LIKE TABLE OF BAPIMEOUTVALIDITYX.
DATA GS_ITEM_CONDITION TYPE BAPIMEOUTCONDITION.
DATA GT_ITEM_CONDITION LIKE TABLE OF BAPIMEOUTCONDITION.
DATA GT_ITEM_CONDITION2 LIKE TABLE OF BAPIMEOUTCONDITION.
DATA GS_ITEM_CONDITIONX TYPE BAPIMEOUTCONDITIONX.
DATA GT_ITEM_CONDITIONX LIKE TABLE OF BAPIMEOUTCONDITIONX.
DATA GT_RETURN LIKE TABLE OF BAPIRET2.
ZJT-RFC-LOG-B. "日志记录开始,函数进入时写
ES_RET-KEY1 = EQ_EBELN.
ES_RET-KEY2 = IS_HEAD-LIFNR.
CLEAR:GS_HEADER,GS_HEADERX.
GS_HEADER-VPER_START = IS_HEAD-KDATB."有效起始日期
GS_HEADER-VPER_END = IS_HEAD-KDATE."有效截至日期
GS_HEADER-PMNTTRMS = IS_HEAD-DZTERM."付款条件代码
GS_HEADER-PUR_GROUP = IS_HEAD-BKGRP."采购组
GS_HEADERX-VPER_START = 'X'."有效起始日期
GS_HEADERX-VPER_END = 'X'."有效截至日期
GS_HEADERX-PMNTTRMS = 'X'."付款条件代码
GS_HEADERX-PUR_GROUP = 'X'."采购组
SELECT COUNT(*) FROM EKPO WHERE EBELN = EQ_EBELN ."AND EBELP = GS_DATA-EBELP.
IF SY-SUBRC <> 0.
ES_RET-MSG = '无此合同数据'.
ZJT-RFC-LOG-E IS_REQ ES_RET.
RETURN.
ENDIF.
REFRESH:GT_ITEM,GT_ITEMX,GT_ACCOUNT,GT_ACCOUNTX,GT_ITEM_CONDITION,GT_ITEM_CONDITIONX,GT_ITEM_COND_VALIDITY,GT_ITEM_COND_VALIDITYX.
LOOP AT GT_DATA INTO DATA(GS_DATA).
CLEAR:GS_ITEM,GS_ITEMX,GS_ACCOUNT,GS_ACCOUNTX,GS_ITEM_CONDITION,GS_ITEM_CONDITIONX,GS_ITEM_COND_VALIDITY,GS_ITEM_COND_VALIDITYX.
SELECT COUNT(*) FROM EKPO WHERE EBELN = EQ_EBELN AND EBELP = GS_DATA-EBELP.
IF SY-SUBRC <> 0.
DATA(GV_BS) = 'X'."新增行
ENDIF.
GS_ITEM-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
GS_ITEM-TARGET_QTY = GS_DATA-KTMNG."目标数量
GS_ITEM-TAX_CODE = GS_DATA-MWSKZ."销售/购买税代码
GS_ITEM-STGE_LOC = GS_DATA-LGORT_D."存储地点
GS_ITEM-DELETE_IND = GS_DATA-LOEKZ."采购凭证中的删除标识
GS_ITEM-NET_PRICE = GS_DATA-NETPR."采购凭证中的净价(以凭证货币计)
GS_ITEM-ACCTASSCAT = GS_DATA-KNTTP."科目分配类别
GS_ITEM-SHORT_TEXT = GS_DATA-TXZ01."短文本
GS_ITEM-PO_UNIT = GS_DATA-BSTME."采购订单计量单位
GS_ITEM-MATL_GROUP = GS_DATA-MATKL."物料组
IF GV_BS = 'X'.
GS_ITEM-EMATERIAL = GS_DATA-MATNR."物料号
GS_ITEM-PLANT = GS_DATA-WERKS_D. "工厂
GS_ITEM-NET_PRICE = GS_DATA-NETPR. "净价
GS_ITEM-PRICE_UNIT = GS_DATA-PEINH. "价格单位 每
GS_ITEM-ORDERPR_UN = GS_DATA-BPRME. "订单价格单位(采购)
ENDIF.
APPEND GS_ITEM TO GT_ITEM.
GS_ITEMX-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
GS_ITEMX-TARGET_QTY = 'X'."目标数量
GS_ITEMX-TAX_CODE = 'X'."销售/购买税代码
GS_ITEMX-STGE_LOC = 'X'."存储地点
GS_ITEMX-DELETE_IND = 'X'."采购凭证中的删除标识
* GS_ITEMX-NET_PRICE = 'X'."采购凭证中的净价(以凭证货币计)
GS_ITEMX-ACCTASSCAT = 'X'."科目分配类别
IF GS_DATA-MATNR IS INITIAL.
GS_ITEMX-SHORT_TEXT = 'X'."短文本
ENDIF.
GS_ITEMX-PO_UNIT = 'X'."采购订单计量单位
GS_ITEMX-MATL_GROUP = 'X'."物料组
IF GV_BS = 'X'.
GS_ITEMX-EMATERIAL = ABAP_TRUE."物料号
GS_ITEMX-PLANT = ABAP_TRUE. "工厂
GS_ITEMX-NET_PRICE = ABAP_TRUE. "净价
GS_ITEMX-PRICE_UNIT = ABAP_TRUE. "价格单位 每
GS_ITEMX-ORDERPR_UN = ABAP_TRUE. "订单价格单位(采购)
ENDIF.
APPEND GS_ITEMX TO GT_ITEMX.
GS_ACCOUNT-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
GS_ACCOUNT-SERIAL_NO = '01'."科目分配的序号
GS_ACCOUNT-GL_ACCOUNT = GS_DATA-SAKNR."总账科目编号
GS_ACCOUNT-COSTCENTER = GS_DATA-KOSTL."成本中心
GS_ACCOUNT-ORDERID = GS_DATA-AUFNR."订单编号
GS_ACCOUNT-ASSET_NO = GS_DATA-ANLN1."主要资产编号
GS_ACCOUNT-SUB_NUMBER = GS_DATA-ANLN2."资产子编号
APPEND GS_ACCOUNT TO GT_ACCOUNT.
GS_ACCOUNTX-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
GS_ACCOUNTX-SERIAL_NO = '01'."科目分配的序号
GS_ACCOUNTX-GL_ACCOUNT = 'X'."总账科目编号
GS_ACCOUNTX-COSTCENTER = 'X'."成本中心
GS_ACCOUNTX-ORDERID = 'X'."订单编号
GS_ACCOUNTX-ASSET_NO = 'X'."主要资产编号
GS_ACCOUNTX-SUB_NUMBER = 'X'."资产子编号
APPEND GS_ACCOUNTX TO GT_ACCOUNTX.
SELECT SINGLE * INTO @DATA(GS_A016)
FROM A016
WHERE EVRTN = @EQ_EBELN
AND EVRTP = @GS_DATA-EBELP
AND KSCHL = 'PB00'
AND DATBI = '99991231'.
IF GS_A016-KNUMH IS NOT INITIAL.
CALL FUNCTION 'BAPI_CONTRACT_GETDETAIL'
EXPORTING
PURCHASINGDOCUMENT = EQ_EBELN
* ITEM_DATA = 'X'
* ACCOUNT_DATA = ' '
CONDITION_DATA = 'X'
* TEXT_DATA = ' '
* PARTNER_DATA = ' '
* RELEASE_DATA = ' '
* IMPORTING
* HEADER =
TABLES
* ITEM =
* ACCOUNT =
* DELIVERY_ADDRESS =
ITEM_COND_VALIDITY = GT_ITEM_COND_VALIDITY[]
ITEM_CONDITION = GT_ITEM_CONDITION2[]
* ITEM_COND_SCALE_VALUE =
* ITEM_COND_SCALE_QUAN =
* ITEM_TEXT =
* HEADER_TEXT =
* HEAD_COND_VALIDITY =
* HEAD_CONDITION =
* HEAD_COND_SCALE_VAL =
* HEAD_COND_SCALE_QUAN =
* PARTNER =
* RELEASE_DOCU =
* EXTENSIONOUT =
* RETURN =
* RFM_VAS_ITEM_EX =
* RFM_VAS_TEXT_EX =
.
*
* GS_ITEM_COND_VALIDITY-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
* GS_ITEM_COND_VALIDITY-VALID_FROM = GS_A016-DATAB.
* GS_ITEM_COND_VALIDITY-VALID_TO = '99991231'.
* APPEND GS_ITEM_COND_VALIDITY TO GT_ITEM_COND_VALIDITY.
DELETE GT_ITEM_COND_VALIDITY WHERE VALID_TO <> '99991231'.
GS_ITEM_COND_VALIDITYX-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
GS_ITEM_COND_VALIDITYX-ITEM_NOX = 'X'.
GS_ITEM_COND_VALIDITYX-VALID_FROM = 'X'.
GS_ITEM_COND_VALIDITYX-VALID_TO = 'X'.
APPEND GS_ITEM_COND_VALIDITYX TO GT_ITEM_COND_VALIDITYX.
READ TABLE GT_ITEM_CONDITION2 INTO DATA(GS_CONDITION2) WITH KEY ITEM_NO = GS_DATA-EBELP
COND_TYPE = 'PB00'.
GS_ITEM_CONDITION-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
* GS_ITEM_CONDITION-SERIAL_ID = GS_A016-KNUMH."条件记录数目
READ TABLE GT_ITEM_COND_VALIDITY[] INTO DATA(GS_VALD) WITH KEY ITEM_NO = GS_ITEM_CONDITION-ITEM_NO.
GS_ITEM_CONDITION-SERIAL_ID = GS_VALD-SERIAL_ID."条件记录数目
GS_ITEM_CONDITION-COND_COUNT = GS_CONDITION2-COND_COUNT."'01'."条件的序列号
GS_ITEM_CONDITION-COND_VALUE = GS_DATA-NETPR."条件金额
GS_ITEM_CONDITION-CURRENCY = GS_CONDITION2-CURRENCY."'CNY'."货币码
GS_ITEM_CONDITION-CURRENCY_ISO = GS_CONDITION2-CURRENCY_ISO."'CNY'."ISO代码货币
GS_ITEM_CONDITION-COND_P_UNT = GS_CONDITION2-COND_P_UNT."'1'."条件定价单位
GS_ITEM_CONDITION-COND_UNIT = GS_CONDITION2-COND_UNIT."'EA'."条件单位
GS_ITEM_CONDITION-COND_UNIT_ISO = GS_CONDITION2-COND_UNIT_ISO."'EA'."ISO条件单位
GS_ITEM_CONDITION-BASE_UOM = GS_CONDITION2-BASE_UOM."'EA'."基本计量单位
GS_ITEM_CONDITION-BASE_UOM_ISO = GS_CONDITION2-BASE_UOM_ISO."'EA'."ISO 代码的计量基本单位
GS_ITEM_CONDITION-COND_TYPE = GS_CONDITION2-COND_TYPE."'PB00'."条件类型
* GS_ITEM_CONDITION-SCALE_TYPE = 'A'."等级类型
* GS_ITEM_CONDITION-CALCTYPCON = 'C'."条件的计算类型
GS_ITEM_CONDITION-CHANGE_ID = 'U'."更改类型
SELECT COUNT(*) FROM EKPO WHERE EBELN = EQ_EBELN AND EBELP = GS_DATA-EBELP.
IF SY-SUBRC <> 0.
GS_ITEM_CONDITION-CHANGE_ID = 'I'."更改类型
ENDIF.
* GS_ITEM_CONDITION-DELETION_IND = ''."条件记录的删除标识
APPEND GS_ITEM_CONDITION TO GT_ITEM_CONDITION.
GS_ITEM_CONDITIONX-ITEM_NO = GS_DATA-EBELP."采购凭证的项目编号
* GS_ITEM_CONDITIONX-SERIAL_ID = GS_A016-KNUMH."条件记录数目
GS_ITEM_CONDITIONX-ITEM_NOX = 'X'.
GS_ITEM_CONDITIONX-COND_COUNT = '01'."条件的序列号
GS_ITEM_CONDITIONX-COND_VALUE = 'X'."条件金额
* GS_ITEM_CONDITIONX-CURRENCY = 'X'."货币码
* GS_ITEM_CONDITIONX-CURRENCY_ISO = 'X'."ISO代码货币
* GS_ITEM_CONDITIONX-COND_P_UNT = 'X'."条件定价单位
* GS_ITEM_CONDITIONX-COND_UNIT = 'X'."条件单位
* GS_ITEM_CONDITIONX-COND_UNIT_ISO = 'X'."ISO条件单位
* GS_ITEM_CONDITIONX-BASE_UOM = 'X'."基本计量单位
* GS_ITEM_CONDITIONX-BASE_UOM_ISO = 'X'."ISO 代码的计量基本单位
* GS_ITEM_CONDITIONX-COND_TYPE = 'X'."条件类型
* GS_ITEM_CONDITIONX-SCALE_TYPE = 'X'."等级类型
* GS_ITEM_CONDITIONX-CALCTYPCON = 'X'."条件的计算类型
* GS_ITEM_CONDITIONX-DELETION_IND = 'X'."条件记录的删除标识
APPEND GS_ITEM_CONDITIONX TO GT_ITEM_CONDITIONX.
ENDIF.
CLEAR GV_BS.
ENDLOOP.
CALL FUNCTION 'BAPI_CONTRACT_CHANGE'
EXPORTING
PURCHASINGDOCUMENT = EQ_EBELN
HEADER = GS_HEADER
HEADERX = GS_HEADERX
* VENDOR_ADDRESS =
* TESTRUN =
* TECHNICAL_DATA =
* IMPORTING
* EXP_HEADER =
TABLES
ITEM = GT_ITEM[]
ITEMX = GT_ITEMX[]
ACCOUNT = GT_ACCOUNT[]
* ACCOUNTPROFITSEGMENT =
ACCOUNTX = GT_ACCOUNTX[]
* DELIVERY_ADDRESS =
ITEM_COND_VALIDITY = GT_ITEM_COND_VALIDITY[]
ITEM_COND_VALIDITYX = GT_ITEM_COND_VALIDITYX[]
ITEM_CONDITION = GT_ITEM_CONDITION[]
ITEM_CONDITIONX = GT_ITEM_CONDITIONX[]
* ITEM_COND_SCALE_VALUE =
* ITEM_COND_SCALE_QUAN =
* ITEM_TEXT =
* HEADER_TEXT =
* HEAD_COND_VALIDITY =
* HEAD_COND_VALIDITYX =
* HEAD_CONDITION =
* HEAD_CONDITIONX =
* HEAD_COND_SCALE_VAL =
* HEAD_COND_SCALE_QUAN =
* PARTNER =
* PARTNERX =
* RELEASE_DOCU =
* EXTENSIONIN =
* EXTENSIONOUT =
RETURN = GT_RETURN[]
* RFM_VAS_ITEM_IN =
* RFM_VAS_ITEM_INX =
* RFM_VAS_TEXT =
.
READ TABLE GT_RETURN INTO DATA(GS_RETURN) WITH KEY TYPE = 'E'.
IF SY-SUBRC = 0 .
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
ES_RET-MSG = '采购合同修改失败' .
ES_RET-CODE = 'E'.
LOOP AT GT_RETURN INTO GS_RETURN WHERE TYPE = 'E' OR TYPE = 'A' OR TYPE = 'X'.
ES_RET-MSG = ES_RET-MSG && ',' && GS_RETURN-MESSAGE.
ENDLOOP.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
WAIT = 'X'.
ES_RET-MSG = '采购合同修改成功'.
ES_RET-CODE = 'S'.
WAIT UP TO '0.6' SECONDS.
ENDIF.
ZJT-RFC-LOG-E IS_REQ ES_RET.
ENDFUNCTION.参考文献
你认为这篇文章怎么样?
0
0
0
0
0
0





