Текущее время: Пн, июн 30 2025, 04:40

Часовой пояс: 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 часа


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

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


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

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