【转】BW Query 变量增强(给日期变量设置黙认值为系统当天)
由于要求在打开报表的时候,弹出一个对话框来输入日期(用于计算)。
在“过滤限制”中添加日期特征,右击选择 ,然后在“显示”输入框处选择“变量”,点击“新增”变量按钮。
在“处理由”处选择“用户出口”。
替换路径功能区为默认.
明细处如果你做的变量是不可输入的话就不对任何复选框做选择,如果是可输入性的,则选中变量已准备输入。其他的功能区就保持默认状态即可,然后点击OK按钮。
在BW系统中运行CMOD进行做增强。
使用"RSR00001" BI: Enhancements for Global Variables in Reporting.
代码,双击:ZXRSRU01
进行编写代码:
data E_T_RANGE,
ls_var_range LIKE i_t_var_range,
loc_ls_range LIKE e_t_range,
gv_date LIKE SY-DATUM.
case
WHEN.
"I_STEP 值说明:
"I_STEP = 1,请直接发生前变量条目。可用于预先填充选择变量。
"I_STEP = 2,呼叫发生后直接变量条目。这一步的时候,才开始了同一个变量是无法输入准备,并且不能在L_STEP = 1填补。
"I_STEP = 3,在此调用,您可以检查变量的值。触发一个异常(提高)导致变量屏幕再次出现。随
"后,L_step = 2,也再次调用。
"I_STEP = 0,是不是从屏幕变量呼吁提高。调用可以来自授权检查或从监视器。这
"是你要推出填充授权对象的模型设计。因为这是为代码如下:
if.
* BREAK-POINT.
* READ TABLE i_t_var_range INTO ls_var_range WITH KEY vnam = 'ZCUTDATE_NEW'. "'ZCUTDATE_NEW' .
* IF SY-SUBRC = 0.
ls_range-opt = 'EQ'.
ls_range-sign .
gv_date = SY-DATUM + 4.
ls_range-low = gv_date.
INSERT e_t_range.
* ENDIF.
endif.
ENDCASE. ls_range INTO TABLE = 'I' i_step = 1 'VAR_CUTDATE' I_VNAM. "Name of Variable to be Replaced LINE OF LINE OF: ls_range like LINE OF
使用Analyzer运行报表结果:
Note:
If I_STEP = 1,call takes place directly before variable entry. Can be used to pre populate selection variables.
If I_STEP = 2,Call takes place directly after variable entry. This step is only started up when the same variable is not input ready and could not be filled at L_STEP = 1.
If I_STEP = 3,In this call, you can check the values of the variables. Triggering an exception (RAISE)causes the variable screen to appear once more. Afterwards, L_step = 2 is also called again.
If I_STEP = 0,The enhancement is not called from the variable screen. The call can come from the authorization check or from the Monitor. This is where you want to put the mod for populating the authorization object. Code for this is as follows:
DATA:LS_RANGE LIKE LINE OF E_T_RANGE,
LS_VAR_RANGE LIKE LINE OF I_T_VAR_RANGE,
YEAR(4) TYPE N,
QUART(1) TYPE N,
MONTH(2) TYPE N,
LASTDAY TYPE D,
DAYIN TYPE D. "定义的字段
CASE I_VNAM. "这个I_CNAM可以自动获取你所创建的变量的名称
WHEN 'ZVBCRLNY'."日历年月(默认本月) 这个定义的是一个带有默认值为当前
"年度期间的一个可输入的变量
IF I_STEP = 1.
CLEAR LS_RANGE.
LS_RANGE-LOW = SY-DATUM(6).
LS_RANGE-SIGN = 'I'.
LS_RANGE-OPT = 'EQ'.
CONDENSE LS_RANGE-LOW NO-GAPS.
APPEND LS_RANGE TO E_T_RANGE.
ENDIF.
WHEN 'ZVBCQT02'."季度(间隔)-本年累计(非输入)
IF I_STEP = 2.
LOOP AT I_T_VAR_RANGE INTO LS_VAR_RANGE
WHERE VNAM = '0CQUART'.
CLEAR YEAR.
YEAR = LS_VAR_RANGE-LOW(4).
CONCATENATE YEAR '1' INTO LS_RANGE-LOW.
LS_RANGE-HIGH = LS_VAR_RANGE-LOW.
LS_RANGE-SIGN = 'I'.
LS_RANGE-OPT = 'BT'.
CONDENSE LS_RANGE-LOW NO-GAPS.
CONDENSE LS_RANGE-HIGH NO-GAPS.
APPEND LS_RANGE TO E_T_RANGE.
ENDLOOP.
ENDIF.
WHEN 'ZVHJQJ1'."会计年度/期间(默认本期)
*BREAK-POINT.
IF I_STEP = 1.
CLEAR LS_RANGE.
LS_RANGE-LOW(4) = SY-DATUM(4).
LS_RANGE-LOW+5(1) = '0'.
LS_RANGE-LOW+6(2) = SY-DATUM+4(2).
LS_RANGE-SIGN = 'I'.
LS_RANGE-OPT = 'EQ'.
CONDENSE LS_RANGE-LOW NO-GAPS.
APPEND LS_RANGE TO E_T_RANGE.
ENDIF.
这里的黄色与红色标注的地方的字段应该与你命名的变量的技术名称完全相同,否则程序是不可能执行的。此外,我不建议大家用过长的字段来命名变量的名称,否 则在程序在运行的时候CASE I_VNAM.中的I_VNAM这个变量会自动截取部分字段,那么程序是无法按照我们的意愿来执行,导致一些不必要的问题出现。如果必须用很长的技术名 称,我建议你看看这个I_VNAM字段的长度,尽量小于或者等于这个长度,否则必然出错。