最近做了SAP质检同步WMS的接口
需求:将SAP质检的数据同步到WMS
SAP发送使用Http方式传输Json报文格式.
{
"data": [
{
"STATUS_QI": "1",
"MAT_DOC": "3151351",
"CHARG": "23072718053006100",
"WERKS": "LB",
"MATNR": "342352",
"ZWHID": ""
},
{
"STATUS_QI": "2",
"MAT_DOC": "3151352",
"CHARG": "230727180530061002",
"WERKS": "LB",
"MATNR": "3423523",
"ZWHID": ""
}
]
}
WMS返回给SAP的报文格式.
{
"Response": {
"return": {
"returnFlag": "1",
"returnCode": "0000",
"returnDesc": "Success"
}
}
}
其实就是将SAP结构转换成Json报文,调用SAP内置的HttpFM将Json发送WMS, 再将WMS回调的JSon报文转换成SAP结构。
需求的本质还是SAP的结构和Json的互相转换,网上有很多Sap结构转换成Json结构的方法,推荐使用 /ui2/cl_json
代码:
FORM frm_send_pz.
DATA lv_send_url TYPE string.
DATA io_http_client TYPE REF TO if_http_client.
** 质检同步发送报文结构
TYPES: BEGIN OF t_data2,
status_qi TYPE string, "质检标识
mat_doc TYPE string, "物料凭证
charg TYPE string, "批次
werks TYPE string, "工厂
matnr TYPE string, "物料
zwhid TYPE string, "类型
END OF t_data2.
TYPES: tt_data2 TYPE STANDARD TABLE OF t_data2 WITH DEFAULT KEY.
TYPES: BEGIN OF t_json1,
data TYPE tt_data2,
END OF t_json1.
DATA:lt_send_data TYPE TABLE OF t_data2,
lw_send_data TYPE t_data2.
DATA ls_request TYPE t_json1.
** 质检同步WMS接收报文结构
TYPES: BEGIN OF t_return2,
return_flag TYPE string,
return_code TYPE string,
return_desc TYPE string,
END OF t_return2.
TYPES: BEGIN OF t_response3,
return TYPE t_return2,
END OF t_response3.
TYPES: BEGIN OF t_json2,
response TYPE t_response3,
END OF t_json2.
DATA ls_response TYPE t_json2.
** 判断内表中有没有SEL='X'的数据 条件为真返回abap_true 为假返回abap_false
" 这个内表已经在其他代码块处获取数据了
TRY.
DATA(lv_exist) = xsdbool( line_exists( gt_pz_data[ sel = 'X' ] ) ).
ENDTRY.
IF lv_exist = abap_false.
MESSAGE '请选择数据' TYPE 'S' DISPLAY LIKE 'E'.
RETURN.
ENDIF.
" 这个内表已经在其他代码块处获取数据了
LOOP AT gt_pz_data INTO gw_pz_data WHERE sel = abap_true.
IF gw_pz_data-lgort+3(1) = '3'.
lw_send_data-status_qi = '2'.
ELSE.
lw_send_data-status_qi = '1'.
ENDIF.
lw_send_data-mat_doc = |{ gw_pz_data-mblnr ALPHA = OUT }|.
lw_send_data-matnr = |{ gw_pz_data-ummat ALPHA = OUT }|.
lw_send_data-charg = gw_pz_data-umcha.
lw_send_data-werks = gw_pz_data-umwrk.
lw_send_data-zwhid = 'Z01'.
APPEND lw_send_data TO lt_send_data.
ENDLOOP.
ls_request-data = lt_send_data[].
* 将SAP结构数据转换成JSON数据
DATA(lv_send_data) = /ui2/cl_json=>serialize( data = ls_request
compress = abap_false
pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).
* 接口地址
lv_send_url = ''. "这里填WMS提供的被调用URL
TRY.
"创建http客户端并传入URL
cl_http_client=>create_by_url( EXPORTING url = lv_send_url IMPORTING client = io_http_client ).
"设置内容格式和编码格式
io_http_client->request->set_content_type( content_type = 'application/json; charset=utf-8' ).
" 设置方法为 post
io_http_client->request->set_method( if_http_request=>co_request_method_post ).
"设置传输内容
io_http_client->request->set_cdata( data = lv_send_data ).
"发送请求
io_http_client->send( EXCEPTIONS http_communication_failure = 1
http_invalid_state = 2 ).
IF sy-subrc <> 0.
"发送失败,获取失败原因
io_http_client->get_last_error( IMPORTING message = DATA(lv_message) code = DATA(lv_code) ).
CONCATENATE '质检同步WMS失败原因:' lv_message INTO lv_message.
ENDIF.
"读取远程服务器响应
io_http_client->receive( EXCEPTIONS http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3 ).
IF sy-subrc <> 0.
io_http_client->get_last_error( IMPORTING message = DATA(lv_msg) code = DATA(lv_code1) ).
CONCATENATE '质检同步WMS服务器响应失败原因:'lv_msg INTO lv_msg.
ENDIF.
DATA(lv_res) = io_http_client->response->get_cdata( ).
"将Json报文转换成SAP结构
/ui2/cl_json=>deserialize( EXPORTING json = lv_res
pretty_name = /ui2/cl_json=>pretty_mode-camel_case
CHANGING data = ls_response ).
IF ls_response-response-return-return_flag = '1'.
MESSAGE '质检同步WMS成功' TYPE 'S'.
ELSE.
MESSAGE '质检同步WMS失败' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDTRY.
ENDFORM.