ABAP技术问询:如何从BKPF表获取数据?已实现参数拼接查询
正确从BKPF表获取数据的ABAP实现方案
嗨,针对你在ABAP开发中想用SELECT-OPTIONS和PARAMETERS组合查询BKPF数据的需求,我给你两种常见场景的解决方案,直接就能用:
一、常规场景:直接用选择选项和参数做查询条件
这是最省心的方式——ABAP的SELECT语句天生支持直接使用SELECT-OPTIONS类型的条件,完全不需要手动拼接,既高效又不容易出错。如果你的需求是**查凭证号在s_belnr范围内、会计年度等于p_ghjahr**的BKPF数据,直接这么写:
TABLES: bkpf. SELECT-OPTIONS: s_belnr FOR bkpf-belnr NO-EXTENSION OBLIGATORY. PARAMETERS: p_ghjahr LIKE bkpf-gjahr DEFAULT sy-datum(4) OBLIGATORY. DATA: it_bkpf TYPE STANDARD TABLE OF bkpf, wa_bkpf TYPE bkpf. * 核心查询语句:直接用IN和等于条件 SELECT * FROM bkpf INTO TABLE it_bkpf WHERE belnr IN s_belnr AND gjahr = p_ghjahr. * 后续处理数据(比如打印输出) LOOP AT it_bkpf INTO wa_bkpf. WRITE: / wa_bkpf-belnr, wa_bkpf-gjahr, wa_bkpf-bukrs. ENDLOOP.
为什么不用手动拼接?因为SELECT-OPTIONS自带sign(包含/排除)、option(匹配规则:EQ/BT等)、low/high这些属性,SELECT会自动解析生成对应的WHERE子句,还能避免SQL注入风险,比自己拼字符串靠谱多了。
二、特殊场景:通过AWKEY拼接条件查询
如果你是想通过BKPF的AWKEY字段(一般是凭证号+会计年度的拼接格式,比如00000123452024)来查询,那需要先把选择的凭证号和年度拼接成AWKEY的格式,再作为查询条件:
TABLES: bkpf. SELECT-OPTIONS: s_belnr FOR bkpf-belnr NO-EXTENSION OBLIGATORY. PARAMETERS: p_ghjahr LIKE bkpf-gjahr DEFAULT sy-datum(4) OBLIGATORY. DATA: it_awkey TYPE STANDARD TABLE OF string, wa_awkey TYPE string, it_bkpf TYPE STANDARD TABLE OF bkpf, wa_bkpf TYPE bkpf. * 遍历选择选项,拼接每个凭证号+年度为AWKEY格式 LOOP AT s_belnr INTO DATA(ls_belnr). CASE ls_belnr-option. * 单值匹配的情况(EQ/NE/GT等) WHEN 'EQ' OR 'NE' OR 'GT' OR 'LT' OR 'GE' OR 'LE'. * 注意:BELNR是10位字符型,要补前导零保证和AWKEY格式一致 DATA(lv_formatted_belnr) TYPE string. WRITE ls_belnr-low TO lv_formatted_belnr LEFT-JUSTIFIED NO-GAP. CONCATENATE lv_formatted_belnr p_ghjahr INTO wa_awkey. APPEND wa_awkey TO it_awkey. * 范围匹配的情况(BT/NB) WHEN 'BT' OR 'NB'. DATA(lv_belnr_from) = ls_belnr-low. DATA(lv_belnr_to) = ls_belnr-high. DO. WRITE lv_belnr_from TO lv_formatted_belnr LEFT-JUSTIFIED NO-GAP. CONCATENATE lv_formatted_belnr p_ghjahr INTO wa_awkey. APPEND wa_awkey TO it_awkey. IF lv_belnr_from >= lv_belnr_to. EXIT. ENDIF. lv_belnr_from = lv_belnr_from + 1. ENDDO. ENDCASE. ENDLOOP. * 用拼接好的AWKEY列表查询BKPF SELECT * FROM bkpf INTO TABLE it_bkpf WHERE awkey IN it_awkey. * 后续处理数据 LOOP AT it_bkpf INTO wa_bkpf. WRITE: / wa_bkpf-awkey, wa_bkpf-belnr, wa_bkpf-gjahr. ENDLOOP.
这里要注意两个点:
- BELNR是10位字符型,直接拼接数字会丢失前导零,必须用
WRITE语句格式化,保证和AWKEY里的格式一致; - 如果选择的凭证号范围很大(比如从1到10000),遍历区间会影响性能,这种情况建议直接用第一种常规查询方式,效率更高。
三、你原有代码片段的修正
你原来的代码写到CONCATENATE s_belnr-...就卡住了,其实如果是单值选择(s_belnr-high IS INITIAL),直接用常规查询就可以,不用手动拼接。修正后的片段参考:
TABLES: bkpf. SELECT-OPTIONS: s_belnr FOR bkpf-belnr NO-EXTENSION OBLIGATORY. PARAMETERS: p_ghjahr LIKE bkpf-gjahr DEFAULT sy-datum(4) OBLIGATORY. DATA: it_con TYPE TABLE OF bkpf, ls_con TYPE bkpf-awkey, lv_belnr LIKE bkpf-belnr, it TYPE STANDARD TABLE OF bkpf, wa TYPE bkpf. * 直接查询,无需手动拼接选择选项 SELECT * FROM bkpf INTO TABLE it WHERE belnr IN s_belnr AND gjahr = p_ghjahr. * 如果需要提取AWKEY的话 LOOP AT it INTO wa. WRITE wa-belnr TO lv_belnr LEFT-JUSTIFIED NO-GAP. CONCATENATE lv_belnr wa-gjahr INTO ls_con. * 这里可以把数据存入it_con,或者单独处理ls_con APPEND wa TO it_con. ENDLOOP.
内容的提问来源于stack exchange,提问作者Kjarlvi
相关产品推荐
相关产品推荐

