You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:48:02