Ну, ладно господа. Видимо не умею я свои мысли излагать и доводить до слушателей.
За сим, прикладываю скриншоты:
1 - селекционник отчета
2 - селекционник справки (с программным сокрытием полей)
3 - результат отбора справки (с программным сокрытием полей)
4 - селекционник справки (без программного сокрытия полей)
5 - результат отбора справки (без программного сокрытия полей)
6 - вид на комплексное СП
7 - одно из элементарных средств поиска
8 - ракурс, поставляющий данные для этого элементарного средства поиска
Механизм - для ограничения справки по датам берется значение из поля <месяц>. Формируется первое и последнее число месяца. В справке в поля с датами вставляются ограничения, а сами поля скрываются.
Блок события - вызов справки
Code:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR SO_PERNR-LOW .
DATA
: shlp TYPE shlp_descr_t
, lop TYPE ddshselops WITH HEADER LINE
, return_values LIKE TABLE OF ddshretval
, fieldname(30)
, lt_dynpfields LIKE dynpread OCCURS 0 WITH HEADER LINE
, lt_imp_props TYPE ddshfprops
.
DATA
: lv_begper TYPE sy-datum
, lv_endper TYPE sy-datum
, lv_bp_shlp TYPE rsdsselop_
, lv_ep_shlp TYPE rsdsselop_
.
CONSTANTS shlpname TYPE shlpname VALUE 'ZPREM'.
FIELD-SYMBOLS
: <fs> LIKE LINE OF shlp-interface
, <fs_ret> LIKE LINE OF return_values
, <fs_prop> LIKE LINE OF shlp-fieldprop
, <value> LIKE pa0001-orgeh
.
IF PA_MONAT IS INITIAL.
MESSAGE 'Не указан рабочий месяц!'
TYPE 'E' .
ELSE.
* first date of work month
lv_begper(4) = pa_monat+2(4) .
lv_begper+4(2) = pa_monat(2) .
lv_begper+6(2) = '01' .
CONCATENATE lv_begper+6(2) lv_begper+4(2) lv_begper(4)
INTO lv_bp_shlp .
* last date of work month
lv_endper = lv_begper .
lv_endper = lv_endper + 32 .
lv_endper+6(2) = '01' .
lv_endper = lv_endper - 1 .
CONCATENATE lv_endper+6(2) lv_endper+4(2) lv_endper(4)
INTO lv_ep_shlp .
* get search help description
CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
EXPORTING shlpname = shlpname
IMPORTING shlp = shlp .
* set field PERNR to return
READ TABLE shlp-interface ASSIGNING <fs>
WITH KEY shlpfield = 'PERNR' .
IF sy-subrc EQ 0 .
<fs>-valfield = 'X' .
UNASSIGN <fs> .
ENDIF .
* set field ORGEH to return
READ TABLE shlp-interface ASSIGNING <fs>
WITH KEY shlpfield = 'ORGEH' .
IF sy-subrc EQ 0 .
<fs>-valfield = 'X' .
UNASSIGN <fs> .
ENDIF .
*----------------------------------------------------------------------*
* set data to MASSN field
lop-shlpname = shlpname .
lop-shlpfield = 'MASSN' .
lop-sign = 'I' .
lop-option = 'NE' .
lop-low = '10' .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to BEGDA_0002 field
lop-shlpname = shlpname .
lop-shlpfield = 'BEGDA_0002' .
lop-sign = 'I' .
lop-option = 'LE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to ENDDA_0002 field
lop-shlpname = shlpname .
lop-shlpfield = 'ENDDA_0002' .
lop-sign = 'I' .
lop-option = 'GE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to BEGDA_0003 field
lop-shlpname = shlpname .
lop-shlpfield = 'BEGDA_0003' .
lop-sign = 'I' .
lop-option = 'LE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to ENDDA_0003 field
lop-shlpname = shlpname .
lop-shlpfield = 'ENDDA_0003' .
lop-sign = 'I' .
lop-option = 'GE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to BEGDA_0001 field
lop-shlpname = shlpname .
lop-shlpfield = 'BEGDA_0001' .
lop-sign = 'I' .
lop-option = 'LE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to ENDDA_0001 field
lop-shlpname = shlpname .
lop-shlpfield = 'ENDDA_0001' .
lop-sign = 'I' .
lop-option = 'GE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to BEGDA_0000 field
lop-shlpname = shlpname .
lop-shlpfield = 'BEGDA_0000' .
lop-sign = 'I' .
lop-option = 'LE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
* set data to ENDDA_0000 field
lop-shlpname = shlpname .
lop-shlpfield = 'ENDDA_0000' .
lop-sign = 'I' .
lop-option = 'GE' .
lop-low = lv_ep_shlp .
APPEND lop TO shlp-selopt . CLEAR lop .
*----------------------------------------------------------------------*
* block MASSN field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'MASSN' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block BEGDA_0002 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'BEGDA_0002' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block ENDDA_0002 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'ENDDA_0002' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block BEGDA_0003 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'BEGDA_0003' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block ENDDA_0003 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'ENDDA_0003' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block BEGDA_0001 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'BEGDA_0001' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block ENDDA_0001 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'ENDDA_0001' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block BEGDA_0000 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'BEGDA_0000' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
* block ENDDA_0000 field
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = 'ENDDA_0000' .
IF sy-subrc EQ 0 .
* <fs_prop>-shlpseldis = 'X' .
<fs_prop>-shlpselpos = 0 .
<fs_prop>-shlplispos = 0 .
UNASSIGN <fs_prop> .
ENDIF .
*----------------------------------------------------------------------*
MOVE shlp-fieldprop TO lt_imp_props .
LOOP AT shlp-interface ASSIGNING <fs>
WHERE valfield = 'X' .
DELETE lt_imp_props WHERE fieldname = <fs>-shlpfield .
ENDLOOP .
EXPORT lt_imp_props TO MEMORY ID 'ZHR_SHLP_PROPS' .
*----------------------------------------------------------------------*
* Show Search Help Dialogue
CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
EXPORTING shlp = shlp
TABLES return_values = return_values .
FREE MEMORY ID 'ZHR_SHLP_PROPS' .
* Set Selection to Screen Fields
READ TABLE return_values ASSIGNING <fs_ret>
WITH KEY shlpname = shlpname
fieldname = 'PERNR' .
IF sy-subrc EQ 0.
so_pernr-low = <fs_ret>-fieldval .
UNASSIGN <fs_ret> .
ENDIF .
READ TABLE return_values ASSIGNING <fs_ret>
WITH KEY shlpname = shlpname
fieldname = 'ORGEH' .
IF sy-subrc EQ 0 .
lt_dynpfields-fieldname = 'PA_ORGEH' .
lt_dynpfields-fieldvalue = <fs_ret>-fieldval .
APPEND lt_dynpfields .
UNASSIGN <fs_ret> .
* Set Selection to Screen Fields
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
DYNAME = sy-repid
DYNUMB = sy-dynnr
TABLES
DYNPFIELDS = lt_dynpfields
EXCEPTIONS
INVALID_ABAPWORKAREA = 1
INVALID_DYNPROFIELD = 2
INVALID_DYNPRONAME = 3
INVALID_DYNPRONUMMER = 4
INVALID_REQUEST = 5
NO_FIELDDESCRIPTION = 6
UNDEFIND_ERROR = 7
OTHERS = 8 .
ENDIF .
ENDIF .
Обработка ограничения средства поиска в расширении.
Code:
IF callcontrol-step = 'PRESEL'.
IMPORT lt_imp_props FROM MEMORY ID 'ZHR_SHLP_PROPS'.
IF sy-subrc EQ 0.
LOOP AT lt_imp_props.
READ TABLE shlp-fieldprop ASSIGNING <fs_prop>
WITH KEY fieldname = lt_imp_props-fieldname.
IF sy-subrc EQ 0.
<fs_prop>-shlpselpos = lt_imp_props-shlpselpos.
<fs_prop>-shlplispos = lt_imp_props-shlplispos.
ENDIF.
ENDLOOP.
ENDIF.
EXIT.
ENDIF.
Напоминаю, что этот огород я начал городить, так как применение сокрытия полей к комплексному СП не возымело действия. Пришлось засовывать ограничение в расширения к элементарным СП.
Если у кого есть предложение более красивого способа, то с удовольствием посмотрю и поучусь.