Текущее время: Пт, мар 29 2024, 00:32

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


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


ВНИМАНИЕ!

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



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

Зарегистрирован:
Вс, мар 19 2017, 10:33
Сообщения: 3
Добрый день! Пожалуйста, помогите разобраться.
Делал ALV-отчет через SALV, обнаружил, что, к сожалению, не так просто открыть поля на редактирование в отчете...
Нашел в гугле, как можно сделать, вызвав метод get_grid() и, как бы получить стандартную ALV-ху.
Вот код:
Code:
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, 16:27 
Модератор
Модератор

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


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

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


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

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


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

Code:
 
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, 19:39 
Модератор
Модератор

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

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

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


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

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


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


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

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

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, 21:09 
Модератор
Модератор

Зарегистрирован:
Пн, июн 27 2011, 08:25
Сообщения: 475
пример, на который можно ориентироваться - 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 )
(ну или сделайте любой другой, чтобы Вам подходил)


Code:
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, 05:13 
Начинающий
Начинающий

Зарегистрирован:
Вс, мар 19 2017, 10: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, 08:43 
Специалист
Специалист

Зарегистрирован:
Пт, июл 27 2007, 13:06
Сообщения: 137
Рекомендую зарегистрировать два события для полученного объекта cl_gui_alv_grid: mc_evt_modified и mc_evt_enter. Проблема в том, что данные после ввода без нажатия enter при нажатии кнопки на панели не уходят "глубже".
Code:
    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, 08:59 
Модератор
Модератор

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


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


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

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


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

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


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

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