Текущее время: Чт, мар 28 2024, 20:38

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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