SAP BPS 變數完美級聯 - Variables in web interaces

leniz發表於2011-05-27

    在前一篇中,我們實現了級聯的設計,但是存在缺陷,因為之前的設計沒有把下一級本身的許可權考慮進去,所以有可能會把使用者沒有的許可權顯示出來,所以在新的設計中,加入了非有效下級的剔除功能。

FUNCTION z_variable_user_exit_attr.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(I_AREA) TYPE  UPC_Y_AREA
*"     VALUE(I_VARIABLE) TYPE  UPC_Y_VARIABLE
*"     VALUE(I_CHANM) TYPE  UPC_Y_CHANM OPTIONAL
*"     VALUE(ITO_CHANM) TYPE  UPC_YTO_CHA
*"  EXPORTING
*"     REFERENCE(ETO_CHARSEL) TYPE  UPC_YTO_CHARSEL
*"  EXCEPTIONS
*"      FAILED
*"----------------------------------------------------------------------

* -------------------------------------------------------------------
* fill export table eto_charsel of structure UPC_YS_CHARSEL
*   fields: CHANM -  Characteristic
*           SEQNO -  Sequence Number
*           SIGN  -  +/- Sign of Selection Criterion
*           OPT   -  Selection Condition (EQ, BT, ...)
*           LOW   -  Lower Limit of the Selection Conditions
*           HIGH  -  Upper Limit of Selection Conditions
* --------------------------------------------------------------------

* clear export table
  CLEAR eto_charsel.


  DATA l_eto_charsel_wa TYPE upc_ys_charsel.
  DATA: l_month(2).
  DATA:
  l_source_var TYPE upc_y_variable VALUE '',
  l_source_area TYPE upc_y_area VALUE 'ZSDPLAN1',
  l_use_restricted_values TYPE boole-boole VALUE 'X',
  l_buffer_call TYPE boole-boole VALUE ''.
  DATA:
  l_subrc LIKE sy-subrc,
  ls_return LIKE bapiret2,
  l_type LIKE upc_var-vartype,
  lto_varsel_all TYPE upc_yto_charsel,
  lto_varsel TYPE upc_yto_charsel,
  lto_var TYPE upc_yto_charsel,
  lto_chanm TYPE upc_yto_cha.
  DATA: ls_varsel TYPE upc_ys_charsel,
  l_comp(4) TYPE c,
  l_entries TYPE i.

  DATA:

  l_error TYPE c,
  ls_hiesel TYPE upc_ys_api_hiesel,
  ls_cha TYPE upc_ys_cha,
  lt_cha TYPE STANDARD TABLE OF upc_ys_cha,
  ls_varsel_all TYPE upc_ys_api_varsel,
  lt_varsel_all TYPE STANDARD TABLE OF upc_ys_api_varsel,
  lt_return TYPE STANDARD TABLE OF bapiret2.

  CASE   i_variable .
    WHEN  'ZORGEX'.
* read source value
      l_source_var = 'ZCOMPANY'.
      l_source_area = i_area .

"這裡把使用者的原始許可權抓取過來
      CALL FUNCTION 'API_SEMBPS_VARIABLE_GETDETAIL'
        EXPORTING
          i_area         = i_area
          i_variable     = 'ZSALESOG'  "AUTHORIZATION VARIABLE
        IMPORTING
          e_subrc        = l_subrc
          es_return      = ls_return
          e_type         = l_type
          es_hiesel      = ls_hiesel
        TABLES
          etk_cha        = lt_cha
          etk_varsel_all = lt_varsel_all.

      CALL FUNCTION 'Z_VARIABLE_GET_DETAIL'
        EXPORTING
          i_area         = l_source_area
          i_variable     = l_source_var
          i_buffer       = l_buffer_call
        IMPORTING
          e_subrc        = l_subrc
          es_return      = ls_return
          e_type         = l_type
          eto_varsel_all = lto_varsel_all
          eto_varsel     = lto_varsel
          eto_chanm      = lto_chanm.
      IF l_subrc <> 0.
        MESSAGE i136(upc_fw) WITH l_source_var.
* Values of variable &1 cannot be determined
        EXIT.
      ENDIF.

* We have a single value for the year and only one characteristic
* => our value is stored in the first line
      IF l_use_restricted_values IS INITIAL.
        lto_var = lto_varsel_all.
      ELSE.
        lto_var = lto_varsel.
      ENDIF.
      READ TABLE lto_var INTO ls_varsel INDEX 1.
* check prerequisites:
* - record found?
      IF sy-subrc <> 0.
        MESSAGE i147(upc_fw) WITH l_source_var.
* Variable &1 does not contain any values
        EXIT.
      ENDIF.
* - exactly one record and characteristic?
      DESCRIBE TABLE lto_var LINES l_entries.
      IF l_entries <> 1.
        MESSAGE i534(upc) WITH l_source_var.
* Variable &1 must be restricted to a value
        EXIT.
      ENDIF.
* is there a next year?
      l_comp = ls_varsel-low.

      CLEAR:l_eto_charsel_wa.
      l_eto_charsel_wa-chanm = i_chanm.
      l_eto_charsel_wa-seqno = '0000'.
      l_eto_charsel_wa-sign  = 'I'.
      l_eto_charsel_wa-opt   = 'EQ'.

*      l_eto_charsel_wa-low = l_comp .
      SELECT salesorg INTO l_eto_charsel_wa-low
      FROM  /bi0/msalesorg
      WHERE comp_code = l_comp.
        l_eto_charsel_wa-seqno = l_eto_charsel_wa-seqno + 1.

"把下級值和使用者的原始變數值作對比,剔除無效的值
        READ TABLE lt_varsel_all TRANSPORTING NO FIELDS
        WITH KEY low = l_eto_charsel_wa-low.
        IF sy-subrc EQ 0.
          INSERT l_eto_charsel_wa INTO TABLE eto_charsel.
        ENDIF.
      ENDSELECT.


    WHEN 'ZOFFEX'.
      ......

  ENDCASE.


ENDFUNCTION.

通過以上,可以做到動態重新整理取值,並且做到下級值的有效性檢查。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/554557/viewspace-696452/,如需轉載,請註明出處,否則將追究法律責任。

相關文章