在用webservice進行數據傳輸的過程當中,SAP系統與.net開發的信息系統之間的數據調用。如何用SAP調用外部的.net系統發佈的webservice程序來獲取外部的數據,詳情請見下文:node
1,建立代理web
事務碼:SE80dom
【右鍵】-【create】-【enterprise service】函數
選擇【service consumer】點擊【繼續】spa
選擇【URL/HTTP Destination】,點擊【繼續】.net
填寫URL地址,地址是wsdl結尾的地址,而後點擊【繼續】代理
package處輸入程序包,prefix處輸入名稱,request/task中輸入請求號名稱,點擊【繼續】調試
點擊【complete】xml
而後點擊【保存】,而後進行【激活】,則代理就建立好了事務
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.