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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: CL_OS_STATE  Тема решена
СообщениеДобавлено: Пн, июл 04 2022, 07:12 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
Добрый день.
Нашел такую штуку - CL_OS_STATE.
Очень хочется попробовать сохранить состояние какого то класса, но никак не получается присвоить <FS>.
Например в MIGO:

Code:
DATA: MOM TYPE REF TO CL_OS_STATE.
FIELD-SYMBOLS: <LS_TEST> TYPE ANY.


CREATE OBJECT MOM.
MOM->SET_STATE_FROM_OBJECT( LCL_MIGO_GLOBALS=>KERNEL ).
ASSIGN MOM->STATE->* TO <LS_TEST>.


Присвоение работает, но даже в отладчике не могу посмотреть его содержимое.
Пробовал объявлять <LS_TEST> типа, в котором есть все атрибуты класса KERNEL + дополнение CASTING - вылетает ДАМП.
Из этого примера всё просто, когда в классе всего 2 параметра - https://abap4.ru/access-to-private-attributes.html

Подскажите, с помощью CL_OS_STATE вообще реально выкопать данные из классов (не тривиальных) ?
Видел ещё, что у LCL_MIGO_GLOBALS=>KERNEL есть дополнение READ ONLY. Это как то может влиять на CL_OS_STATE ???
Буду благодарен любой информации, в гугле почти нету примеров с этой штукой.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Вт, июл 05 2022, 13:18 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 131
Откуда: Набережные Челны
Пол: Мужской
Занятный класс, вроде даже работает.
Assign component вам в помощь, правда не удобно.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Чт, июл 07 2022, 11:28 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Сб, июн 08 2019, 12:01
Сообщения: 38
Считать можно любые атрибуты любого типа на произвольном уровне иерархии. Сложность в определении типа структуры. Тип <LS_TEST> должен содержать полный перечень полей нужного типа, тогда будет без проблем читаться (см. статью на которую ссылаешься).

P.S: READ ONLY не влияет ни на сохранение ни на чтение.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пт, июл 08 2022, 06:09 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
Большое спасибо за помощь.
Планировалась использовать эту возможность для решения задач, связанных со стандартными транзакциями , но получается, что это ещё дороже выходит (объявлять стр-ру содержащую весь класс целиком да ещё и гадать потом с порядком полей), чем обычное решение ну и по факту всё равное не присвоилось в конце, ошибка вида "ASSIGN_BASE_TOO_SHORT".
ASSIGN COMPONENT "1" и т.д. у меня не получилось сделать по крайней мере на LCL_MIGO_GLOBALS=>KERNEL.

Была бы штука универсальной, цены бы ей не было. :wink:


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пт, июл 08 2022, 06:49 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
broker.chelny написал:
Занятный класс, вроде даже работает.
Assign component вам в помощь, правда не удобно.

Попробовал на простом примере (как в источнике) - всё работает.
Но как только добавил в этот класс статический атрибут, то всё резко перестало работать, пример:

Code:
REPORT  Z_TEST_STATE.
*----------------------------------------------------------------------*
*       CLASS lcl_example DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EXAMPLE DEFINITION.
  PUBLIC SECTION.
    METHODS CONSTRUCTOR
      IMPORTING
        IV_BAR TYPE I
        IV_FOO TYPE STRING.

    DATA: MY_DAT TYPE I.

    CLASS-DATA:
     STATIC TYPE CHAR1.

  PRIVATE SECTION.
    DATA MV_BAR TYPE I.
    DATA MV_FOO TYPE STRING.
ENDCLASS.                    "lcl_example DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl_example IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EXAMPLE IMPLEMENTATION.
  METHOD CONSTRUCTOR.
    MV_BAR = IV_BAR.
    MV_FOO = IV_FOO.
  ENDMETHOD.                    "constructor
ENDCLASS.                    "lcl_example IMPLEMENTATION

START-OF-SELECTION.
  TYPES:
    BEGIN OF LTS_STATE,
      BAR TYPE I,
      FOO TYPE STRING,
      DAT TYPE I,
      STATIC TYPE CHAR1,
    END OF LTS_STATE.

  FIELD-SYMBOLS: <LS_STATE> TYPE LTS_STATE,
                 <ANY> TYPE ANY,
                 <BAR> TYPE I.

  DATA LO_OBJECT TYPE REF TO LCL_EXAMPLE.
  DATA LO_MEMENTO TYPE REF TO CL_OS_STATE.

  CREATE OBJECT LO_OBJECT
    EXPORTING
      IV_BAR = 100
      IV_FOO = 'Im private'.
  CREATE OBJECT LO_MEMENTO.
  LO_MEMENTO->SET_STATE_FROM_OBJECT( LO_OBJECT ).
  ASSIGN LO_MEMENTO->STATE->* TO <LS_STATE> CASTING. (вылетает дамп) - ASSIGN_BASE_TOO_SHORT.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пт, июл 08 2022, 08:02 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
Получилось и в MIGO присвоить!
Ура!

Но получилось только после того, как убрал из стр-ры статические атрибуты.
А если их добавить то будет непонятная ошибка ASSIGN_BASE_TOO_SHORT.
Странно, что в источнике про это ничего не сказано!!!
Если есть у кого ни будь соображения почему статические атрибуты становятся корнем преткновения как в простом примере, так и в MIGO, поделитесь пожалуйста.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пт, июл 08 2022, 10:20 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Сб, июн 08 2019, 12:01
Сообщения: 38
Статичные атрибуты не принадлежат инстанции класса. Их значения не записываются в состояние.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пт, июл 08 2022, 11:02 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
Спасибо!
ООП кончено прихрамывает.....


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Вс, июл 10 2022, 03:02 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3074
Откуда: Москва
proga19 написал:
Спасибо!
ООП кончено прихрамывает.....

чем?
Разницу реализации в SAP и другими OOP нужно учитывать.

_________________
С уважением,
Удав.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Чт, июл 14 2022, 10:12 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 131
Откуда: Набережные Челны
Пол: Мужской
Создал программно структуру 1 к 1 как в CL_OS_STATE->STATE, потом сделал assign все равно ошибка (делал снимок сложного класса).
Поэтому создал структуру, а потом поэлементно у deep структур скопировал значения атрибутов, так сработало.

Но такое себе, работать с динамически созданной структурой не удобно, проще уж через assign component добираться до нужного значения.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пн, авг 22 2022, 11:42 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
Можете уточнить про "проще уж через assign component добираться до нужного значения" ?
Напрямую сделать ASSIGN COMPONENT 4 OF STRUCTURE LO_MOMENTO->STATE->* TO <KERNEL_GOSERIAL> CASTING не получится, т.к dereference можно делать для ссылки на дату. В данном случае LO_MOMENTO - это ссылка на объект.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Пн, авг 22 2022, 15:06 
Специалист
Специалист

Зарегистрирован:
Чт, дек 16 2010, 15:23
Сообщения: 131
Откуда: Набережные Челны
Пол: Мужской
Я имел в виду следующее:
Code:
ASSIGN ref_data->* TO <STATE>.
ASSIGN COMPONENT 1 OF STRUCTURE <STATE> TO FIELD-SYMBOL(<fs_any>).
IF sy-subrc = 0
  ASSIGN COMPONENT 3 OF STRUCTURE <fs_any> TO FIELD-SYMBOL(<fs_any2>).
ENDIF.


Структура данных следующая:
Глубокая структура
- глубокая подструктура1:
-- данные1 (переменные, константы)
-- данные2
-- ...
- глубокая подструктура2:
-- данные21
-- данные22
- ...

По третьей ветке уже можете делать assign с casting.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: CL_OS_STATE
СообщениеДобавлено: Вт, авг 23 2022, 06:22 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 08 2018, 14:09
Сообщения: 87
Откуда: Челябинск
Пол: Мужской
Всё получилось. Спасибо!

Code:
LO_MOMENTO->SET_STATE_FROM_OBJECT( LCL_MIGO_GLOBALS=>KERNEL ).
ASSIGN LO_MOMENTO->STATE->* TO <GS>.
ASSIGN COMPONENT 1 OF STRUCTURE <GS> TO <FS_1>.
IF SY-SUBRC EQ 0.
ASSIGN COMPONENT 4 OF STRUCTURE <FS_1> TO <FS_4> CASTING.
ENDIF.


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

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


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

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


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

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