1.取得生产订单对象号函数
CALL FUNCTION 'K_AUFNR_OBJECT_KEY_GET'
EXPORTING
aufnr = m_aufnr ‘’生产订单号
kokrs = m_kokrs ‘’控制范围
IMPORTING
objnr = m_objnr. ‘’对象号
对象号可用于查询JEST、TJ02T、JCDS、JSTO订单状态信息等
2.整合消息到字符串中
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = return_value."返回值
3.创建SAP客户函数,前台创建事务XD01,修改XD02,显示XD03,删除XD06
创建客户函数示例:
DATA:ls_kna1 TYPE kna1,
ls_knb1 TYPE knb1,
ls_knvv TYPE knvv,
ls_addr1 TYPE bapiaddr1,
ls_addr2 TYPE bapiaddr2,
ls_knvi TYPE knvi,
lt_knvi TYPE STANDARD TABLE OF fknvi WITH HEADER LINE.
DATA:lv_id TYPE bapi4001_1-objkey,
lt_bapiad1vl TYPE STANDARD TABLE OF bapiad1vl WITH HEADER LINE,
lt_bapiad1vl_x TYPE STANDARD TABLE OF bapiad1vlx WITH HEADER LINE,
lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE.
DATA:lv_kunnr TYPE kunnr,
lv_num TYPE i,
lv_addrnumber TYPE adrc-addrnumber,
lv_region TYPE zcrm_region-sapregion,
lv_cityc TYPE zcrm_region-sapregion,
lv_num1 TYPE i.
*转换SAP地区、城市代码
CLEAR:lv_region,lv_cityc.
PERFORM frm_get_sapregion USING region
CHANGING lv_region.
PERFORM frm_get_sapregion USING cityc
CHANGING lv_cityc.
CLEAR:lv_num1.
lv_num1 = STRLEN( lv_region ).
IF lv_num1 <> 3.
return_status = 'F'.
return_value = 'CRM标准行政区域对应SAP区域代码维护错误,地区(省份)应该为三位数字!'.
RETURN.
ENDIF.
*检查此客户是否已经创建,已经创建,返回已经创建的的客户号
IF requesttype = 'CREATE'.
CLEAR:lv_addrnumber.
SELECT SINGLE addrnumber
INTO lv_addrnumber
FROM adrc
WHERE extension1 = accountnumber.
IF sy-subrc = 0.
CLEAR:sapcode.
SELECT SINGLE kunnr
INTO sapcode
FROM kna1
WHERE adrnr = lv_addrnumber.
IF sy-subrc = 0.
requesttype = 'UPDATE'.
ENDIF.
ENDIF.
ENDIF.
*客户主文件的一般数据
IF requesttype = 'UPDATE'.
ls_kna1-kunnr = sapcode. "客户代码
ENDIF.
ls_kna1-mandt = '300'.
ls_kna1-ktokd = ktokd. "科目组
ls_kna1-cityc = lv_cityc. "城市代码
ls_kna1-stceg = stceg. "增值税登记号
IF requesttype = 'UPDATE'.
ls_kna1-loevm = loevm. "主记录中删除标记
ENDIF.
*客户主数据 (公司代码)
ls_knb1-mandt = '300'.
IF requesttype = 'UPDATE'.
ls_knb1-kunnr = sapcode.
ls_knb1-loevm = loevm. "主记录删除标记(公司代码级)
ENDIF.
ls_knb1-bukrs = bukrs. "公司代码
ls_knb1-akont = akont. "统驭科目
ls_knb1-xzver = xzver. "付款历史记录
*客户主记录销售数据
ls_knvv-mandt = '300'.
IF requesttype = 'UPDATE'.
ls_knvv-kunnr = sapcode.
ls_knvv-loevm = loevm. "客户的删除标记 (销售级别)
ENDIF.
ls_knvv-vkorg = vkorg. "销售组织
ls_knvv-vtweg = vtweg. "分销渠道
ls_knvv-spart = spart. "产品组
ls_knvv-kdgrp = kdgrp. "客户组
ls_knvv-kalks = kalks. "客户定价过程
ls_knvv-bzirk = bzirk. "销售地区
ls_knvv-vkbur = vkbur. "销售部门
ls_knvv-waers = waers. "货币
ls_knvv-pltyp = pltyp. "价格清单
ls_knvv-vsbed = vsbed. "装运条件
ls_knvv-ktgrd = ktgrd. "账户分配组
*地址的 BAPI 参考结构(组织/公司)
ls_addr1-sort1 = sort1. "城市描述
ls_addr1-sort2 = sort2. "组织机构代码
lv_num = STRLEN( name ). "客户名称
IF lv_num < 35.
ls_addr1-name = name.
ELSEIF lv_num < 69.
ls_addr1-name = name+ 0( 34).
ls_addr1-name_2 = name+ 34( 34).
ELSEIF lv_num <= 100.
ls_addr1-name = name+ 0( 34).
ls_addr1-name_2 = name+ 34( 34).
ls_addr1-name_3 = name+ 68( 32).
ENDIF.
ls_addr1-street = street. "用户地址
ls_addr1-postl_cod1 = post_code1. "城市邮政编码
ls_addr1-city = city1. "城市描述
ls_addr1- country = country. "国家代码
ls_addr1-langu = sy-langu. "语言
ls_addr1-region = lv_region. "省份
ls_addr1-tel1_numbr = mob_number. "电话
ls_addr1-fax_number = fax_number. "传真
ls_addr1-e_mail = smtp_addr. "电子邮箱
ls_addr1-formofaddr = title_medi. "标题
*设置税分类
lt_knvi-mandt = '300'.
IF requesttype = 'UPDATE'.
lt_knvi-kunnr = sapcode. "客户代码
ENDIF.
lt_knvi-aland = country.
lt_knvi-tatyp = 'MWST'.
lt_knvi-taxkd = taxkd.
lt_knvi-kz = 'I'.
APPEND lt_knvi.
CALL FUNCTION 'SD_CUSTOMER_MAINTAIN_ALL'
EXPORTING
i_kna1 = ls_kna1
i_knb1 = ls_knb1
i_knvv = ls_knvv
i_bapiaddr1 = ls_addr1
i_maintain_address_by_kna1 = 'X'
pi_postflag = 'X'
IMPORTING
e_kunnr = lv_kunnr
TABLES
t_xknvi = lt_knvi
EXCEPTIONS
client_error = 1
kna1_incomplete = 2
knb1_incomplete = 3
knb5_incomplete = 4
knvv_incomplete = 5
kunnr_not_unique = 6
sales_area_not_unique = 7
sales_area_not_valid = 8
insert_update_conflict = 9
number_assignment_error = 10
number_not_in_range = 11
number_range_not_extern = 12
number_range_not_intern = 13
account_group_not_valid = 14
parnr_invalid = 15
bank_address_invalid = 16
tax_data_not_valid = 17
no_authority = 18
company_code_not_unique = 19
dunning_data_not_valid = 20
knb1_reference_invalid = 21
cam_error = 22
OTHERS = 23.
IF sy-subrc <> 0.
ROLLBACK WORK.
* MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
* WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
return_status = 'F'. "返回状态(S:成功;F:失败)
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = sy-msgid
msgnr = sy-msgno
msgv1 = sy-msgv1
msgv2 = sy-msgv2
msgv3 = sy-msgv3
msgv4 = sy-msgv4
IMPORTING
message_text_output = return_value. "返回值
ELSE.
CLEAR:lt_bapiad1vl,lt_bapiad1vl[],lt_return,lt_return[].
lt_bapiad1vl-extens_1 = accountnumber.
APPEND lt_bapiad1vl.
CLEAR:lt_bapiad1vl_x,lt_bapiad1vl_x[].
lt_bapiad1vl_x-extens_1 = 'X'.
APPEND lt_bapiad1vl_x.
CLEAR:lv_id.
IF requesttype = 'UPDATE'.
lv_id = sapcode. "客户代码
ELSE.
lv_id = lv_kunnr.
ENDIF.
CALL FUNCTION 'BAPI_ADDRESSORG_CHANGE'
EXPORTING
obj_type = 'KNA1'
obj_id = lv_id
* OBJ_ID_EXT = ' '
* CONTEXT = 1
* ACCEPT_ERROR = ' '
* SAVE_ADDRESS = 'X'
* IV_CHECK_ADDRESS = 'X'
* IV_TIME_DEPENDENT_COMM_DATA = ' '
* IMPORTING
* ADDRESS_NUMBER =
TABLES
bapiad1vl = lt_bapiad1vl
bapiad1vl_x = lt_bapiad1vl_x
return = lt_return
.
IF lt_return[] IS INITIAL.
COMMIT WORK.
return_status = 'S'. "返回状态(S:成功;F:失败)
IF requesttype = 'UPDATE'.
kunnr = sapcode.
ELSE.
kunnr = lv_kunnr.
ENDIF.
ELSE.
ROLLBACK WORK.
return_status = 'F'. "返回状态(S:成功;F:失败)
CLEAR:lt_return.
READ TABLE lt_return INDEX 1.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return- id
msgnr = lt_return- number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = return_value. "返回值
ENDIF.
ENDIF.
4.修改客户地址函数BAPI_ADDRESSORG_CHANGE,示例如上
5.创建客户联系人前台事务VAP1,修改VAP2,显示VAP3,相应函数如下:
ISAI_CONTACT_CREATE
ISAI_CONTACT_CHANGE
ISAI_CONTACT_DELETE
示例:
DATA:lst_address TYPE bapiaddr3,
lst_address_changes TYPE bapiaddr3x,
lt_return TYPE STANDARD TABLE OF bapiret2 WITH HEADER LINE,
lv_return_status TYPE bapi_mtype,
lv_return_value TYPE zreturn_value.
lst_address-lastname = name_last.
lst_address-tel1_numbr = telf.
sy-batch = 'X'.
*创建
IF requesttype = 'CREATE'.
CALL FUNCTION 'ISAI_CONTACT_CREATE'
EXPORTING
customerid = kunnr
address = lst_address
IMPORTING
new_contactid = vonnr
return_status = lv_return_status
TABLES
return = lt_return
* extensions_import =
* extensions_export =
.
IF lv_return_status = 'S'.
return_status = 'S'.
return_value = '成功'.
ELSE.
return_status = 'F'.
CLEAR:lt_return.
LOOP AT lt_return.
IF sy-tabix = 1.
IF lt_return-message IS NOT INITIAL.
lv_return_value = lt_return-message.
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_return_value."返回值
ENDIF.
return_value = lv_return_value.
ELSE.
IF lt_return-message IS NOT INITIAL.
lv_return_value = lt_return-message.
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_return_value."返回值
ENDIF.
CONCATENATE return_value lv_return_value INTO return_value SEPARATED BY space.
ENDIF.
CLEAR:lt_return.
ENDLOOP.
ENDIF.
*更新
ELSEIF requesttype = 'UPDATE'.
lst_address_changes-lastname = 'X'.
lst_address_changes-tel1_numbr = 'X'.
CALL FUNCTION 'ISAI_CONTACT_CHANGE'
EXPORTING
customerid = kunnr
contactid = parnr
address = lst_address
address_changes = lst_address_changes
IMPORTING
return_status = lv_return_status
TABLES
return = lt_return
* EXTENSIONS_IMPORT =
* EXTENSIONS_EXPORT =
.
vonnr = parnr.
IF lv_return_status = 'S'.
return_status = 'S'.
return_value = '成功'.
ELSE.
return_status = 'F'.
CLEAR:lt_return.
LOOP AT lt_return.
IF sy-tabix = 1.
IF lt_return-message IS NOT INITIAL.
lv_return_value = lt_return-message.
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_return_value."返回值
ENDIF.
return_value = lv_return_value.
ELSE.
IF lt_return-message IS NOT INITIAL.
lv_return_value = lt_return-message.
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_return_value."返回值
ENDIF.
CONCATENATE return_value lv_return_value INTO return_value SEPARATED BY space.
ENDIF.
CLEAR:lt_return.
ENDLOOP.
ENDIF.
ELSEIF requesttype = 'DELETE'.
CALL FUNCTION 'ISAI_CONTACT_DELETE'
EXPORTING
customerid = kunnr
contactid = parnr
IMPORTING
return_status = lv_return_status
TABLES
return = lt_return
* EXTENSIONS_IMPORT =
* EXTENSIONS_EXPORT =
.
vonnr = parnr.
IF lv_return_status = 'S'.
return_status = 'S'.
return_value = '成功'.
ELSE.
return_status = 'F'.
CLEAR:lt_return.
LOOP AT lt_return.
IF sy-tabix = 1.
IF lt_return-message IS NOT INITIAL.
lv_return_value = lt_return-message.
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_return_value."返回值
ENDIF.
return_value = lv_return_value.
ELSE.
IF lt_return-message IS NOT INITIAL.
lv_return_value = lt_return-message.
ELSE.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = lt_return-id
msgnr = lt_return-number
msgv1 = lt_return-message_v1
msgv2 = lt_return-message_v2
msgv3 = lt_return-message_v3
msgv4 = lt_return-message_v4
IMPORTING
message_text_output = lv_return_value."返回值
ENDIF.
CONCATENATE return_value lv_return_value INTO return_value SEPARATED BY space.
ENDIF.
CLEAR:lt_return.
ENDLOOP.
ENDIF.
ENDIF.
4.转换成内部输入(增加前导0)
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input =
IMPORTING
output = .
转换成外部输入(去掉前导0)
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_OUTPUT'
EXPORTING
input =
IMPORTING
output =
5.BAPI更新订单顺序编号
DATA:gv_number TYPE bapi_order_key-order_number,"订单号
gwa_orderdata TYPE bapi_pp_order_change,"更改字段
gwa_orderdatax TYPE bapi_pp_order_changex,"更改字段标识
gwa_return TYPE bapiret2."返回消息
gv_number = gwa_output-aufnr.
gwa_orderdata-sequence_number = gwa_output-seqnr.
gwa_orderdatax-sequence_number = 'X'.
CALL FUNCTION 'BAPI_PRODORD_CHANGE'
EXPORTING
number = gv_number
orderdata = gwa_orderdata
orderdatax = gwa_orderdatax
IMPORTING
return = gwa_return
* ORDER_TYPE =
* ORDER_STATUS =
* MASTER_DATA_READ =
.
*更新失败
IF gwa_return-type = 'E'.
gwa_output-message = gwa_return-message.
ROLLBACK WORK.
ELSE.
*更新成功
gwa_output-message = '更新成功'.
COMMIT WORK AND WAIT.
ENDIF.
ELSE.
*更新表失败
gwa_output-message = '更新半成品订单与整车预留关系表(ZREL_HAFAFKO_RES 激)失败'.
ROLLBACK WORK.
ENDIF.
6.BAPI修改采购订单
*新增采购订单项目号
CLEAR: gt_return,gt_poschedule,gt_poschedulex,gv_flag,gt_poitem,gt_poitemx.
REFRESH : gt_return,gt_poschedule,gt_poschedulex,gt_poitem,gt_poitemx.
*修改采购订单
gt_poschedule-po_item = wa_data-ebelp.
gt_poschedule-sched_line = '0001'.
gt_poschedule-delivery_date = wa_data-eindt1.
gt_poschedule-quantity = wa_data-menge1.
APPEND gt_poschedule.
CLEAR gt_poschedule.
gt_poschedulex-po_item = wa_data-ebelp.
gt_poschedulex-po_itemx = 'X'.
gt_poschedulex-sched_line = '0001'.
gt_poschedulex-sched_linex = 'X'.
gt_poschedulex-delivery_date = 'X'.
gt_poschedulex-quantity = 'X'.
APPEND gt_poschedulex.
CLEAR gt_poschedulex.
*调用函数修改采购订单
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
purchaseorder = wa_data-ebeln
TABLES
return = gt_return
poschedule = gt_poschedule
poschedulex = gt_poschedulex.
LOOP AT gt_return WHERE type = 'E'.
CONCATENATE '采购订单' wa_data-ebeln '项目' wa_data-ebelp gt_return-message INTO gt_message SEPARATED BY ''.
APPEND gt_message.
CLEAR gt_message.
gv_flag = 'X'.
ENDLOOP.
IF gv_flag = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CONTINUE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
WAIT UP TO 1 SECONDS.
CLEAR: gt_return,gt_poschedule,gt_poschedulex,gv_flag,gt_poitem,gt_poitemx.
REFRESH : gt_return,gt_poschedule,gt_poschedulex,gt_poitem,gt_poitemx.
*创建采购订单
*物料数量信息
gt_poitem-po_item = gv_item.
gt_poitem-quantity = wa_data-menge2.
gt_poitem-material = wa_data-matnr.
gt_poitem-plant = gt_ekpo-werks.
gt_poitem-item_cat = gt_ekpo-pstyp.
gt_poitem-stge_loc = gt_ekpo-lgort.
APPEND gt_poitem.
CLEAR gt_poitem.
gt_poitemx-po_item = gv_item.
gt_poitemx-po_itemx = 'X'.
gt_poitemx-material = 'X'.
gt_poitemx-plant = 'X'.
gt_poitemx-item_cat = 'X'.
gt_poitemx-stge_loc = 'X'.
APPEND gt_poitemx.
CLEAR gt_poitemx.
*修改采购订单
gt_poschedule-po_item = gv_item.
gt_poschedule-delivery_date = wa_data-eindt2.
gt_poschedule-quantity = wa_data-menge2.
APPEND gt_poschedule.
CLEAR gt_poschedule.
gt_poschedulex-po_item = gv_item.
gt_poschedulex-po_itemx = 'X'.
gt_poschedulex-delivery_date = 'X'.
gt_poschedulex-quantity = 'X'.
APPEND gt_poschedulex.
CLEAR gt_poschedulex.
*调用函数增加采购订单行项目
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
purchaseorder = wa_data-ebeln
TABLES
return = gt_return
poschedule = gt_poschedule
poschedulex = gt_poschedulex
poitem = gt_poitem
poitemx = gt_poitemx.
LOOP AT gt_return WHERE type = 'E'.
CONCATENATE '采购订单' wa_data-ebeln '新建项目' gt_return-message INTO gt_message SEPARATED BY ''.
APPEND gt_message.
CLEAR gt_message.
gv_flag = 'X'.
ENDLOOP.
IF gv_flag = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CONTINUE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
WAIT UP TO 1 SECONDS.
*begin modify by zhangzaigang 20120525 物料存在舍入值时重写新增加项目数量
DATA: lv_bstrf LIKE marc-bstrf,
lv_ebelp LIKE ekpo-ebelp.
lv_ebelp = gv_item.
SELECT SINGLE bstrf
INTO lv_bstrf
FROM marc
WHERE matnr = wa_data-matnr
AND werks = gt_ekpo-werks.
IF sy-subrc = 0 AND lv_bstrf <> ''.
REFRESH: gt_poschedule,gt_poschedulex,gt_return.
CLEAR: gt_poschedule,gt_poschedulex,gt_return,gv_flag.
*修改采购订单
gt_poschedule-po_item = gv_item.
gt_poschedule-sched_line = '0001'.
gt_poschedule-quantity = wa_data-menge2.
APPEND gt_poschedule.
CLEAR gt_poschedule.
gt_poschedulex-po_item = gv_item.
gt_poschedulex-po_itemx = 'X'.
gt_poschedulex-sched_line = '0001'.
gt_poschedulex-sched_linex = 'X'.
gt_poschedulex-quantity = 'X'.
APPEND gt_poschedulex.
CLEAR gt_poschedulex.
*调用函数修改采购订单
CALL FUNCTION 'BAPI_PO_CHANGE'
EXPORTING
purchaseorder = wa_data-ebeln
TABLES
return = gt_return
poschedule = gt_poschedule
poschedulex = gt_poschedulex.
LOOP AT gt_return WHERE type = 'E'.
CONCATENATE '采购订单' wa_data-ebeln '项目' lv_ebelp gt_return-message INTO gt_message SEPARATED BY ''.
APPEND gt_message.
CLEAR gt_message.
gv_flag = 'X'.
ENDLOOP.
IF gv_flag = 'X'.
CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
CONTINUE.
ELSE.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
ENDIF.
WAIT UP TO 1 SECONDS.
ENDIF.