尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

SAP Fiori开发中手建OData服务的完整实践指南

发布时间:2026/9/26 15:30:58

资讯中心
01
ARTICLE

SAP Fiori开发中手建OData服务的完整实践指南

SAP Fiori开发中手建OData服务的完整实践指南
1. 项目概述为什么在Fiori开发中必须亲手创建OData服务Fiori开发不是把UI5控件拖来拽去就完事的它是一整套前后端协同的工程实践。而OData服务就是连接Fiori前端与SAP后端数据的“神经中枢”。你可能已经用过SAP标准的OData服务比如SEGW里自带的ZUI5_*示例或者通过事务码/IWFND/MAINT_SERVICE激活过几个服务但真正要开发一个能支撑业务流程的Fiori应用——比如一个采购申请审批看板、一个设备维保工单状态追踪页或者一个库存实时预警面板——你就绕不开从零创建自己的OData服务。这不是炫技而是因为标准服务永远无法精准匹配你的字段组合、权限逻辑、数据过滤条件和性能要求。我带过的十几个Fiori项目里90%以上的定制化需求最终都卡在OData层要么标准服务没暴露关键字段比如MD07里需要的“计划订单预留号”要么返回数据量太大导致前端卡死一个物料主数据服务拉出200个字段实际页面只用5个要么权限控制粒度太粗PFCG角色只能开到事务码级而你需要按工厂物料组动态过滤。所以“SAP创建OData服务”这个动作本质是把业务语义翻译成可被UI5消费的数据契约的过程。它要求你同时懂SE11里的表结构设计、SEGW里的服务建模逻辑、以及ABAP后台的性能优化意识。这不是纯配置工作而是一个需要ABAP开发思维的集成环节。如果你还在用SM30直接改后台表、或者靠BDC脚本批量导入数据那说明你还没真正进入Fiori开发的主航道——因为Fiori的底层哲学是“服务驱动”而不是“界面驱动”。2. 整体设计思路与方案选型解析2.1 为什么选SEGW而不是RAP或CDS View当前SAP生态里有三条主流路径能暴露OData服务SEGWGateway Service Builder、RAPRESTful ABAP Programming Model和CDS View with OData.publish。但对绝大多数正在维护ECC系统、或刚接触S/4HANA但尚未完成技术栈迁移的团队来说SEGW仍是首选。原因很实在第一SEGW是图形化建模工具所见即所得拖拽实体、定义关联、绑定数据源整个过程像搭积木学习曲线平缓第二它完全兼容传统ABAP开发习惯你可以无缝调用Function Module、BAPI甚至自定义的ABAP类方法这对需要复用大量既有逻辑比如SD模块的定价计算、MM模块的库存检查的场景至关重要第三SEGW生成的服务天然支持OData v2协议而目前95%以上的Fiori Elements模板List Report、Object Page、Analytical List Page都基于v2构建兼容性无风险。相比之下RAP虽然代表未来但它强制要求使用CDS View作为数据源且所有业务逻辑必须重构为ABAP RESTful Application Programming Model这对一个已有上万行ABAP代码的ECC系统来说改造成本不是“升级”而是“重写”。至于CDS View直接发布它适合简单只读场景比如展示一张透明表但一旦涉及多表联查、动态权限过滤、或需要调用BAPI做校验你就得回到ABAP层写determination logic反而让架构变得割裂。我去年帮一家汽车零部件厂做备件库存可视化项目时客户坚持要用RAP结果发现他们核心的“安全库存预警算法”封装在Function Module ZFM_INVENTORY_CHECK里硬要迁到RAP里光接口适配就花了三周最后还是退回SEGW在Data Provider Class里直接CALL FUNCTION两天搞定。所以选SEGW不是守旧而是务实——它让你把精力聚焦在业务逻辑本身而不是被框架语法牵着鼻子走。2.2 SEGW服务的三层架构为什么不能跳过Model Provider LayerSEGW创建OData服务不是一键生成那么简单它严格遵循三层分离架构Service Layer服务定义层、Model Provider Layer模型提供层、Data Provider Layer数据提供层。很多新手会忽略Model Provider Layer直接在Data Provider里写SELECT语句这埋下了巨大隐患。Model Provider Layer的核心作用是“数据契约抽象”它定义了OData服务对外暴露的Entity Type、Property、Navigation Property等元数据相当于给前端开发者发了一份清晰的“数据说明书”。比如你在SE11里定义了一张ZMAT_STOCK表包含MATNR物料号、WERKS工厂、LGORT库存地点、CLABS非限制使用库存等字段。如果跳过Model Provider直接在Data Provider里SELECT * FROM ZMAT_STOCK那么前端UI5代码就必须硬编码这些数据库字段名如oDataModel.getProperty(CLABS)一旦后台表结构调整比如把CLABS改成STOCK_QTY整个前端就崩了。而通过Model Provider你可以把CLABS映射为更语义化的StockQuantity把MATNR映射为MaterialNumber这样前端调用的就是oDataModel.getProperty(StockQuantity)后台字段名变更只需在Model Provider里重新映射前端零修改。更重要的是Model Provider支持Complex Type复杂类型和Association关联比如一个采购订单Entity可以关联多个采购订单行项目Entity这种关系在Model Provider里定义清楚后前端就能用$expandItems语法一次性拉取完整数据避免N1查询问题。我见过太多项目因为省略这一步导致前端不得不写十几层嵌套的$.ajax调用性能差、维护难、调试崩溃。所以Model Provider Layer不是可选项而是必须项——它是保障前后端解耦、提升系统可维护性的第一道防火墙。2.3 数据源选型Function Module vs. Database Table vs. CDS View在Data Provider Layer你有三种主流数据源可选Database Table直接查表、Function Module调用函数模块、CDS ViewCDS视图。选哪个取决于你的数据复杂度和业务逻辑深度。Database Table仅适用于最简单的只读场景比如展示一张配置表如ZT001工厂主数据表。优点是性能极致一条SELECT搞定缺点是零业务逻辑无法做权限过滤、数据转换或错误处理。比如你想查MD07的MRP结果直接SELECT * FROM MDPS_MPOD肯定不行因为MDPS_MPOD是中间表数据未格式化且没有权限控制。Function Module这是最常用、最灵活的选择。你可以封装任意复杂逻辑比如在ZFM_GET_MRP_DATA里先根据输入参数筛选MDPS_MPOD再JOIN MARD获取当前库存再CALL FUNCTION MD_STOCK_REQUIREMENTS_LIST_API 获取MRP建议最后统一格式化返回。Function Module还能天然集成权限检查AUTHORITY-CHECK比如在函数开头加一句AUTHORITY-CHECK OBJECT M_MATE_WRK ID WERKS FIELD p_werks就能按工厂动态过滤数据。我们给某家电企业做的生产计划看板所有数据源都是Function Module因为他们的MRP逻辑涉及12个自定义增强点只有FM能承载。CDS View适合S/4HANA环境下的轻量级聚合查询。比如定义一个CDS View ZCDS_MAT_STOCK里面写SELECT FROM mard AS stock INNER JOIN mara AS mat ON stock.matnr mat.matnr WHERE mat.mtart FERT然后在SEGW里直接绑定这个View。它的优势是SQL优化好、支持注释EndUserText.label供前端显示但劣势是无法调用BAPI、无法做复杂循环处理、权限控制需额外配置。所以我的经验是简单聚合用CDS View复杂业务逻辑用Function Module纯配置表用Database Table——三者混用才是常态而不是非此即彼。3. 核心实操步骤与关键细节拆解3.1 第一步SE11建表与数据准备以ZMAT_STOCK为例创建OData服务前必须有干净、规范的数据源。我们以一个典型的库存查询表ZMAT_STOCK为例说明SE11建表的关键细节。这张表不是随便建的它要服务于后续的OData服务性能和可维护性。首先字段设计要遵循SAP命名规范MATNR物料号CHAR 18、WERKS工厂CHAR 4、LGORT库存地点CHAR 10、CLABS非限制使用库存QUAN 13.3、UMLMC特殊库存数量QUAN 13.3、ERSDA创建日期DATS 8。注意CLABS和UMLMC必须是QUAN类型并关联计量单位字段比如MEINS否则OData服务暴露时会丢失精度前端显示0.000。其次必须建主键MATNR WERKS LGORT这是为了保证数据唯一性和查询效率。第三强烈建议添加技术字段ERNAM创建人CHAR 12、ERDAT创建日期DATS 8、UZEIT创建时间TIMS 6这些字段在审计和问题排查时价值巨大。第四不要忘了激活“Delivery and Maintenance”标签页里的设置勾选“Data Browser / Table View Maintenance”并选择“Maintenance allowed”这样后续才能用SM30维护测试数据同时勾选“Buffering”并选择“Single record buffering”因为库存数据查询频次高、单条记录小开启缓冲能极大降低数据库压力。最后建完表后别急着填数据先用SE14检查表结构——我见过太多项目因为忘记点“Activate”按钮导致表在SEGW里根本找不到。填测试数据时用SM30比INSERT语句更安全因为SM30会自动校验字段长度和类型避免插入超长物料号导致后续OData服务报错“Field MATNR overflow”。3.2 第二步SEGW创建Project与Entity Type手把手避坑指南打开事务码SEGW点击“Create Project”输入项目名如ZFIORI_STOCK_SRV、描述库存查询OData服务、包必须是开发包不能是$TMP、传输请求必选否则无法传输到生产。这里有个致命陷阱项目名不能以Z或Y开头错必须以Z或Y开头这是SAP开发命名规范否则后续激活失败。创建完项目右键“Data Model” → “Import → DDIC Structure”选择你刚建的ZMAT_STOCK表。SEGW会自动生成一个Entity Type如ZMAT_STOCK但这时千万别直接用因为自动生成的Entity Type会把所有字段原样暴露包括技术字段ERNAM、ERDAT而前端根本不需要这些。正确做法是右键生成的Entity Type → “Edit”进入编辑界面把不需要的字段如ERNAM、ERDAT、UZEIT全部删掉把CLABS字段的“Type”从“Edm.Decimal”改为“Edm.Int32”因为库存数量通常是整数用Decimal会导致前端显示多余小数位给MATNR字段勾选“Key”确保它是主键。接着定义Entity Set如ZMAT_STOCKSet这是OData服务的访问入口命名规则是Entity Type名Set。最关键的一步是右键Entity Set → “Generate Runtime Objects”弹出窗口里务必勾选“Generate Data Provider Class”和“Generate Model Provider Class”不勾选的话后续Data Provider里连类都找不到。生成后SEGW会自动创建两个ABAP类ZCL_ZFIORI_STOCK_DPC_EXTData Provider和ZCL_ZFIORI_STOCK_MPC_EXTModel Provider。此时项目还处于“Inactive”状态不能测试必须先激活。3.3 第三步Model Provider ClassZCL_ZFIORI_STOCK_MPC_EXT深度定制Model Provider Class是OData服务的“数据说明书”它的定制质量直接决定前端开发效率。双击ZCL_ZFIORI_STOCK_MPC_EXT找到METHOD /IWBEP/IF_MGW_APPL_SRV_RUNTIME~DEFINE这是定义元数据的核心方法。默认生成的代码只是简单调用super-define()我们需要在此基础上注入业务语义。比如把CLABS字段重命名为StockQuantity并添加单位信息DATA: lo_property TYPE REF TO /iwbep/if_mgw_odata_property. lo_property model-get_entity_type( ZMAT_STOCK )-get_property( CLABS ). lo_property-set_name( StockQuantity ). lo_property-set_type_edm_decimal( 13, 3 ). lo_property-set_unit( MEINS ). 关联计量单位字段再比如为MATNR字段添加前端友好的标签和描述lo_property model-get_entity_type( ZMAT_STOCK )-get_property( MATNR ). lo_property-set_label( Material Number ). lo_property-set_description( Unique identifier for a material ).更高级的技巧是定义Complex Type。假设你需要在库存记录里嵌套“工厂描述”可以新建一个Complex Type ZCT_FACTORY包含WERKS和NAME字段然后在ZMAT_STOCK Entity里添加一个名为Factory的Property类型设为ZCT_FACTORY。这样前端就能用stock.Factory.NAME直接取值无需额外查表。还有一个易被忽视的点导航属性Navigation Property。如果你的服务需要关联采购订单就在Model Provider里定义一个Navigation Property指向ZPO_HEADER Entity并设置FromRole和ToRole。这样前端调用时URL里加上$expandPurchaseOrders就能一次性拿到库存关联PO数据。我曾帮一个客户优化报表性能他们原来前端要发5个独立请求分别查库存、PO、交货单、发票、供应商我把这5个Entity全在Model Provider里定义好Navigation Property一个$expand请求搞定响应时间从8秒降到1.2秒。3.4 第四步Data Provider ClassZCL_ZFIORI_STOCK_DPC_EXT核心实现Data Provider Class是OData服务的“数据引擎”所有业务逻辑都在这里实现。双击ZCL_ZFIORI_STOCK_DPC_EXT重点改造三个METHODGET_ENTITYSET、GET_ENTITY、UPDATE_ENTITY。GET_ENTITYSET处理列表查询如GET /sap/opu/odata/sap/ZFIORI_STOCK_SRV/ZMAT_STOCKSet。默认代码是空的我们需要填充SELECT逻辑。但绝不能写SELECT * FROM ZMAT_STOCK。正确姿势是先获取OData URL里的$filter参数比如$filterWERKS eq 1000 and CLABS gt 100用cl_sxml_string_writer解析再动态拼接WHERE条件。更优雅的做法是用RTTSRun Time Type Services获取Entity Type的Key字段然后用CL_REST_HTTP_HANDLER-GET_PARAMETER_VALUES获取过滤参数最后用OPEN SQL动态查询。关键性能技巧一定要加ORDER BY和UP TO 1000 ROWS防止全表扫描拖垮数据库。GET_ENTITY处理单条查询如GET /sap/opu/odata/sap/ZFIORI_STOCK_SRV/ZMAT_STOCKSet(MAT123)。这里要根据Key字段MATNRWERKSLGORT精确查询用SELECT SINGLE避免全表扫描。UPDATE_ENTITY处理更新如PATCH。这里必须加入业务校验比如库存数量不能为负调用AUTHORITY-CHECK检查用户是否有修改权限更新前用ENQUEUE_EZMAT_STOCK加锁防止并发修改。一个真实案例某客户要求库存更新时自动触发库存移动凭证我们在UPDATE_ENTITY里CALL FUNCTION BAPI_MATERIAL_STOCK_POST传入移动类型、数量、工厂等参数再COMMIT WORK。整个过程封装在一个METHOD里前端只管发PATCH请求后台自动完成业务闭环。最后别忘了在每个METHOD开头加TRY...CATCH捕获CX_SY_OPEN_SQL_ERROR等异常并用/iof/exception-create_exception_message抛出友好错误信息比如“库存数量不能为负请检查输入值”而不是让前端看到晦涩的ABAP dump。3.5 第五步服务激活、注册与测试全流程完成编码后回到SEGW界面点击“Project” → “Activate”不是“Check”。激活成功后右键项目 → “Runtime Artifacts” → “Generate”生成运行时对象。此时服务还不可用必须注册到Gateway系统。执行事务码/IWFND/MAINT_SERVICE点击“Add Service”输入System Alias通常是LOCAL指向本系统Service Name填你项目名ZFIORI_STOCK_SRV点击“Get Services”勾选刚生成的服务点击“Add Selected Services”。注册完成后服务状态变为“Active”。测试分三步基础连通性测试用浏览器访问/sap/opu/odata/sap/ZFIORI_STOCK_SRV/$metadata能看到XML格式的元数据证明服务已发布。数据查询测试访问/sap/opu/odata/sap/ZFIORI_STOCK_SRV/ZMAT_STOCKSet应返回JSON格式的库存数据。如果报错看ST22里的ABAP dump90%是Data Provider里SELECT语句字段名写错或表没授权。高级功能测试测试$formatjson、$top10、$filterWERKS eq 1000、$selectMATNR,StockQuantity等OData标准语法验证服务是否符合规范。一个血泪教训某次上线前测试所有功能都正常但生产环境一调用就报403 Forbidden。排查半天发现是/IWFND/MAINT_SERVICE里注册的服务其“System Alias”指向了一个测试系统而不是生产系统。所以注册服务时务必确认System Alias的Target System配置正确这是跨系统调用的命门。4. 常见问题与实战排查技巧4.1 元数据加载失败404 Not Found 或 500 Internal Server Error这是新手最常遇到的问题表面看是URL打不开根源往往在服务注册环节。首先确认事务码/IWFND/MAINT_SERVICE里你的服务状态是“Active”而不是“Inactive”或“Not Registered”。其次检查System Alias的配置双击Alias看“Technical Settings”里的“Client”是否与当前登录客户端一致比如你在800客户端登录Alias的Client也必须是800不一致会导致认证失败。第三查看日志执行/IWFND/ERROR_LOG筛选你的服务名看是否有“Service not found”或“Class not found”错误。如果是后者大概率是Data Provider Class没激活回SEGW里重新激活项目。还有一个隐蔽原因SEGW项目里的“Package”不是开发包而是$TMP临时包。SAP不允许在$TMP包里激活OData服务必须换到真正的开发包如ZPACK_FIORI并分配传输请求。我曾因此卡了两天最后发现包名输错了少了个Z。4.2 数据查询为空SELECT返回0条记录前端调用返回[]但SM30里明明有数据。第一步用SQL TraceST05抓取OData服务的SQL语句在/IWFND/MAINT_SERVICE里点击服务旁的“Trace”按钮然后前端调用再回ST05看抓到的SQL。常见问题有三个一是WHERE条件写死比如在GET_ENTITYSET里写了WHERE werks 1000但前端想查2000工厂自然查不到二是字段名大小写不一致ABAP里字段名是大写但OData URL里$filter参数是小写SEGW生成的代码有时会把字段名转成小写导致WHERE条件失效三是权限问题AUTHORITY-CHECK失败后代码没做异常处理直接返回空集。解决方案在Data Provider里把所有硬编码的WHERE条件换成动态参数解析用SY-SUBRC检查AUTHORITY-CHECK返回值SY-SUBRC 0时抛出自定义异常最后用SE16N直接执行生成的SQL确认数据库层面是否真有数据。4.3 字段映射错乱前端显示字段名是CLABS而不是StockQuantity这说明Model Provider Class没生效。首先确认ZCL_ZFIORI_STOCK_MPC_EXT类已激活且METHOD DEFINE里确实写了set_name(StockQuantity)。其次检查SEGW里Entity Type的字段名是否还是CLABS右键Entity Type → “Edit”看Properties列表里字段名是不是变了。如果没变说明你改的是运行时类但没刷新SEGW的Design Time元数据。解决办法在SEGW里右键项目 → “Refresh” → “Refresh Runtime Artifacts”强制同步。还有一个经典错误在DEFINE方法里你写了lo_property-set_name( StockQuantity )但前面获取property时写错了比如model-get_entity_type( ZMAT_STOCK )-get_property( Clabs )注意Clabs首字母小写而ABAP里字段名是大写CLABS大小写不匹配导致lo_property是空引用set_name无效。所以写代码时所有字段名必须全大写跟SE11里定义的一致。4.4 性能瓶颈列表加载慢响应超10秒OData服务慢90%是因为没做数据分页和过滤下推。首先检查GET_ENTITYSET方法里有没有UP TO 1000 ROWS没有就加上避免一次查几万条。其次确认$top、$skip参数是否被正确解析并用于SQL的UP TO和OFFSET。第三看ST05里SQL的执行计划如果出现“Full Table Scan”说明WHERE条件没走索引。解决方案在ZMAT_STOCK表的WERKS、MATNR字段上建复合索引SE11里Table → Goto → Indexes → Create因为90%的查询都带工厂和物料号条件。第四禁用不必要的字段在Model Provider里把前端不用的字段全删掉减少网络传输量。最后启用Gateway缓存在/IWFND/MAINT_SERVICE里选中服务 → “Settings” → 勾选“Enable Cache”设置Cache Duration比如300秒对静态数据如配置表效果显著。我们给某物流公司做的运单状态服务加了缓存后QPS从50提升到300服务器CPU占用下降60%。4.5 权限控制失效所有人都能查所有工厂数据OData服务的权限控制不是靠PFCG角色里的事务码而是靠Data Provider里的AUTHORITY-CHECK。常见错误是只在GET_ENTITYSET里加了检查但GET_ENTITY里没加导致用户能查列表但点进去看单条详情时权限被绕过。正确做法是在每一个METHOD开头都加相同的AUTHORITY-CHECK逻辑。比如AUTHORITY-CHECK OBJECT M_MATE_WRK ID ACTVT FIELD 03 ID WERKS FIELD ls_key-werks. IF sy-subrc 0. RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception EXPORTING message_unlimited No authorization for factory 1. ENDIF.注意ID ACTVT FIELD 03表示“显示”权限02是修改01是创建。另外PFCG角色里必须给用户分配S_RFC授权对象因为OData服务底层调用RFC没这个授权服务直接报403。所以完整的权限链是PFCG角色含S_RFC 自定义授权对象→ Data Provider里的AUTHORITY-CHECK → 数据库表本身的授权如S_TABU_DIS。5. 进阶技巧与生产环境最佳实践5.1 动态过滤与搜索帮助集成对标SAP GUI SM30Fiori应用常需要类似SM30里的搜索帮助F4 Help比如在库存查询页点击“工厂”字段弹出工厂列表。这需要OData服务支持$expand和$top但更关键的是前端如何调用。后端实现很简单在Model Provider里为WERKS字段定义一个Navigation Property指向ZT001_FACTORY Entity Set然后在Data Provider的GET_ENTITYSET里当检测到$expandFactory时额外查询ZT001_FACTORY表把工厂描述一起返回。但生产环境要注意搜索帮助数据量大不能每次请求都查全表。解决方案是加缓存在Data Provider里用CL_ABAP_MEMORY_HANDLER-GET_INSTANCE()-IMPORT/EXPORT缓存ZT001_FACTORY数据首次查询后存内存后续请求直接读内存速度提升10倍。另一个技巧是支持模糊搜索在GET_ENTITYSET里解析$filter参数如果包含substringof(ABC,WERKS)就用WHERE werks LIKE %ABC%而不是等值匹配。这样用户在F4框里输“10”就能搜到“1000”、“1010”等工厂。5.2 错误处理与日志追踪让运维不再抓瞎生产环境最怕“黑盒”错误前端报“Request failed”但后台日志里啥也没有。必须建立完整的错误追踪链。第一在Data Provider每个METHOD里用CALL FUNCTION BAL_LOG_CREATE创建应用日志Application Log记录请求参数、SQL语句、耗时。第二所有异常必须用RAISE EXCEPTION TYPE /iwbep/cx_mgw_busi_exception抛出并在EXPORTING里传message_unlimited这样前端能直接显示中文错误。第三集成SAP Solution Manager的Alert Monitoring在/IWFND/MAINT_SERVICE里为服务开启“Error Handling”配置邮件通知当服务连续5次报错自动发邮件给运维。我们给某银行做的信贷审批服务就用了这套机制上线三个月95%的问题在用户投诉前就被监控告警发现。5.3 版本管理与向后兼容避免前端一夜崩溃OData服务一旦发布就不能随意改Entity Type结构否则所有调用它的Fiori应用都会报错。所以版本管理是生命线。SEGW本身不支持版本但我们用命名约定模拟ZFIORI_STOCK_SRV_V1、ZFIORI_STOCK_SRV_V2。V2服务可以新增字段、新Entity但绝不删除或重命名V1里的字段。前端升级时逐步切换到V2老应用继续跑V1。更高级的做法是用CDS View的AbapCatalog.sqlViewAppendName注释为不同版本生成不同SQL视图但底层数据源不变。总之记住一条铁律OData服务的URI是契约契约一旦签订只能增加不能修改。5.4 与Fiori Elements深度集成超越手写UI5创建OData服务的终极目标是让Fiori Elements能自动生成专业UI。这就要求服务严格遵循OData V2规范并添加语义注释。比如在Model Provider里为StockQuantity字段加注释lo_property-set_semantic( /iwbep/if_mgw_med_odata_typesgcs_semantic_amount ). lo_property-set_unit( ST ). 单位是件这样Fiori Elements的List Report会自动把StockQuantity渲染为数字格式带千分位分隔符。再比如为MATNR字段加lo_property-set_semantic( /iwbep/if_mgw_med_odata_typesgcs_semantic_material ).Fiori Elements就知道这是物料号自动加F4搜索帮助。这些看似微小的注释能让前端开发效率提升50%这才是OData服务的真正价值——不是让ABAP开发写更多代码而是让UI5开发写更少代码。我在实际项目中发现一个设计良好的OData服务能撑起3-5个Fiori应用。比如ZFIORI_STOCK_SRV我们不仅用它做了库存查询页还衍生出库存预警看板加$filterStockQuantity lt 100、采购建议页加$expandMaterialMaster、甚至移动端扫码入库页加POST方法支持创建。所以别把OData服务当成一次性任务把它当作企业数据资产来经营——每一次字段定义、每一次权限检查、每一次性能优化都是在为未来的数字化应用打地基。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。