Lil*_*hal 2 abap opensql sap-selection-screens
我有一个程序,除其他外,它RESB根据bdter字段(一种 DATS 类型)从表中检索数据。在选择屏幕上,用户指定范围或使用标准范围(月初 - 今天)。
但是,如果我尝试在未填写日期的情况下(用户未输入日期范围)尝试重新使用我为日期创建的选择选项,则我对该工作区的更改似乎无法识别在我的选择语句中使用它。
相关代码段如下。经过一些测试,我得出结论:
如果s_bdter没有被用户修改并随后在代码中设置,则不会过滤任何记录
如果s_bdter被用户修改,记录被正确过滤
如果s_bdter被用户修改并随后在代码中修改,记录将被正确过滤
SELECT-OPTIONS: s_bdter FOR ls_itab-bdter MODIF ID sbd.
START-OF-SELECTION.
" Set the interval.
s_bdter-sign = 'I'.
s_bdter-option = 'BT'.
s_bdter-low = lc_bdter_start.
s_bdter-high = sy-datum + 30.
" This select doesn't filter on bdter unless the selection parameter was set by the user.
SELECT r~aufnr p~psphi
FROM resb AS r
INNER JOIN afpo AS o ON o~aufnr = r~aufnr
INNER JOIN prps AS p ON p~pspnr = o~projn
INTO TABLE lt_resb_ss
WHERE r~bdter IN s_bdter.
Run Code Online (Sandbox Code Playgroud)
这是已知并记录在案的行为吗?我通过创建自己的RANGE表解决了这个问题,这是你应该做的吗?那么有没有办法重新使用 unset select-options 来防止代码重复?
您只需填写s_bdter. 您还必须附加它:
" Set the interval.
s_bdter-sign = 'I'.
s_bdter-option = 'BT'.
s_bdter-low = lc_bdter_start.
s_bdter-high = sy-datum + 30.
append s_bdter. "<- this was missing
Run Code Online (Sandbox Code Playgroud)
有了这个,你不检查,如果它没有被填满。此检查必须明确进行:
" describe table s_bdter.
if sy-tfill = 0.
" Set the interval.
s_bdter-sign = 'I'.
s_bdter-option = 'BT'.
s_bdter-low = lc_bdter_start.
s_bdter-high = sy-datum + 30.
append s_bdter. "<- this was missing
endif. " sy-tfill = 0.
Run Code Online (Sandbox Code Playgroud)
我希望我的代码具有正确的语法并且 sy-tfill 是正确的值。我无法检查它的实际情况。但是原理应该是清楚的。