Текущее время: Ср, окт 18 2017, 02:32

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: ALV Grid: получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 11:52 
Начинающий
Начинающий

Зарегистрирован:
Вс, мар 19 2017, 11:33
Сообщения: 3
Добрый день! Пожалуйста, помогите разобраться.
Делал ALV-отчет через SALV, обнаружил, что, к сожалению, не так просто открыть поля на редактирование в отчете...
Нашел в гугле, как можно сделать, вызвав метод get_grid() и, как бы получить стандартную ALV-ху.
Вот код:
Код:
METHOD set_edit_mode.
DATA lo_alv TYPE REF TO cl_gui_alv_grid.
DATA lt_fcat TYPE lvc_t_fcat.
DATA ls_fcat TYPE lvc_s_fcat.

FIELD-SYMBOLS <fs_fcat> LIKE LINE OF lt_fcat.

lo_alv ?= lcl_salv_model=>get_grid( go_alv ).
CHECK lo_alv IS BOUND.
lo_alv->get_frontend_fieldcatalog( IMPORTING et_fieldcatalog = lt_fcat ).

LOOP AT lt_fcat ASSIGNING <fs_fcat> WHERE fieldname = 'main_data' OR fieldname = 'older'
OR fieldname = 'type_s''.
<fs_fcat>-edit = id_edit.

ENDLOOP.

lo_alv->set_frontend_fieldcatalog( EXPORTING it_fieldcatalog = lt_fcat ).
IF id_edit = abap_true.
lo_alv->set_ready_for_input( 1 ).
ELSE.
lo_alv->set_ready_for_input( 0 ).
ENDIF.
ENDMETHOD. "set_edit_mode


Если устанавливаю edit 'true', то поля открываются на редактирование.
Все заработало, ввожу данные в табличку, закинул на форму кнопку, чтобы провалиться в отладчик, а введенные данные во внутреннюю таблицу не приходят! Ничего не пришло, просто пустота.
Что делать? Подскажите, плиз, по-моему в стандартной AlV-хе все сразу сохраняется, что ввели.
Я junior, помогите, пожалуйста.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 17:27 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
до нужного момента получения данных вызовите метод
lo_alv->check_changed_data


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 17:32 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
и еще "рядом с этой темой"
viewtopic.php?f=13&t=21032


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 20:00 
Начинающий
Начинающий

Зарегистрирован:
Вс, мар 19 2017, 11:33
Сообщения: 3
olegbash писал(а):
до нужного момента получения данных вызовите метод
lo_alv->check_changed_data


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

Код:
 
METHOD save_input_data.
    DATA lo_alv  TYPE REF TO cl_gui_alv_grid.

    lo_alv ?= lcl_salv_model=>get_grid( go_alv ).
    CHECK lo_alv IS BOUND.
    lo_alv->CHECK_CHANGED_DATA( ).
ENDMETHOD.


И тогда снова приходится создавать lo_alv, получать в него стандартный alv и вызывать метод chek_changed_data.
Компилятор не ругается, но во внутреннюю таблицу ничего не приходит.
Где вызывать этот метод правильно? Что-то нужно делать дальше?

Или надо делать check changed data в предыдущем методе?
Тема, на которую ссылаетесь, не помогла, не вижу особой связи вопроса...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 20:39 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
если go_alv типа CL_SALV_TABLE, то в методе save_input_data вызовите

go_alv->refresh( refresh_mode = if_salv_c_refresh=>full ).

если что-то не получиться - пришлите, пожалуйста, текст программы.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 20:41 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
lurk писал(а):
Тема, на которую ссылаетесь, не помогла, не вижу особой связи вопроса...


тема, которая указал, - для информации; это связанная тема, помогающая избежать ошибок, но, Вы правы, не для Вашего случая (как выясняется).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 21:16 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
я понял, что Вы делаете.

1) Вы хотите сделать редактирование ячеек через класс cl_salv_table - это не очень хорошо. если можно сделайте через CL_ALV_GUI_GRID

2) Вынесите объект lo_alv в атрибуты класса и заполните его в методе set_edit_mode
в методе save_input_data

сделайте так
if me->lo_alv is BOUND.
me->lo_alv->check_changed_data( ).

" после этого данные должны быть во внутренней таблице
endif.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Вс, мар 19 2017, 22:09 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
пример, на который можно ориентироваться - http://zevolving.com/2008/12/salv-table ... alv-model/

пример программы под Ваши нужды.
Предварительно скопируйте GUI Status SALV_STANDARD из report SALV_DEMO_TABLE_EVENTS
в gui status SALV_STANDARD_TST этой программы (в данном случае Z_TST_SALV_TABLE )
(ну или сделайте любой другой, чтобы Вам подходил)


Код:
REPORT  Z_TST_SALV_TABLE.
CLASS lcl_salv_model DEFINITION INHERITING FROM cl_salv_model_list.
  PUBLIC SECTION.
    DATA: o_control TYPE REF TO cl_salv_controller_model,
          o_adapter TYPE REF TO cl_salv_adapter.
    METHODS:
      grabe_model
        IMPORTING
          io_model TYPE REF TO cl_salv_model,
       grabe_controller,
       grabe_adapter.
  PRIVATE SECTION.

    DATA: lo_model TYPE REF TO cl_salv_model.
ENDCLASS.                    "LCL_SALV_MODEL DEFINITION
*----------------------------------------------------------------------*
* Event handler for the added buttons
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* Local Report class - Definition
*----------------------------------------------------------------------*
CLASS lcl_report DEFINITION.
  PUBLIC SECTION.
    TYPES: ty_t_sflights TYPE STANDARD TABLE OF sflights.
    DATA: t_data TYPE ty_t_sflights.
    DATA: o_salv       TYPE REF TO cl_salv_table.
    DATA: o_salv_model TYPE REF TO lcl_salv_model.

    DATA: lo_grid TYPE REF TO cl_gui_alv_grid.

    METHODS:
      get_data,
      generate_output,
      on_user_command FOR EVENT added_function OF cl_salv_events
        IMPORTING e_salv_function
      .
ENDCLASS.                    "lcl_report DEFINITION
*----------------------------------------------------------------------*
* Global data
*----------------------------------------------------------------------*
DATA: lo_report TYPE REF TO lcl_report.
*----------------------------------------------------------------------*
* Start of selection
*----------------------------------------------------------------------*
START-OF-SELECTION.
  CREATE OBJECT lo_report.
  lo_report->get_data( ).
  lo_report->generate_output( ).
*----------------------------------------------------------------------*
* Local Report class - Implementation
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
  METHOD get_data.
*   test data
    SELECT * FROM sflights
           INTO TABLE me->t_data
           UP TO 30 ROWS.
  ENDMETHOD.                    "get_data
  METHOD generate_output.
*...New ALV Instance ...............................................
    TRY.
        cl_salv_table=>factory(
           EXPORTING
*             r_container    = w_alv1
             list_display = abap_false
           IMPORTING
             r_salv_table = o_salv
           CHANGING
             t_table      = t_data ).
      CATCH cx_salv_msg.                                "#EC NO_HANDLER
    ENDTRY.
*...PF Status.......................................................
*   create GUI status
    " two buttons: SAVE and EDIT

    o_salv->set_screen_status(
      pfstatus      =  'SALV_STANDARD_TST'
      REPORT        =  'Z_TST_SALV_TABLE'
      set_functions = o_salv->c_functions_all ).


*...Event handler for the button.....................................
    DATA: lo_events TYPE REF TO cl_salv_events_table

          .
* event object
    lo_events = o_salv->get_event( ).
* setting up the event handler
    SET HANDLER me->on_user_command FOR lo_events.
*...Get Model Object ...............................................
    DATA: lo_alv_mod TYPE REF TO cl_salv_model.
*   Narrow casting
    lo_alv_mod ?= o_salv.
*   object for the local inherited class from the CL_SALV_MODEL_LIST
    CREATE OBJECT o_salv_model.
*   grabe model to use it later
    CALL METHOD o_salv_model->grabe_model
      EXPORTING
        io_model = lo_alv_mod.
*...Generate ALV output ...............................................
    o_salv->display( ).
  ENDMETHOD.                    "generate_output

    METHOD on_user_command.

    data lo_full_adap TYPE REF TO cl_salv_fullscreen_adapter.
    DATA: ls_layout TYPE lvc_s_layo.
    CASE e_salv_function.
*     Make ALV as Editable ALV
      WHEN 'EDIT'.

*       Contorller
        CALL METHOD lo_report->o_salv_model->grabe_controller.
*       Adapter
        CALL METHOD lo_report->o_salv_model->grabe_adapter.
*       Fullscreen Adapter (Down Casting)
        lo_full_adap ?= lo_report->o_salv_model->o_adapter.
*       Get the Grid
        me->lo_grid = lo_full_adap->get_grid( ).
*       Got the Grid .. ?
        IF lo_grid IS BOUND.
*         Editable ALV
          ls_layout-edit = 'X'.
*         Set the front layout of ALV
          CALL METHOD lo_grid->set_frontend_layout
            EXPORTING
              is_layout = ls_layout.
*         refresh the table
          CALL METHOD lo_grid->refresh_table_display.
        ENDIF.

      when 'SAVE'.

        IF me->lo_grid is BOUND.

          me->lo_grid->check_changed_data( ).

          BREAK-POINT.
          " check me->t_data


        endif.
    ENDCASE.
  ENDMETHOD.                    "on_user_command

ENDCLASS.                    "lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
* LCL_SALV_MODEL implementation
*----------------------------------------------------------------------*
CLASS lcl_salv_model IMPLEMENTATION.
  METHOD grabe_model.
*   save the model
    lo_model = io_model.
  ENDMETHOD.                    "grabe_model
  METHOD grabe_controller.
*   save the controller
    o_control = lo_model->r_controller.
  ENDMETHOD.                    "grabe_controller
  METHOD grabe_adapter.
*   save the adapter from controller
    o_adapter ?= lo_model->r_controller->r_adapter.
  ENDMETHOD.                    "grabe_adapter
ENDCLASS.                    "LCL_SALV_MODEL IMPLEMENTATION


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Пн, мар 20 2017, 06:13 
Начинающий
Начинающий

Зарегистрирован:
Вс, мар 19 2017, 11:33
Сообщения: 3
olegbash писал(а):
я понял, что Вы делаете.

1) Вы хотите сделать редактирование ячеек через класс cl_salv_table - это не очень хорошо. если можно сделайте через CL_ALV_GUI_GRID

2) Вынесите объект lo_alv в атрибуты класса и заполните его в методе set_edit_mode
в методе save_input_data

сделайте так
if me->lo_alv is BOUND.
me->lo_alv->check_changed_data( ).

" после этого данные должны быть во внутренней таблице
endif.


Спасибо Вам большое за консультацию, но в моей программе ничего работать не хочет. Я боролся за salv, как мог:D но видимо, придется последовать Вашему совету и сделать все через cl_alv_gui_grid и не мучиться.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Пн, мар 20 2017, 09:43 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, июл 27 2007, 14:06
Сообщения: 86
Рекомендую зарегистрировать два события для полученного объекта cl_gui_alv_grid: mc_evt_modified и mc_evt_enter. Проблема в том, что данные после ввода без нажатия enter при нажатии кнопки на панели не уходят "глубже".
Код:
    lo_grid->REGISTER_EDIT_EVENT(
      exporting
        I_EVENT_ID = cl_gui_alv_grid=>MC_EVT_MODIFIED
      exceptions
        ERROR      = 1
        OTHERS     = 2
    ).

Для проверки можно повесить обработчик на data_changed of cl_gui_alv_grid и там поставить точку остановки.

Лично у меня отлично работает редактируемый salv


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: alv grid получение введенных данных.
СообщениеДобавлено: Пн, мар 20 2017, 09:59 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 09:25
Сообщения: 403
lurk писал(а):
Спасибо Вам большое за консультацию, но в моей программе ничего работать не хочет. Я боролся за salv, как мог:D но видимо, придется последовать Вашему совету и сделать все через cl_alv_gui_grid и не мучиться.


а программа выше у Вас работает? или Вы не стали пробовать?
Ведь там редактируемый salv.


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

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


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

Сейчас этот форум просматривают: BingBot и гости: 17


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

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