SAP BPS : Exit Function 实现版本锁定

        虽然老大们表示,以后不会再让我们玩这个了,不过本着要玩就彻底的态度,把能看到的功能多试验一下。
        这里先讲一个知识点:
         BPS变量:
        从类型上来说,有:特征变量,层级变量,数值变量,属性变量。
        除了属性变量外,其它几个变量应该都是很容易懂得,而属性变量是通过属性值的约束,获取特征值的范围,比如省份是地区的属性,那么如果限定属性值等于广东,那么可以选择的地区即都是广东地区,不过遗憾的是,我一直尝试在Web实现这个变量,一直没有成功,变量值始终显示“全部”。
        另外值的来源方法,又分为以下几种:
        1. 固定值 2. 依据用户而定义的值 3. 用户出口(就是ABAP啦)4. 权限
        方法1是将这个变量能够用到的值,都罗列出来;方法2是按照用户的不同,罗列不同的值;方法3是通过Function的方式动态去取值,比较灵活,方法4同BW的权限控制是统一的,即BW的权限控制直接拿过来用而已。
       
        言归正传。
        锁定过程一般会有三个动作,查询锁定,锁定执行,以及解锁,所以在设置用户出口的时候,需要加入两个变量,即“什么东西”,“什么动作”。
 
我就直接放代码了,过程解释都在里面呢。
 
FUNCTION z_bps_exit_exec_lock.
*"------------------------------------------------------ *"*"Local Interface:
*"  IMPORTING
*"     VALUE(I_AREA) TYPE  UPC_Y_AREA
*"     VALUE(I_PLEVEL) TYPE  UPC_Y_PLEVEL
*"     VALUE(I_PACKAGE) TYPE  UPC_Y_PACKAGE
*"     VALUE(I_METHOD) TYPE  UPC_Y_METHOD
*"     VALUE(I_PARAM) TYPE  UPC_Y_PARAM
*"     VALUE(IT_EXITP) TYPE  UPF_YT_EXITP
*"     VALUE(ITO_CHASEL) TYPE  UPC_YTO_CHASEL
*"     VALUE(ITO_CHA) TYPE  UPC_YTO_CHA
*"     VALUE(ITO_KYF) TYPE  UPC_YTO_KYF
*"  EXPORTING
*"     REFERENCE(ET_MESG) TYPE  UPC_YT_MESG
*"  CHANGING
*"     REFERENCE(XTH_DATA) TYPE  HASHED TABLE
*"-----------------------------------------------------


  TABLES:upc_dataslicet,
upc_dataslice,upc_optios,zv_dataslice.
  DATA:wa_upc_dataslicet TYPE upc_dataslicet ,
        wa_upc_dataslice TYPE upc_dataslice,
        wa_upc_optios TYPE upc_optios.

  DATA: itab LIKE TABLE OF zsave,
        wa LIKE LINE OF itab.
  DATA: lt_bapiret TYPE STANDARD TABLE OF bapiret2,
  lt_data_cust TYPE STANDARD TABLE OF upc_ys_api_data,
  lt_row TYPE STANDARD TABLE OF upc_ys_api_row,
  lt_subrc TYPE sy-subrc,
  l_select TYPE string.
  DATA: lto_chas TYPE yto_chas.
  DATA: l_date LIKE sy-datum.

  DATA: wa_chasel  TYPE LINE OF upc_yto_chasel,
          ls_chasel TYPE upc_ys_chasel,
          ls_chas TYPE ys_chas,
   ls_charng TYPE upc_ys_charng.
  DATA:ls_para TYPE  upf_ys_exitp,
       ls_val(60) .
  FIELD-SYMBOLS:  TYPE ANY.
  DATA: l_str TYPE string.
  DATA:l_area LIKE i_area ,
       l_sort(6) , "保存
       l_act(1),"执行操作 N-NEW,D-DELETE
       l_flag VALUE 'N'"是否存在
  DATA:l_ds_year LIKE  zbps_ds_year,
       l_ds_year_old LIKE  zbps_ds_year .
  DATA:BEGIN OF ls_ds_year,
         sort(2),
         include TYPE zbps_ds_year,
       END OF ls_ds_year.
  DATA: lt_ds_year LIKE TABLE OF ls_ds_year.
  DATA:wa_mesg TYPE LINE OF  upc_yt_mesg.



  DATA:l_do(6), "参数一执行的动作
       l_con(3). "锁定内容
*"----------------------------------------------------------------
*"  L_VER
*"  S:销售预测锁定ZVERSION ->   Y1:Y6
*"  SR: 销售回款编辑锁定 ZVERSION ->   Y9
*"  PS:生产预测销售版锁定 ZVERSION  -> Y7
*"  PP:生产预测生产版锁定 ZVERSION -> Y8
*"
*"  L_CON
*"  CHECK:检查版本锁定状态
*"  LOCK: 版本锁定  (直接添加)
*"  UNLOCK:版本解锁(直接删除)
*"--------------------------------------------------------------------

  DATA:BEGIN OF ls_old_ds,
          sort        LIKE zv_dataslice-sort,
          area        LIKE zv_dataslice-area,
          fieldname   LIKE zv_dataslice-fieldname,
          low         LIKE zv_dataslice-low,
      END OF ls_old_ds.

  DATA:lt_old_ds LIKE TABLE OF  ls_old_ds.


****获取锁定条件
  LOOP AT ito_chasel INTO ls_chasel.
    READ TABLE ls_chasel-t_charng INTO ls_charng INDEX 1.
    IF sy-subrc = 0.
      ASSIGN COMPONENT ls_chasel-chanm OF STRUCTURE l_ds_year  TO .
      IF sy-subrc EQ 0.
         = ls_charng-low.
        IF ls_chasel-chanm NE '0CURRENCY'.
          CONCATENATE l_str '' ls_charng-low INTO l_str.
        ENDIF.
      ENDIF.
    ENDIF.
  ENDLOOP.

*  READ TABLE it_exitp INTO ls_para INDEX 1."
***读取参数值 读取操作动作

  READ TABLE it_exitp INTO ls_para WITH  KEY parnm = 'STATUS'.
  l_do = ls_para-chavl.
****  读取操作内容参数
  READ TABLE it_exitp INTO ls_para WITH  KEY parnm = 'CONTENT'.
  l_con = ls_para-chavl.

* LOCK - 进行锁定
* UNLOCK - 进行解锁
* CHECK  - 判断锁状态

***先判断area是否存在 dataslice
  SELECT  sort area fieldname low
    INTO   TABLE lt_old_ds
    FROM zv_dataslice
    WHERE area = i_area.

  IF sy-subrc NE 0.  "目前不存在任何此area的dataslice
    CASE l_do.
      WHEN 'UNLOCK' OR 'CHECK'.
        wa_mesg-msgty = 'I'.
        wa_mesg-msgno = '0001'.
        wa_mesg-msgv1 = '当前系统不存在任何版本的锁定!'.
        APPEND wa_mesg TO et_mesg.
      WHEN 'LOCK'.
        l_act = 'N'"新增锁定
      WHEN OTHERS.
        wa_mesg-msgty = 'E'.
        wa_mesg-msgno = '0001'.
        wa_mesg-msgv1 = '未知命令,请联系开发人员!'.
        APPEND wa_mesg TO et_mesg.
    ENDCASE.

  ELSE.  "已存在,需要再次判断

    SORT lt_old_ds BY sort.

    LOOP AT lt_old_ds INTO ls_old_ds.

      ASSIGN COMPONENT ls_old_ds-fieldname OF STRUCTURE l_ds_year_old  TO .
      IF sy-subrc EQ 0.
*        concatenate '2:'
*       ls_old_ds-fieldname into  wa-zstr1 .
*        wa-zstr2 = ls_old_ds-low.
*        MODIFY zsave FROM wa.
         = ls_old_ds-low.
      ENDIF.
****
      AT END OF sort.
        IF l_ds_year_old EQ l_ds_year.
          l_sort = ls_old_ds-sort.
          l_flag = 'Y'.
          EXIT.
        ENDIF.
      ENDAT.

    ENDLOOP.

    IF l_flag  EQ 'Y'.

      CASE l_do.
        WHEN 'LOCK' OR 'CHECK'.
          wa_mesg-msgty = 'I'.
          wa_mesg-msgno = '0001'.
          wa_mesg-msgv1 = '当前系统此版本已锁定!'.
          wa_mesg-msgv2 = l_str.
          APPEND wa_mesg TO et_mesg.
        WHEN 'UNLOCK'.
          l_act = 'D'.
        WHEN OTHERS.
          wa_mesg-msgty = 'E'.
          wa_mesg-msgno = '0001'.
          wa_mesg-msgv1 = '未知命令,请联系开发人员!'.
          APPEND wa_mesg TO et_mesg.
      ENDCASE.
    ELSE.
      CASE l_do.
        WHEN 'UNLOCK' OR 'CHECK'.
          wa_mesg-msgty = 'I'.
          wa_mesg-msgno = '0001'.
          wa_mesg-msgv1 = '当前系统此版本未锁定!'.
          wa_mesg-msgv2 = l_str.
          APPEND wa_mesg TO et_mesg.
        WHEN 'LOCK'.
          l_act = 'N'.
        WHEN OTHERS.
          wa_mesg-msgty = 'E'.
          wa_mesg-msgno = '0001'.
          wa_mesg-msgv1 = '未知命令,请联系开发人员!'.
          APPEND wa_mesg TO et_mesg.
      ENDCASE.
    ENDIF.
*

  ENDIF.

  DATA:l_uid LIKE rssgtpdir-uni_idc25.
  IF l_act EQ 'N'.
    CALL FUNCTION 'RSS_SYSTEM_GET_UNIQUE_ID'
      IMPORTING
        e_uni_idc25 = l_uid.

    SELECT sort INTO l_sort
      FROM zv_dataslice
      UP TO ROWS
      WHERE area = i_area
      ORDER  BY sort DESCENDING.
    ENDSELECT.
    IF sy-subrc EQ 0.
      l_sort = l_sort + 1.
    ELSE.
      l_sort = 1.
    ENDIF.

***UPC_DATASLICE
    wa_upc_dataslice-area = i_area.
    wa_upc_dataslice-sort = l_sort.
    wa_upc_dataslice-guid = l_uid.
    wa_upc_dataslice-inactive = ''.
    INSERT  upc_dataslice FROM wa_upc_dataslice.

***UPC_DATASLICET
    wa_upc_dataslicet-area = i_area.
    wa_upc_dataslicet-sort = l_sort.
    wa_upc_dataslicet-langu = '1'.
    wa_upc_dataslicet-text = l_str.
    INSERT  upc_dataslicet FROM wa_upc_dataslicet.

***UPC_OPTIOS
    wa_upc_optios-guid = l_uid.
    wa_upc_optios-seqno = '1'.
    wa_upc_optios-optio = 'EQ'.
    wa_upc_optios-sign = 'I'.

    LOOP AT ito_chasel INTO ls_chasel.
      READ TABLE ls_chasel-t_charng INTO ls_charng INDEX 1.
      IF sy-subrc = 0.
        wa_upc_optios-fieldname = ls_chasel-chanm.
        wa_upc_optios-low = ls_charng-low.
        INSERT   upc_optios FROM wa_upc_optios.
      ENDIF.
    ENDLOOP.

    wa_upc_optios-fieldname = 'ZVERSION'.
    CASE l_con.
      WHEN 'S'.
        wa_upc_optios-guid = l_uid.
        wa_upc_optios-seqno = '1'.
        wa_upc_optios-optio = 'BT'.
        wa_upc_optios-sign = 'I'.
        wa_upc_optios-low = 'Y1'.
        wa_upc_optios-high = 'Y6'.
      WHEN 'SR'.
        wa_upc_optios-guid = l_uid.
        wa_upc_optios-seqno = '1'.
        wa_upc_optios-optio = 'EQ'.
        wa_upc_optios-sign = 'I'.
        wa_upc_optios-low = 'Y9'.

      WHEN 'PS'.
        wa_upc_optios-guid = l_uid.
        wa_upc_optios-seqno = '1'.
        wa_upc_optios-optio = 'EQ'.
        wa_upc_optios-sign = 'I'.
        wa_upc_optios-low = 'Y7'.
      WHEN 'PP'.
        wa_upc_optios-guid = l_uid.
        wa_upc_optios-seqno = '1'.
        wa_upc_optios-optio = 'EQ'.
        wa_upc_optios-sign = 'I'.
        wa_upc_optios-low = 'Y8'.

    ENDCASE.

    INSERT   upc_optios FROM wa_upc_optios.

    wa_mesg-msgty = 'I'.
    wa_mesg-msgno = '0001'.
    wa_mesg-msgv1 = '当前版本锁定已添加成功!'.
    wa_mesg-msgv2 = l_str.
    APPEND wa_mesg TO et_mesg.

  ELSEIF l_act EQ 'D'.

    SELECT SINGLE guid INTO l_uid
      FROM upc_dataslice
    WHERE area = i_area AND
         sort = l_sort.
    IF sy-subrc EQ 0.
      DELETE FROM upc_dataslice
      WHERE area = i_area AND
           sort = l_sort.

      DELETE FROM upc_dataslicet
      WHERE area = i_area AND
           sort = l_sort.

      DELETE FROM upc_optios
       WHERE guid = l_uid.
    ENDIF.
    wa_mesg-msgty = 'I'.
    wa_mesg-msgno = '0001'.
    wa_mesg-msgv1 = '当前版本锁定已删除成功!'.
    wa_mesg-msgv2 = l_str.
    APPEND wa_mesg TO et_mesg.
  ENDIF.

*  DATA:ES_AREA_SLICE TYPE YS_AREA_SLICE.
  IF l_act EQ 'N' OR l_act EQ 'D'.
*    PERFORM buffer_dataslice_get
*    IN PROGRAM saplupc_dataslice
*    USING I_AREA "insert your data slice area name here
*   'E'
*   CHANGING ES_AREA_SLICE  .
*
*    PERFORM buffer_dataslice_update
*    IN PROGRAM saplupc_dataslice .

    CALL FUNCTION 'UPC_DATASLICE_COMMIT'.
    CALL FUNCTION 'UPC_DATASLICE_SAVE'.

  ENDIF.


  CLEAR:l_act.

ENDFUNCTION.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/554557/viewspace-700872/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/554557/viewspace-700872/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值