Текущее время: Вс, июн 29 2025, 10:01

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Обновление грида после события "DATA_CHANGED"  Тема решена
СообщениеДобавлено: Вс, дек 19 2010, 07:35 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Доброе утро всем! Подскажите пожалуйста, как обновить грид после изменений данных в таблице, т.е. после отработки события DATA_CHANGED (допустим пользователь поставил значение куда-нибудь, а нужно в событии data_changed вернуть то, что было до его изменения)...

Code:
REFRESH: events.
  events_line-name = 'DATA_CHANGED'.
  events_line-form = 'DATA_CHANGED'.
  APPEND events_line TO events.

  gset-edt_cll_cb = 'X'.

CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat              = fieldcat[]
      i_save                   = 'X'
      i_callback_program       = self
      i_callback_pf_status_set = 'SET_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout                = layout
      i_bypassing_buffer       = 'X'
      i_grid_settings          = gset
      it_events                = events[]
    TABLES
      t_outtab                 = IT_ztdocinfo[]
    EXCEPTIONS
      program_error            = 1
      OTHERS                   = 2.

FORM data_changed USING
     rr_data_changed TYPE REF TO cl_alv_changed_data_protocol.

  DATA: w_itab TYPE LINE OF lvc_t_modi,
        itab TYPE lvc_t_modi,
        ix LIKE sy-tabix.

  itab[] = rr_data_changed->mt_mod_cells[].

  LOOP AT itab INTO w_itab.
    ix = sy-tabix.

    CASE w_itab-fieldname.
      WHEN 'VIBOR'.
        READ TABLE IT_ztdocinfo INDEX w_itab-row_id.
        IF w_itab-value = 'X' AND
          ( ( IT_ztdocinfo-NALICHIE = icon_led_green AND p_create = 'X' ) OR
          ( IT_ztdocinfo-NALICHIE = icon_led_red AND p_change = 'X' ) ).
          CLEAR IT_ztdocinfo-VIBOR.
          MODIFY IT_ztdocinfo INDEX w_itab-row_id.
          w_itab-value = ''.
          MODIFY itab FROM w_itab.
          MESSAGE text-005 type 'I'.
        ENDIF.
    ENDCASE.


  ENDLOOP.

rr_data_changed->mt_mod_cells[] = itab[].

ENDFORM.   


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вс, дек 19 2010, 18:38 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, авг 28 2006, 11:24
Сообщения: 292
Пол: Мужской
Для изменения данных экрана воспользуйтесь методом MODIFY_CELL объекта rr_data_changed.

Цитата:
Code:
rr_data_changed->mt_mod_cells[] = itab[].

По-моему, это бесполезное действие.

Цитата:
Code:
MESSAGE text-005 type 'I'.

Пожалуйста, пожалейте разработчиков, которые будут поддерживать ваш код, не делайте так. Складывайте сообщения в класс сообщений.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Пн, дек 20 2010, 08:59 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Вызываю метод - не работает :(
Code:
   CALL METHOD rr_data_changed->modify_cell
            EXPORTING
              i_row_id    = w_itab-row_id
              i_fieldname = 'VIBOR'
              i_value     = ''.

И правильно ли я понял, мы даем ф/м на вход:
i_row_id - номер строки, в которой находится изменяемая ячейка;
i_fieldname - имя изменяемого поля;
i_value - новое значение.

И ничего больше? Может какой-нибудь refresh потом нужен....


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Пн, дек 20 2010, 17:39 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 13 2006, 16:44
Сообщения: 55
Пол: Мужской
Чтобы в редактируемом алв гриде изменения переносились во внутреннюю таблицу, надо обработку юзер-комманда начинать со следующей конструкции:
Код:
FORM USCOM USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.

DATA: L_GRID TYPE REF TO CL_GUI_ALV_GRID.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_GRID.

CALL METHOD L_GRID->CHECK_CHANGED_DATA.

IF R_UCOMM = ....
....
ENDIF.

Чтобы сразу после ввода значение попадало во внутренню таблицу, тогда не надо CALL METHOD L_GRID->CHECK_CHANGED_DATA.
а в REUSE_ALV_GRID передать
i_grid_settings-edt_cll_cb = 'X'. " обр. вызов при выходе из отредактир. ячейки


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 07:19 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Хмм.. А при чем тут юзер-комманд? Там как раз нет проблем обновить экран...
Нужно обновить после обработки события DATA_CHANGED, т.е. когда пользователь что-то изменил в ячейке.. Нужно в зависимости от условия установить значение другое....
Code:
DATA: L_GRID TYPE REF TO CL_GUI_ALV_GRID.

CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_GRID.

CALL METHOD L_GRID->CHECK_CHANGED_DATA.

С этим блоков вообще весь sap logon завис :(

Че делать-то? Люди! Подскажите плиз!!!


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 08:03 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Code:
FORM data_changed USING
     rr_data_changed TYPE REF TO cl_alv_changed_data_protocol.
  field-symbols <ft> type standard table.
  field-symbols <ft2> like line of ваша таблица.
  assign data_changed->mp_mod_rows->* to <ft>.
  read table <ft> index 1 assigning <ft2>.
  <ft2>-ваше поле = '333'.
ENDFORM.   


+edt_cll_cb = 'X'


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 09:15 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
И так не работает......:(

Code:
DATA:
      BEGIN OF IT_ztdocinfo OCCURS 0.
.INCLUDE STRUCTURE ztdocinfo.
DATA:
       VIBOR(1) TYPE C,
       NALICHIE TYPE ICONNAME,
       KRIJIK TYPE ICONNAME,
       KOLVO TYPE I,
      END OF IT_ztdocinfo,

...........
  layout-colwidth_optimize = 'X'.
  self = sy-repid.

  REFRESH: events.
  events_line-name = 'DATA_CHANGED'.
  events_line-form = 'DATA_CHANGED'.
  APPEND events_line TO events.

  gset-edt_cll_cb = 'X'.
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      it_fieldcat              = fieldcat[]
      i_save                   = 'X'
      i_callback_program       = self
      i_callback_pf_status_set = 'SET_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout                = layout
      i_bypassing_buffer       = 'X'
      i_grid_settings          = gset
      it_events                = events[]
    TABLES
      t_outtab                 = IT_ztdocinfo[].
   

FORM data_changed USING
     rr_data_changed TYPE REF TO cl_alv_changed_data_protocol.

            field-symbols <ft> type standard table.
            field-symbols <ft2> like line of IT_ztdocinfo.

            assign rr_data_changed->mp_mod_rows->* to <ft>.
            read table <ft> index 1 assigning <ft2>.
            <ft2>-VIBOR = ''.
ENDFORM. 


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 09:38 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
lestat написал:
И так не работает......:(

У меня работает :roll:
На крайний случай используйте объектный АЛВ, метод data_changed_finished...


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 10:02 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Ясно.. Ладно, буду переделывать алв через классы, там все проще... Больше вообще не буду связываться с алв через REUSE_ALV_GRID_DISPLAY... уже бы пять раз сделал через класс... Спасибо за помощь :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 10:17 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
А ф/м "REUSE_ALV_GRID_DISPLAY" не создает ли случаем какой-нибудь объект класса "CL_GUI_ALV_GRID", чтобы потом тупо вызвать метод класса "REFRESH_TABLE_DISPLAY"? Или так не прокатит, с самого начала нужно все через классы делать?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 10:45 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
lestat написал:
А ф/м "REUSE_ALV_GRID_DISPLAY" не создает ли случаем какой-нибудь объект класса "CL_GUI_ALV_GRID", чтобы потом тупо вызвать метод класса "REFRESH_TABLE_DISPLAY"? Или так не прокатит, с самого начала нужно все через классы делать?

Конечно создает. Вам привели пример
Code:
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = L_GRID.

CALL METHOD L_GRID-> Вызывайте какой хотите метод, хоть REFRESH_TABLE_DISPLAY

Обычно так и делают...
Только REFRESH_TABLE_DISPLAY в методе DATA_CHANGED вроде как не поможет, в юзер команде - да.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, дек 21 2010, 13:49 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Чт, янв 14 2010, 13:26
Сообщения: 70
Откуда: Санкт-Петербург
Пол: Мужской
Все спасибо за советы! Проблема решена следующим образом:
Code:
FORM data_changed USING
     rr_data_changed TYPE REF TO cl_alv_changed_data_protocol.

  DATA: w_itab TYPE LINE OF lvc_t_modi,
        itab TYPE lvc_t_modi,
        ix LIKE sy-tabix.

  itab[] = rr_data_changed->mt_mod_cells[].

  CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
    IMPORTING
      E_GRID = L_GRID.

  LOOP AT itab INTO w_itab.
    ix = sy-tabix.

    CASE w_itab-fieldname.
      WHEN 'VIBOR'.
        READ TABLE IT_ztdocinfo INDEX w_itab-row_id.
        IF w_itab-value = 'X' AND
          ( ( IT_ztdocinfo-NALICHIE = icon_led_green AND p_create = 'X' ) OR
          ( IT_ztdocinfo-NALICHIE = icon_led_red AND p_change = 'X' ) ).
            IT_ztdocinfo-VIBOR = ''.
            IT_ztdocinfo-dktxt = '999Я ИДИЁТ, УБЕЙТЕ МИНЯ КТО-НИБУДЬ!'.
            MODIFY IT_ztdocinfo INDEX w_itab-row_id.

        ENDIF.
    ENDCASE.
  ENDLOOP.

  CALL METHOD L_GRID->REFRESH_TABLE_DISPLAY.

ENDFORM. 


НО ПОЯВИЛАСЬ СЛЕДУЮЩАЯ ПРОБЛЕМА! :)

Метод REFRESH_TABLE_DISPLAY работает, но только для тех полей, у которых в филдкате не стоит параметр edit = 'X', т.е. можно изменять только поля, которые не доступны в алв для ввода... Поле VIBOR у меня как раз открыто для ввода... dktxt обновляется, а VIBOR - нет...

КАК БЫТЬ? :)
Я придумал тока перестраивать филдкат перед рефрешем (закрывать поле на редактирование), после рефреша его снова открывать... Но мне кажется это изврат... - так попробовал не работает... :(
Может кто-нибудь подскажет как решить данную проблему?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Пт, дек 31 2010, 13:39 
Специалист
Специалист

Зарегистрирован:
Вс, янв 11 2009, 11:05
Сообщения: 152
Пол: Мужской
Может тогда повешать рефреш в событии DATA_CHANGED_FINISHED?
У меня никогда проблем не возникало с обновлением. Не важно разрешены поля на ввод или нет.
в DATA_CHANGED подменяем поля какие надо. а в DATA_CHANGED_FINISHED делаем один рефреш. Но лучше при изменении полей выставлять флаг и в DATA_CHANGED_FINISHED по нему обновлять, чтобы на всякие пересортировки не рефрешиться.

Да и modify_cell должен работать для нередактируемых ячеек. тогда и рефреш не надо делать никакой.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, янв 11 2011, 12:55 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Как правильно сказал _garycor_, если уж рефрешить грид, то в событии DATA_CHANGED_FINISHED - никаких проблем. Однако, по возможности, следует использовать событие data_changed:

1) Если хотите при изменении пользователем значения редактировать соседние ячейки или вернуть значение в исходное состояние, используйте метод er_data_changed->modify_cell (где er_data_changed - это параметр в событии data_changed ALV-грида).
2) Если хотите добавить свое сообщение в лог и вывести на экран, используйте метод er_data_changed->add_protocol_entry
3) Чтобы запретить дальнейшее редактирование, пока пользователь не ввел правильное значение, следует установить флаг error = 'X' в соответствующей строке таблицы er_data_changed->mt_mod_cells.

пример здесь: viewtopic.php?f=13&t=56473&p=356813#p356813


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Обновление грида после события "DATA_CHANGED"
СообщениеДобавлено: Вт, янв 11 2011, 15:30 
Начинающий
Начинающий

Зарегистрирован:
Вт, янв 11 2011, 15:15
Сообщения: 14
У меня работает вот так с REUSE_ALV_GRID_DISPLAY (изменяется только одно поле типа галочка):
Code:
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      i_bypassing_buffer       = true
      i_callback_program       = g_repid
      i_callback_pf_status_set = 'MY_STATUS'
      i_callback_user_command  = 'USER_COMMAND'
      is_layout                = gs_layouth
      it_fieldcat              = gt_fieldcat1[]
*      it_sort                  = gt_sort
*      it_filter                = gt_filter
      i_default                = 'X'
      i_save                   = 'A'
      is_variant               = gs_variant
*      it_events                = lt_evts
    TABLES
      t_outtab                 = gt_otbor
    EXCEPTIONS
      program_error            = 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.



Code:
    IF ls_fcat-fieldname = 'VIBOR'.
      ls_fcat-checkbox = true.
      ls_fcat-edit = 'X'.
      ls_fcat-hotspot = 'X'.
*      ls_fcat-input = 'X'.
    ENDIF.



Code:
*&---------------------------------------------------------------------*
*&      Form  user_command
*&---------------------------------------------------------------------*
*    обработка кнопок тулбара основного грида
*----------------------------------------------------------------------*
*      -->R_UCOMM      text
*      -->RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
         rs_selfield TYPE slis_selfield.
  DATA: l_doknrs     TYPE rm06e-evrtn,
        l_index      TYPE sy-tabix,
        lt_cell      TYPE lvc_t_ceno,
        l_otvet      TYPE c,
        l_obnov      TYPE c.
  DATA: l_da TYPE c.
  CASE r_ucomm.

    WHEN '&IC1'.
      IF rs_selfield-fieldname = 'VIBOR'.
        PERFORM set_galochka USING rs_selfield.
      ELSE.
* ищем строку
        READ TABLE gt_otbor INDEX rs_selfield-tabindex.
        CHECK sy-subrc = 0.

        SET PARAMETER ID 'BLN' FIELD gt_otbor-belnr.
        SET PARAMETER ID 'BUK' FIELD gt_otbor-bukrs.
        SET PARAMETER ID 'GJR' FIELD gt_otbor-gjahr.
        CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.

      ENDIF.
    WHEN 'EXIT'.    " выход красная кнопка
      PERFORM set_vopros USING 'Изменения будут потеряны! Вы уверены, что хотите выйти?'
            CHANGING l_da.
      IF l_da = 'X'.
        SET SCREEN 0.
        LEAVE SCREEN.
      ENDIF.
    WHEN 'SOHR' OR '&DATA_SAVE'.
      " сохраняем выбранные записи
      PERFORM set_sohr.
    WHEN 'SOHR_EXIT'.
      " сохраняем выбранные записи
      PERFORM set_sohr.
      SET SCREEN 0.
      LEAVE SCREEN.
  ENDCASE.
* обновление экрана
  rs_selfield-refresh    = true.
  rs_selfield-col_stable = true.
  rs_selfield-row_stable = true.

ENDFORM.                    "user_command

*&---------------------------------------------------------------------*
*&      Form  SET_GALOCHKA
*&---------------------------------------------------------------------*
*      установить/убрать галочку
*----------------------------------------------------------------------*
*      -->P_RS_SELFIELD  text
*----------------------------------------------------------------------*
FORM set_galochka  USING    p_rs_selfield TYPE slis_selfield.


  READ TABLE gt_otbor INDEX p_rs_selfield-tabindex.
  CHECK sy-subrc = 0.
  IF gt_otbor-vibor = 'X'.
    CLEAR gt_otbor-vibor.
  ELSE.
    IF gt_otbor-zzkod_ps IS INITIAL.
      gt_otbor-vibor = 'X'.
    ELSE.
      MESSAGE ///
    ENDIF.
  ENDIF.
  MODIFY gt_otbor INDEX sy-tabix.

ENDFORM.                    " SET_GALOCHKA




Работает и без DATA_CHANGED.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

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


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

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


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

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