query中的customer exit客户出口变量

搞Bex变量呢,有五种:
就是建的时候它提示有五种:

  1. 特性值
  2. 层级节点
  3. 文本
  4. 公式
  5. 层级
    在这里插入图片描述

有了参数变量,就得看怎么传值。在query运行时,这个值怎么传来的得看处理类型。
有好几种处理类型:

  • 手动输入,默认值
  • 替换路径
  • 客户出口
  • SAP exit
  • 授权
  • HANA exit
    -
    在传值方式上,最后一个是批量导入。
    在这里插入图片描述

所有变量定义信息都在后台表:RSZGLOBV 看处理类型是3的,是客户出口变量。
现在都用BWMT建,就只有右键New去建一个变量了。以前的Bex Query 淘汰了,就不管了。

客户出口变量的处理方式有两种:

  1. function module EXIT_SAPLRRS0_001
  2. BAdI RSROA_VARIABLES_EXIT_BADI
    BW7.3 后,都用BADI 。
    在这里插入图片描述

在不同的application area,用不同的BADI implementations. 比较好分类和维护。
在BADI里面有下面这么多的参数:
一看描述就知道。
在这里插入图片描述
I_VNAM: 变量技术名
I_IOBJNM: 变量基于的对象的技术名
I_S_COB_PRO: 基于的对象的属性,比如数据类型,长度
I_S_RKB1D: query技术名
I_T_VAR_RANGE: 需要用到的其他变量的属性值,增强被调用的时候,系统会填充这个表,表类型RRS0_T_VAR_RANGE,结构类型RRS0_S_VAR_RANGE,参考结构RRRANGEEXIT,字段:
在这里插入图片描述
I_STEP: 控制变量被调用的时间

C_T_RANGE: 就是写代码要填入的变量值
C_NO_SCREEN: 如果X,就说不会弹出这个变量
C_CHECK_AGAIN: 如果X,就是说尽管i_step= 1 已经调用过了,i_step=2 还会调用一遍

I_STEP = 1: 在变量entry前调用
I_STEP = 2: 变量entry后调用,前提条件它不是个input-ready的,也不会被step1 那给值。
I_STEP = 3: 检查变量值,如果有例外,变量会叫重新输,会重新去call step 2填值。
I_STEP = 0: 这个是在权限检查那用。

step1 是进入query时,但是还没有输一些手动输入的参数变量。
对于我们的客户出口变量,如果你的code里面要基于别的手动输入的变量来传值,那就只能step2去拿值,因为step1那个手动输入的变量还没有填入值。比如我需要根据你输入的日期来获取现在是第多少周这种。
step1之前就给这个变量弄值,比如我就直接根据系统当前跑报表的日期去获取当前月。
在这里插入图片描述

这就是我今天要搞的。理论看了下,现在开始搞。系统已经有个FM算闰年啥的了。SN_LAST_DAY_OF_MONTH
所以,so easy.

WHEN '0CALDAY_0'.

        l_calmonth2 = sy-datum+4(2).
        l_calyear = sy-datum(4).
        if l_calmonth2 = 01.
           l_calyear = l_calyear - 1.
           l_calmonth2 = 12.
        else.
           l_calyear = l_calyear.
           l_calmonth2 = l_calmonth2 - 1.
        ENDIF.

        CONCATENATE l_calyear l_calmonth2 INTO l_calmonth.
        CONCATENATE l_calmonth '01' into ld_input.
        CALL FUNCTION 'SN_LAST_DAY_OF_MONTH'
          EXPORTING
            day_in             = ld_input
         IMPORTING
           END_OF_MONTH       = ld_output .
         l_s_range-low = ld_output.
         clear: l_s_range-high.
         l_s_range-sign = 'I'.
         l_s_range-opt = 'EQ'.
         APPEND l_s_range TO e_t_range.

当然,一般这种不用手动输入的变量可以不展示出来,如果在query里被展示了出来,那么也可以用C_NO_SCREEN这个给赋值成‘X’,下面是个老的截图。
在这里插入图片描述
以上是直接调用默认值来改变客户出口变量的。
还有就是调用另一个参数值来改变客户出口变量,也就是step2之后。

在query里,filter分为静态filter和动态filter。就是固定变量值,和默认变量值。

固定变量值肯定是不能改的,在query里面只能改默认变量值。
意思呢也就是,固定的值会直接确定query里的结果集。
你分析query的时候,只能在这个已经被过滤了的结果集里面再去下钻或者去基于结果集过滤。你不能说去分析它这个固定过滤的结果集以外的数据了。
在这里插入图片描述
那么变量,就可以放在固定过滤或者默认过滤两个地方了。
如果放在固定过滤值里:比如基于别的input ready变量值读取。
在这里插入图片描述
那么这个query的结果集就是完全受这些变量控制的。
对于这两个地方的变量,还有专门名词区分的:固定的叫SPACE,动态的叫STATE。
在这里插入图片描述
变量执行的方式呢,在这里定义的:
在这里插入图片描述
在这里插入图片描述
变量刷新方式要么是动态,要么是as designed。啥意思呢?
在这里插入图片描述
Dynamically就是这个customer exit的变量只会被call一次。
但是如果说我这个customer exit的变量是基于query中的另一个input ready的变量的话,我跑报表的时候,我把另一个变量的值要改一下了,那么这另外一个customer exit的变量值,我就要改成 as designed,也就是再去call一次。
否则数据就不对了。

比如说我query有两个变量,第一个input ready的变量,我去输入当前日期,第二个客户出口变量是直接去读取当前日期的所在月。
那么我这个第二个客户出口变量就要调整刷新方式为: as designed. 要不然我跑报表的时候,重新给参数值了,这里去不再重新跑一遍,不就是错了么。

关于query的参数界面重新赋值的时候,要想让customer exit再跑一遍,如果这个customer exit是固定参数,而且不是input ready, 那就咋搞都行。
如果是在step 2后取了别的参数值的,那就要改成Refresh as Designed了。
在这里插入图片描述

简言之呢,如果你的客户出口变量是基于其他的手动输入变量的,在固定过滤那里的。那么你改手动输入变量的时候,这个客户出口变量会再去call一次,会基于你改的变量做更改。

这是query的变量执行方式。

但是如果你的客户出口变量是在动态过滤那里的。那么你跑了query之后,然后去改参数窗口的手动输入变量的话,这里的客户出口变量是不会受影响的,是不会去call一遍的。要想让它也跟着变,那就by designed.
所以,一般这种客户出口变量还是都放在固定过滤那里。

在E_CHECK_AGAIN 这个的意思也是再执行一遍:
这个参数赋值,就是说在STEP1跑了之后,还会在STEP2再跑一次:
在这里插入图片描述
这需要在STEP2再写一个:如果不再写一段代码,就默认执行到STEP2的时候这个变量是空的了。

当然如果这个变量是个强制必输的,那就会出错说没取到值,如果是个optional可输的,那就是会取到所有满足条件的值。
E_CHECK_AGAIN

BADI RSROA_VARIABLES_EXIT

se18去找增强点,创建implementation。
在这里插入图片描述在这里插入图片描述
建好之后,双击进去还要填实现BADI的类,然后激活。
在这里插入图片描述
激活之后,创建filter:
在这里插入图片描述

然后双击Implementing class,然后创建method,写好代码,然后激活。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后去打断点:RSRT测query
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomici

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值