ABAP SELECT语句含BETWEEN日期范围查询结果与SE16N不符问题排查
ABAP SELECT语句结果与SE16N查询不一致的排查
问题场景
需提取指定日期范围的数据,SE16N手动查询返回1000条正确记录,但执行以下SELECT语句仅得到6条结果,需排查语句问题:
DATA: lv_document_date_since TYPE d, lv_document_date_until TYPE d. SELECT bk~belnr FROM bset AS bt INNER JOIN bkpf AS bk ON ( bt~bukrs = bk~bukrs AND bt~belnr = bk~belnr AND bt~gjahr = bk~gjahr ) WHERE bk~bldat BETWEEN @lv_document_date_since AND @lv_document_date_until AND bt~bukrs = @mv_bukrs AND bt~mwskz IN @mt_mwskz AND bk~budat IN @mt_budat ORDER BY bk~belnr INTO CORRESPONDING FIELDS OF TABLE @me->my_data.
核心问题与修正建议
- JOIN类型限制:当前使用
INNER JOIN,仅返回两张表关联条件完全匹配的记录。若SE16N查询的是单表(如BKPF)或允许凭证无对应BSET税行记录,需改为LEFT JOIN,避免过滤掉无税行的凭证。 - 筛选条件不匹配:
- 检查
@mt_budat参数:确认SE16N查询时是否添加了budat的范围限制,若SE16N未设置该条件,代码中的bk~budat IN @mt_budat会大幅过滤结果。 - 核对
@mv_bukrs和@mt_mwskz的取值:确保这两个参数的筛选范围与SE16N完全一致,比如是否存在参数值遗漏、多选值错误的情况。
- 检查
- 重复记录未去重:BSET表中一个凭证(BKPF的
belnr)对应多条税行,INNER JOIN后会返回多条相同belnr的记录,若SE16N查询的是BKPF单表(每个凭证仅一条记录),需添加DISTINCT关键字去重,保证结果的凭证数量与SE16N一致。 - 关联条件校验:虽然
bukrs+belnr+gjahr是BSET与BKPF的标准关联键,仍需确认代码中无拼写错误(如字段名大小写、符号使用)。
调整后的示例代码
DATA: lv_document_date_since TYPE d, lv_document_date_until TYPE d. SELECT DISTINCT bk~belnr FROM bkpf AS bk LEFT JOIN bset AS bt ON ( bt~bukrs = bk~bukrs AND bt~belnr = bk~belnr AND bt~gjahr = bk~gjahr ) WHERE bk~bldat BETWEEN @lv_document_date_since AND @lv_document_date_until AND ( bt~bukrs = @mv_bukrs OR bt~bukrs IS NULL ) AND ( bt~mwskz IN @mt_mwskz OR bt~mwskz IS NULL ) AND bk~budat IN @mt_budat ORDER BY bk~belnr INTO CORRESPONDING FIELDS OF TABLE @me->my_data.
说明:若业务要求必须存在对应BSET记录,可保留
INNER JOIN,但需严格对齐SE16N的所有筛选参数;若仅需提取BKPF中符合条件的凭证,直接查询BKPF表会更高效。
内容的提问来源于stack exchange,提问作者user14674462
相关产品推荐
相关产品推荐

