Автор Тема: CL_SALV_TABLE - Класс для быстрого вывода ALV-таблицы на экран  (Прочитано 183294 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
1) кнопку тоже установил, а прописывать где - вот здесь-perform vigr (если кнопка одна!)?:
Код: You are not allowed to view links. Register or Login
class lcl_handle_events definition deferred. "Объявляем локальный класс для обработки события
class lcl_handle_events definition.
  public section.
    methods:
      on_user_command for event added_function of cl_salv_events
        importing e_salv_function.
endclass.

class lcl_handle_events implementation.
  method on_user_command.
    perform vigr.
  endmethod.

если 4 кнопки то так чтоли?

Код: You are not allowed to view links. Register or Login
class lcl_handle_events definition.
  public section.
    methods:
      on_user_command for event added_function of cl_salv_events
        importing e_salv_function,

endclass.

class lcl_handle_events implementation.
  method on_user_command.
    perform handle_user_command using e_salv_function.
  endmethod.
form handle_user_command using i_ucomm type salv_de_function.

form d0100_pbo .
 try.
      l_text = text-b01.
      lr_functions->add_function(
        name     = 'GET_SEL'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.

    try.
      l_text = text-b02.
      lr_functions->add_function(
        name     = 'SET_ROWS'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.

    try.
      l_text = text-b03.
      lr_functions->add_function(
        name     = 'SET_COLS'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.

    try.
      l_text = text-b04.
      lr_functions->add_function(
        name     = 'SET_CELL'
        icon     = space
        text     = l_text
        tooltip  = l_text
        position = if_salv_c_function_position=>right_of_salv_functions ).
      catch cx_salv_wrong_call cx_salv_existing.
    endtry.
endform.
  form handle_user_command using i_ucomm type salv_de_function.

  case i_ucomm.
    when 'GET_SEL'.
      perform get_selections.
    when 'SET_ROWS'.
      perform set_selected_rows.
    when 'SET_COLS'.
      perform set_selected_cols.
    when 'SET_CELL'.
      perform set_current_cell.
  endcase.

endform.
только для этого видимо надо создать экран и прописать это
Код: You are not allowed to view links. Register or Login
process before output.
  module d0100_pbo.

process after input.
  module d0100_pai.

эти модули выглядят так:
Код: You are not allowed to view links. Register or Login
module d0100_pbo output.
  perform d0100_pbo.
endmodule.                 " d0100_pbo  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  d0100_pai  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
module d0100_pai input.
  perform d0100_pai.
endmodule.

так ??? все это я выдернул из SALV_DEMO_TABLE_SELECTIONS и SALV_DEMO_TABLE_EVENTS

только вот с экраном не получилось у меня...на module ссылается типа не объявлен....каков порядок действий в этом случаи (SALV_DEMO_TABLE_SELECTIONS ): куда, что и как создать надо чтобы все заработало???

2) а вот как определить и использовать выделенные строки - не знаю(((

3) чем отличается cl_salv_columns_table (который вы используете) и cl_salv_columns и аналогично для cl_salv_column_table и  cl_salv_column ?????

отрывок из вашего кода
Код: You are not allowed to view links. Register or Login
DATA: gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
если кто-то получит свои примеры, например раскопает возможность добавления своих кнопок, то надеюсь поделится своими знаниями в этой теме.
вы это имели ввиду - то что я выше описал??

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
1. Делать модули PAI и PBO для этого класса будет лишним, это вы уже про глобальный класс построения ALV полезли читать, там где сетка размещается в специальном элементе экрана, контейнере, но в данном случае это не ваш метод.

2. Ниже идет пример как вывести поле с чек-боксом и обрабатывать его изменение путем двойного клика мышью в ячейке, а так же пример как добавить свои кнопки на панель инструментов и как их обрабатывать. Тонкость оказалась в том, что если мы используем стандартный класс работы с кнопками ALV-таблицы, то в данном случае метод CALL METHOD gc_functions->add_function не реализован т.е. добавить свою кнопку нельзя, поэтому надо использовать полностью свой статус. Шаблон статуса можно скопировать в свою программу из программы SAPLSALV_METADATA_STATUS, примеры на рисунках ниже. А далее уже в своей программе добавить в него свои кнопки, убрал лишнюю функциональность, так как тулбар к сожалению имеет ограниченную длину.

Ну и сам код программы:
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YTSH_TEMP_GRID
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ytsh_temp_grid.

* Объявляем внутреннюю таблицу, со своими полями + поля из таблицы MKPF
DATA: BEGIN OF gt_mkpf OCCURS 10,
  check_box(1) TYPE c.
        INCLUDE STRUCTURE mkpf.
DATA: my_field(5) TYPE c,
      my_data TYPE matnr,
END OF gt_mkpf.
DATA: gs_mkpf LIKE gt_mkpf.

* Объявляем объект типа cl_salv_table, который выведет наши данные в виде ALV
DATA: gc_alv_table TYPE REF TO cl_salv_table,
      gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table,
      gc_sorts TYPE REF TO cl_salv_sorts,
      "gc_functions TYPE REF TO cl_salv_functions, - Не испльзуется так как объявлен свой статус экрана
      gc_selections TYPE REF TO cl_salv_selections,
      gc_display TYPE REF TO cl_salv_display_settings,
      gc_layout TYPE REF TO cl_salv_layout,
      gc_aggr TYPE REF TO cl_salv_aggregations,
      gc_events TYPE REF TO cl_salv_events_table.

DATA: keys TYPE salv_s_layout_key,
      g_report TYPE syrepid,
      g_pfstatus TYPE sypfkey.


*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
  PUBLIC SECTION.
    METHODS:
    on_user_command FOR EVENT added_function OF cl_salv_events
    IMPORTING e_salv_function,

      on_before_salv_function FOR EVENT before_salv_function OF cl_salv_events
    IMPORTING e_salv_function,

      on_after_salv_function FOR EVENT after_salv_function OF cl_salv_events
    IMPORTING e_salv_function,

      on_double_click FOR EVENT double_click OF cl_salv_events_table
    IMPORTING row column,

      on_link_click FOR EVENT link_click OF cl_salv_events_table
    IMPORTING row column.
ENDCLASS.                    "lcl_handle_events DEFINITION
DATA: gr_events TYPE REF TO lcl_handle_events.
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*



START-OF-SELECTION.
* Выбираем данные из MKPF
  SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_mkpf FROM mkpf.

  LOOP AT gt_mkpf.
* Все CHECK_BOX = "Х" для примера, перед первым показом данных
    gt_mkpf-check_box = 'X'.
*   Какое-то свое поле, занесем тоже значение перед выводом на экран
    gt_mkpf-my_data = gt_mkpf-vgart.
    MODIFY gt_mkpf.
  ENDLOOP.

* Статический метод класса для создания объекта и связывания с нашей таблицей
  cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                          CHANGING t_table = gt_mkpf[] ).

* Получим каталог полей
  gc_columns = gc_alv_table->get_columns( ).
* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'CHECK_BOX' ).
* Зададим заголовок колонки обработанных документов
  gc_colwork->set_long_text( 'Обработанные строки в таблице' ).
  gc_colwork->set_medium_text( 'ОбрабСтроки' ).
  gc_colwork->set_short_text( 'ОбрСтр' ).
* Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '3' ).
  gc_colwork->set_cell_type( if_salv_c_cell_type=>checkbox ).


* События в таблице для пользовательской обработки
  gc_events = gc_alv_table->get_event( ).
  CREATE OBJECT gr_events.
*... §6.1 register to the event USER_COMMAND
  SET HANDLER gr_events->on_user_command FOR gc_events.
*... §6.2 register to the event BEFORE_SALV_FUNCTION
  SET HANDLER gr_events->on_before_salv_function FOR gc_events.
*... §6.3 register to the event AFTER_SALV_FUNCTION
  SET HANDLER gr_events->on_after_salv_function FOR gc_events.
*... §6.4 register to the event DOUBLE_CLICK
  SET HANDLER gr_events->on_double_click FOR gc_events.
*... §6.5 register to the event LINK_CLICK
  SET HANDLER gr_events->on_link_click FOR gc_events.

* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'MY_DATA' ).
* Задать выравнивание по левому краю для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '1' ).

* Получить список полей для сортировки
  gc_sorts = gc_alv_table->get_sorts( ).
  gc_sorts->add_sort( columnname = 'MBLNR' sequence = '2' ).
  gc_sorts->add_sort( columnname = 'MJAHR' sequence = '2' subtotal = 'X' ).

* Получим список функциональных клавиш и активируем их все, но так как нам нужные допонительные
* кнопки на экране, а метод CALL METHOD gc_functions->add_function не поддреживается, то создаем
* свой статус экрана содержащий стандартные кнопки + наши дополнительные кнопки.
  "gc_functions = gc_alv_table->get_functions( ).
  "gc_functions->set_all( 'X' ).

* Испльзуем свой PF-статус так как к стандартному кнопики не добавлются
  gc_alv_table->set_screen_status( report = sy-cprog pfstatus = 'PF_TABLE_STANDARD'
                                   set_functions = cl_salv_model_base=>c_functions_all ).

* Класс для работы с выделеными строками таблицы
  gc_selections = gc_alv_table->get_selections( ).
  gc_selections->set_selection_mode( if_salv_c_selection_mode=>row_column  ).

* Изменим заголовок таблицы
  gc_display = gc_alv_table->get_display_settings( ).
  gc_display->set_list_header( 'Заголовок таблицы' ).

* Добавим ведение вариантов отражения таблицы
  gc_layout = gc_alv_table->get_layout( ).
  keys-report = sy-repid.
  gc_layout->set_key( keys ).
  gc_layout->set_save_restriction( '3' ).

* Выполнить агрегирование по колонке незапланированных затрат
  gc_aggr = gc_alv_table->get_aggregations( ).
  gc_aggr->add_aggregation( 'FRATH' ).

* Вывести ALV-таблицу на экран
  gc_alv_table->display( ).

*---------------------------------------------------------------------*
*       CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
* §5.2 implement the events for handling the events of cl_salv_table
*---------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
  METHOD on_user_command.
    DATA: l_index LIKE sy-tabix,
          lt_rows TYPE salv_t_row.

    CASE e_salv_function.
      WHEN 'BTN_1'.
*       Нажата первая кнопка

*       Получить выделенные строки
        gc_selections->get_selected_rows( RECEIVING value  = lt_rows ).
        LOOP AT lt_rows INTO l_index.
*         Прочитать данные таблицы для выделенной строки
          READ TABLE gt_mkpf INTO gs_mkpf INDEX l_index.
*         какя-нить обработка
        ENDLOOP.

      WHEN 'BTN_2'.
*       Нажата вторая кнопка
    ENDCASE.
  ENDMETHOD.                    "on_user_command

  METHOD on_before_salv_function.

  ENDMETHOD.                    "on_before_salv_function

  METHOD on_after_salv_function.

  ENDMETHOD.                    "on_after_salv_function

  METHOD on_double_click.
    DATA: ls_stable TYPE lvc_s_stbl.
    IF row <> 0.
      IF column = 'CHECK_BOX'.
        READ TABLE gt_mkpf INTO gs_mkpf INDEX row.
        IF gs_mkpf-check_box = 'X'. gs_mkpf-check_box = space. ELSE. gs_mkpf-check_box = 'X'. ENDIF.
        MODIFY gt_mkpf FROM gs_mkpf INDEX row.
        ls_stable-row = 'X'.
        ls_stable-col = 'X'.
        gc_alv_table->refresh( ls_stable ). "Нужно для обработки изменения в экране.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "on_double_click

  METHOD on_link_click.

  ENDMETHOD.                    "on_single_click
ENDCLASS.                    "lcl_handle_events IMPLEMENTATION

PS: Вызов событий взят из примера предоставленного insaf121.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Пример как это выглядит на рисунке ниже. Как видим две свои кнопки, возможность выделения строк и поле с чек-боксом который меняет свой статус по двойному клику в ячейке.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
спасибо огромное...я почти тоже самое сделал...но зачем создавать дополнительно поле CheckBox, если есть крайнее левое поле, кот-я уже позволяет выделять строки???

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
спасибо огромное...я почти тоже самое сделал...но зачем создавать дополнительно поле CheckBox, если есть крайнее левое поле, кот-я уже позволяет выделять строки???
Ну это я для примера... если работать без поля кнопки, ну и показать как обрабатывать клики мышью в ячейках, так сказать объединил два примера в одной программе.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
спасибо...все понятно и доступно...очень полезная вещь...вот добавить это в Ваш первоначальный pdf и будет супер)))

PS: все-таки чем отличается cl_salv_columns_table (который вы используете) и cl_salv_columns ?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
спасибо...все понятно и доступно...очень полезная вещь...вот добавить это в Ваш первоначальный pdf и будет супер)))
Добавлю позже. Файл это так сказать типа из полезных дополнений и его обновление в отличии от форума на регулярной основе не выполянется  8)

You are not allowed to view links. Register or Login
PS: все-таки чем отличается cl_salv_columns_table (который вы используете) и cl_salv_columns ?
Ну я понял что имеется в виду вот это:

1.    gc_columns TYPE REF TO cl_salv_columns_table, "<- Список всех колонок таблицы
2.    gc_colwork TYPE REF TO cl_salv_column_table,  "<- Колонка таблицы для обработки

потому что именно cl_salv_columns, такого типа я у себя в программе не вижу в упор...

Так собственно вот ответ:

* Получим каталог полей это тип: cl_salv_columns_table т.е. класс который содержит все колонки
* таблицы которые будут показываться.
  gc_columns = gc_alv_table->get_columns( ).

* Получим поле по имени это тип cl_salv_columns, т.е. класс который содержит одну выбранную
* колонку с которой типа начинаем работать. В данном случае это колонка 'CHECK_BOX
  gc_colwork ?= gc_columns->get_column( 'CHECK_BOX' ).

т.е. фактически конечно можно было бы написать что-то типа так: gc_alv_table->get_columns( )->get_column( 'CHECK_BOX' )->set_long_text( 'Обработанные строки в таблице' )., но с точки зрения написания кода, длинно каждый раз так писать, да и по производительности будет хуже, так как раждый раз будет метод вызываться, который будет возвращать список из которого мы будем брать одну колонку из которой будем далее брать какое-то одно свойство... согласитесь наглядность падает.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
спасибо за ответ..теперь стало понятней..но я имел ввиду именно то что написал:
вы используете cl_salv_columns_table , но есть и cl_salv_columns - кот-ый вы НЕ используете...это 2 разных класса, но выполняющих почти одни и теже функции...в cl_salv_columns_table намного больше методов, чем в cl_salv_columns.....просто я думал, что cl_salv_columns является подклассом cl_salv_columns_table - выходит ошибался...думал может вы знаете и объясните?
« Последнее редактирование: Сентябрь 28, 2012, 07:15:04 am от jacknk88 »

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears

Здравствуйте, уважаемые! Огромное спасибо Uukrul, очень полезный и простой класс показал. Я АБАПер начинающий, не судите пожалуйста строго, у меня возник вопрос по этому классу, я сначала воспользовался
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table.
 cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).
  gc_alv_table->display( ).

и вроде бы нормально, но мне нужно чтобы было чтобы и метод GET_FUNCTIONS, котоырй вы описали тоже работал
Код: You are not allowed to view links. Register or Login
DATA: gc_functions TYPE REF TO cl_salv_functions.

* Получим список функциональных клавиш и активируем их все
  gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

Я извиняюсь ещё раз, я АБАПер начинающий, может кто поподробней объяснит,  а то я вставляю в начало тела программы, после объявления всех данных и переменных
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table.
DATA: gc_functions TYPE REF TO cl_salv_functions.
.............

 cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).
  gc_alv_table->display( ).

gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).


Но второй метод не отрабатывает, т.е. табличка отображается нормально то стандартной панели с кнопочками нету, может я что не так делаю? Может там ещё надо что нибудь дописывать? Буду весьма признателен за помощь.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
 gc_alv_table->display( ) -  вот это вот показывает твою таблицу, т.е. его надо вставить в самом конце кода, а то у тебя сформировать таблицу и показать, а потом уже стоит активировать кнопки таблицу, но активировать то уже нечего.

Должно быть что-то типа такого:
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table.
DATA: gc_functions TYPE REF TO cl_salv_functions.
.............

 cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).

gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

  gc_alv_table->display( ).

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Спасибо, дейвствительно, как вы и сказали, сделал, заработало. Буду изучать синтаксис...

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Доброго времени суток, уважаемые! У меня опыть возникли затруднения с использованием этого класса. Возникла необходимость изменения имени некоторых столбцов выводимой таблички. Синтаксис пишу такой же какой вы и тут предоставили.
Код: You are not allowed to view links. Register or Login
DATA: gc_alv_table TYPE REF TO cl_salv_table,
      gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table,
      gc_functions TYPE REF TO cl_salv_functions.
START-OF-SELECTION.

Select * from......
........................

cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).

* Получим каталог полей таблицы
  gc_columns = gc_alv_table->get_columns( ).
* Получим поле по имени
  gc_colwork ?= gc_columns->get_column( 'Имя' ).
  gc_colwork->set_medium_text( 'Имя на рус.' ).
*   Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
  gc_colwork->set_alignment( '3' ).



* Получим список функциональных клавиш и активируем их все

 gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

  gc_alv_table->display( ).

При компиляции падает в дамп


Не могу понять в чём дело? Может кто подскажет, буду весьма признателен.


Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
gc_colwork ?= gc_columns->get_column( 'Имя' ).
Мда?! Т.е. у вас поля внутренней таблицы названы русскими буквами? Не ну в 1С там можно конечно, про ABAP не видел. Значит так, ищем вот эту книгу: You are not allowed to view links. Register or Login, других просто по ABAP нет, и читаем ее...

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
You are not allowed to view links. Register or Login
Мда?! Т.е. у вас поля внутренней таблицы названы русскими буквами? Не ну в 1С там можно конечно, про ABAP не видел. Значит так, ищем вот эту книгу: You are not allowed to view links. Register or Login, других просто по ABAP нет, и читаем ее...

ой, запарился, извиняюcь,  имя сомого поля конечно же на английском языке name1, получается пишу

Код: You are not allowed to view links. Register or Login
gc_colwork ?= gc_columns->get_column( 'Name1' ).
  gc_colwork->set_medium_text( 'Имя на рус.' ).

Могу я так обозвать это поле в соответствии с вашим примером? Всё равно в дамп падает. Я понимаю что знаний мне не хватает, ту книжку которую вы предлагаете я постоянно читаю, но может вы всё же подскажете что не так на данный момент, а то мне буквально осталось то несколько названий полей поменять и запрос будет готов. Please!!!




Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Я не много не допонял, происходит изменения краткого описания поля выводимого на экран на русском языке, т.е. поле Имя или происходит изменение поля выводимого их внутренней таблицы унаследованное с поля физической таблицы с именем name?

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Я не много не допонял, происходит изменения краткого описания поля выводимого на экран на русском языке, т.е. поле Имя или происходит изменение поля выводимого их внутренней таблицы унаследованное с поля физической таблицы с именем name?
Есть внутренняя таблица описанная например так:
DATA: BEFIN OF lt_table OCCURS 1,
  name_one LIKE mseg-matnr,
  name_two LIKE mseg-matnr,
END OF lt_table.

Так вот это значит что в ALV будут выведены 2 колонки. Имена колонок (в смысле заглавия столбиков) будут выведены из описания домена/типа на который они ссылаются. Так вот вам надо было написать что-то типа такого:

gc_colwork ?= gc_columns->get_column( 'name_one' ).
gc_colwork->set_medium_text( 'Заголовок колонки один' ).

gc_colwork ?= gc_columns->get_column( 'name_two' ).
gc_colwork->set_medium_text( 'Заголовок колонки два' ).

ну где-то так.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Ну вот у меня приблизительно тоже самое
Код: You are not allowed to view links. Register or Login
DATA: begin of im_tab OCCURS 100,
 im_bukrs LIKE lfb1-bukrs,   " балансовая единица
  im_lifnr LIKE lfa1-lifnr,   " номер кредитора
  im_name1 LIKE lfa1-name1,   " Наименование организации на рус. яз.
  im_name2 LIKE lfa1-name2,
END OF im_tab.

Ну вот я так и пишу как у вас в примере, сначала объвляю ссылки на классы
gc_colwork TYPE REF TO cl_salv_column_table,
      gc_functions TYPE REF TO cl_salv_functions.

затем пытаюсь

gc_columns = gc_alv_table->get_columns( ).
gc_colwork ?= gc_columns->get_column( 'Name1' ).
  gc_colwork->set_medium_text( 'Имя на рус.' ).

при компиляции падает в дамп.


ругается на один из модулей, судя по скриншоту, может у вас ещё какие нибудь догадки?

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Извиняюсь, скриншот не вставился.




Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Извиняюсь, скриншот не вставился.
Мда, оно говорит что объект "Столбец" не найден?! Таки где-то похоже русский используется не там где надо.. потому что такого объекта на русском быть не должно.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Да чо та я любое другое имя внутренней таблицы пытаюсь изменить тоже самое в дамп падает. И так же ругается что не может найти столбец с именем. Не пойму в чём дело.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
You are not allowed to view links. Register or Login
Да чо та я любое другое имя внутренней таблицы пытаюсь изменить тоже самое в дамп падает. И так же ругается что не может найти столбец с именем. Не пойму в чём дело.
Текст программы в студию.. других вариантов нет. Но похоже что вы там уже такое накрутили, что помочь даже не знаю как.

Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Да текст собственно не очень то и мудрёный.
TABLES: lfa1, " Данные поставщиков
              lfb1. " Данные по БЕ
DATA: im_lfa1 LIKE lfa1 OCCURS 100 WITH HEADER LINE,
          im_lfb1 LIKE lfb1 OCCURS 100 WITH HEADER LINE.


TABLES: lfa1, " Данные поставщиков
              lfb1. " Данные по БЕ

DATA: begin of im_tab OCCURS 100,
 im_bukrs LIKE lfb1-bukrs,   
  im_lifnr LIKE lfa1-lifnr,   " номер кредитора
  im_name1 LIKE lfa1-name1,   " Наименование организации на рус. яз.
  im_name2 LIKE lfa1-name2,   " Наименование организации на англ.яз.
  im_erdat LIKE lfb1-erdat,   " Дата создания кредитора (На уровне БЕ)
  im_ernam like lfb1-ernam,   " Кем был создан кредитор (на уровне БЕ)
  im_loevm LIKE lfa1-loevm,   " метка удаления (Все БЕ)
  im_sperr LIKE lfa1-sperr,   " Блокировка (Все БЕ)
  im_sperm LIKE lfa1-sperm,   " Блокировка2 (Все закупочные организации).
  im_sperr2 like lfb1-sperr,  " Блокировка на уровне БЕ.
  im_loevm2 like lfb1-loevm,  " Метка удаления на уровне БЕ
  im_zahls like lfb1-zahls,   " Блокировка платежа на уровне БЕ
  im_stcd1 LIKE lfa1-stcd1,   " РНН организации
  im_stcd3 LIKE lfa1-stcd3,   " БИН организации
  im_stceg LIKE lfa1-stceg, 
Далее идёт selection screen
SELECTION-SCREEN BEGIN OF BLOCK lb WITH FRAME TITLE text-001.
SELECT-OPTIONS im_bukrs FOR lfb1-bukrs.
SELECT-OPTIONS im_name1 FOR lfa1-name1 DEFAULT 'AA' TO 'ZZ'.
SELECT-OPTIONS im_erdat FOR lfa1-erdat.
PARAMETERS: im_lifnr LIKE lfa1-lifnr,
            im_stcd1 LIKE lfa1-stcd1,
            im_stcd3 like lfa1-stcd3.
SELECTION-SCREEN END OF BLOCK lb.

SELECTION-SCREEN BEGIN OF BLOCK lb1 WITH FRAME TITLE text-002.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 5.
PARAMETERS: button1 RADIOBUTTON GROUP bt.
SELECTION-SCREEN COMMENT  10(30) text-003.
SELECTION-SCREEN END OF LINE.

DATA: gc_alv_table TYPE REF TO cl_salv_table,
      gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table,
      gc_functions TYPE REF TO cl_salv_functions.

START-OF-SELECTION.


IF button1 EQ 'X'.
    SELECT  * FROM lfb1 INTO  im_lfb1 WHERE bukrs IN im_bukrs .         " Условие выбора всех кредиторов
      im_tab-im_bukrs = im_lfb1-bukrs .
      im_tab-im_erdat = im_lfb1-erdat.
      im_tab-im_ernam = im_lfb1-ernam.
      im_tab-im_sperr2 = im_lfb1-sperr.
      im_tab-im_loevm2 = im_lfb1-loevm.
      im_tab-im_zahls = im_lfb1-zahls.
      SELECT * FROM lfa1  INTO im_lfa1
              WHERE lifnr = im_lfb1-lifnr.
        im_tab-im_lifnr = im_lfa1-lifnr.
        im_tab-im_name1 = im_lfa1-name1.
        im_tab-im_name2 = im_lfa1-name2.
        im_tab-im_erdat = im_lfa1-erdat.
        im_tab-im_loevm = im_lfa1-loevm.
        im_tab-im_sperr = im_lfa1-sperr.
        im_tab-im_sperm = im_lfa1-sperm.
        im_tab-im_stcd1 = im_lfa1-stcd1.
        im_tab-im_stceg = im_lfa1-stceg.
        im_tab-im_stcd3 = im_lfa1-stcd3.


        append im_tab.

      ENDSELECT.
    ENDSELECT.
cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).
** Получим каталог полей таблицы
*  gc_columns = gc_alv_table->get_columns( ).
** Получим поле по имени
*  gc_colwork ?= gc_columns->get_column( 'im_name1' ).
*  gc_colwork->set_medium_text( 'Имя на рус.' ).
**   Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
*  gc_colwork->set_alignment( '3' ).


* Получим список функциональных клавиш и активируем их все

 gc_functions = gc_alv_table->get_functions( ).
  gc_functions->set_all( 'X' ).

  gc_alv_table->display( ).

Селект я вставил один только, на примере этого селекта, выбор радиобаттона всех кредиторов, всё работает нормально, и ваш класс отрабатывает, но вот именно с переименованием не получается.


Оффлайн themax

  • Newbie
  • *
  • Сообщений: 346
  • Репутация: +5/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Всё ни как не могу привыкнуть к некоторым АБАПовским штучкам, регистр букв надо было изменить

gc_colwork ?= gc_columns->get_column( 'IM_NAME1' )

и всё заработало.

Спасибо вам Uukrul за участие и за помощь.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Ну так работает. Да правильно регистр букв важен.. кстати используйте теги вверху страницы при оформлении текстов, например оформление программы в специальном блоке.
Код: You are not allowed to view links. Register or Login
*&---------------------------------------------------------------------*
*& Report  YTSH_TEST_ALV
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ytsh_test_alv.
TABLES: lfa1, " Данные поставщиков
              lfb1. " Данные по БЕ
DATA: im_lfa1 LIKE lfa1 OCCURS 100 WITH HEADER LINE,
          im_lfb1 LIKE lfb1 OCCURS 100 WITH HEADER LINE.

DATA: BEGIN OF im_tab OCCURS 100,
 im_bukrs LIKE lfb1-bukrs,
  im_lifnr LIKE lfa1-lifnr,   " номер кредитора
  im_name1 LIKE lfa1-name1,   " Наименование организации на рус. яз.
  im_name2 LIKE lfa1-name2,   " Наименование организации на англ.яз.
  im_erdat LIKE lfb1-erdat,   " Дата создания кредитора (На уровне БЕ)
  im_ernam LIKE lfb1-ernam,   " Кем был создан кредитор (на уровне БЕ)
  im_loevm LIKE lfa1-loevm,   " метка удаления (Все БЕ)
  im_sperr LIKE lfa1-sperr,   " Блокировка (Все БЕ)
  im_sperm LIKE lfa1-sperm,   " Блокировка2 (Все закупочные организации).
  im_sperr2 LIKE lfb1-sperr,  " Блокировка на уровне БЕ.
  im_loevm2 LIKE lfb1-loevm,  " Метка удаления на уровне БЕ
  im_zahls LIKE lfb1-zahls,   " Блокировка платежа на уровне БЕ
  im_stcd1 LIKE lfa1-stcd1,   " РНН организации
  im_stcd3 LIKE lfa1-stcd3,   " БИН организации
  im_stceg LIKE lfa1-stceg,
END OF im_tab.

SELECT-OPTIONS im_bukrs FOR lfb1-bukrs.
SELECT-OPTIONS im_name1 FOR lfa1-name1 DEFAULT 'AA' TO 'ZZ'.
SELECT-OPTIONS im_erdat FOR lfa1-erdat.
PARAMETERS: im_lifnr LIKE lfa1-lifnr,
            im_stcd1 LIKE lfa1-stcd1,
            im_stcd3 LIKE lfa1-stcd3.

DATA: gc_alv_table TYPE REF TO cl_salv_table,
      gc_columns TYPE REF TO cl_salv_columns_table,
      gc_colwork TYPE REF TO cl_salv_column_table,
      gc_functions TYPE REF TO cl_salv_functions.

SELECT  * FROM lfb1 INTO  im_lfb1 WHERE bukrs IN im_bukrs .         " Условие выбора всех кредиторов
  im_tab-im_bukrs = im_lfb1-bukrs .
  im_tab-im_erdat = im_lfb1-erdat.
  im_tab-im_ernam = im_lfb1-ernam.
  im_tab-im_sperr2 = im_lfb1-sperr.
  im_tab-im_loevm2 = im_lfb1-loevm.
  im_tab-im_zahls = im_lfb1-zahls.
  SELECT * FROM lfa1  INTO im_lfa1
          WHERE lifnr = im_lfb1-lifnr.
    im_tab-im_lifnr = im_lfa1-lifnr.
    im_tab-im_name1 = im_lfa1-name1.
    im_tab-im_name2 = im_lfa1-name2.
    im_tab-im_erdat = im_lfa1-erdat.
    im_tab-im_loevm = im_lfa1-loevm.
    im_tab-im_sperr = im_lfa1-sperr.
    im_tab-im_sperm = im_lfa1-sperm.
    im_tab-im_stcd1 = im_lfa1-stcd1.
    im_tab-im_stceg = im_lfa1-stceg.
    im_tab-im_stcd3 = im_lfa1-stcd3.

    APPEND im_tab.

  ENDSELECT.
ENDSELECT.

cl_salv_table=>factory( IMPORTING r_salv_table = gc_alv_table
                           CHANGING t_table = im_tab[] ).

** Получим каталог полей таблицы
gc_columns = gc_alv_table->get_columns( ).
** Получим поле по имени
gc_colwork ?= gc_columns->get_column( 'IM_NAME1' ).
gc_colwork->set_medium_text( 'Имя на рус.' ).
**   Задать центрирование для вывода поля, тип словаря SALV_DO_ALIGNMENT
gc_colwork->set_alignment( '3' ).


* Получим список функциональных клавиш и активируем их все
gc_functions = gc_alv_table->get_functions( ).
gc_functions->set_all( 'X' ).

gc_alv_table->display( ).

Sapforum.Biz