当前位置: 首页 > article >正文

SAP ABAP on HANA开发避坑指南:新语法FILTER、SWITCH、COND的常见错误与最佳实践

SAP ABAP on HANA开发实战FILTER、SWITCH、COND高阶用法与性能优化在SAP HANA平台上ABAP语言的进化带来了FILTER、SWITCH、COND等新语法特性它们像瑞士军刀一样为开发者提供了更简洁高效的编程方式。但正如任何锋利的工具如果使用不当反而会伤及自身——我在三个大型SAP项目实施中见过太多因误用这些语法导致的性能瓶颈和逻辑错误。本文将分享如何避开这些语法糖背后的陷阱让代码既优雅又健壮。1. FILTER操作的内核原理与性能陷阱FILTER语句本质上是对内表的条件筛选但它的执行效率取决于你是否理解HANA数据库的索引机制。许多开发者抱怨FILTER速度慢其实问题往往出在表键定义上。1.1 必须定义的SORTED/HASHED KEY 错误示例未定义任何KEY直接使用FILTER DATA(lt_unfiltered) FILTER #( lt_data WHERE matkl 1020 ). 正确做法预先定义SORTED KEY DATA: lt_data TYPE TABLE OF lty_data WITH NON-UNIQUE SORTED KEY matkl_key COMPONENTS matkl. DATA(lt_filtered) FILTER #( lt_data USING KEY matkl_key WHERE matkl 1020 ).关键点未定义KEY时FILTER会执行全表扫描SORTED KEY适合范围查询HASHED KEY适合等值查询复合键字段顺序影响查询效率1.2 EXCEPT关键字的隐藏逻辑FILTER的EXCEPT语法看似简单但在处理NULL值时容易产生意外结果 保留matkl为1020的记录 DATA(lt_keep) FILTER #( lt_data USING KEY matkl_key WHERE matkl 1020 ); 排除matkl为1020的记录注意NULL值也会被保留 DATA(lt_except) FILTER #( lt_data EXCEPT USING KEY matkl_key WHERE matkl 1020 );提示在关键业务逻辑中使用FILTER前务必用CL_DEMO_OUTPUT验证结果集是否符合预期2. SWITCH与COND的选择艺术SWITCH和COND都用于条件赋值但它们的适用场景有本质区别。我曾见过一个财务模块的报表因为错误选择导致30%的性能损失。2.1 何时用SWITCHSWITCH适合离散值匹配的场景其内部实现类似于二分查找 典型应用状态码转换 DATA(lv_status_text) SWITCH string( iv_status_code WHEN 01 THEN 已创建 WHEN 02 THEN 审批中 WHEN 03 THEN 已完成 ELSE 未知状态 ).性能对比表条件类型SWITCH执行时间(ms)IF-ELSEIF链(ms)5个条件0.120.1510个条件0.150.3820个条件0.180.822.2 何时用CONDCOND适合复杂条件判断特别是需要多字段组合判断时 多条件组合判断 DATA(lv_discount) COND f( WHEN iv_is_vip abap_true AND iv_order_amount 10000 THEN 0.2 WHEN iv_order_date CP 2023-12-* THEN 0.15 WHEN iv_product_type PREMIUM THEN 0.1 ELSE 0 ).经验法则条件数量≤5且为等值比较 → 优先SWITCH条件包含范围判断或AND/OR逻辑 → 必须用COND性能敏感场景 → 用事务ST12实测两种方式的差异3. VALUE与BASE的进阶用法VALUE语句的BASE附加项是结构赋值的利器但也是最容易引发数据错位的特性之一。3.1 结构一致性检查TYPES: BEGIN OF ty_header, docnum TYPE char10, bukrs TYPE char4, waers TYPE char3, END OF ty_header. DATA(ls_header) VALUE ty_header( docnum 1000000001 bukrs 1000 waers USD ). 危险操作混合使用不同结构 DATA(ls_mixed) VALUE #( BASE ls_header docid ls_header-docnum ). 字段docid不存在于ty_header中 安全做法使用完全匹配的结构 DATA(ls_safe) VALUE ty_header( BASE ls_header waers EUR ). 仅修改已知字段3.2 动态字段赋值技巧结合FOR和BASE可以实现动态字段更新DATA(lt_changes) VALUE ty_change_table( ( fieldname BUKRS value 2000 ) ( fieldname WAERS value CNY ) ). LOOP AT lt_changes ASSIGNING FIELD-SYMBOL(fs_change). ls_header VALUE #( BASE ls_header (fs_change-fieldname) fs_change-value ). ENDLOOP.警告动态赋值必须配合异常处理否则遇到非法字段名会触发运行时错误4. 类型转换的现代方式传统的类型转换需要中间变量而CONV操作符让代码更加简洁但也带来了精度问题。4.1 数值转换的精度陷阱DATA(lv_string) 123456789.123456789. 传统方式可能丢失精度 DATA(lv_packed) lv_string. DATA(lv_float) lv_packed. 现代方式明确指定目标类型 DATA(lv_dec34) CONV decfloat34( lv_string ). DATA(lv_packed16) CONV p LENGTH 16 DECIMALS 6( lv_string ).精度对比实验转换方式原始值转换结果CONV decfloat34123456789.123456789123456789.123456789CONV p(16,6)123456789.123456789123456789.123457隐式转换123456789.123456789123456789.1234564.2 货币与单位转换规范 货币金额格式化 DATA(lv_amount) CONV p LENGTH 16 DECIMALS 2( 1234.56 ). DATA(lv_currency) |{ lv_amount CURRENCY JPY }|. 输出: 1,235 单位转换注意四舍五入规则 DATA(lv_quantity) CONV p LENGTH 13 DECIMALS 3( 12.3456 ). DATA(lv_unit) |{ lv_quantity UNIT KG DECIMALS 1 }|. 输出: 12.3最佳实践金融计算必须使用decfloat34界面显示用CURRENCY/UNIT格式化避免在计算过程中多次转换类型5. REDUCE的高级应用模式REDUCE不仅是简单的聚合工具用好它可以替代很多循环操作。在某库存分析项目中我用REDUCE重构后性能提升了40%。5.1 多维度聚合计算TYPES: BEGIN OF ty_stats, plant TYPE werks_d, matkl TYPE matkl, avg_qty TYPE menge_d, max_qty TYPE menge_d, min_qty TYPE menge_d, END OF ty_stats. DATA(lt_results) REDUCE #( INIT lt_result VALUE ty_stats_table( ) FOR GROUPS group OF wa IN lt_materials GROUP BY ( plant wa-werks matkl wa-matkl ) NEXT lt_result VALUE #( BASE lt_result ( plant group-plant matkl group-matkl avg_qty REDUCE #( INIT lv_sum 0 lv_count 0 FOR item IN GROUP group NEXT lv_sum lv_sum item-menge lv_count lv_count 1 THEN lv_sum / lv_count ) max_qty REDUCE #( INIT lv_max 0 FOR item IN GROUP group NEXT lv_max nmax( val1 lv_max val2 item-menge ) ) min_qty REDUCE #( INIT lv_min 0 FOR item IN GROUP group NEXT lv_min COND #( WHEN lv_min 0 THEN item-menge ELSE nmin( val1 lv_min val2 item-menge ) ) ) ) ) ).5.2 替代READ TABLE的场景 传统方式 READ TABLE lt_orders INTO DATA(ls_order) WITH KEY vbeln iv_vbeln BINARY SEARCH. 使用REDUCE当需要复杂查找逻辑时 DATA(ls_order) REDUCE #( INIT ls_result TYPE ty_order FOR ls_item IN lt_orders WHERE ( vbeln iv_vbeln AND erdat iv_min_date ) NEXT ls_result COND #( WHEN ls_result-vbeln IS INITIAL THEN ls_item WHEN ls_item-erdat ls_result-erdat THEN ls_item ELSE ls_result ) ).性能对比数据量READ TABLE(ms)REDUCE(ms)1,0000.050.1210,0000.080.15100,0000.120.181,000,0000.251.20注意REDUCE在数据量大时性能劣势明显仅推荐在复杂查找逻辑时使用6. 字符串处理的新范式HANA平台上的ABAP提供了更强大的字符串处理能力但需要特别注意字符集问题。6.1 智能分割字符串 安全的分割方式自动处理异常 TRY. DATA(lv_part) segment( val 张三;李四;王五 index 2 sep ; ). CATCH cx_sy_strg_par_val INTO DATA(lx_error). 处理索引越界情况 ENDTRY. 多语言环境下的安全分割 DATA(lv_i18n_text) Tokyo¥New York¥London¥Paris. DATA(lt_cities) REDUCE string_table( INIT lt_temp VALUE #( ) FOR lv_idx 1 THEN lv_idx 1 UNTIL lv_idx 10 NEXT lt_temp COND #( WHEN segment( val lv_i18n_text index lv_idx sep ¥ ) IS NOT INITIAL THEN VALUE #( BASE lt_temp ( segment( val lv_i18n_text index lv_idx sep ¥ ) ) ) ELSE lt_temp ) ).6.2 正则表达式实战 提取字符串中的所有汉字 DATA(lv_text) 订单1234状态已审核(2023). DATA: lt_matches TYPE match_result_tab. FIND ALL OCCURRENCES OF REGEX [\u4e00-\u9fa5] IN lv_text RESULTS lt_matches. DATA(lv_chinese_only) REDUCE string( INIT lv_result FOR ls_match IN lt_matches NEXT lv_result lv_result lv_textls_match-offset(ls_match-length) ).字符处理性能提示简单操作用标准函数如substring复杂模式匹配用正则表达式超大文本考虑用CL_ABAP_REGEX7. 结构复用的现代方法INCLUDE TYPE语法在HANA环境下有了新的可能性特别是在处理多层嵌套结构时。7.1 安全的结构扩展TYPES: BEGIN OF ty_base, bukrs TYPE bukrs, belnr TYPE belnr_d, END OF ty_base. TYPES: BEGIN OF ty_extended. INCLUDE TYPE ty_base AS base RENAMING WITH SUFFIX _header. TYPES: gjahr TYPE gjahr, buzei TYPE buzei, END OF ty_extended. DATA(ls_doc) VALUE ty_extended( base_header_bukrs 1000 base_header_belnr 21000001 gjahr 2023 buzei 001 ).7.2 动态结构处理 动态访问重命名字段 ASSIGN COMPONENT BASE_HEADER_BUKRS OF STRUCTURE ls_doc TO FIELD-SYMBOL(fs_bukrs). 批量处理包含结构 LOOP AT lt_documents ASSIGNING FIELD-SYMBOL(fs_doc). ASSIGN COMPONENT BASE_HEADER_BELNR OF STRUCTURE fs_doc TO FIELD-SYMBOL(fs_belnr). IF fs_belnr IS ASSIGNED. 处理逻辑 ENDIF. ENDLOOP.结构设计建议基础字段放在被INCLUDE的结构中业务特定字段放在主结构使用SUFFIX避免命名冲突为复杂结构编写字段符号访问工具类8. 调试与性能分析技巧再完美的语法也需要验证特别是在HANA环境下一些操作在开发系统表现良好但在生产环境可能完全不同。8.1 运行时类型检查 检查FILTER操作的执行计划 DATA(lt_filtered) FILTER #( lt_data USING KEY matkl_key WHERE matkl 1020 ). cl_demo_outputdisplay( lt_filtered ). 获取实际执行的HANA SQL DATA(lv_sql) cl_abap_dyn_prgget_last_statement( ).8.2 性能对比工具 使用GET RUN TIME测量执行时间 GET RUN TIME FIELD DATA(lv_start). 执行待测试代码 GET RUN TIME FIELD DATA(lv_end). DATA(lv_elapsed) ( lv_end - lv_start ) / 1000. 转换为毫秒 或者使用更专业的类 DATA(lo_timer) cl_abap_runtimecreate_measure( ). lo_timer-start( ). 执行代码 lo_timer-stop( ). DATA(lv_micro) lo_timer-get_microseconds( ).性能分析步骤用ST12事务记录执行过程用SAT事务分析代码热点用HANA Studio查看执行计划对比新旧实现方式的资源消耗9. 代码审查要点清单根据多个项目的经验教训总结出新语法使用的审查清单9.1 语法正确性检查[ ] FILTER操作的内表是否正确定义了SORTED/HASHED KEY[ ] SWITCH/COND的条件分支是否覆盖所有可能情况[ ] VALUE语句的BASE用法是否保持结构一致[ ] CONV操作是否考虑了目标类型的精度限制[ ] REDUCE的INIT部分是否初始化了所有必要变量9.2 性能优化检查[ ] 频繁执行的FILTER是否使用了最优KEY[ ] 多层嵌套REDUCE是否影响可读性[ ] 字符串操作是否避免不必要的中间转换[ ] 正则表达式是否可能造成回溯爆炸[ ] 动态字段访问是否有适当的异常处理9.3 可维护性检查[ ] 复杂SWITCH/COND是否添加了注释说明业务逻辑[ ] 魔数(Magic Number)是否被常量替代[ ] 是否过度使用新语法导致代码难以调试[ ] 团队是否对新语法有统一的使用规范[ ] 是否存在更好的传统语法替代方案10. 真实项目案例解析在某全球零售企业的SAP升级项目中商品主数据同步程序原本需要8小时运行经过新语法重构后缩短到47分钟。关键优化点包括10.1 FILTER替代LOOP AT WHERE原代码LOOP AT lt_materials INTO DATA(ls_mat) WHERE matkl iv_matkl. APPEND ls_mat TO lt_filtered. ENDLOOP.优化后DATA: lt_materials TYPE SORTED TABLE OF ty_material WITH NON-UNIQUE KEY matkl. DATA(lt_filtered) FILTER #( lt_materials USING KEY matkl WHERE matkl iv_matkl ).10.2 REDUCE实现跨表统计原代码LOOP AT lt_stock INTO DATA(ls_stock). READ TABLE lt_trans INTO DATA(ls_trans) WITH KEY matnr ls_stock-matnr. IF sy-subrc 0. ls_stock-quantity ls_stock-quantity ls_trans-quantity. ENDIF. MODIFY lt_stock FROM ls_stock. ENDLOOP.优化后lt_stock REDUCE #( INIT lt_result lt_stock FOR ls_trans IN lt_trans GROUP BY matnr ls_trans-matnr INTO DATA(ls_group) NEXT lt_result VALUE #( FOR ls_stock IN lt_result ( CORRESPONDING #( BASE ( ls_stock ) quantity ls_stock-quantity REDUCE menge_d( INIT lv_sum 0 FOR ls_item IN GROUP ls_group NEXT lv_sum lv_sum ls_item-quantity ) ) ) ) ).10.3 COND简化状态机逻辑原代码IF ls_order-erdat iv_cutoff_date. IF ls_order-vbtyp OR. lv_status HISTORICAL. ELSE. lv_status ARCHIVED. ENDIF. ELSEIF ls_order-vbtyp OR. lv_status ACTIVE. ELSE. lv_status PENDING. ENDIF.优化后lv_status COND #( WHEN ls_order-erdat iv_cutoff_date THEN COND #( WHEN ls_order-vbtyp OR THEN HISTORICAL ELSE ARCHIVED ) WHEN ls_order-vbtyp OR THEN ACTIVE ELSE PENDING ).11. 版本兼容性策略在混合环境中部分系统已升级到HANA部分仍在传统数据库需要特别注意11.1 语法可用性检查 在程序开头检查系统版本 DATA(lv_release) cl_abap_systemget_release( ). IF lv_release LT 753. 使用传统语法 ELSE. 使用新语法 ENDIF.11.2 条件编译技巧 根据SY-DBSYS决定使用哪种语法 IF sy-dbsys HDB. DATA(lt_data) FILTER #( lt_source USING KEY primary_key WHERE matnr iv_matnr ). ELSE. LOOP AT lt_source INTO DATA(ls_line) WHERE matnr iv_matnr. APPEND ls_line TO lt_data. ENDLOOP. ENDIF.兼容性建议为未升级系统保留传统语法分支使用CL_ABAP_SYSTEM检查功能可用性在构建系统中配置不同版本的语法检查文档中明确标注最低版本要求12. 团队协作规范建议新语法虽然强大但团队如果没有统一规范反而会导致代码混乱。我们团队经过多次迭代形成了这些规则12.1 代码格式化标准 SWITCH/COND的格式化要求 lv_result SWITCH #( iv_input WHEN A THEN 选项A WHEN B THEN 选项B ELSE 默认值 ). REDUCE的格式化要求 lt_result REDUCE #( INIT lt_temp VALUE ty_table( ) FOR ls_item IN lt_source NEXT lt_temp VALUE #( BASE lt_temp ( CORRESPONDING #( ls_item ) ) ) ).12.2 命名约定临时变量lv_temp_xxxREDUCE初始值lt_init_xxxFILTER结果lt_filtered_xxxCONV转换结果lv_converted_xxx12.3 注释规范每个复杂的新语法使用处必须包含业务目的说明特殊处理的考虑性能影响评估可能的替代方案13. 性能优化进阶技巧当处理海量数据时即使使用新语法也需要额外优化13.1 并行处理模式 使用PARALLEL CURSOR提高处理速度 DATA(lt_huge_data) VALUE ty_table( ... ). LOOP AT lt_huge_data ASSIGNING FIELD-SYMBOL(fs_line) GROUP BY ( bukrs fs_line-bukrs ) INTO DATA(ls_group). DATA(lt_group) FILTER #( lt_huge_data USING KEY bukrs WHERE bukrs ls_group-bukrs ). 处理每个分组... ENDLOOP.13.2 内存优化策略 及时释放不再需要的内表 CLEAR lt_huge_data WITH EMPTY KEY. FREE lt_huge_data. 使用VALUE初始化时指定行数 DATA(lt_prealloc) VALUE ty_table( ( LINES OF lt_existing_data ) ( matnr NEW001 ) ).13.3 批量操作技巧 使用FOR批量构造数据 DATA(lt_batch) VALUE ty_table( FOR lv_index 1 UNTIL lv_index 100 ( matnr |MAT{ lv_index }| mtart COND #( WHEN lv_index MOD 2 0 THEN FOOD ELSE BAGA ) ) ). 批量更新内表 MODIFY lt_target FROM VALUE #( FOR ls_source IN lt_source ( CORRESPONDING #( ls_source ) ) ).14. 异常处理最佳实践新语法的错误消息往往更简洁但也更难调试14.1 预防性检查 检查FILTER操作的输入 IF lines( lt_source ) 0. RAISE EXCEPTION TYPE cx_empty_input. ENDIF. 确保REDUCE的初始值有效 DATA(lt_result) REDUCE #( INIT lt_temp COND #( WHEN lt_input IS NOT INITIAL THEN lt_input ELSE VALUE #( ) ) FOR ls_item IN lt_temp NEXT ... ).14.2 错误捕获模式TRY. DATA(lt_filtered) FILTER #( lt_data USING KEY non_existing_key WHERE field value ). CATCH cx_sy_itab_key_not_found INTO DATA(lx_key_error). 处理未找到KEY的情况 CATCH cx_sy_conversion_error INTO DATA(lx_conv_error). 处理类型转换错误 ENDTRY.14.3 调试辅助工具 在复杂表达式中间插入调试点 DATA(lv_complex) COND #( WHEN condition1 THEN value1 WHEN condition2 THEN cl_demo_outputdisplay( value2 ) 调试输出 value2 ELSE value3 ).15. 未来兼容性设计随着SAP S/4HANA的演进新语法还在不断发展15.1 可扩展的结构设计TYPES: BEGIN OF ty_flexible, 公共字段 mandt TYPE mandt, 扩展标记 extension TYPE abap_bool, 动态部分 rest TYPE abap_parmbind_tab, END OF ty_flexible. DATA(ls_dynamic) VALUE ty_flexible( mandt sy-mandt extension abap_true rest VALUE #( ( name FIELD1 value REF #( VALUE1 ) ) ( name FIELD2 value REF #( 1234 ) ) ) ).15.2 语法特性检测 检查特定语法是否可用 DATA(lv_has_filter) cl_abap_featuresis_available( EXPORTING feature ITAB_FILTER ). DATA(lv_has_cond) cl_abap_featuresis_available( EXPORTING feature COND_OPERATOR ).15.3 渐进式迁移策略新开发代码直接使用新语法旧代码在修改时逐步重构核心逻辑保持两种实现方式建立自动化测试保障正确性16. 工具链整合建议将新语法的最佳实践融入开发工具链16.1 ABAP Test Cockpit规则自定义ATC检查规则禁止未定义KEY的FILTERSWITCH必须包含ELSE分支REDUCE的INIT必须初始化所有变量CONV需要显式指定目标类型16.2 Eclipse模板创建代码模板加速开发FILTER模板自动生成KEY定义SWITCH/COND模板包含标准结构REDUCE模板包含初始化部分VALUE模板包含BASE用法示例16.3 CI/CD管道集成在构建流程中加入新语法静态检查性能基准测试与传统实现的结果比对代码风格合规验证17. 性能关键型代码的黄金法则对于执行频率极高的核心代码我们总结出这些铁律FILTER必须使用HASHED KEY在百万级数据上HASHED KEY比SORTED KEY快3-5倍SWITCH优先于多层IF当条件超过5个时SWITCH的执行时间更稳定REDUCE避免多层嵌套超过两层的REDUCE会显著影响可读性和性能VALUE初始化指定大小对于已知大小的内表使用(LINES n)预先分配内存CONV注意精度损失金融计算必须使用decfloat34避免使用浮点数字符串操作慎用正则简单匹配用CONTAINS或SEARCH代替正则表达式批量操作优于单条处理使用FOR构造批量数据减少单行操作18. 代码可读性平衡术新语法虽然简洁但过度使用会导致代码难以理解。我们的经验法则是当逻辑可以在一屏内显示时约30行使用新语法当需要复杂注释才能理解时拆分为传统写法团队新成员能够在一周内理解的复杂度是可接受的任何可能被误读的写法都必须添加示例注释在代码审查中可读性比简洁性优先级更高19. 学习路径建议对于想要掌握这些新语法的开发者建议的学习顺序是从VALUE和CONV开始 - 最简单的入门语法掌握SWITCH和COND - 条件逻辑的现代写法学习FILTER - 理解表键的重要性实践REDUCE - 最强大但也最复杂的操作符探索FOR表达式 - 批量数据构造的利器研究CORRESPONDING - 结构映射的高级技巧最后整合使用 - 在真实项目中应用组合技巧20. 常见反模式警示在代码审查中我们会特别警惕这些不良实践FILTER未定义KEY导致全表扫描的性能灾难SWITCH遗漏ELSE引发难以追踪的运行时错误REDUCE副作用在NEXT部分修改外部变量VALUE结构污染BASE混用不同结构导致数据错位CONV精度忽视财务数据计算丢失小数位字符串拼接滥用大量使用导致性能下降过度嵌套表达式单行代码过长难以调试21. 调试复杂表达式的方法当面对多层嵌套的新语法时这些调试技巧很管用21.1 分步拆解法 原始复杂表达式 DATA(lv_result) COND #( WHEN condition1 THEN VALUE #( ( REDUCE #( ... ) ) ) WHEN condition2 THEN FILTER #( ... ) ELSE SWITCH #( ... ) ). 拆解步骤 DATA(lt_interim) REDUCE #( ... ). DATA(lt_filtered) FILTER #( ... ). DATA(lv_switch) SWITCH #( ... ). lv_result COND #( WHEN condition1 THEN VALUE #( ( lt_interim ) ) WHEN condition2 THEN lt_filtered ELSE lv_switch ).21.2 临时变量法 在表达式中间插入临时变量 DATA(lv_debug) REDUCE #( INIT lv_sum 0 FOR ls_item IN lt_items NEXT lv_sum lv_sum ( COND #( WHEN ls_item-valid abap_true THEN ls_item-amount ELSE 0 ) ) ). cl_demo_outputdisplay( lv_debug ).21.3 日志注入法DATA(lv_complex) REDUCE #( INIT lv_total 0 FOR ls_line IN lt_data NEXT lv_total lv_total SWITCH #( ls_line-type WHEN A THEN ls_line-amount * 1.1 WHEN B THEN COND #( WHEN ls_line-date iv_cutoff THEN ls_line-amount ELSE ls_line-amount * 0.9 ) ELSE CONV #( 0 ) ) THEN log_write( lv_total ) ). 记录中间结果22. 与ABAP对象模型的结合新语法与传统ABAP OO可以完美结合22.1 在方法中使用METHODS filter_materials IMPORTING it_input TYPE ty_material_tab iv_matkl TYPE matkl RETURNING VALUE(rt_result) TYPE ty_material_tab. METHOD filter_materials. rt_result FILTER #( it_input USING KEY matkl WHERE matkl iv_matkl ). ENDMETHOD.22.2 构建流畅接口CLASS lcl_builder DEFINITION. PUBLIC SECTION. METHODS: set_filter IMPORTING iv_field TYPE string iv_value TYPE any RETURNING VALUE(ro_self) TYPE REF TO lcl_builder, build RETURNING VALUE(rt_data) TYPE ty_table. PRIVATE SECTION. DATA: mt_filters TYPE ty_filter_tab. ENDCLASS. METHOD set_filter. mt_filters VALUE #( BASE mt_filters ( field iv_field value iv_value ) ). ro_self me. ENDMETHOD. METHOD build. rt_data REDUCE #( INIT lt_result mt_source_data FOR ls_filter IN mt_filters NEXT lt_result FILTER #( lt_result USING KEY (ls_filter-field) WHERE (ls_filter-field) ls_filter-value ) ). ENDMETHOD.23. 与CDS视图的协同在CDS视图和ABAP新语法之间建立桥梁23.1 CDS参数传递 CDS视图定义 AbapCatalog.sqlViewName: ZCDS_MATFILTER define view Z_MaterialFilter as select from mara parameters p_matkl : matkl { key matnr, mtart, matkl } where matkl :p_matkl; ABAP中使用 DATA(lt_materials) FILTER #( VALUE ty_material_tab( FOR ls_cds IN zcl_cds_readerget_data( p_matkl 1020 ) ( CORRESPONDING #( ls_cds ) ) ) USING KEY primary_key WHERE matnr LIKE MAT% ).23.2 类型安全转换 从CDS返回的深结构中提取数据 DATA(lt_flat) VALUE ty_flat_table( FOR ls_deep IN lt_cds_data ( matnr ls_deep-material-matnr werks ls_deep-plant-plant_id lgort COND #( WHEN ls_deep-storage-location IS NOT INITIAL THEN ls_deep-storage-location ELSE DEFAULT ) ) ).24. 与Fiori元素的集成新语法特别适合构建OData服务响应24.1 构建ETag响应METHOD get_entity. DATA(ls_entity) REDUCE #( INIT ls_result TYPE ty_entity FOR ls_db IN FILTER #( mt_db_data USING KEY bukrs WHERE bukrs iv_bukrs AND belnr iv_belnr ) NEXT ls_result VALUE #( bukrs ls_db-bukrs belnr ls_db-belnr etag |{ ls_db-last_changed TIMESTAMP ISO }| ) ). er_entity CORRESPONDING #( ls_entity ). ENDMETHOD.24.2 批量操作响应METHOD batch_process. rt_results VALUE #( FOR ls_input IN it_input ( key ls_input-key status COND #( WHEN line_exists( FILTER #( mt_valid_keys USING KEY primary_key WHERE key ls_input-key ) )

相关文章:

SAP ABAP on HANA开发避坑指南:新语法FILTER、SWITCH、COND的常见错误与最佳实践

SAP ABAP on HANA开发实战:FILTER、SWITCH、COND高阶用法与性能优化 在SAP HANA平台上,ABAP语言的进化带来了FILTER、SWITCH、COND等新语法特性,它们像瑞士军刀一样为开发者提供了更简洁高效的编程方式。但正如任何锋利的工具,如…...

Revelation光影包:免费打造Minecraft电影级画质的终极解决方案

Revelation光影包:免费打造Minecraft电影级画质的终极解决方案 【免费下载链接】Revelation An explorative shaderpack for Minecraft: Java Edition 项目地址: https://gitcode.com/gh_mirrors/re/Revelation 还在为Minecraft原版单调的画面而烦恼吗&#…...

AMD Ryzen系统管理单元调试工具SMUDebugTool完全指南:免费开源硬件调节利器

AMD Ryzen系统管理单元调试工具SMUDebugTool完全指南:免费开源硬件调节利器 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. …...

揭秘Parse12306:如何用C自动化抓取全国高铁时刻表数据

揭秘Parse12306:如何用C#自动化抓取全国高铁时刻表数据 【免费下载链接】Parse12306 分析12306 获取全国列车数据 项目地址: https://gitcode.com/gh_mirrors/pa/Parse12306 你是否曾为获取权威的铁路数据而烦恼?无论是开发旅行规划应用、进行交通…...

量子机器学习中的噪声挑战与纠错技术实践

1. 量子机器学习中的噪声挑战与纠错需求 量子机器学习(QML)作为量子计算与经典机器学习的交叉领域,正在重新定义人工智能的边界。与传统机器学习相比,QML利用量子态的叠加和纠缠特性,理论上可以在特定任务上实现指数级…...

浏览器标签页防误关扩展开发:原理、实现与调试指南

1. 项目概述:一个专治“手滑”的浏览器标签页守护者 作为一名长期泡在代码编辑器里的开发者,我敢打赌,你肯定有过这样的经历:在浏览器里开着GitHub Codespaces或者VSCode Web版,正沉浸式地敲代码,脑子里想着…...

通过 Elastic MCP Server 将 Cursor 连接到生产日志

作者:来自 Elastic Jeffrey Rengifo 了解如何使用 Elastic Agent Builder MCP server 将 Cursor 连接到你的 Elastic APM 数据,这样你就可以在不离开编辑器的情况下调试生产错误,并基于真实使用数据做出 UI 决策。 前置条件 Elasticsearch 9…...

DX-BT04-A蓝牙模块连接不上?可能是AT指令这几个坑你没注意

DX-BT04-A蓝牙模块连接故障排查指南:AT指令的七个致命陷阱 蓝牙模块在物联网设备开发中扮演着关键角色,而DX-BT04-A以其稳定性和易用性成为众多开发者的首选。但当你满怀信心地发送AT指令时,模块却沉默不语——这种挫败感我深有体会。去年在…...

在 Elastic 中使用 MCP 自动化用户旅程以进行合成监控

作者:来自 Elastic Jessica Garson 本文探讨如何使用 Elastic Observability、TypeScript 和 FastMCP 自动创建合成监控中的用户旅程(journeys),并演示该应用及其工作流程。 Elastic Observability 中的 Synthetic Monitoring 允许…...

别再只盯着算法了!手把手教你用ROS和Gazebo搭建第一个激光SLAM仿真环境(Ubuntu 20.04)

激光SLAM实战:从仿真环境搭建到算法验证全流程指南 在机器人导航领域,激光SLAM技术已经从实验室走向工业应用,成为自动驾驶、服务机器人等场景的核心组件。但许多初学者常陷入一个误区——过度关注算法理论而忽视工程实践。本文将打破这一惯性…...

Elastic-caveman : 在不损失 Elastic 最佳效果的情况下,将 AI 响应 tokens 减少64%

作者:来自 Elastic Sri Kolagani 了解如何使用 elastic-caveman,在保留 Elastic 代理能力优势的同时减少 AI 响应的 token 消耗。 Agent Builder 现已正式发布。通过 Elastic Cloud Trial 开始使用,并查看这里的 Agent Builder 文档。 当通过…...

Navicat无限试用完整解决方案:三步彻底解决macOS版14天限制

Navicat无限试用完整解决方案:三步彻底解决macOS版14天限制 【免费下载链接】navicat_reset_mac navicat mac版无限重置试用期脚本 Navicat Mac Version Unlimited Trial Reset Script 项目地址: https://gitcode.com/gh_mirrors/na/navicat_reset_mac 还在为…...

Windows热键冲突终极指南:3分钟精准定位占用程序的免费工具

Windows热键冲突终极指南:3分钟精准定位占用程序的免费工具 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是…...

终极指南:如何免费解锁WeMod高级功能?Wand-Enhancer为你提供完整解决方案

终极指南:如何免费解锁WeMod高级功能?Wand-Enhancer为你提供完整解决方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 你是否…...

5分钟掌握:终极免费图像转字节数组工具让OLED开发如此简单

5分钟掌握:终极免费图像转字节数组工具让OLED开发如此简单 【免费下载链接】image2cpp 项目地址: https://gitcode.com/gh_mirrors/im/image2cpp image2cpp图像转换工具是一个专为嵌入式开发者设计的强大在线工具,能够将普通图像快速转换为适用于…...

不只是MC和L4D2:用Python RCON库,我还能管理这些Steam游戏服务器

用Python RCON库解锁多款Steam游戏服务器的管理潜能 当你在《Rust》中需要紧急重启服务器,或想在《7 Days to Die》里实时调整僵尸数量时,是否厌倦了反复登录服务器控制面板?Python的RCON库能让你用代码直接与游戏服务器对话。这不仅仅是《我…...

ParroT框架实战:用指令与反馈数据驯化开源大模型,打造可控翻译助手

1. 项目概述:用“提示”与“反馈”驯化大语言模型,打造专属翻译助手 在机器翻译领域,我们正处在一个激动人心的十字路口。以ChatGPT、GPT-4为代表的大语言模型(LLMs)展现出了令人惊叹的对话和翻译能力,但它…...

DRIFT技术:动态微调提升多模态大模型推理性能

1. 项目概述 DRIFT(Dynamic Refinement through Injected Fine-Tuning)是一种针对多模态大模型的轻量级优化技术,通过在推理阶段动态注入梯度信号,显著提升模型在复杂任务中的表现。这项技术特别适合处理需要跨模态对齐的视觉-语言…...

阿里推AI生成视频模型Happy Horse,算力消耗与商业价值不匹配,打法或需调整

01 跑分第一名月月有,不必过于上心欲拒还迎的阿里把AI生成视频模型Happy Horse正式推上了台面。Happy Horse 1.0开启灰度测试,专业创作者和企业客户走阿里云百炼,大众用户在千问首页就能用上新加的胶囊入口。刊例价720P每秒0.9元、1080P每秒1…...

3分钟极速安装:Windows下iPhone USB网络共享驱动一键解决方案

3分钟极速安装:Windows下iPhone USB网络共享驱动一键解决方案 【免费下载链接】Apple-Mobile-Drivers-Installer Powershell script to easily install Apple USB and Mobile Device Ethernet (USB Tethering) drivers on Windows! 项目地址: https://gitcode.com…...

如何彻底解决Dell G15散热问题:tcc-g15开源控制中心完整指南

如何彻底解决Dell G15散热问题:tcc-g15开源控制中心完整指南 【免费下载链接】tcc-g15 Thermal Control Center for Dell G15 - open source alternative to AWCC 项目地址: https://gitcode.com/gh_mirrors/tc/tcc-g15 想象一下,你正在用Dell G1…...

专业窗口调整工具:重新掌控你的Windows桌面布局

专业窗口调整工具:重新掌控你的Windows桌面布局 【免费下载链接】WindowResizer 一个可以强制调整应用程序窗口大小的工具 项目地址: https://gitcode.com/gh_mirrors/wi/WindowResizer WindowResizer是一款基于C和MFC开发的免费开源工具,专门用于…...

解放STM32的串口潜力:Arduino环境下玩转多串口通信(Serial1/2/3实例化与数据收发实战)

解放STM32的串口潜力:Arduino环境下玩转多串口通信 当你第一次接触STM32时,可能会被它丰富的硬件资源所震撼——尤其是那些看似普通却功能强大的串口。不同于常见的Arduino Uno只有一个硬件串口,STM32系列单片机通常配备2-10个不等的硬件串口…...

3大核心优化,让你的魔兽争霸III在现代电脑上重获新生

3大核心优化,让你的魔兽争霸III在现代电脑上重获新生 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸III在现代电脑上的兼容…...

别再傻等画面了!海康/大华摄像头RTSP延迟高?试试这3个立竿见影的配置优化

海康/大华摄像头RTSP延迟优化实战指南 监控画面延迟3秒,关键事件发生时你还在看历史影像?这个问题困扰着无数安防工程师。上周某大型商超的防损案例就很典型——当值班人员通过监控发现货架商品被盗时,嫌疑人早已离开现场,3秒的延…...

精密低电流与高阻测量技术解析与应用

1. 精密低电流测量技术解析 在半导体材料特性分析、纳米器件测试以及光电探测器评估等前沿领域,皮安级甚至飞安级电流的精确测量已成为关键技术瓶颈。这类测量面临的核心挑战在于:待测信号极其微弱,而环境干扰和系统噪声往往比有用信号高出数…...

Swoole长连接承载LLM请求的5层熔断设计:连接层、协议层、推理层、缓存层、降级层——2024金融级容灾白皮书首次公开

更多请点击: https://intelliparadigm.com 第一章:Swoole长连接承载LLM请求的5层熔断设计全景概览 在高并发LLM服务场景中,Swoole协程长连接作为请求入口,需应对模型推理延迟突增、GPU显存溢出、网络抖动、客户端异常重连及上游限…...

遥感新手别踩坑:哥白尼Dataspace下载Sentinel-1数据时,关于‘单文件下载’和‘离线申请’的几点真相

遥感数据获取实战:避开Copernicus Dataspace的五个典型操作陷阱 当你第一次登录Copernicus Dataspace平台,面对琳琅满目的功能按钮时,是否感到无从下手?作为欧洲航天局最新的遥感数据门户,这个平台确实藏着不少新手容易…...

OpenClaw从入门到应用——Agent:订阅认证(OAuth)

通过OpenClaw实现副业收入:《OpenClaw赚钱实录:从“养龙虾“到可持续变现的实践指南》 OpenClaw 通过 OAuth 支持"订阅认证",适用于提供此功能的提供商(特别是 OpenAI Codex (ChatGPT OAuth))。对于 Anthro…...

STM32H743飞控DIY:手把手教你搞定BMI088的SPI引脚配置与PX4驱动移植(避坑指南)

STM32H743飞控DIY:手把手教你搞定BMI088的SPI引脚配置与PX4驱动移植(避坑指南) 在DIY飞控板的开发过程中,传感器接口的正确配置往往是决定项目成败的关键环节。特别是当使用STM32H743这类高性能MCU搭配BMI088这样的高精度IMU时&a…...