SAP BPS : Exit Function 實現版本鎖定

leniz發表於2011-06-28
        雖然老大們表示,以後不會再讓我們玩這個了,不過本著要玩就徹底的態度,把能看到的功能多試驗一下。
        這裡先講一個知識點:
         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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章