写一个RFC,在VK11下,把条件类型是Z907的一些数据输出。
在IMPORT下入参 定义2个
IT_VKORG LIKEA907-VKORG 销售组织
IT_KUNNR LIKE A907-KUNNR 客户号
当输入IT_VKOGR 或者 IT_KUNNR 时,或者2个都输入都能获取到数据。 这个看似简单的需求,我确花费了大概1天的时间。
其中卡就卡在:
第一,对ranges基本用法的不理解;
第二,没有进行判断就执行;
第三,对where条件后的 and 和 or 不了解。
下面看看最后正确的做法:
定义ranges
RANGES : s_vkorg FOR itab-vkorg,
s_kunnr FOR itab-kunnr.
IF it_vkorg IS NOT INITIAL. "一定要判断输入的值是否为空。
s_vkorg-sign = 'I'.
s_vkorg-option = 'EQ'. " 如果option='EQ'.后面就不需要HIGH
s_vkorg-low = it_vkorg.
APPEND s_vkorg.
ENDIF.
IF it_kunnr IS NOT INITIAL.
s_kunnr-sign = 'I'.
s_kunnr-option = 'EQ'.
s_kunnr-low = it_kunnr.
APPEND s_kunnr.
ENDIF.
SELECT a~kappl a~kschl a~vkorg a~kunnr a~knumh a~datab a~datbi b~kbetr b~konwa
INTO CORRESPONDING FIELDS OF TABLE itab
FROM a907 AS a JOIN konp AS b ON a~knumh = b~knumh
WHERE a~vkorg IN s_vkorg
AND a~kunnr IN s_kunnr.
ranges知识:
RANGES <seltab> FOR <f>.
该语句创建 选择表 <seltab>, 该表参考数 据库表的列 <f> 或内部字段 <f>。选 择表 <seltab> 必须在程序 中填充。不 必在程序中 再用 TABLES 语句声明数 据库表。
RANGES 语句是下列 语句的短格 式:
DATA: BEGIN OF <seltab> OCCURS 10,
SIGN(1),
OPTION(2)
LOW LIKE <f>,
HIGH LIKE <f>,
END OF <seltab>.