Текущее время: Пт, июл 04 2025, 22:02

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Ср, апр 27 2016, 14:24 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 09:38
Сообщения: 170
Коллеги, всем добрый день.
Стоит несколько нетривиальная задача.
Есть редактируемый ALV(3 поля редактируются, 1 закрыто на редактирование).
После того как пользователь ввел значение в первое поле необходимо:
1) Если пользователь не нажал Enter, а просто выполнил какое либо другое действие - запускается обработчик data_changed, и в нередактируемое поле подтягивается название введенного объекта.
2) Если пользователь нажал Enter, то происходит то что в пункте 1 + тянутся дефолтные значения в другие поля.
3) Если пользователь встал на строку и нажал Enter, то просто подтянуть 2 дефолтных поля.

Казалось бы все просто, но не тут то было. Оказывается если зарегистрировать оба события для ALV, то при наличии события data_changed мы никаким образом не можем понять, был ли нажат Enter или нет. Если регистрировать только событие по Enter'у, то тогда если пользователь забудет его нажать у нас не подтянется название объекта(пункт 1).
Пытался и в поля текущего эвента лезть(cl_cui_alv_grid->cur_event->eventid), и через i_appl_events = 'X' с отлавливанием в PAI экрана.
Может у меня уже глаз замылился и я не вижу очевидного решения?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Ср, апр 27 2016, 15:16 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Saperx написал(а):
Коллеги, всем добрый день.
Стоит несколько нетривиальная задача.
Есть редактируемый ALV(3 поля редактируются, 1 закрыто на редактирование).
После того как пользователь ввел значение в первое поле необходимо:
1) Если пользователь не нажал Enter, а просто выполнил какое либо другое действие - запускается обработчик data_changed, и в нередактируемое поле подтягивается название введенного объекта.
2) Если пользователь нажал Enter, то происходит то что в пункте 1 + тянутся дефолтные значения в другие поля.
3) Если пользователь встал на строку и нажал Enter, то просто подтянуть 2 дефолтных поля.

Казалось бы все просто, но не тут то было. Оказывается если зарегистрировать оба события для ALV, то при наличии события data_changed мы никаким образом не можем понять, был ли нажат Enter или нет. Если регистрировать только событие по Enter'у, то тогда если пользователь забудет его нажать у нас не подтянется название объекта(пункт 1).
Пытался и в поля текущего эвента лезть(cl_cui_alv_grid->cur_event->eventid), и через i_appl_events = 'X' с отлавливанием в PAI экрана.
Может у меня уже глаз замылился и я не вижу очевидного решения?

1 - через f4 не устроит?

еще как вариант, создать хоткей на Вашу процедуру "энтера".


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Ср, апр 27 2016, 15:25 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
sender->m_eventid = 19 (enter),
но он инкапсулирован (чтобы достать надо изощраться)


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Ср, апр 27 2016, 15:40 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
trop написал(а):
sender->m_eventid = 19 (enter),
но он инкапсулирован (чтобы достать надо изощраться)


Есть же видимый SENDER->CUR_EVENT-EVENTID про который Saperx написал.

Я так понимаю, пункты 1 и 2 можно отличить через EVENTID (18 и 19). В пункте 3 пользователь встает на ячейку и без редактирования жмет ентер (вроде по описанию всегда происходит редактирование, но по содержимому пункта 3 его нет) - значит щупай дополнительно ER_DATA_CHANGED- MT_MOD_CELLS или ER_DATA_CHANGED-MP_MOD_ROWS на отсутствие отредактированных ячеек.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Ср, апр 27 2016, 16:16 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 09:38
Сообщения: 170
Проблема в том, что если зарегистрированы оба эвента(mc_evt_modified и mc_evt_enter), то при событии data_changed всегда будет eventid = 18.
Отсюда же вторая проблема, data_changed срабатывает только когда есть изменение данных. Если данные не менялись, то событие не отработает просто по нажатию enter.
Если отписать mc_evt_modified - не будет отрабатывать 1 пункт.
Если отписать mc_evt_enter - то вообще не понятно как быть с 2 и 3 пунктом.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Ср, апр 27 2016, 19:42 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
Я что-то похожее делал в обработчике data_changed_finished. Но по формулировке задачи не понятно, что подразумевается под:
1) "просто выполнил какое либо другое действие". Изменил значение ячейки и перешёл (табом, стрелками, мышкой) на другую ячейку грида или куда-то на экранное поле?
2) "нажал Enter". Изменил значение ячейки и нажал ентер?
3) "встал на строку и нажал Enter". Ничего не менял в ячейке, просто нажал ентер?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Чт, апр 28 2016, 01:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Я бы сделал в тулбаре кнопку для подтягивания дефолтных значений. Всё!
Как вариант, предложение Besa - F4, или F1.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Чт, апр 28 2016, 08:33 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
проверьте зарегистрированы ли события
Code:
*     register simple events for editing
      call method grid->register_edit_event
        exporting
          i_event_id = cl_gui_alv_grid=>mc_evt_modified
          .
      call method grid->register_edit_event
        exporting
          i_event_id = cl_gui_alv_grid=>mc_evt_enter
          .
      call method grid->set_ready_for_input
        exporting
          i_ready_for_input = 1
          .


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Чт, апр 28 2016, 10:17 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Parazit написал:
Я бы сделал в тулбаре кнопку для подтягивания дефолтных значений. Всё!

Я о том же, хоткей на эту кнопку, пользователь когда будет передвигаться по строкам будет прожимать не энтер а например F7.
Плюсом будет то, что, он сможет массово выделив несколько строк выполнить процедуру проставления значений.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Чт, апр 28 2016, 12:49 
Специалист
Специалист

Зарегистрирован:
Пн, мар 12 2012, 09:38
Сообщения: 170
Решили все через кнопку на тулбаре, как посоветовали.
Но вопрос все же остался - возможно ли вообще такое? Сделать для нажатия enter и data_changed разные обработчики.
LAT написал(а):
Я что-то похожее делал в обработчике data_changed_finished. Но по формулировке задачи не понятно, что подразумевается под:
1) "просто выполнил какое либо другое действие". Изменил значение ячейки и перешёл (табом, стрелками, мышкой) на другую ячейку грида или куда-то на экранное поле?
2) "нажал Enter". Изменил значение ячейки и нажал ентер?
3) "встал на строку и нажал Enter". Ничего не менял в ячейке, просто нажал ентер?

1) Да, изменил значение но не нажал enter, а перешел на другую ячейку грида.
2) Да, если произвел изменение и нажал enter.
3) Да, просто нажал enter.

To trop,
Все события зарегистрированы.
Проблема не в отработке событий вообще, а именно в грамотном комбинировании.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Редактируемый ALV Grid: как отловить 2 отдельных события при редатировании?
СообщениеДобавлено: Чт, апр 28 2016, 14:22 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
Saperx написал(а):
...возможно ли вообще такое? Сделать для нажатия enter и data_changed разные обработчики.
Если надо отличить ситуации "просто нажатие ентер", "изменение значения и нажатие ентер", "изменение значения и смена ячейки без нажатия ентер", алгоритм такой:
В обработчике data_changed_finished анализируем cur_event->eventid.
1. Если mc_evt_enter - пользователь ничего не менял, просто нажал ентер
2. Если mc_evt_modified.
а. (на всякий случай) проверяем, что в et_good_cells 1 строка (т.е. менялась 1 ячейка)
б. считываем из et_good_cells имя колонки fieldname и номер строки row_id
в. получаем имя колонки, на которой находится курсор сейчас, и номер строки: get_current_cell( e_row = ... es_col_id = ... )
г. если имена колонок и номера строк из б) и в) совпадают, пользователь изменил значение ячейки и нажал ентер
д. если не совпадают - изменил ячейку и перешёл на другую ячейку без нажатия ентер


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB