不使用INNER JOIN时如何在SELECT查询中使用BSEG表的KOART字段
针对ABAP查询中使用BSEG表KOART字段的解决方案
方案1:直接使用索引表自带KOART字段(最优性能方案)
BSID是SAP标准的客户未清行项目索引表,本身就是BSEG拆分出的透明表,所有行对应的KOART(账户类型)固定为D(客户),且表结构自带KOART字段,完全不需要关联BSEG即可直接使用,你的需求可以直接改写查询逻辑实现:
CONSTANTS: lc_d TYPE c VALUE 'D'. SELECT k~bukrs, k~belnr, k~budat, k~gjahr, k~buzei, k~kunnr, k~koart, " 直接从BSID取KOART字段 i~banks, i~bankl, i~bankn FROM bsid AS k INNER JOIN knbk AS i ON k~kunnr EQ i~kunnr INTO TABLE @DATA(lt_data_knbk) WHERE k~bukrs IN @so_bukrs AND k~budat IN @so_budat AND k~blart IN @so_blart AND k~koart = @lc_d. " 直接加筛选条件即可
如果需要同时覆盖客户已清项数据,可以将BSID替换为BSID UNION ALL BSAD,两个表均自带KOART字段。
方案2:分两次查询+FOR ALL ENTRIES(通用关联BSEG方案)
如果业务逻辑确实需要从BSEG取数,无法用索引表替代,可以采用该方式规避簇表无法JOIN的限制:
CONSTANTS: lc_d TYPE c VALUE 'D'. * 第一步:先查询BSID和KNBK的基础数据 SELECT k~bukrs, k~belnr, k~budat, k~gjahr, k~buzei, k~kunnr, i~banks, i~bankl, i~bankn FROM bsid AS k INNER JOIN knbk AS i ON k~kunnr EQ i~kunnr INTO TABLE @DATA(lt_data_knbk) WHERE k~bukrs IN @so_bukrs AND k~budat IN @so_budat AND k~blart IN @so_blart. IF lt_data_knbk IS NOT INITIAL. * 第二步:用FOR ALL ENTRIES查询BSEG匹配KOART条件的行 SELECT bukrs, belnr, gjahr, buzei, koart FROM bseg INTO TABLE @DATA(lt_bseg_koart) FOR ALL ENTRIES IN @lt_data_knbk WHERE bukrs = @lt_data_knbk-bukrs AND belnr = @lt_data_knbk-belnr AND gjahr = @lt_data_knbk-gjahr AND buzei = @lt_data_knbk-buzei AND koart = @lc_d. * 第三步:合并结果、过滤不符合条件的行 SORT lt_bseg_koart BY bukrs belnr gjahr buzei. LOOP AT lt_data_knbk ASSIGNING FIELD-SYMBOL(<fs_data>). READ TABLE lt_bseg_koart INTO DATA(ls_bseg) WITH KEY bukrs = <fs_data>-bukrs belnr = <fs_data>-belnr gjahr = <fs_data>-gjahr buzei = <fs_data>-buzei BINARY SEARCH. IF sy-subrc <> 0. DELETE lt_data_knbk. ELSE. <fs_data>-koart = ls_bseg-koart. ENDIF. ENDLOOP. ENDIF.
补充说明
如果系统已经升级到S/4HANA版本,BSEG已优化为透明表,支持直接JOIN操作,你原本注释的JOIN逻辑可以直接启用运行。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

