在用webservice進行數據傳輸的過程中,SAP系統與.net開發的信息系統之間的數據調用。如何用SAP調用外部的.net系統發布的webservice程序來獲取外部的數據,詳情請見下文:
1,創建代理
事務碼:SE80

【右鍵】-【create】-【enterprise service】

選擇【service consumer】點擊【繼續】

選擇【URL/HTTP Destination】,點擊【繼續】

填寫URL地址,地址是wsdl結尾的地址,然后點擊【繼續】

package處輸入程序包,prefix處輸入名稱,request/task中輸入請求號名稱,點擊【繼續】

點擊【complete】

然后點擊【保存】,然后進行【激活】,則代理就創建好了
2,調用邏輯代理端口
事務碼:LPCONFIG

填寫【代理類】名稱,【邏輯端口】名稱(代理名稱就是上創建的代理名稱,邏輯端口名稱與代理類名稱相同即可),勾選【缺省端口】,點擊創建

填寫【描述】,勾選【全局設置】中的【狀態管理】,保存

填寫【調用參數】中的URL地址(以?wsdl結束的地址),然后保存

輸入對應的URL地址中的對應方法的soapAction找到如下部分代碼:
將其中的soapaction部分放入到SOAP操作,點擊【保存】,然后點擊【激活】
3,創建調用程序
事務碼:SE38

填寫程序名稱,點擊【創建】

填寫【title】,選擇【type】,然后點擊【保存】

選擇【開發類】,點擊【保存】,輸入請求號,程序就創建好了
SAP程序中撰寫調用.net中的webservice的中的helloworld方法程序,直接第1步中創建好的代理拖拉到創建好的程序中,則會自動生成代碼,將代碼修改如下所示:
"定義調用函數名稱
DATA: ZHELLOWORLD TYPE REF TO ZCRM_DELIVERYCO_SERVICE_SOAP .
TRY.
CREATE OBJECT ZHELLOWORLD
* EXPORTING
"定義邏輯端口名稱
LOGICAL_PORT_NAME = 'ZCRM_DELIVERYCO_SERVICE_SOAP'
.
CATCH CX_AI_SYSTEM_FAULT .
ENDTRY.
"定義輸入輸出參數類型
data: ZOUTPUT type ZCRM_DELIVERY_WSHELLO_WORLD_SO .
data: ZINPUT type ZCRM_DELIVERY_WSHELLO_WORLD_S1 .
TRY.
CALL METHOD XXXXXXXX->HELLO_WORLD
EXPORTING
INPUT = ZINPUT
IMPORTING
OUTPUT = ZOUTPUT
.
* CATCH CX_AI_SYSTEM_FAULT .
* CATCH CX_AI_APPLICATION_FAULT .
ENDTRY.
通過調試上述代碼,則可以看到調用到的數據
如果對方給定的webservice的URL地址中包含有消息頭文件,則在程序中需要添加消息頭文件的說明,其代碼如下:
REPORT ZHELLOWORLD.
"聲明消息頭header文件
data: ws_header TYPE REF TO if_wsprotocol_ws_header,
name TYPE string,
namespace TYPE string.
DATA: ZHELLOWORLD TYPE REF TO ZCRM_DELIVERYCO_SERVICE_SOAP .
TRY.
CREATE OBJECT ZHELLOWORLD
* EXPORTING
* LOGICAL_PORT_NAME =
.
ws_header ?= ZHELLOWORLD->get_protocol('IF_WSPROTOCOL_WS_HEADER').
DATA: ixml TYPE REF TO if_ixml,
xml_document TYPE REF TO if_ixml_document,
xml_root TYPE REF TO if_ixml_element,
xml_element TYPE REF TO if_ixml_element,
xml_node TYPE REF TO if_ixml_node.
DATA l_xstring TYPE xstring.
DATA l_string TYPE string.
FIELD-SYMBOLS <fs_xstring> TYPE xstring.
CONCATENATE
"消息頭文件header中的內容
'<soap:Header>'
'<s1:MySoapHeader xmlns:s1="http://tempuri.org/">'
"'<s1:RegisteredUser>'
'<s1:Uname>admin</s1:Uname>'
'<s1:Password>admin</s1:Password>'
"'</s1:RegisteredUser>
'</s1:MySoapHeader>'
'</soap:Header>' INTO l_string.
l_xstring = cl_proxy_service=>cstring2xstring( l_string ).
IF NOT l_string IS INITIAL.
CALL FUNCTION 'SDIXML_XML_TO_DOM'
EXPORTING
xml = l_xstring
IMPORTING
document = xml_document
EXCEPTIONS
invalid_input = 1
OTHERS = 2.
IF sy-subrc = 0 AND NOT xml_document IS INITIAL.
xml_root = xml_document->get_root_element( ).
xml_element ?= xml_root->get_first_child( ).
WHILE NOT xml_element IS INITIAL.
name = xml_element->get_name( ).
namespace = 'http://tempuri.org/' . "xml_element->get_namespace_uri( ).
IF NOT xml_element IS INITIAL.
ENDIF.
ws_header->set_request_header(
name = name
namespace = namespace
dom = xml_element ).
xml_element ?= xml_element->get_next( ).
ENDWHILE.
ENDIF.
ENDIF.
CATCH CX_AI_SYSTEM_FAULT .
ENDTRY.
data: OUTPUT type ZCRM_DELIVERY_WSHELLO_WORLD_SO .
data: INPUT type ZCRM_DELIVERY_WSHELLO_WORLD_S1 .
TRY.
CALL METHOD ZSALES->HELLO_WORLD
EXPORTING
INPUT = ZINPUT
IMPORTING
OUTPUT = ZOUTPUT
.
* CATCH CX_AI_SYSTEM_FAULT .
* CATCH CX_AI_APPLICATION_FAULT .
ENDTRY.
