Besa написал:
Ух так много/хорошо написали
Да, я старался

И можно на ты.
Besa написал:
Это Ваш единственный вопрос ведь?
Цитата:
Я не понял, как задать ограничения на этом экране, т.е. чтобы при отображении экрана в полях уже стояли ограничивающие значения.
Да, это был единственный вопрос.
В итоге я решил его так: сделал собственное элементарное средство поиска. Код и скриншот — в конце ответа.
Besa написал:
Я думаю тут поабапить придется. Можете создать вариант для IH10, заранее обозначить ограничения на экране, затем в параметр SELSTR ФМ-а PM_HLP_EQUI_LIST_SV передаете название этого варианта. Каким образом?
Code:
* Aufruf des User-Exits
SELSTR = SPACE.
LOOP AT SHLP-INTERFACE INTO WA_IFACE WHERE
F4FIELD EQ 'X' AND VALUE(1) EQ '='.
SELSTR = WA_IFACE-VALUE.
ENDLOOP.
+ Ваш callback_form = 'F4CALLBACK'
Вариант через вариант (

) не подходит, т.к. это будет статично. Для каждого местоположения придётся вводить отдельный вариант, это долго и нудно.
Besa написал:
А вообще я бы просто вызвал программу RIEQUI20 оператором submit со своими критериями, какими нужно, в алв-событии ф4 и результат передал бы дальше...
Я не знаю, как через оператор submit добиться заполнения поля "Местоположение", если у него нет идентификатора (parameter id), как у поля "Единица оборудования" (parameter id = 'EQN'), например. Если бы на экране в программе RIEQUI20 был прописан идентификатор для этого поля, можно было бы перед submit вызвать Set parameter id. Но идентификатора-то нет!
В общем, спасибо, но я сделал через собственное средство поиска.
Код с сокращениямиCode:
Constants:
gc_true type boolean value 'X',
gc_false type boolean value ' ',
gc_asterisk type c length 1 value '*',
begin of gcs,
...
begin of screens,
...
begin of data_create, "Экран для ввода новых записей, режим CREATE
number type i value 10,
title type gui_title value '0010',
end of data_create,
begin of data_change, "Экран для изменения записей, режим CHANGE
number type i value 20,
title type gui_title value '0020',
end of data_change,
begin of data_view, "Экран для просмотра записей, режим VIEW
number type i value 30,
title type gui_title value '0030',
end of data_view,
...
end of screens,
begin of data_table,
...
stort type NAME_FELD value 'STORT',
equnr type NAME_FELD value 'EQUNR',
...
end of data_table,
end of gcs.
*&-------------------------------------------------------------------*
*& Обработчик событий для всех типов ALV-гридов, объявление
*&-------------------------------------------------------------------*
Class lcl_grid_event_handler definition final.
Public section.
Methods:
...
handle_onf4
for event onf4 of cl_gui_alv_grid
importing sender e_fieldname e_fieldvalue es_row_no er_event_data,
...
Private section.
"Пусто
Endclass.
Types:
begin of ty_s_string,
string type string,
end of ty_s_string,
ty_t_strings type standard table of ty_s_string,
ty_t_data type ZPMP006_1_TABLE_TYPE,
ty_s_data type line of ty_t_data,
begin of ty_s_alv,
begin of 01,
r_grid type ref to cl_gui_alv_grid,
r_handler type ref to lcl_grid_event_handler,
r_cont type ref to cl_gui_docking_container,
t_fcat type lvc_t_fcat,
t_sort type lvc_t_sort,
t_excl type ui_functions,
t_f4 type lvc_t_f4,
s_layo type lvc_s_layo,
s_vari type disvariant,
v_save type c,
end of 01,
end of ty_s_alv.
Data:
"Ограничения на поле ZPMP006_1-STORT "Местоположение"
gt_create_stort_restrictions type ty_t_strings, "для операции CREATE
gt_change_stort_restrictions type ty_t_strings, "для операции CHANGE
...
gs_alv type ty_s_alv.
*&-------------------------------------------------------------------*
*& Обработчик событий для всех типов ALV-гридов, реализация
*&-------------------------------------------------------------------*
Class lcl_grid_event_handler implementation.
...
Method handle_onf4.
Case sender.
When gs_alv-01-r_grid.
Case e_fieldname.
When gcs-data_table-stort. "Местоположение
Data:
lt_restrictions type ty_t_strings. "Ограничения
"Заполнить таблицу с ограничениями
Case sy-dynnr.
When gcs-screens-data_create-number.
Move gt_create_stort_restrictions to lt_restrictions.
When gcs-screens-data_change-number.
Move gt_change_stort_restrictions to lt_restrictions.
When others.
"Оставить стандартную помощь по вводу
Exit.
Endcase.
"Показать свою помощь по вводу (с ограничениями)
Perform alv_1_show_f4_stort
using es_row_no
er_event_data
lt_restrictions
.
When gcs-data_table-equnr. "Единица оборудования
Data: ls_data_row type ty_s_data.
Read table gt_data into ls_data_row index es_row_no-row_id.
"Показать свою помощь по вводу
Perform alv_1_show_f4_equnr
using ls_data_row
es_row_no
er_event_data
.
When others.
Message i000(SU) with 'Событие onf4' 'не обрабатывается для этого поля'.
Endcase.
When others.
Message i000(SU) with 'Событие onf4' 'не обрабатывается для этого ALV-Grid''а'.
Endcase.
Endmethod.
...
Endclass.
*&-------------------------------------------------------------------*
*& Показать свою помощь по вводу (клавиша F4) для местоположения (STORT)
*& с ограничениями
*&-------------------------------------------------------------------*
Form alv_1_show_f4_stort
using
is_row_no type lvc_s_roid
ir_event_data type ref to cl_alv_event_data
it_restriction_strings type ty_t_strings.
Types:
begin of ty_s_restriction,
stand type T499S-STAND,
end of ty_s_restriction,
ty_t_restrictions type standard table of ty_s_restriction.
Constants:
"Источник данных для помощи по вводу
lc_tabname type tabname value 'T499S', "Изменил? Ищи from T499S, of T499S
lc_field_1 type fieldname value 'STAND', "Поле со значением местоположения
lc_field_2 type fieldname value 'KTEXT'. "Поле с поясняющим текстом
Data:
ls_restriction_string type ty_s_string,
lt_restrictions type ty_t_restrictions,
ls_restriction type ty_s_restriction,
lt_data_source type table of T499S,
ls_data_source like line of lt_data_source,
ls_value type seahlpres,
lt_values type table of seahlpres,
ls_field type dfies,
lt_fields type table of dfies,
lt_selected_sh_rows type standard table of ddshretval,
ls_selected_sh_row type ddshretval,
ls_modi type lvc_s_modi.
Field-symbols:
<ft_modi> type lvc_t_modi.
"Отказаться от стандартной помощи по вводу
ir_event_data->m_event_handled = gc_true.
"Выбрать данные для помощи по вводу с учётом ограничений
Loop at it_restriction_strings into ls_restriction_string.
ls_restriction-stand = ls_restriction_string-string.
Append ls_restriction to lt_restrictions.
Endloop.
Select *
into table lt_data_source
from T499S
for all entries in lt_restrictions "Если нет ограничений — выбрать всё
where STAND = lt_restrictions-stand.
"Перевести выбранные данные в формат "ячейка-за-ячейкой" (cell-by-cell)
Loop at lt_data_source into ls_data_source.
ls_value-string = ls_data_source-stand.
Append ls_value to lt_values.
ls_value-string = ls_data_source-ktext.
Append ls_value to lt_values.
Endloop.
"Задать набор столбцов для отображения выбранных данных
ls_field-tabname = lc_tabname.
ls_field-fieldname = lc_field_1.
Append ls_field to lt_fields.
ls_field-tabname = lc_tabname.
ls_field-fieldname = lc_field_2.
Append ls_field to lt_fields.
"Показать помощь по вводу во всплывающем окне
Call function 'F4IF_INT_TABLE_VALUE_REQUEST'
exporting
retfield = lc_field_1
multiple_choice = gc_false
display = gc_false
tables
value_tab = lt_values
field_tab = lt_fields
return_tab = lt_selected_sh_rows
exceptions
parameter_error = 1
no_values_found = 2
others = 3
.
If sy-subrc <> 0.
"Ошибка, показать сообщение и выйти
Message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
Exit.
Endif.
"Передать выбранное значение в ALV-грид
Read table lt_selected_sh_rows into ls_selected_sh_row index 1.
If sy-subrc <> 0.
"Нет ни одной выбранной строки, выйти из подпрограммы
Exit.
Endif.
ls_modi-value = ls_selected_sh_row-fieldval.
ls_modi-fieldname = gcs-data_table-stort. "В поле "Местоположение"
ls_modi-row_id = is_row_no-row_id.
Assign ir_event_data->m_data->* to <ft_modi>.
Append ls_modi to <ft_modi>. "Добавить к изменённым ячейкам ALV-грида
Unassign <ft_modi>.
Endform. "alv_1_show_f4_stort
*&-------------------------------------------------------------------*
*& Показать свою помощь по вводу (клавиша F4) для единицы оборудования (ЕО,
*& EQUNR) с учётом уже введённых данных в поля столбцов "Местоположение",
*& "Тип/модель", "Наименование", "Серийный номер".
*&-------------------------------------------------------------------*
Form alv_1_show_f4_equnr
using
is_data_row type ty_s_data
is_row_no type lvc_s_roid
ir_event_data type ref to cl_alv_event_data.
Constants:
"Источник данных для помощи по вводу
lc_shlpname type shlpname value 'ZPMP006_1'.
Data:
ls_shlp type shlp_descr,
ls_interface type ddshiface,
ls_selopt type ddshselopt,
lv_rc type sy-subrc,
lt_selected_sh_rows type standard table of ddshretval,
ls_selected_sh_row type ddshretval,
ls_modi type lvc_s_modi.
Field-symbols:
<ft_modi> type lvc_t_modi.
"Отказаться от стандартной помощи по вводу
ir_event_data->m_event_handled = gc_true.
"Получить описание средства поиска СП
Call function 'F4IF_GET_SHLP_DESCR'
exporting
shlpname = lc_shlpname
importing
shlp = ls_shlp.
"Дополнить описание СП: задать возвращаемые из СП поля
Loop at ls_shlp-interface into ls_interface
where shlpfield <> gcs-data_table-stort.
"Все, кроме поля "Местоположение
ls_interface-valfield = ls_interface-shlpfield.
Modify ls_shlp-interface from ls_interface index sy-tabix.
Endloop.
"Дополнить описание СП: ввести начальные ограничения в ls_shlp-selopt
ls_selopt-shlpname = lc_shlpname.
ls_selopt-sign = gcs-so-sign-include.
ls_selopt-option = gcs-so-option-equals.
If is_data_row-stort is not initial. "Местоположение
ls_selopt-shlpfield = gcs-data_table-stort.
ls_selopt-low = is_data_row-stort.
Append ls_selopt to ls_shlp-selopt.
Endif.
If is_data_row-type is not initial. "Тип/модель
ls_selopt-shlpfield = gcs-data_table-type.
ls_selopt-option = gcs-so-option-contains_pattern.
Concatenate gc_asterisk is_data_row-type gc_asterisk
into ls_selopt-low.
Append ls_selopt to ls_shlp-selopt.
Endif.
If is_data_row-serge is not initial. "Серийный номер
ls_selopt-shlpfield = gcs-data_table-serge.
ls_selopt-option = gcs-so-option-contains_pattern.
Concatenate gc_asterisk is_data_row-serge gc_asterisk
into ls_selopt-low.
Append ls_selopt to ls_shlp-selopt.
Endif.
If is_data_row-equipment_name is not initial. "Наименование
ls_selopt-shlpfield = gcs-data_table-equipment_name.
ls_selopt-option = gcs-so-option-contains_pattern.
Concatenate gc_asterisk is_data_row-equipment_name gc_asterisk
into ls_selopt-low.
Append ls_selopt to ls_shlp-selopt.
Endif.
"Вызвать дополненную помощь по вводу (с заданными начальными ограничениями)
Call function 'F4IF_START_VALUE_REQUEST'
exporting
shlp = ls_shlp
importing
rc = lv_rc
tables
return_values = lt_selected_sh_rows.
Case lv_rc.
When 0.
"Выбранное значение находится в таблице lt_selected_sh_rows
When 4.
Message s000(su) with 'Значения не найдены'.
Exit.
When 8.
Message s000(su) with 'Ничего не выбрано'.
Exit.
When others.
Message s000(su) with 'Ошибка номер'
lv_rc
'при вызове ФМ F4IF_START_VALUE_REQUEST,'
'сообщите разработчикам'
display like 'E'.
Exit. "Выйти из подпрограммы
Endcase.
"Передать поля выбранной строки из СП в ALV-грид
Assign ir_event_data->m_data->* to <ft_modi>.
Loop at lt_selected_sh_rows into ls_selected_sh_row.
ls_modi-value = ls_selected_sh_row-fieldval.
ls_modi-fieldname = ls_selected_sh_row-fieldname.
ls_modi-row_id = is_row_no-row_id.
Append ls_modi to <ft_modi>. "Добавить поле к изменённым ячейкам ALV-грида
Endloop.
Unassign <ft_modi>.
Endform. "alv_1_show_f4_equnr
АлгоритмF4 для столбца "Местополож" — это содержимое внутренней таблицы (подпрограмма
alv_1_show_f4_stort, вызов функционального модуля F4IF_INT_TABLE_VALUE_REQUEST).
F4 для столбца "Ед. оборудов." — это вызов собственного средства поиска ZPMP006_1 (подпрограмма
alv_1_show_f4_equnr). При этом сначала вызывается ФМ F4IF_GET_SHLP_DESCR, а затем ФМ F4IF_START_VALUE_REQUEST. Первый получает описание СП из словаря данных, чтобы потом подкрутить его (спасибо vvk за
совет на sapnet.ru), а затем подкрученное описание передаётся второму.
Средство поиска ZPMP006_1
РезультатВ СП для единицы оборудования в поля подставляются значения из ALV-грида. На рисунке — автоматически подставились значения "85", "*8/0/0*" и "*для снятия заусенцев*".

Т.е., грубо говоря, проблема была в том, как подставить 85 в поле местоположение
Изменение: поменял ссылки на рисунки