ABAP关联簇表BSEG报「不允许用于JOIN」错误的解决方案咨询
报错原因
报错是因为
BSEG属于SAP ABAP中的簇表,ABAP语法规定不允许对簇表、池表使用JOIN关联操作,因此你直接在SELECT语句中JOIN BSEG会触发语法错误。
解决方案
方案1:拆分查询,配合FOR ALL ENTRIES语法实现关联(兼容ECC和S/4全版本)
该方案不需要改动原有逻辑,拆分查询后合并结果即可,示例代码如下:
" 第一步:先查询符合条件的BKPF数据 SELECT bukrs, belnr, budat, gjahr FROM bkpf INTO TABLE @DATA(lt_bkpf) WHERE bukrs IN @so_bukrs AND budat IN @so_budat AND blart IN @so_blart. IF lt_bkpf IS NOT INITIAL. " 第二步:根据BKPF的主键查询对应BSEG行项目 SELECT bukrs, belnr, gjahr, buzei, kunnr FROM bseg INTO TABLE @DATA(lt_bseg) FOR ALL ENTRIES IN @lt_bkpf WHERE bukrs = @lt_bkpf-bukrs AND belnr = @lt_bkpf-belnr AND gjahr = @lt_bkpf-gjahr AND kunnr IS NOT INITIAL. " 过滤没有客户号的行,减少后续查询量 ENDIF. IF lt_bseg IS NOT INITIAL. " 第三步:根据BSEG的客户号查询KNBK银行数据 SELECT kunnr, banks, bankl, bankn FROM knbk INTO TABLE @DATA(lt_knbk) FOR ALL ENTRIES IN @lt_bseg WHERE kunnr = @lt_bseg-kunnr. " 第四步:合并三个内表的数据到最终结果 SORT lt_bseg BY bukrs belnr gjahr. SORT lt_knbk BY kunnr. LOOP AT lt_bkpf INTO DATA(ls_bkpf). LOOP AT lt_bseg INTO DATA(ls_bseg) WHERE bukrs = ls_bkpf-bukrs AND belnr = ls_bkpf-belnr AND gjahr = ls_bkpf-gjahr. READ TABLE lt_knbk INTO DATA(ls_knbk) WITH KEY kunnr = ls_bseg-kunnr BINARY SEARCH. APPEND VALUE #( bukrs = ls_bkpf-bukrs belnr = ls_bkpf-belnr budat = ls_bkpf-budat gjahr = ls_bkpf-gjahr buzei = ls_bseg-buzei kunnr = ls_bseg-kunnr banks = ls_knbk-banks bankl = ls_knbk-bankl bankn = ls_knbk-bankn ) TO lt_data_knbk. ENDLOOP. ENDLOOP. ENDIF.
注意:使用FOR ALL ENTRIES前必须判断参考内表是否为空,否则会跳过WHERE条件查询全表数据。
方案2:使用客户行项目索引表替代BSEG(性能最优,推荐优先使用)
BSEG的客户相关行项目分别存储在透明表BSID(客户未清项)和BSAD(客户已清项)中,二者均为透明表支持JOIN操作,你可以将两个表UNION后替代BSEG,直接实现三表关联,示例代码如下:
SELECT k~bukrs, k~belnr, k~budat, k~gjahr, s~buzei, s~kunnr, i~banks, i~bankl, i~bankn FROM bkpf AS k INNER JOIN ( SELECT bukrs, belnr, gjahr, buzei, kunnr FROM bsid UNION ALL SELECT bukrs, belnr, gjahr, buzei, kunnr FROM bsad ) AS s ON s~bukrs = k~bukrs AND s~belnr = k~belnr AND s~gjahr = k~gjahr INNER JOIN knbk AS i ON i~kunnr = s~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.
该方案的查询效率远高于直接查询簇表BSEG,只要你的业务只需要客户相关的财务行项目,优先选择该方案。
方案3:S/4 HANA环境直接使用JOIN
如果你使用的是S/4 HANA系统,BSEG已经重构为透明表,直接使用你原本的JOIN语句即可,不会触发语法错误。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

