在前一篇中,我们实现了级联的设计,但是存在缺陷,因为之前的设计没有把下一级本身的权限考虑进去,所以有可能会把用户没有的权限显示出来,所以在新的设计中,加入了非有效下级的剔除功能。
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/,如需转载,请注明出处,否则将追究法律责任。