1. 有规律的字段名12345IF GS_DATA-WERKS1 . GS_STO-SWEK GS_DATA-WERKS1. ENDIF. IF GS_DATA-WERKS2 . GS_STO-SWEK GS_DATA-WERKS2. ENDIF. IF GS_DATA-WERKS3 . GS_STO-SWEK GS_DATA-WERKS3. ENDIF. IF GS_DATA-WERKS4 . GS_STO-SWEK GS_DATA-WERKS4. ENDIF. IF GS_DATA-WERKS5 . GS_STO-SWEK GS_DATA-WERKS5. ENDIF. IF GS_DATA-WERKS6 . GS_STO-SWEK GS_DATA-WERKS6. ENDIF.简化为FIELD-SYMBOLS: fs TYPE any. DO 6 TIMES. ASSIGN COMPONENT |WERKS{ sy-index }| OF STRUCTURE gs_data TO fs. IF fs IS ASSIGNED AND fs space. gs_sto-swek fs. ENDIF. ENDDO.用动态字段名拼接语法 |WERKS{ sy-index }| 生成字段名通过字段符号 fs 动态访问结构体字段保留原有覆盖逻辑最后一个非空值会覆盖前面的注意如果需求是取第一个非空值可以在赋值后添加 EXIT. 退出循环2.SPLIT减少定义用法DATA: lv_input TYPE char241, lv_result TYPE string. 假设 lv_input 是原始字段的值例如 123456qq.comlv_input 123456qq.com. 使用 SPLIT 分割字符串 SPLIT lv_input AT INTO lv_result DATA(lv_rest). 输出结果WRITE: / 提取的值为:, lv_result.3. 简单赋值SAP系统abap代码简化以下代码TYPES: BEGIN OF TY_FIELDVALUELIST, FIELDCODE TYPE STRING, 字段编码 VALUE TYPE STRING, 字段值 END OF TY_FIELDVALUELIST. DATA: GS_VALUE TYPE TY_FIELDVALUELIST, GT_VALUE TYPE STANDARD TABLE OF TY_FIELDVALUELIST. FREE:GT_VALUE[]. CLEAR GS_VALUE. GS_VALUE-FIELDCODE REPORT_NAME. GS_VALUE-VALUE xxxxxx表. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE COMPANY_CODE. GS_VALUE-VALUE GS_DATA-BUKRS. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE COMPANY_NAME. GS_VALUE-VALUE GS_DATA-BUTXT. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE STR_BILL_DATE. GS_VALUE-VALUE GS_DATA-BUDAT0(6). APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE ACCOUNT_NO. GS_VALUE-VALUE GS_DATA-ZREC_ACCOUNT. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE CURRENCY. GS_VALUE-VALUE GS_DATA-WAERS. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE CURRENCY_NAME. GS_VALUE-VALUE GS_DATA-ZUNIT. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE OPEN_BANK_NAME. GS_VALUE-VALUE GS_DATA-TEXT1. APPEND GS_VALUE TO GT_VALUE. CLEAR GS_VALUE. GS_VALUE-FIELDCODE BANK_ACCOUNT_ARRAY. GS_VALUE-VALUE GS_DATA-SAKNR. APPEND GS_VALUE TO GT_VALUE. TYPES: BEGIN OF ty_fieldvaluelist, fieldcode TYPE string, 字段编码 value TYPE string, 字段值 END OF ty_fieldvaluelist. DATA: gt_value TYPE STANDARD TABLE OF ty_fieldvaluelist.3.1 使用 VALUE 直接构造内表gt_value VALUE #( ( fieldcode REPORT_NAME value xxxxxx表 ) ( fieldcode COMPANY_CODE value gs_data-bukrs ) ( fieldcode COMPANY_NAME value gs_data-butxt ) ( fieldcode STR_BILL_DATE value gs_data-budat0(6) ) ( fieldcode ACCOUNT_NO value gs_data-zrec_account ) ( fieldcode CURRENCY value gs_data-waers ) ( fieldcode CURRENCY_NAME value gs_data-zunit ) ( fieldcode OPEN_BANK_NAME value gs_data-text1 ) ( fieldcode BANK_ACCOUNT_ARRAY value gs_data-saknr ) ( fieldcode AMOUNT value gs_data-zbaln ) ( fieldcode BANK_TYPE value gs_data-banktype ) ( fieldcode REVIEWED_BY value gs_data-usnam ) ).删除显式的 FREE 和 CLEAR 语句VALUE 操作符会自动覆盖内表原有内容无需单独定义工作区 gs_value3.2 范围表简单赋值lr_bsart VALUE #( sign I option EQ ( low ZNB) ( low ZNB1) ( low ZNB2) ( low ZNB7) ( low ZNB8) ).等价于lr_bsart VALUE #( ( sign I option EQ low ZNB) ( sign I option EQ low ZNB1) ( sign I option EQ low ZNB2) ( sign I option EQ low ZNB7) ( sign I option EQ low ZNB8) ).3.3 范围表的CONDVALUEDATA: LR_BELNR TYPE RANGE OF BELNR_D. LR_BELNR COND #( WHEN P_1 2 THEN VALUE #( ( SIGN I OPTION EQ LOW ) ) WHEN P_1 3 THEN VALUE #( ( SIGN I OPTION NE LOW ) ) ELSE VALUE #( ) ).4. Select fromitab排重采购组织数据 TYPES: BEGIN OF ty_pur, ekorg TYPE ekorg, zterm TYPE dzterm, waers TYPE waers, END OF ty_pur. DATA: lt_pur_collect TYPE STANDARD TABLE OF ty_pur, ls_pur_collect TYPE ty_pur. LOOP AT pt_data. ls_pur_collect-ekorg pt_data-ekorg. ls_pur_collect-zterm pt_data-zterm. ls_pur_collect-waers pt_data-waers. COLLECT ls_pur_collect INTO lt_pur_collect. CLEAR ls_pur_collect. ENDLOOP.必须要as xxfrom的itab必须不能带有header lineSELECT DISTINCT a~ekorg, a~zterm, a~waers FROM pt_datac AS a INTO TABLE DATA(lt_pur_distinct).5. 循环给范围表赋值注意方法中不能用header lineMETHOD is_my_bukrs. DATA:lr TYPE RANGE OF bukrs. SELECT bukrs INTO TABLE DATA(lt_bukrs) FROM zcompany_abroad WHERE is_my X. LOOP AT lt_bukrs ASSIGNING FIELD-SYMBOL(lfs_bukrs). CONCATENATE IEQ lfs_bukrs-bukrs INTO lr. APPEND lr. ENDLOOP. * APPEND IEQ 7100 TO lr. * APPEND IEQ 7300 TO lr. Rv boolc( iv IN lr ). ENDMETHOD.改成LOOP AT LT_BUKRS ASSIGNING FIELD-SYMBOL(LFS_BUKRS). APPEND VALUE #( SIGN I OPTION EQ LOW LFS_BUKRS-BUKRS ) TO LR. ENDLOOP.或者lr VALUE #( FOR ls IN lt_bukrs ( sign I option EQ low ls-bukrs ) ).即DATA:lr_vkorg TYPE RANGE OF vbak-vkorg. SELECT bukrs INTO TABLE DATA(lt_bukrs) FROM zcompany_abroad WHERE is_my X. lr_vkorg VALUE #( FOR ls IN lt_bukrs ( sign I option EQ low ls-bukrs ) ).或者METHOD is_my_bukrs. DATA(lr) VALUE RANGE OF bukrs( FOR ls IN ( SELECT bukrs FROM zcompany_abroad WHERE is_my X ) ( sign I option EQ low ls-bukrs ) ). rv boolc( iv IN lr ). ENDMETHOD.此版本更简洁使用 VALUE 直接构造范围表将数据库查询嵌入到范围表构造中省略中间内表变量 lt_bukrsFor增加where条件的话LR_MYBUKRS VALUE #( FOR LS IN LT_BUKRS WHERE ( IS_MY X ) ( SIGN I OPTION EQ LOW LS-BUKRS ) ).6. CASE转SWITCHCASE iv_werks0(2). WHEN 71. lv_bukrs 7100. WHEN 73. lv_bukrs 7300. WHEN OTHERS. ENDCASE.变为lv_bukrs SWITCH #( iv_werks0(2) WHEN 71 THEN 7100 WHEN 73 THEN 7300 ELSE ).在SWITCH中我们必须处理所有可能的情况因此我们需要为OTHERS指定一个值。ELSE 分支处理 OTHERS 情况。如果 lv_bukrs 未初始化建议声明时赋予默认值如 DATA(lv_bukrs) . 初始化 lv_bukrs SWITCH #( ... ) 同上7. READ TABLE简化LS_STCD5 VALUE #( LT_STCD5[ KUNNR LFS_Z011-DVKORG ] OPTIONAL ).等效的旧语法写法READ TABLE LT_STCD5 INTO LS_STCD5 WITH KEY KUNNR LFS_Z011-DVKORG. IF sy-subrc 0. CLEAR LS_STCD5. 未找到时清空结构 ENDIF.新语法通过 构造器表达式 内表查询 实现了更简洁、安全的内表检索操作避免了显式的 SY-SUBRC 检查和初始化逻辑是 ABAP 现代化编程的重要特性。[问题分析]第一种写法的问题TRY . DATA(ls_1) VALUE #( lt_026_01[ ekorg gs_all-ekorg ] OPTIONAL ). DATA(ls_2) VALUE #( lt_026_01[ ekorg ls_mm026-ekorg ] OPTIONAL ). CATCH cx_sy_itab_line_not_found. ENDTRY.问题当使用 OPTIONAL 时表表达式不会抛出 cx_sy_itab_line_not_found 异常如果找不到记录会返回初始值而不是抛出异常因此CATCH 块永远不会执行TRY-ENDTRY 是多余的。8. IF…ELSE变CONDIF LS_KP_ITEM-BELNR IS NOT INITIAL. LS_ITEM-VBELN LS_KP_ITEM-BELNR. ELSE. LS_ITEM-VBELN LS_KP_ITEM-MBLNR. ENDIF. IF LS_KP_ITEM-BUZEI IS NOT INITIAL. LS_ITEM-POSNR LS_KP_ITEM-BUZEI. ELSE. LS_ITEM-POSNR LS_KP_ITEM-ZEILE. ENDIF.变成LS_ITEM-VBELN COND #( WHEN LS_KP_ITEM-BELNR IS NOT INITIAL THEN LS_KP_ITEM-BELNR ELSE LS_KP_ITEM-MBLNR ). LS_ITEM-POSNR COND #( WHEN LS_KP_ITEM-BUZEI IS NOT INITIAL THEN LS_KP_ITEM-BUZEI ELSE LS_KP_ITEM-ZEILE ).减少IF-ELSE的嵌套直接作为表达式使用逻辑与原代码完全等效仅语法简化9. ORDER BY 等价SELECT MATNR INTO TABLE DATA(MTART_Z006) FROM MARA WHERE MTART Z006 ORDER BY MATNR . SELECT MATNR INTO TABLE DATA(MTART_Z006) FROM MARA WHERE MTART Z006 ORDER BY MATNR DESCENDING.等价于SELECT MATNR INTO TABLE DATA(MTART_Z006) FROM MARA WHERE MTART Z006. SORT MTART_Z006 BY MATNR.执行过程数据库如 HANA、Oracle 等在读取数据时会直接按照 MATNR 字段进行排序然后将已经排好序的结果集返回给 ABAP并填充到内表 MTART_Z006 中。优点效率通常更高对于大数据量的查询数据库的排序算法通常比 ABAP 应用服务器的排序更高效尤其是在数据库有针对性的优化如索引时。代码简洁一行代码完成查询和排序。DESCENDING 关键字在 ORDER BY 子句后添加 DESCENDING 来指定降序排列而使用sort的话ABAP 应用服务器再在内存中对这个内表执行 SORT 命令。控制灵活如果后续需要不同的排序方式或者需要基于更复杂的逻辑进行排序使用 SORT 会更灵活。10. CONDLS_MOD-VBELN_IM COND #( WHEN LFS_EI-VBELN_IM IS INITIAL THEN LFS_EI-BELNR ELSE LFS_EI-VBELN_IM ). LS_MOD-VBELP_IM COND #( WHEN LFS_EI-VBELN_IM IS INITIAL THEN LFS_EI-BUZEI ELSE LFS_EI-VBELP_IM ).11. VALUE 语法一次性赋值给结构体ls_chksmpprc VALUE #( lifnr ls_header-lifnr matnr ls_items-matnr ekorg ls_header-ekorg waers ls_komv-waers kdatu ls_komv-kdatu kbetr ls_komv-kbetr kpein ls_komv-kpein ).12. SWITCHls_chksmpprc VALUE #( lifnr ls_header-lifnr matnr ls_items-matnr ekorg ls_header-ekorg waers ls_komv-waers kdatu ls_komv-kdatu kbetr ls_komv-kbetr kpein ls_komv-kpein esokz SWITCH #( ls_header-bsart WHEN ZNB OR ZNB0 OR ZNB8 THEN 0 WHEN ZNB1 OR ZNBA THEN 3 ELSE 0 ) ).13. COND和SWITCH区别在 ABAP 7.40 及以上版本中可以用 COND 或 SWITCH 表达式简化这类赋值逻辑。使用 COND 写法gfs_sbi-ztaxid COND #( WHEN gfs_sbi-zpercent 0 THEN 06 ELSE 01 ).使用 SWITCH 写法基于字段值判断gfs_sbi-ztaxid SWITCH #( gfs_sbi-zpercent WHEN 0 THEN 06 ELSE 01 ).两者功能完全相同。COND 更适合逻辑条件判断这里是 比较SWITCH 则更适合直接基于某个变量的值做多路分支。这里条件简单两种都可以使用。