SAP CALL WEB SERVICES - 代码篇2
上代码: 使用e-cology开发人员自已开发的WEB SERVICES中的方法 - ErpWorkflowService->DO_WORKFLOW_REQUEST
有点乱,稍做步骤说明:
YFU_SD_SO2OA
将字段属性及字段值放入内表(分为主表和明细表(支持多个明细表))
将第1步结果动态创建内表并创建记录
将内表转为XML
CALL 方法传递参考
检查返回结果
YFU_SD_FHZL2OA(此方法相对简单一些)
将值存入内表
将内表转为XML
CALL 方法传递参考
检查返回结果
示例包含技术:
动态创建内表并创建记录
根据内表生成XML
解悉XML
CALL web service
YFU_SD_SO2OA
function YFU_SD_SO2OA. *"---------------------------------------------------------------------- *"*"局部接口: *" IMPORTING *" VALUE(VBELN) TYPE VBELN DEFAULT '2010000318' *" EXPORTING *" VALUE(OARE) LIKE YFU_NODE_DATA STRUCTURE YFU_NODE_DATA *" TABLES *" RE STRUCTURE BAPIRET2 *"---------------------------------------------------------------------- *抛OA data: LT_VALUE like standard table of YFU_SAP2OA_VALUE with header line, LS_VBAK type VBAK, LS_VBKD type VBKD, LT_VBAP like standard table of VBAP with header line, TEMP type P decimals 2,KNUMV type VBAK-KNUMV, WORKFLOW_ID type CHAR03,REQUEST_ID type CHAR05,CREATOR_ID type CHAR08, FLAG type STRING,TXT type STRING,STR_VBELN type TDOBNAME,AUART type STRING, L_TXT like standard table of TLINE with header line. select single * from VBAK into LS_VBAK where VBELN eq VBELN. if SY-SUBRC eq 0. case LS_VBAK-AUART. when 'ZOR1'. WORKFLOW_ID = 41.AUART = '大货销售订单'. when 'ZOR2'. WORKFLOW_ID = 41.AUART = '大货-CKD/SKD销售订单'. when 'ZOR3'. WORKFLOW_ID = 42.AUART = '试产订单'. when 'ZOR4'. WORKFLOW_ID = 41.AUART = '大货-备库订单'. when 'ZOR5'. WORKFLOW_ID = 43.AUART = '收费备料销售订单'. when 'ZFD1'. WORKFLOW_ID = 43.AUART = '免费备料销售订单'. when 'ZOR6'. WORKFLOW_ID = 44.AUART = '收费样机销售订单'. when 'ZFD2'. WORKFLOW_ID = 44.AUART = '免费样机销售订单'. when 'ZOR7'. "-零星销售订单 WORKFLOW_ID = 0. when 'ZRE1'. "-退货订单 WORKFLOW_ID = 0. when 'ZSV1'. "-服务订单 WORKFLOW_ID = 0. when others. endcase. check WORKFLOW_ID gt 0. IF LS_VBAK-ZZOANO is NOT INITIAL. REQUEST_ID = LS_VBAK-ZZOANO+14. ENDIF. concatenate LS_VBAK-AUART AUART into AUART separated by SPACE. STR_VBELN = VBELN. define REAR_TXT. TXT = ''. CALL FUNCTION 'READ_TEXT'"Save_Text EXPORTING ID = &1 LANGUAGE = &2 NAME = &3 OBJECT = &4 TABLES LINES = L_TXT EXCEPTIONS ID = 1 LANGUAGE = 2 NAME = 3 NOT_FOUND = 4 OBJECT = 5 REFERENCE_CHECK = 6 WRONG_ACCESS_TO_ARCHIVE = 7 OTHERS = 8. IF SY-SUBRC EQ 0. LOOP AT L_TXT. CONCATENATE TXT L_TXT-TDLINE INTO TXT. ENDLOOP. ENDIF. end-of-definition. IF LS_VBAK-ZZYWY is INITIAL. CREATOR_ID = 'B100060'. MESSAGE '测试时先默认使用帐号B100060,正式上线请在业务员栏位中输入业务员OA帐号' TYPE 'I'. ELSE. CREATOR_ID = LS_VBAK-ZZYWY. ENDIF. * WORKFLOW_ID = '44'. * REQUEST_ID = ''. FLAG = 'VA01'. * CREATOR_ID = LS_VBAK-ZZYWY. select * from YFU_SAP2OA_VALUE client specified into table LT_VALUE where FLAG eq FLAG. sort LT_VALUE by FIELD_POS. select single * from VBKD into LS_VBKD where VBELN eq VBELN. KNUMV = LS_VBAK-KNUMV. loop at LT_VALUE where DETAILTABLE eq 'MAIN'. case LT_VALUE-FIELD_NAME. when 'SQR'."申请人 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZYWY. when 'SQRSSBM'."申请人所属部门 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZYWY. when 'SQRSSFB'."申请人所属分部 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZYWY. when 'LCBH'."流程编号 concatenate 'OA' VBELN into LT_VALUE-FIELD_VALUE separated by '-'. when 'XGFJ'."相关附件---X when 'XGWD'."相关文档---X when 'XGLC'."相关流程---X when 'DDLX'."订单类型 LT_VALUE-FIELD_VALUE = AUART. when 'XDBH'."下单编号 LT_VALUE-FIELD_VALUE = VBELN. when 'XDRQ'."下单日期 LT_VALUE-FIELD_VALUE = LS_VBAK-ERDAT . when 'BMBH'."部门编号---X concatenate LS_VBAK-VKORG LS_VBAK-VTWEG LS_VBAK-SPART into LT_VALUE-FIELD_VALUE separated by ' - '."描述 when 'YWY'."业务员 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZYWY. when 'KHDH'."客户单号---X when 'KH'."客户 LT_VALUE-FIELD_VALUE = LS_VBAK-KUNNR. when 'SB'."商标 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZSB. when 'XSGJ'."销售国家 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZXSGJ. when 'GSXH'."公司型号 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZGSXH. when 'KHXH'."客户型号 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZKHXH. when 'HDMD'."货代名称 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZHDMC. when 'MFBJ'."免费备机(≤1% LT_VALUE-FIELD_VALUE = LS_VBAK-ZZMFBJ. when 'MFBJ2'."免费备件(≤1% LT_VALUE-FIELD_VALUE = LS_VBAK-ZZMFBJ2. when 'TPBJ'."特批备件 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZTPBJ. when 'TPBJ2'."特批备机 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZTPBJ2. when 'FFBJ'."付费备件 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZFFBJ. when 'TPBJBJ'."特批备机+备件 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZTPBJ3. when 'JYF'."验货方 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZYHF. when 'AQLZ'."AQL值 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZAQL. when 'ZYJBZFS'."装运及包装方式 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZZYFS. when 'ZYYJQD'."是否有《重要元件清单》(见附件) LT_VALUE-FIELD_VALUE = LS_VBAK-ZZYJQD. when 'KHTSYQ'."客户特殊要求 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZKHTSYQ. when 'FKTJ'."付款条件 LT_VALUE-FIELD_VALUE = LS_VBKD-ZTERM . when 'LCNO'."LC NO LT_VALUE-FIELD_VALUE = LS_VBAK-ZZLCNO. when 'ZDJF'."最低降幅 LT_VALUE-FIELD_VALUE = '?' . when 'DJBL'."订金比率 data INT type P decimals 0. INT = LS_VBAK-ZZDJBL * 100 . LT_VALUE-FIELD_VALUE = INT. condense LT_VALUE-FIELD_VALUE. concatenate LT_VALUE-FIELD_VALUE(2) '%' into LT_VALUE-FIELD_VALUE. when 'BZ'."币种 data:WAERK type FCURR_CURR,LAMOUNT type WERTV. WAERK = LS_VBAK-WAERK. call function 'YFU_TOCURR_GET' exporting FOREIGN_CURRENCY = WAERK LOCAL_CURRENCY = 'RMB' importing LOCAL_AMOUNT = LAMOUNT. TXT = LAMOUNT. concatenate WAERK LAMOUNT into LT_VALUE-FIELD_VALUE separated by ' /'. when 'SZ'."税种 - 转明细表 when 'JGSM'."价格说明 LT_VALUE-FIELD_VALUE = LS_VBAK-ZZJGSM. when 'QTBZ'."其他备注 REAR_TXT 'Z003' '1' STR_VBELN 'VBBK'. LT_VALUE-FIELD_VALUE = TXT . when 'FXED'."风险额度 data:LV_SUM type OBLIG_F02L,LV_CMWAE type WAERS. call function 'CREDIT_EXPOSURE' exporting KKBER = '1000' KUNNR = LS_VBAK-KUNNR DATE_CREDIT_EXPOSURE = '99991231' importing SUM_OPENS = LV_SUM CMWAE = LV_CMWAE. LT_VALUE-FIELD_VALUE = LV_SUM. condense LT_VALUE-FIELD_VALUE. concatenate LT_VALUE-FIELD_VALUE LV_CMWAE into LT_VALUE-FIELD_VALUE separated by SPACE. when 'YSYE'."应收余额 data: BUKRS type VKBUK,AC_BALANCE type BAPI3007_9. select single BUKRS from TVKO into BUKRS where VKORG = LS_VBAK-VKORG. call function 'BAPI_AR_ACC_GETCURRENTBALANCE' exporting COMPANYCODE = BUKRS CUSTOMER = LS_VBAK-KUNNR importing ACTUAL_BALANCE = AC_BALANCE. if SY-SUBRC eq 0. LT_VALUE-FIELD_VALUE = AC_BALANCE-TOTAL_BAL. condense: LT_VALUE-FIELD_VALUE. concatenate LT_VALUE-FIELD_VALUE AC_BALANCE-CURRENCY into LT_VALUE-FIELD_VALUE separated by SPACE. endif. when 'FKXGWJ'."风控相关文件---X when 'GGSFJ'."规格书附件---X when 'GSSCZSL'."公司生产总数量---X when 'TZSBZ'."通知书备注 REAR_TXT 'Z001' '1' STR_VBELN 'VBBK'. LT_VALUE-FIELD_VALUE = TXT . when 'HXSAPZT'."回写SAP状态---X when 'CWXX'."错误信息---X when 'GSMC'."公司名称---X when 'SDF'."送达方 select single KUNNR from VBPA into LS_VBAK-KUNNR where VBELN eq VBELN and PARVW eq 'SH'. LT_VALUE-FIELD_VALUE = LS_VBAK-KUNNR. when 'QQJHRQ'."请求交货日期 LT_VALUE-FIELD_VALUE = LS_VBAK-VDATU . when 'XSDDH'."销售订单号 LT_VALUE-FIELD_VALUE = VBELN . when 'CJRQ'."创建日期 LT_VALUE-FIELD_VALUE = LS_VBAK-ERDAT . when 'FXQD'."分销渠道 concatenate LS_VBAK-VKORG LS_VBAK-VTWEG LS_VBAK-SPART into LT_VALUE-FIELD_VALUE separated by ' - '."描述 when 'KHCGDDBH'."客户采购订单编号 LT_VALUE-FIELD_VALUE = LS_VBKD-BSTKD. when 'SDF2'."售达方 select single KUNNR from VBPA into LS_VBAK-KUNNR where VBELN eq VBELN and PARVW eq 'SH'. LT_VALUE-FIELD_VALUE = LS_VBAK-KUNNR. when 'ZTBZ2'."其他备注二 REAR_TXT 'Z004' '1' STR_VBELN 'VBBK'. LT_VALUE-FIELD_VALUE = TXT . when 'TJLXJE'."条件类型/金额 LT_VALUE-FIELD_VALUE = '不需显示'. when others. endcase. modify LT_VALUE. endloop. data N type I. select * from VBAP into table LT_VBAP where VBELN eq VBELN. describe table LT_VBAP lines N. "汇率统计 - VBAP-STCUR do N times. read table LT_VBAP index SY-INDEX. loop at LT_VALUE where DETAILTABLE cp '*_DT1' and FIELD_ROW eq 1. case LT_VALUE-FIELD_NAME. when 'PH'."品号 when 'PMGG'."品名 when 'MXINDEX'."明细index data NN type I. NN = LT_VBAP-POSNR. LT_VALUE-FIELD_VALUE = NN . when 'WL'."物料 LT_VALUE-FIELD_VALUE = LT_VBAP-MATNR . when 'WLMS'."物料描述 LT_VALUE-FIELD_VALUE = LT_VBAP-ARKTX. when 'LB'."类别 LT_VALUE-FIELD_VALUE = LT_VBAP-PSTYV. when 'DDSLZPSL'."订单数量 LT_VALUE-FIELD_VALUE = LT_VBAP-KWMENG. when 'DJ'."单价 LT_VALUE-FIELD_VALUE = LT_VBAP-NETPR."KPEIN-条件定价单位 KMEIN-条件单位 when 'SE'."税额 * select single KBETR from KONV into TEMP where KNUMV eq KNUMV and KPOSN eq LT_VBAP-POSNR and KSCHL eq 'MWST' . * TEMP = TEMP / LT_VBAP-NETPR . LT_VALUE-FIELD_VALUE = LT_VBAP-MWSBP. when 'JE'."金额 LT_VALUE-FIELD_VALUE = LT_VBAP-NETWR. when 'YJHQ'."预交货期 data DATE type D. select single EDATU into DATE from VBEP where VBELN eq VBELN and POSNR eq LT_VBAP-POSNR. LT_VALUE-FIELD_VALUE = DATE. when 'DJJF'."定价降幅 LT_VALUE-FIELD_VALUE = 0 . when 'BZ'."备注 LT_VALUE-FIELD_VALUE = '?' . when others. endcase. if SY-INDEX eq 1. modify LT_VALUE. else. LT_VALUE-FIELD_ROW = SY-INDEX. append LT_VALUE. endif. endloop. enddo. call function 'YFU_SAP2OA' exporting WORKFLOW_ID = WORKFLOW_ID REQUEST_ID = REQUEST_ID REQUEST_NAME = 'TEST REQUEST' REQUEST_LEVEL = '重要' NEXT = 'X' CREATOR_ID = CREATOR_ID MESSAGE = '自动触发' FLAG = FLAG importing OARE = OARE tables FIELDS = LT_VALUE[]. *WORKFLOW_ID 41大货 42-试产 43-备料 44-样机 if OARE-SUCCESS eq 'true'. * 回写OA流程号 concatenate 'OA' VBELN OARE-REQUESTID into TXT separated by '-'. update VBAK set ZZOANO = TXT ZZFLOW = 'Y' where VBELN = VBELN. * 修改SO状态 call function 'YFU_SD_XSDD_CHANGE' exporting VBELN = VBELN LOCK = 'Y' tables RETURN = RE. RE-TYPE = 'S'. concatenate VBELN ':成功触发流程:' OARE-REQUESTID into RE-MESSAGE. else. RE-TYPE = 'E'. concatenate VBELN ':' OARE-MSG OARE-EXCEPTIONMSG into RE-MESSAGE. endif. else. RE-TYPE = 'E'. concatenate VBELN ':销售订单号有误,请检查后重试!' into RE-MESSAGE. endif. append RE. endfunction.
YFU_SD_FHZL2OA
function YFU_SD_FHZL2OA. *"---------------------------------------------------------------------- *"*"局部接口: *" IMPORTING *" VALUE(VBELN) TYPE VBELN_VA DEFAULT 'Z110000102' *" EXPORTING *" VALUE(OARE) LIKE YFU_NODE_DATA STRUCTURE YFU_NODE_DATA *" TABLES *" RE STRUCTURE BAPIRET2 *"---------------------------------------------------------------------- define CHECKSW. IF &1 EQ 'X'. &1 = '1'. ELSE. &1 = '0'. ENDIF. end-of-definition. define LISTSW. IF &1 EQ 9. &1 = '0'. ENDIF. end-of-definition. define UNITSW. CALL FUNCTION 'CONVERSION_EXIT_CUNIT_OUTPUT' EXPORTING INPUT = &1 * LANGUAGE = SY-LANGU IMPORTING * LONG_TEXT = OUTPUT = &1 * SHORT_TEXT = EXCEPTIONS UNIT_NOT_FOUND = 1 OTHERS = 2. IF SY-SUBRC <> 0. * Implement suitable error handling here ENDIF. end-of-definition. data:LIPS like standard table of ZLIPS with header line, VBELN2 type VBELN_VA,AUART type AUART, WORKFLOW_ID type CHAR03,REQUEST_ID type CHAR05,CREATOR_ID type CHAR08,FLAG type STRING. select * from ZLIPS into table LIPS where VBELN2 eq VBELN. read table LIPS index 1.VBELN2 = LIPS-VBELN. select single AUART from VBAK into AUART where VBELN eq VBELN2. if SY-SUBRC eq 0. case AUART. when 'ZOR1'. WORKFLOW_ID = 45.AUART = '大货销售订单'. when 'ZOR2'. WORKFLOW_ID = 45.AUART = '大货-CKD/SKD销售订单'. when 'ZOR3'. WORKFLOW_ID = 46.AUART = '试产订单'. when 'ZOR4'. WORKFLOW_ID = 45.AUART = '大货-备库订单'. when 'ZOR5'. WORKFLOW_ID = 47.AUART = '收费备料销售订单'. when 'ZFD1'. WORKFLOW_ID = 47.AUART = '免费备料销售订单'. when 'ZOR6'. WORKFLOW_ID = 62.AUART = '收费样机销售订单'. when 'ZFD2'. WORKFLOW_ID = 62.AUART = '免费样机销售订单'. when 'ZOR7'. "-零星销售订单 WORKFLOW_ID = 0. when 'ZRE1'. "-退货订单 WORKFLOW_ID = 0. when 'ZSV1'. "-服务订单 WORKFLOW_ID = 0. when others. endcase. check WORKFLOW_ID gt 0. FLAG = 'ZVL01'. loop at LIPS. UNITSW LIPS-VRKME. modify LIPS. endloop. export LIPS to memory id 'DT1'. *抛OA data: begin of LIKP occurs 0. include type ZLIKP as ZLIKP. data: FXED type STRING, YSYE type STRING, LCBH type STRING. data end of LIKP. select single * from ZLIKP into corresponding fields of LIKP where VBELN2 eq VBELN. IF LIKP-ZZOANO is NOT INITIAL. REQUEST_ID = LIKP-ZZOANO+14. ENDIF. CREATOR_ID = LIKP-ZZYWY."'B100080'. WORKFLOW_ID = '62'. REQUEST_ID = ''. CHECKSW:LIKP-ZLSCD,LIKP-ZLSCD2,LIKP-ZLSCD3,LIKP-ZCDZ."CHECK Box LISTSW:LIKP-ZHDFS,LIKP-ZZYFS,LIKP-ZBZFS,LIKP-ZBOAT2. "LIST Box "流程编号 concatenate 'OA' VBELN into LIKP-LCBH separated by '-'. "风险额度 data:LV_SUM type OBLIG_F02L,LV_CMWAE type WAERS. call function 'CREDIT_EXPOSURE' exporting KKBER = '1000' KUNNR = LIKP-KUNNR DATE_CREDIT_EXPOSURE = '99991231' importing SUM_OPENS = LV_SUM CMWAE = LV_CMWAE. LIKP-FXED = LV_SUM. condense LIKP-FXED. concatenate LIKP-FXED LV_CMWAE into LIKP-FXED separated by SPACE. "应收余额 data: BUKRS type VKBUK,AC_BALANCE type BAPI3007_9. select single BUKRS from TVKO into BUKRS where VKORG = LIKP-VKORG. call function 'BAPI_AR_ACC_GETCURRENTBALANCE' exporting COMPANYCODE = BUKRS CUSTOMER = LIKP-KUNNR importing ACTUAL_BALANCE = AC_BALANCE. if SY-SUBRC eq 0. LIKP-YSYE = AC_BALANCE-TOTAL_BAL. condense: LIKP-YSYE. concatenate LIKP-YSYE AC_BALANCE-CURRENCY into LIKP-YSYE separated by SPACE. endif. append LIKP. export LIKP to memory id 'MAIN'. call function 'YFU_SAP2OA' exporting WORKFLOW_ID = WORKFLOW_ID REQUEST_ID = REQUEST_ID REQUEST_NAME = 'TEST REQUEST' REQUEST_LEVEL = '重要' NEXT = 'X' CREATOR_ID = CREATOR_ID MESSAGE = '自动触发' FLAG = FLAG importing OARE = OARE. if OARE-SUCCESS eq 'true'. * 回写OA流程号 data TXT type STRING. concatenate 'OA' VBELN OARE-REQUESTID into TXT separated by '-'. update ZLIKP set ZZOANO = TXT ZZFLOW = 'Y' where VBELN2 eq VBELN. *修改发货指令状态 call function 'YFU_SD_FHZL_CHANGE' exporting FHZLH = VBELN SIGN = '1' * AUDIT = tables RETURN = RE. RE-TYPE = 'S'. concatenate VBELN ':成功触发流程:' OARE-REQUESTID into RE-MESSAGE. else. RE-TYPE = 'E'. concatenate VBELN ':' OARE-MSG into RE-MESSAGE. endif. else. RE-TYPE = 'E'. concatenate VBELN ':发货指令号有误,请检查后重试!' into RE-MESSAGE. endif. append RE. endfunction.
YFU_SAP2OA
*PARSE_XML data:L_DOC type ref to IF_IXML_DOCUMENT, RE type YFU_NODE_DATA. function YFU_SAP2OA. *"---------------------------------------------------------------------- *"*"局部接口: *" IMPORTING *" REFERENCE(WORKFLOW_ID) TYPE CHAR03 DEFAULT '41' *" REFERENCE(REQUEST_ID) TYPE CHAR05 DEFAULT '' *" REFERENCE(REQUEST_NAME) TYPE CHAR128 DEFAULT 'TEST REQUEST' *" REFERENCE(REQUEST_LEVEL) TYPE CHAR04 DEFAULT '重要' *" REFERENCE(NEXT) TYPE CHAR01 DEFAULT 'X' *" REFERENCE(CREATOR_ID) TYPE CHAR08 DEFAULT 'A16106' *" REFERENCE(MESSAGE) TYPE CHAR128 DEFAULT '自动触发' *" REFERENCE(FLAG) TYPE STRING DEFAULT 'VA01' *" EXPORTING *" REFERENCE(OARE) LIKE YFU_NODE_DATA STRUCTURE YFU_NODE_DATA *" TABLES *" FIELDS STRUCTURE YFU_SAP2OA_VALUE OPTIONAL *" RAISING *" CX_AI_SYSTEM_FAULT *" CX_AI_APPLICATION_FAULT *"---------------------------------------------------------------------- type-pools: SLIS. *==================================================ITAB2XML--001 *&————2nd step: create the XML types: begin of XML_LINE, DATA(256) type X, end of XML_LINE. data: L_IXML type ref to IF_IXML, L_ENCODING type ref to IF_IXML_ENCODING, L_COMMENT type ref to IF_IXML_COMMENT, L_ROOT type ref to IF_IXML_ELEMENT, L_RVAL type I, L_OSTREAM type ref to IF_IXML_OSTREAM, L_FACTORY type ref to IF_IXML_STREAM_FACTORY, XML_TABLE type table of XML_LINE, XML_SIZE type I. **create the IXML instance class CL_IXML definition load. L_IXML = CL_IXML=>CREATE( ). **set the Encoding call method L_IXML->CREATE_ENCODING exporting BYTE_ORDER = 0 CHARACTER_SET = 'UTF-8' receiving RVAL = L_ENCODING. **create XML Documnet call method L_IXML->CREATE_DOCUMENT receiving RVAL = L_DOC. call method L_DOC->SET_ENCODING exporting ENCODING = L_ENCODING. **Create the 1st XML node call method L_DOC->CREATE_SIMPLE_ELEMENT exporting NAME = 'root' PARENT = L_DOC receiving RVAL = L_ROOT. **Create attribute of 1st XML node call method L_ROOT->SET_ATTRIBUTE exporting NAME = FLAG VALUE = 'sample' receiving RVAL = L_RVAL. **Create one Comment call method L_DOC->CREATE_COMMENT exporting COMMENT = 'SAP TO OA' receiving RVAL = L_COMMENT. **Create child node to the 1st Root Node call method L_ROOT->APPEND_CHILD exporting NEW_CHILD = L_COMMENT receiving RVAL = L_RVAL. *==================================================TABLE_CREATE if FLAG ne 'ZVL01'. field-symbols: type standard table, " 内表结构 type standard table, " 内表结构 type standard table, " 内表结构 type standard table, " 内表结构 , " 表头 . " 项 data: DY_TABLE type ref to DATA, DY_LINE type ref to DATA, " 行 XFC type LVC_S_FCAT, " 列结构 IFC type LVC_T_FCAT, " 列内表 TXT(254) type C. sort FIELDS[] by FIELD_POS. ******************'MAIN' loop at FIELDS where DETAILTABLE eq 'MAIN'. clear XFC. XFC-FIELDNAME = FIELDS-FIELD_NAME. XFC-DATATYPE = FIELDS-FIELD_TYPE. XFC-INTLEN = FIELDS-FIELD_LEN. append XFC to IFC. endloop. check IFC is not initial. call method CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE exporting IT_FIELDCATALOG = IFC importing EP_TABLE = DY_TABLE. assign DY_TABLE->* to . assign DY_TABLE->* to . create data DY_LINE like line of . assign DY_LINE->* to . clear: XFC, IFC. loop at FIELDS where DETAILTABLE eq 'MAIN'. assign component FIELDS-FIELD_NAME of structure to . condense FIELDS-FIELD_VALUE. = FIELDS-FIELD_VALUE. endloop. append to . perform FILL_XML tables using 'data' 'main' L_ROOT."Call Method of Filling data to XML node * export to memory id 'MAIN'. * FREE MEMORY ID 'MAIN'. ******************'DT1' loop at FIELDS where DETAILTABLE cp '*_DT1' and FIELD_ROW eq 1. clear XFC. XFC-FIELDNAME = FIELDS-FIELD_NAME. XFC-DATATYPE = FIELDS-FIELD_TYPE. XFC-INTLEN = FIELDS-FIELD_LEN. append XFC to IFC. endloop. if IFC is not initial. call method CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE exporting IT_FIELDCATALOG = IFC importing EP_TABLE = DY_TABLE. assign DY_TABLE->* to . assign DY_TABLE->* to . create data DY_LINE like line of . assign DY_LINE->* to . clear: XFC, IFC. sort FIELDS by DETAILTABLE FIELD_ROW FIELD_POS. data IDX type N value '1'. loop at FIELDS where DETAILTABLE cp '*_DT1'. if FIELDS-FIELD_ROW ne IDX. IDX = FIELDS-FIELD_ROW. append to . endif. assign component FIELDS-FIELD_NAME of structure to . condense FIELDS-FIELD_VALUE. = FIELDS-FIELD_VALUE. endloop. append to . perform FILL_XML tables using 'data' 'detailtable1' L_ROOT."Call Method of Filling data to XML node endif. ******************'DT2' loop at FIELDS where DETAILTABLE cp '*_DT2' and FIELD_ROW eq 1. clear XFC. XFC-FIELDNAME = FIELDS-FIELD_NAME. XFC-DATATYPE = 'CHAR'. XFC-INTLEN = FIELDS-FIELD_LEN. append XFC to IFC. endloop. if IFC is not initial. call method CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE exporting IT_FIELDCATALOG = IFC importing EP_TABLE = DY_TABLE. assign DY_TABLE->* to . assign DY_TABLE->* to . create data DY_LINE like line of . assign DY_LINE->* to . clear: XFC, IFC. IDX = 1. loop at FIELDS where DETAILTABLE cp '*_DT2'. if FIELDS-FIELD_ROW ne IDX. IDX = FIELDS-FIELD_ROW. append to . endif. assign component FIELDS-FIELD_NAME of structure to . condense FIELDS-FIELD_VALUE. = FIELDS-FIELD_VALUE. endloop. append to . perform FILL_XML tables using 'data' 'detailtable2' L_ROOT."Call Method of Filling data to XML node endif. else. data: begin of LIKP occurs 0. include type ZLIKP as ZLIKP. data: FXED type STRING, YSYE type STRING, LCBH type STRING. data end of LIKP. data:LIPS like standard table of ZLIPS with header line. import LIKP from memory id 'MAIN'. perform FILL_XML tables LIKP using 'data' 'main' L_ROOT."Call Method of Filling data to XML node free memory id 'MAIN'. import LIPS from memory id 'DT1'. perform FILL_XML tables LIPS using 'data' 'detailtable1' L_ROOT."Call Method of Filling data to XML node free memory id 'DT1'. endif. *==================================================ITAB2XML--002 **Call XML Stream Factory call method L_IXML->CREATE_STREAM_FACTORY receiving RVAL = L_FACTORY. **change the XML data to table call method L_FACTORY->CREATE_OSTREAM_ITABLE exporting TABLE = XML_TABLE receiving RVAL = L_OSTREAM. call method L_DOC->RENDER exporting OSTREAM = L_OSTREAM RECURSIVE = 'X'. call method L_OSTREAM->GET_NUM_WRITTEN_RAW receiving RVAL = XML_SIZE. data LS_TMP_STRING type STRING. call function 'SCMS_BINARY_TO_STRING' exporting INPUT_LENGTH = XML_SIZE importing TEXT_BUFFER = LS_TMP_STRING * OUTPUT_LENGTH = tables BINARY_TAB = XML_TABLE exceptions FAILED = 1 others = 2. if SY-SUBRC <> 0. "error endif. *==================================================Call Web Services data: WS type ref to YOA_CO_ERP_WORKFLOW_SERVICE_PO, EXP type YOA_DO_WORKFLOW_REQUEST_REQUES, IMP type YOA_DO_WORKFLOW_REQUEST_RESPON, UID type STRING,TEMP(72),XML type STRING. create object WS. EXP-IN0 = WORKFLOW_ID. "流程ID EXP-IN1 = REQUEST_ID."请求ID,为空创建,否则赋值 EXP-IN2 = REQUEST_NAME."流程标题 EXP-IN3 = REQUEST_LEVEL."紧急程度=正常、重要、紧急 EXP-IN4 = NEXT."自动转下个节点=true,false EXP-IN5 = LS_TMP_STRING. EXP-IN6 = CREATOR_ID."下个节点操作人 EXP-IN7 = MESSAGE."审批意见 try. call method WS->DO_WORKFLOW_REQUEST exporting DO_WORKFLOW_REQUEST_REQUEST = EXP importing DO_WORKFLOW_REQUEST_RESPONSE = IMP. *==================================================PARSE XML * MIME object data: REF_MIME_API type ref to IF_MR_API, LS_XSTRING type XSTRING, * LS_TMP_STRING type STRING, LW_NUMBER type I, LT_CNTBIN type SDOKCNTBINS. * XML proxy class data: * L_IXML type ref to IF_IXML, L_STREAMFACTORY type ref to IF_IXML_STREAM_FACTORY, L_ISTREAM type ref to IF_IXML_ISTREAM, L_DOCUMENT type ref to IF_IXML_DOCUMENT, L_XMLNODE type ref to IF_IXML_NODE, L_PARSER type ref to IF_IXML_PARSER. LS_TMP_STRING = IMP-OUT. L_IXML = CL_IXML=>CREATE( ). ** Creating a stream factory L_STREAMFACTORY = L_IXML->CREATE_STREAM_FACTORY( ). if LS_TMP_STRING is not initial . L_ISTREAM = L_STREAMFACTORY->CREATE_ISTREAM_CSTRING( STRING = LS_TMP_STRING ). endif. check L_ISTREAM is bound. ** Creating a document L_DOCUMENT = L_IXML->CREATE_DOCUMENT( ). ** Create a Parser L_PARSER = L_IXML->CREATE_PARSER( STREAM_FACTORY = L_STREAMFACTORY ISTREAM = L_ISTREAM DOCUMENT = L_DOCUMENT ). if L_PARSER->PARSE( ) ne 0. if L_PARSER->NUM_ERRORS( ) ne 0. ** Parse XML string failed write:/ 'Parse XML failed!'. leave to list-processing. endif. endif. call method L_ISTREAM->CLOSE( ). clear L_ISTREAM. ** XML node L_XMLNODE ?= L_DOCUMENT. *3. Parse XML string using the XML Proxy class perform PARSE_XML using L_XMLNODE. "last record catch CX_AI_SYSTEM_FAULT . RE-SUCCESS = 'false'. RE-MSG = '连接OA失败(网络原因),请确认OA是否可以正常访问!'. catch CX_AI_APPLICATION_FAULT . RE-SUCCESS = 'false'. RE-MSG = '连接OA失败(程序原因),请联系管理员处理!'. endtry. *==================================================Return Info OARE = RE. endfunction. *==================================================Form fill_xml(填充) form FILL_XML tables INTAB using NODE1NAME type STRING NODE2NAME type STRING L_PARENT type ref to IF_IXML_ELEMENT. types: begin of TYP_COMP , LENGTH type I , DECIMALS type I, TYPE_KIND type C, NAME(30) type C, end of TYP_COMP. data:LS_COMP type TYP_COMP , LT_COMP type table of TYP_COMP. * data L_DOC type ref to IF_IXML_DOCUMENT. data DESCR_REF type ref to CL_ABAP_STRUCTDESCR. field-symbols: type ABAP_COMPDESCR , , type ANY . data: N type I , STR type STRING , TEXT1 type STRING, ITEMNAME type STRING , L_NODE type ref to IF_IXML_ELEMENT, L_ITEM type ref to IF_IXML_ELEMENT, L_ELEMENT type ref to IF_IXML_ELEMENT. DESCR_REF ?= CL_ABAP_TYPEDESCR=>DESCRIBE_BY_DATA( INTAB ). loop at DESCR_REF->COMPONENTS assigning . move-corresponding to LS_COMP. translate LS_COMP-NAME to lower case. append LS_COMP to LT_COMP. endloop. * create the element of the incoming element try . call method L_DOC->CREATE_SIMPLE_ELEMENT exporting NAME = NODE1NAME PARENT = L_PARENT receiving RVAL = L_NODE. catch CX_SY_REF_IS_INITIAL. break-point. endtry. * record the number of the fields of this structure describe table LT_COMP lines N. * every record will be one element to XML loop at INTAB assigning . **add the element to the 2nd level call method L_DOC->CREATE_SIMPLE_ELEMENT exporting NAME = NODE2NAME PARENT = L_NODE receiving RVAL = L_ITEM. do N times. assign component SY-INDEX of structure to . STR = . read table LT_COMP into LS_COMP index SY-INDEX. if LS_COMP-TYPE_KIND = 'I' or LS_COMP-TYPE_KIND = 'P' or LS_COMP-TYPE_KIND = 'F'. search STR for '-'. if SY-SUBRC = 0 and SY-FDPOS <> 0. split STR at '-' into STR TEXT1. condense STR. concatenate '-' STR into STR. else. condense STR. endif. elseif LS_COMP-TYPE_KIND = 'D'. define DATESW. CONCATENATE &1(4) &1+4(2) &1+6(2) INTO &1 SEPARATED BY '-'. end-of-definition. DATESW STR. * SHIFT str LEFT DELETING LEADING '0' . endif. ITEMNAME = LS_COMP-NAME . call method L_DOC->CREATE_SIMPLE_ELEMENT exporting NAME = ITEMNAME PARENT = L_ITEM VALUE = STR receiving RVAL = L_ELEMENT. enddo. endloop. endform. "fill_xml *==================================================Form PARSE_XML(递归) form PARSE_XML using IO_XMLNODE type ref to IF_IXML_NODE. data: LW_NODENAM type STRING, LW_NODE type ref to IF_IXML_NODE. case IO_XMLNODE->GET_TYPE( ). when IF_IXML_NODE=>CO_NODE_ELEMENT. LW_NODENAM = IO_XMLNODE->GET_NAME( ). case LW_NODENAM. when 'ResultInfo'. * if RE is not initial. * append RE. * endif. * clear RE. when 'success'. RE-SUCCESS = IO_XMLNODE->GET_VALUE( ). when 'workflowId'. RE-WORKFLOWID = IO_XMLNODE->GET_VALUE( ). when 'workflowCode'. RE-WORKFLOWCODE = IO_XMLNODE->GET_VALUE( ). when 'requestId'. RE-REQUESTID = IO_XMLNODE->GET_VALUE( ). when 'requestHandleMode'. RE-REQUESTHANDLEMODE = IO_XMLNODE->GET_VALUE( ). when 'executeHandleMode'. RE-EXECUTEHANDLEMODE = IO_XMLNODE->GET_VALUE( ). when 'msg'. RE-MSG = IO_XMLNODE->GET_VALUE( ). when 'exceptionMsg'. RE-EXCEPTIONMSG = IO_XMLNODE->GET_VALUE( ). endcase. endcase. * recursion method LW_NODE = IO_XMLNODE->GET_FIRST_CHILD( ). while not LW_NODE is initial. perform PARSE_XML using LW_NODE . LW_NODE = LW_NODE->GET_NEXT( ). endwhile. endform. " PARSE_XML









