Posted: Fri Jun 24, 2011 8:58 am Post subject: [OK] Подставить ограничения в средство поиска для EQUI-EQUNR
Здравствуйте!
Передо мной стоит следующая задача по разработке ALV-грида: учитывать ограничение, введённое по STORT, при вызове средства поиска для поля EQUNR. Рисунок — 01_задача
Я задал обработчик события onf4 в ALV-гриде, в нём вызвал функциональный модуль F4IF_FIELD_VALUE_REQUEST (по примеру в программе BCALV_EDIT_08)
Получил результат: отдельный экран выбора, такой же, что и в транзакции IH08. Рисунок — 02_результат
На этом экране не учитываются ограничивающие данные. Я посмотрел, какое средство поиска вызывается в этом случае. В таблице EQUI для поля EQUNR (к которому я обращаюсь при вызове F4IF_FIELD_VALUE_REQUEST) средство поиска не задано. Оно задано в элементе данных EQUNR для этого поля (вкладка "ДополнитСвойства") и называется EQUI. Рисунки 03_элемент_данных, 04_средство_поиска.
В этом средстве поиска только один выходной (EXP) параметр EQUNR и нет ни одного входного. Видимо, из-за этого поля экрана не заполняются ограничивающими данными (я пытался подставить ограничения по примеру в программе BCALV_EDIT_08, отсюда и ссылка на подпрограмму F4CALLBACK программы ZPMP006 в вызове ФМ)?
Можно ли подставить ограничения в данное средство поиска (очень оно удобное)? Если можно, то долго/сложно ли это делается и не лучше ли будет создать собственное средство поиска через транзакцию SE11?
И где можно прочитать про создание средств поиска, в которых ограничения задаются на экране выбора (как в этом случае)?
Исправление 04.07.2011: задача решена, добавил в заголовок темы [OK]
01_задача.PNG
Description:
Задача: учитывать ограничение по STORT в средстве поиска для EQUNR
Filesize:
4.89 KB
Viewed:
24248 Time(s)
02_результат.PNG
Description:
Результат нажатия F4 — отдельный экран выбора, такой же, что и в транзакции IH08
Filesize:
29.47 KB
Viewed:
24248 Time(s)
03_элемент_данных.PNG
Description:
Элемент данных EQUNR, вкладка "ДополнитСвойства", ссылка на средство поиска EQUI
Filesize:
31.67 KB
Viewed:
24248 Time(s)
04_средство_поиска.PNG
Description:
Средство поиска EQUI, только один параметр EXP, ни одного IMP
Filesize:
31.63 KB
Viewed:
24248 Time(s)
Last edited by Timer on Mon Jul 04, 2011 11:32 am; edited 1 time in total
Можете воспользоваться функциональностью дескриптора SH. В общем виде логика работы следующая
Code:
TYPE-POOLS shlp.
DATA: ls_shlp TYPE shlp_descr_t,
lt_ret TYPE TABLE OF ddshretval,
lf_rc TYPE syst-sybrc.
* Данные дескриптора SH
CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
EXPORTING
shlpname = 'EQUI'
IMPORTING
shlp = ls_shlp.
* Обработка параметров SH (добавляете необходимые ограничения, закрываете поля от изменения и т.д. -> исп. параметры дескриптора ls_shlp-interface, ls_shlp-fieldprop, ls_shlp-selopt)
Попробовал использовать функциональные модули F4IF_GET_SHLP_DESCR и F4IF_START_VALUE_REQUEST. Для элементарных средств поиска ограничения задаются нормально (через ls_shlp-selopt). В этом же случае, для комплексного средства поиска EQUI, ограничения не задаются.
СП EQUI содержит в себе несколько элементарных СП, например, СП EQUIN. Рисунок 1
СП EQUIN тоже не простое: использует ФМ F4_MATCHCODE_USER_EXIT (ПользовСредстПоиск) и PM_HLP_EQUI_LIST_SV (значение по умолчанию в поле FUNCNAME). Рисунок 2
ФМ PM_HLP_EQUI_LIST_SV вызывает подпрограмму SUBMIT_RIEQUI20_F00, которая вызывает программу RIEQUI20. Рисунок 3 и код
Code:
FORM SUBMIT_RIEQUI20_F00 TABLES F_VALUES STRUCTURE RSMVA
USING F_TCODE F_SELSTR.
DATA: G_ERRORCODE LIKE SY-SUBRC.
DATA: BEGIN OF SEL_TAB OCCURS 1.
INCLUDE STRUCTURE RIHEQUI_LIST.
DATA: END OF SEL_TAB.
DATA: H_SELM VALUE 'X'.
*--- Report aufrufen ------------------------------------------------*
PERFORM SUBMIT_LIST_REPORT USING F_TCODE
'RIEQUI20'
F_SELSTR
H_SELM.
*--- Im Selektionsmodus nicht selektiert ? --------------------------*
IMPORT SEL_TAB FROM MEMORY ID M_ID_RIEQUI20.
READ TABLE SEL_TAB INDEX 1.
IF SY-SUBRC = 0.
REFRESH F_VALUES.
LOOP AT SEL_TAB.
F_VALUES-FLDID = 'KEY'.
F_VALUES-FLDLG = 18.
F_VALUES-VALUE = SEL_TAB-EQUNR.
APPEND F_VALUES.
ENDLOOP.
ELSE.
MESSAGE S047.
ENDIF.
ENDFORM. " SUBMIT_RIEQUI20_F00
При запуске программа RIEQUI20 отображает экран выбора, который я приложил рисунком 02_результат в первом сообщении этой темы. Я не понял, как задать ограничения на этом экране, т.е. чтобы при отображении экрана в полях уже стояли ограничивающие значения.
Буду делать собственное элементарное средство поиска.
Это не так функционально, как экран выбора программы RIEQUI20, но зато проще. И на сапфоруме говорят, что для RIEQUI20 нет пользовательских расширений.
Ответ на вопрос
Я получил ответ на вопрос, как сделать так, чтобы при отображении экрана (программа RIEQUI20) в полях уже стояли ограничивающие значения.
Обсуждение — на sapboard.ru, совет от Besa:
Besa wrote:
... жмите F1 на операторе submit ...
SUBMIT prog
WITH Ваши параметры с экрана и их значения + не забываем про return
В общем не обязательно работать через память (set/get parameters).
Code:
Form submit.
Data:
ls_param type RSPARAMS,
lt_params type table of RSPARAMS,
lt_list type table of ABAPLIST.
"Поставить значение 13 в поле Местоположение (STORT)
ls_param-selname = 'STORT'.
ls_param-kind = 'S'.
ls_param-sign = 'I'.
ls_param-option = 'EQ'.
ls_param-low = '13'.
Append ls_param to lt_params.
"Вызвать программу с местоположением, подставленным на экран выбора
Submit RIEQUI20
via selection-screen with selection-table lt_params
exporting list to memory "Получить результат — выбранные единицы оборуд-я
and return.
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
LISTOBJECT = lt_list
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
"Показать выбранные единицы оборудования
CALL FUNCTION 'DISPLAY_LIST'
* EXPORTING
* FULLSCREEN =
* CALLER_HANDLES_EVENTS =
* STARTING_X = 10
* STARTING_Y = 10
* ENDING_X = 60
* ENDING_Y = 20
* IMPORTING
* USER_COMMAND =
TABLES
LISTOBJECT = lt_list
EXCEPTIONS
EMPTY_LIST = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Endform.
Решение
В итоге я всё-же сделал собственное элементарное средство поиска.
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 за совет), а затем подкрученное описание передаётся второму.
Код с сокращениями
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
SH_ZPMP006_1.PNG
Description:
Средство поиска ZPMP006_1
Filesize:
46.05 KB
Viewed:
24092 Time(s)
Result.PNG
Description:
Результат — в СП для единицы оборудования в поля подставляются значения из ALV-грида (автоматически подставились значения "85", "*8/0/0*" и "*для снятия заусенцев*")
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You can download files in this forum
All product names are trademarks of their respective companies. SAPNET.RU websites are in no way affiliated with SAP AG. SAP, SAP R/3, R/3 software, mySAP, ABAP, BAPI, xApps, SAP NetWeaver and any other are registered trademarks of SAP AG. Every effort is made to ensure content integrity. Use information on this site at your own risk.