SAP ABAP 通用基础数据查询

发布时间:2026/6/27 22:12:03
SAP ABAP 通用基础数据查询 背景外围系统需要同步大量SAP key-value结构的基础配置数据故有此开发实现接口结构结构字段注释t_fields查询结果集字段.tablename表.tablefield表字段.byname别名.keymark主键标志可用于排序t_connect数据库表.keyflag关系键用于关联relationship表的关联关系.cnttyp关联类型(INNER/LEFT等).tablename表t_connect_relationship表的关联关系.keyflag关系键.tableleft左表.fieldleft左表字段.tableright右表.fieldright右表字段t_cond查询条件.tablename表.tablefield表字段.values值代码实现METHODzii_si_syncbasicdata_in~si_syncbasicdata_in.*******INSERTIMPLEMENTATIONHERE*******DATA:lv_charTYPEchar10,lv_rollnameTYPErollname.DATA:lv_selc_fieldsTYPEstring,lv_connectTYPEstring,lv_condTYPEstring.DATA:d_refTYPEREFTOdata,lr_table_typeTYPEREFTOcl_abap_tabledescr,lr_struct_typeTYPEREFTOcl_abap_structdescr,lr_abap_elemdescrTYPEREFTOcl_abap_elemdescr,lt_comp_tableTYPEcl_abap_structdescrcomponent_table,ls_comp_tableTYPELINEOFcl_abap_structdescrcomponent_table.DATA:lt_sortTYPEabap_sortorder_tab.DATA:BEGINOFls_convert,componentTYPEchar30,functionTYPEchar30.DATAENDOFls_convert.DATAlt_convertLIKETABLEOFls_convert.CHECKinput-mt_syncbasicdata_req-selc-t_connectISNOTINITIAL.***拼接查询字段 lv_char,.LOOPATinput-mt_syncbasicdata_req-selc-t_fieldsINTODATA(ls_field).**收集结果集字段用于动态生成内表CLEAR:ls_comp_table,lr_abap_elemdescr.ls_comp_table-nameCOND#(WHENls_field-bynameISINITIALTHENls_field-tablefieldELSEls_field-byname).SELECTSINGLErollnameFROMdd03lINTOlv_rollnameWHEREtabnamels_field-tablenameANDfieldnamels_field-tablefield.ls_comp_table-type?cl_abap_typedescrdescribe_by_name(lv_rollname).APPENDls_comp_tableTOlt_comp_table.**收集需要转码的字段 lr_abap_elemdescr?ls_comp_table-type.IFlr_abap_elemdescr-edit_maskISNOTINITIAL.ls_convert-componentls_comp_table-name.ls_convert-function|CONVERSION_EXIT_{lr_abap_elemdescr-edit_mask2}_OUTPUT|.APPENDls_convertTOlt_convert.ENDIF.**主键用于排序IFls_field-keymarkEQabap_true.APPENDVALUE#(namels_comp_table-name)TOlt_sort.ENDIF.IFsy-tabixEQ1.lv_selc_fields|{ls_field-tablename}~{ls_field-tablefield}|.ELSE.lv_selc_fields|{lv_selc_fields}{ls_field-tablename}~{ls_field-tablefield}|.ENDIF.IFls_field-bynameISNOTINITIAL.lv_selc_fields|{lv_selc_fields}AS{ls_field-byname}|.ENDIF.ATLAST.CLEARlv_char.ENDAT.lv_selc_fieldslv_selc_fieldslv_char.ENDLOOP.***拼接表的关联关系IFinput-mt_syncbasicdata_req-selc-t_connect_relationshipISINITIAL.READTABLEinput-mt_syncbasicdata_req-selc-t_connectINTODATA(ls_connect)INDEX1.lv_connectls_connect-tablename.ELSE.LOOPATinput-mt_syncbasicdata_req-selc-t_connectINTOls_connect.IFsy-tabixEQ1.lv_connectls_connect-tablename.ELSE.lv_connect|{lv_connect}{ls_connect-cnttyp}join{ls_connect-tablename}|.ENDIF.ATENDOFkeyflag.lv_connect|{lv_connect}on|.READTABLEinput-mt_syncbasicdata_req-selc-t_connect_relationshipWITHKEYkeyflagls_connect-keyflagTRANSPORTINGNOFIELDS.IFsy-subrc0.LOOPATinput-mt_syncbasicdata_req-selc-t_connect_relationshipINTODATA(ls_connect_relationship)FROMsy-tabix.IFls_connect-keyflagls_connect_relationship-keyflag.EXIT.ENDIF.lv_connect|{lv_connect}{ls_connect_relationship-tableleft}~{ls_connect_relationship-fieldleft}|.lv_connect|{lv_connect}{ls_connect_relationship-tableright}~{ls_connect_relationship-fieldright}AND|.ENDLOOP.lv_connectshift_right(vallv_connect sub|AND|).ENDIF.ENDAT.ENDLOOP.ENDIF.***拼接查询条件DATA:ls_condTYPEzdt_syncbasicdata_req_t_cond,lv_cond_centerTYPEstring.DATA:BEGINOFls_cond_line,tablenameTYPEstring,tablefieldTYPEstring,linesTYPEint4.DATAENDOFls_cond_line.DATAlt_cond_linesLIKETABLEOFls_cond_line.LOOPATinput-mt_syncbasicdata_req-selc-t_condINTOls_cond.READTABLElt_cond_linesASSIGNINGFIELD-SYMBOL(fs_cond_line)WITHKEYtablenamels_cond-tablename tablefieldls_cond-tablefield.IFsy-subrc0.APPENDINITIALLINETOlt_cond_linesASSIGNINGfs_cond_line.fs_cond_line-tablenamels_cond-tablename.fs_cond_line-tablefieldls_cond-tablefield.ENDIF.fs_cond_line-lines1.ENDLOOP.LOOPATlt_cond_linesINTODATA(ls_cond_lines).CLEAR:lv_cond_center.READTABLEinput-mt_syncbasicdata_req-selc-t_condWITHKEYtablenamels_cond_lines-tablename tablefieldls_cond_lines-tablefieldTRANSPORTINGNOFIELDS.IFsy-subrc0.LOOPATinput-mt_syncbasicdata_req-selc-t_condINTOls_condFROMsy-tabix.IFls_cond-tablenamels_cond_lines-tablenameORls_cond-tablefieldls_cond_lines-tablefield.EXIT.ENDIF.lv_cond_center|{lv_cond_center}{ls_cond-tablename}~{ls_cond-tablefield}{ls_cond-values}OR|.ENDLOOP.lv_cond_centershift_right(vallv_cond_center sub|OR|).ENDIF.IFls_cond_lines-lines1.lv_cond|{lv_cond}{lv_cond_center}AND|.ELSE.lv_cond|{lv_cond}({lv_cond_center})AND|.ENDIF.ENDLOOP.lv_condshift_right(vallv_cond sub|AND|).***动态生成内表FIELD-SYMBOLSfs_tableTYPEANYTABLE.lr_struct_typecl_abap_structdescrcreate(p_componentslt_comp_table[]p_strictabap_false).lr_table_typecl_abap_tabledescrcreate(lr_struct_type).CREATEDATAd_refTYPEHANDLElr_table_type.ASSIGNd_ref-*TOfs_table.TRY.SELECT(lv_selc_fields)FROM(lv_connect)WHERE(lv_cond)INTOCORRESPONDINGFIELDSOFTABLEfs_table.IFlt_sortISNOTINITIAL.SORTfs_tableBY(lt_sort).ENDIF.IFlt_convertISNOTINITIAL.LOOPATfs_tableASSIGNINGFIELD-SYMBOL(fs_line).LOOPATlt_convertINTOls_convert.ASSIGNCOMPONENTls_convert-componentOFSTRUCTUREfs_lineTOFIELD-SYMBOL(fs_value).CHECKsy-subrc0.CALLFUNCTIONls_convert-functionEXPORTINGinputfs_valueIMPORTINGoutputfs_valueEXCEPTIONSlength_error1OTHERS2.ENDLOOP.ENDLOOP.ENDIF.output-mt_syncbasicdata_res-typeS.output-mt_syncbasicdata_res-message查询已完成.output-mt_syncbasicdata_res-resultjson/ui2/cl_jsonserialize(EXPORTINGdatafs_tablecompressXpretty_nameL).CATCHcx_rootINTODATA(ls_root).output-mt_syncbasicdata_res-typeE.output-mt_syncbasicdata_res-messagels_root-get_text().ENDTRY.ENDMETHOD.示例单表查询请求参数{selc:{t_fields:[{tablename:TNLST,tablefield:NIELS,byname:,keymark:X},{tablename:TNLST,tablefield:SPRAS,byname:,keymark:},{tablename:TNLST,tablefield:BEZEI,byname:}],t_connect:[{keyflag:,tablename:TNLST,cnttyp:}],t_connect_relationship:[],t_cond:[]}}响应参数{type:S,message:查询已完成,resultjson:[{\spras\:\Z\,\bezei\:\个人开发\},{\spras\:\Z\,\bezei\:\百度\},{\spras\:\Z\,\bezei\:\广州广交会\},{\spras\:\D\,\bezei\:\Bezirk 1\},{\spras\:\D\,\bezei\:\Bezirk 2\},{\spras\:\E\,\bezei\:\Region 1\},{\spras\:\E\,\bezei\:\Region 2\},{\spras\:\Z\,\bezei\:\新媒体\},{\spras\:\Z\,\bezei\:\客户转介绍\}]}多表查询请求参数{selc:{t_fields:[{tablename:MARA,tablefield:MATNR,byname:,keymark:X},{tablename:MARC,tablefield:WERKS,byname:PLANT,keymark:X},{tablename:MAKT,tablefield:MAKTX,byname:}],t_connect:[{keyflag:A,tablename:MARA,cnttyp:INNER},{keyflag:A,tablename:MARC,cnttyp:INNER},{keyflag:B,tablename:MAKT,cnttyp:INNER}],t_connect_relationship:[{keyflag:A,tableleft:MARA,fieldleft:MATNR,tableright:MARC,fieldright:MATNR},{keyflag:B,tableleft:MARA,fieldleft:MATNR,tableright:MAKT,fieldright:MATNR}],t_cond:[{tablename:MARA,tablefield:MATNR,values:000000001001010266},{tablename:MARA,tablefield:MATNR,values:000000002102010779},{tablename:MARA,tablefield:MATNR,values:000000003201010062},{tablename:MARC,tablefield:WERKS,values:1001},{tablename:MARC,tablefield:WERKS,values:1002}]}}响应结果{type:S,message:查询已完成,resultjson:[{\matnr\:\1001010266\,\plant\:\1001\,\maktx\:\测试物料描述\},{\matnr\:\1001010266\,\plant\:\1002\,\maktx\:\测试物料描述\},{\matnr\:\2102010779\,\plant\:\1001\,\maktx\:\测试物料描述\},{\matnr\:\2102010779\,\plant\:\1002\,\maktx\:\测试物料描述\},{\matnr\:\3201010062\,\plant\:\1001\,\maktx\:\测试物料描述\},{\matnr\:\3201010062\,\plant\:\1002\,\maktx\:\测试物料描述\}]}