Текущее время: Ср, апр 24 2024, 13:00

Часовой пояс: 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
Сообщения: 347
Я что-то похожее делал в обработчике 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
Сообщения: 347
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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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