Текущее время: Ср, июл 23 2025, 02:36

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Протокол ALV-грида во второй вызов распахивается на весь экран - и до свидания!
СообщениеДобавлено: Ср, авг 22 2012, 14:11 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Уважаемые коллеги, столкнулся с такой ситуацией.

Проверяю колонку ALV-грида на предмет уникальности ее значений. Ошибки типа "значение в текущей ячейке уже встретилось где-то в строке выше" вывожу в протокол CL_ALV_CHANGED_DATA_PROTOCOL. Ссылку на протокол получаю в обработчике события DATA_CHANGED путем присваивания глобальной переменной: gr_data_changed = er_data_changed. Если событие DATA_CHANGED не происходило (данные не менялись), то в нужном месте формирую протокол самостоятельно через CREATE OBJECT.

Всё в принципе работает, информация о "вертикальных" ошибках выводится, места ошибок корректно указываются. При этом в первый раз окно протокола появляется нормально - не во весь экран. При повторной же проверке окно протокола распахивается на весь экран и вернуться к проверяемому гриду более не представляется возможным. Возможен лишь выход на начальный экран выбора или вообще из программы по предусмотрительно заготовленным в статусе стандартным кнопкам выхода (F3, Shift+F3, F12). Если закрыть окно протокола крестиком, то закрывается весь текущий режим SAP.

Идеи? Кто-нибудь встречался с подобным? Если надо, то приведу код (после некоторой подготовки).


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Протокол ALV-грида во второй вызов распахивается на весь экран - и до свидания!
СообщениеДобавлено: Ср, авг 22 2012, 14:40 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Пт, июн 16 2006, 00:43
Сообщения: 1686
Откуда: Москва <-> Красноярск
Пол: Мужской
Gustav, а вы какой протокол формируете через CREATE OBJECT?

Правильнее сохранять экземпляр протокола в глобальной переменной в DATA_CHANGED и пользоваться уже им. В таком виде прекрасно работает.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Протокол ALV-грида во второй вызов распахивается на весь экран - и до свидания!
СообщениеДобавлено: Ср, авг 22 2012, 15:17 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Всё-таки нужен код. Привожу ниже для демонстрации явления.

На начальном экране выбора указывается таблица. После открытия грида можно постирать "Мандант" в нескольких строках и затем выполнить проверку, например, нажатием на "дискету" Save. Возникнет "Журнал ошибок". Закройте "крестиком" его и опять нажмите на Save. Повторите несколько раз - журнал нормально открывается и закрывается.

Восстановите стертые значения или удалите эти строки с пустыми "мандантами". Снова нажмите на Save. Теперь, когда данные в ячейках нормальные, проверка идёт дальше и включается проверка "между строками" (ошибка данного типа в программе просто имитируется записью соответствующего сообщения в протокол). Итак, после нажатия на Save в первый раз появляется журнал с "вертикальной" ошибкой. Закройте его "крестиком" и еще раз (второй) нажмите на Save... Теперь попробуйте вернуться к гриду... :(

Самый же быстрый способ получения эффекта (ничего не стирая) - после открытия грида нажать на Save, закрыть журнал ошибок и опять нажать на Save. Выйти из "зависания" - по F3.
Code:
REPORT  zzjob_kku_126_grid_protocol.

* Шаги по внедрению этой программы в Вашу систему:
*
* 1. SE38 или SE80: создать данную программу
*
* 2. SE80: создать экран 0100
*
* 3. Screen Painter: на экране 0100 создать 'Спец.упр.элемент'
*    CONT_AREA
*
* 4. SE80: для экрана 0100 установить переменную OK_CODE для элемента OK
*
* 5. SE80: коду на закладке 'ЛогикаВыполн' экрана 0100 придать вид:
*
*    PROCESS BEFORE OUTPUT.
*      MODULE pbo_0100.
*    PROCESS AFTER INPUT.
*      MODULE pai_0100.
*
* 6. SE80: создать GUI-статус STATUS100, назначить функции BACK, EXIT, SAVE
*    стандартным иконкам (либо создайте свои собственные кнопки)

*    ("Шаги" заимствованы отсюда: http://www.kerum.pl/infodepot/00034
*                                     - ОЧ.понравилось как оформлено!)

TYPE-POOLS: slis.

PARAMETERS: p_dbtab TYPE tabname DEFAULT 'T001'.

CLASS lcl_event_receiver  DEFINITION DEFERRED.

DATA:
  gs_layout         TYPE lvc_s_layo,
  grid              TYPE REF TO cl_gui_alv_grid,
  custom_container  TYPE REF TO cl_gui_custom_container,
  event_receiver    TYPE REF TO lcl_event_receiver,
  gr_data_changed   TYPE REF TO cl_alv_changed_data_protocol,
  g_repid           TYPE sy-repid,
  ok_code           TYPE sy-ucomm,
  it_ref            TYPE REF TO data,
  wa_ref            TYPE REF TO data,
  lflagedit(1)      TYPE c,
  gt_fieldcat       TYPE lvc_t_fcat.

FIELD-SYMBOLS:
  <it_grid>         TYPE STANDARD TABLE,
  <wa_grid>         TYPE ANY.

START-OF-SELECTION.

  lflagedit = 'X'.
  PERFORM read_data.
  CALL SCREEN 100.

*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver DEFINITION
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.

    METHODS:
      handle_data_changed
         FOR EVENT data_changed OF cl_gui_alv_grid
             IMPORTING e_onf4
                       e_onf4_before
                       e_onf4_after
                       er_data_changed
                       sender.

  PRIVATE SECTION.

    METHODS:
      perform_semantic_checks
         IMPORTING
            er_data_changed TYPE REF TO cl_alv_changed_data_protocol.

ENDCLASS.                    "lcl_event_receiver DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.

    CALL METHOD perform_semantic_checks( er_data_changed ).

    gr_data_changed = er_data_changed.

  ENDMETHOD.                           " handle_data_changed

*-------------------------------------------------------
  METHOD perform_semantic_checks.

    FIELD-SYMBOLS: <tab>    TYPE STANDARD TABLE,
                   <mandt>  TYPE mandt.

    DATA: ls_good TYPE lvc_s_modi.

    TYPES: BEGIN OF type_row,
              row_id       TYPE lvc_s_modi-row_id,
              tabix        TYPE lvc_s_modi-tabix,
           END OF type_row.

    DATA: it_row TYPE SORTED TABLE OF type_row
                   WITH UNIQUE KEY table_line,
          wa_row LIKE LINE OF it_row.

    LOOP AT er_data_changed->mt_good_cells INTO ls_good.
      MOVE-CORRESPONDING ls_good TO wa_row.
      COLLECT wa_row INTO it_row.
    ENDLOOP.

    ASSIGN er_data_changed->mp_mod_rows->* TO <tab>.

    LOOP AT it_row INTO wa_row.

      READ TABLE <tab> INTO <wa_grid> INDEX wa_row-tabix.

      "проверка на заполненность поля мандант
      ASSIGN COMPONENT 'MANDT' OF STRUCTURE <wa_grid> TO <mandt>.
      IF <mandt> IS INITIAL.
        PERFORM add_protocol
          USING er_data_changed
                wa_row-row_id
                wa_row-tabix
                'MANDT'
                'Поле обязательного ввода'
                '' '' ''.
      ENDIF.

    ENDLOOP.

  ENDMETHOD.                           " perform_semantic_checks

ENDCLASS.                    "lcl_event_receiver IMPLEMENTATION

*&---------------------------------------------------------------------*
*&      Form  init_fieldcat
*&---------------------------------------------------------------------*
FORM init_fieldcat.

  DATA oref_structure     TYPE REF TO cl_abap_structdescr.
  DATA wa_comp            TYPE abap_compdescr.

  "получение структуры таблицы
  oref_structure ?=
    cl_abap_typedescr=>describe_by_name( p_dbtab ).

* создать описание колонок грида
  CLEAR: gt_fieldcat.

  LOOP AT oref_structure->components INTO wa_comp.

    PERFORM addcat1
      USING wa_comp-name p_dbtab wa_comp-name 'X' ''.

  ENDLOOP.

ENDFORM.                    "init_fieldcat

*&---------------------------------------------------------------------*
*&      Form  read_data
*&---------------------------------------------------------------------*
FORM read_data.

  CREATE DATA it_ref TYPE STANDARD TABLE OF (p_dbtab).
  ASSIGN it_ref->* TO <it_grid>.
  CREATE DATA wa_ref LIKE LINE OF <it_grid>.
  ASSIGN wa_ref->* TO <wa_grid>.

  CLEAR: <it_grid>.

  SELECT *
      INTO CORRESPONDING FIELDS OF TABLE <it_grid>
      FROM (p_dbtab).

ENDFORM.                    "read_data

*&---------------------------------------------------------------------*
*&      Form  addcat1
*&---------------------------------------------------------------------*
FORM addcat1 USING fieldname ref_table ref_field cedit ctext.

  DATA: ls_fieldcat LIKE LINE OF gt_fieldcat.

  CLEAR ls_fieldcat.

  ls_fieldcat-fieldname = fieldname.
  ls_fieldcat-ref_table = ref_table.
  ls_fieldcat-ref_field = ref_field.
  IF lflagedit = 'X'.
    ls_fieldcat-edit    = cedit.
  ENDIF.
  IF NOT ctext IS INITIAL.
    ls_fieldcat-coltext   = ctext.
    ls_fieldcat-seltext   = ctext.
  ENDIF.

  ls_fieldcat-col_opt = 'X'. "Подгонка по ширине

  APPEND ls_fieldcat TO gt_fieldcat.

ENDFORM.                                                    "AddCat1

*----------------------------------------------------------------------*
*  MODULE pai_100 INPUT
*----------------------------------------------------------------------*
MODULE pai_100 INPUT.

  CASE ok_code.

    WHEN 'BACK'.
      LEAVE TO SCREEN 0.

    WHEN 'EXIT'.
      LEAVE PROGRAM.
      "LEAVE TO SCREEN 100.

    WHEN 'SAVE'.
      PERFORM check_unique. "некоторая вертикальная проверка между записями

  ENDCASE.
  CLEAR ok_code.

ENDMODULE.                    "pai_100 INPUT

*----------------------------------------------------------------------*
*  MODULE pbo_100 OUTPUT
*----------------------------------------------------------------------*
MODULE pbo_100 OUTPUT.

  DATA: lt_exclude TYPE ui_functions,
        i_save     TYPE char01,
        l_variant  LIKE disvariant.

  DATA: extab TYPE slis_t_extab WITH HEADER LINE.

  CHECK custom_container IS INITIAL.

  IF lflagedit = ''.
    extab-fcode = 'SAVE'.
    APPEND extab.
  ENDIF.

  SET PF-STATUS 'STATUS100' EXCLUDING extab.

  g_repid = sy-repid.

* create a custom container control for our ALV Control
  CREATE OBJECT custom_container
    EXPORTING
      container_name = 'CONT_AREA'.
  IF sy-subrc NE 0.
* add your handling, for example
    CALL FUNCTION 'POPUP_TO_INFORM'
      EXPORTING
        titel = g_repid
        txt2  = sy-subrc
        txt1  = 'The control could not be created'(510).
  ENDIF.

* create an instance of alv control
  CREATE OBJECT grid
    EXPORTING
      i_parent = custom_container.

* Создание списка колонок
  PERFORM init_fieldcat.

* Both user-defined and global layouts can be saved.
  i_save = 'A'.
  l_variant-report = sy-repid.

  CALL METHOD grid->set_table_for_first_display
    EXPORTING
      is_layout            = gs_layout
      it_toolbar_excluding = lt_exclude
      i_save               = i_save
      is_variant           = l_variant
    CHANGING
      it_outtab            = <it_grid>
      it_fieldcatalog      = gt_fieldcat.

* ->Create Object to receive events and link them to handler methods.
* When the ALV Control raises the event for the specified instance
* the corresponding method is automatically called.

  CREATE OBJECT event_receiver.
  SET HANDLER event_receiver->handle_data_changed FOR grid.

ENDMODULE.                    "pbo_100 OUTPUT


*&---------------------------------------------------------------------*
*&      Form  add_protocol
*&---------------------------------------------------------------------*
FORM add_protocol
     USING er_data_changed TYPE REF TO cl_alv_changed_data_protocol
           nrowid          TYPE lvc_s_modi-row_id
           ntabix          TYPE lvc_s_modi-tabix
           i_fieldname     TYPE lvc_fname
           i_msgv1         TYPE any
           i_msgv2         TYPE any
           i_msgv3         TYPE any
           i_msgv4         TYPE any.

  DATA: cfield LIKE i_fieldname.
  cfield = i_fieldname.
  TRANSLATE cfield TO UPPER CASE.
  CALL METHOD er_data_changed->add_protocol_entry
    EXPORTING
      i_msgid     = '0K'
      i_msgno     = '000'
      i_msgty     = 'E'
      i_msgv1     = i_msgv1
      i_msgv2     = i_msgv2
      i_msgv3     = i_msgv3
      i_msgv4     = i_msgv4
      i_fieldname = cfield
      i_row_id    = nrowid.

ENDFORM.                    "add_protocol


*&---------------------------------------------------------------------*
*&      Form  check_unique
*&---------------------------------------------------------------------*
FORM check_unique.

  DATA: protocol_is_visible TYPE int4,
        l_valid             TYPE c.

  CALL METHOD grid->check_changed_data
    IMPORTING
      e_valid = l_valid.

  IF gr_data_changed IS NOT BOUND.
    CREATE OBJECT gr_data_changed
      EXPORTING
        i_calling_alv = grid.
  ELSE.
    CALL METHOD gr_data_changed->refresh_protocol.
  ENDIF.

  "какая-то проверка (бла-бла-бла)
  "перебираем основной грид,
  "следя уникальностью проверяемых полей
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------

  "как бы по результатам проверки добавляем запись в протокол
  PERFORM add_protocol
    USING gr_data_changed
          1 "nrowid
          0 "ntabix - не используется
          'MANDT'
          'Дублирование КЛЮЧА таблицы из одной'
          'из вышележащих строк'
          ''
          ''.

  CALL METHOD gr_data_changed->protocol_is_visible
    IMPORTING
      visible = protocol_is_visible.

  IF protocol_is_visible IS INITIAL.
    CALL METHOD gr_data_changed->display_protocol.
  ENDIF.

ENDFORM.                    "Check_Unique


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Протокол ALV-грида во второй вызов распахивается на весь экран - и до свидания!
СообщениеДобавлено: Ср, авг 22 2012, 16:57 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, июл 16 2010, 09:57
Сообщения: 106
Откуда: СПб
Пол: Мужской
Ну вроде победил (стоило только доложиться на форуме, как "ОНО" испугалось, ибо поняло, что обречено!) :). Сначала банальным FREE, а затем и специализированным cl_alv_changed_data_protocol->free. В окончательный алгоритм для пущей нарочитости включил оба. В обработчике события DATA_CHANGED ссылку на протокол теперь не беру, а пересоздаю собственный всякий раз в начале подпрограммы check_unique, которая теперь имеет вид:
Code:
*&---------------------------------------------------------------------*
*&      Form  check_unique
*&---------------------------------------------------------------------*
FORM check_unique.

  DATA: l_valid             TYPE c.

  CALL METHOD grid->check_changed_data
    IMPORTING
      e_valid = l_valid.

  IF gr_data_changed IS BOUND.
    CALL METHOD gr_data_changed->free. "это специализированный
    FREE gr_data_changed. "и на всякий случай и это
  ENDIF.

  CREATE OBJECT gr_data_changed
    EXPORTING
      i_calling_alv = grid.

  "какая-то проверка (бла-бла-бла)
  "перебираем основной грид,
  "следя уникальностью проверяемых полей
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------
  "-----------------------------

  "как бы по результатам проверки добавляем запись в протокол
  PERFORM add_protocol
    USING gr_data_changed
          1 "nrowid
          0 "ntabix - не используется
          'MANDT'
          'Дублирование КЛЮЧА таблицы из одной'
          'из вышележащих строк'
          ''
          ''.

  CALL METHOD gr_data_changed->display_protocol.

ENDFORM.                    "check_unique


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

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


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

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


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

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