Текущее время: Вс, июл 20 2025, 23:44

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 26 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ASSIGN+ABAP_STACK прочитать значения класса вызывающей программы
СообщениеДобавлено: Чт, авг 28 2008, 14:21 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вс, окт 08 2006, 22:57
Сообщения: 81
Пол: Мужской
Добрый день.

у меня вопрос к теме как считать данные вызывающей программы при помощи ASSIGN если интересующая переменная является классом....

В программе ниже создан класс AUTO с методами get_color и set_color. Созданному объекту A присваивается цвет red. Затем в программе вызывается ФМ без интерфейса и в нём посредством ASSIGN получается значение класса {O:3*\PROGRAM=ZSTACKKLASSE2\CLASS=AUTO}. Вопрос как теперь плучить значения переменных класса.....

Т.е. вопрос как правильно написать "CALL METHOD <fs>->get_color" в ФМ....

Code:
*&---------------------------------------------------------------------*
*& Report  ZSTACKKLASSE1
*&
*&---------------------------------------------------------------------*

REPORT  zstackklasse2.

*----------------------------------------------------------------------*
*       CLASS auto DEFINITION
*----------------------------------------------------------------------*
CLASS auto DEFINITION.
  PUBLIC SECTION.
    METHODS: get_color EXPORTING ecolor TYPE char10.
    METHODS: set_color IMPORTING icolor TYPE char10.
  PRIVATE SECTION.
    DATA: color TYPE char10.
ENDCLASS.                    "auto DEFINITION

*----------------------------------------------------------------------*
*       CLASS auto IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS auto IMPLEMENTATION.
  METHOD get_color.
    ecolor = color.
  ENDMETHOD.                    "get_color
  METHOD set_color.
    color = icolor.
  ENDMETHOD.                    "set_color
ENDCLASS.                    "auto IMPLEMENTATION

*****************************************************
*****************************************************
*****************************************************

DATA: a TYPE REF TO auto.
DATA: c TYPE char10.

START-OF-SELECTION.

  CREATE OBJECT a.
  CALL METHOD a->set_color('red').
  CLEAR: c.
  CALL METHOD a->get_color
    IMPORTING
      ecolor = c.
  WRITE:/ c.
* output will be 'red' and it's OK

*****************************************************
*****************************************************
*****************************************************

  CALL FUNCTION 'ZOOPSTACKKLASSE1'.

*FUNCTION zoopstackklasse1.
**"-------------------------------------------------
**"*"Lokale Schnittstelle:
**"-------------------------------------------------
*  FIELD-SYMBOLS: <fs> TYPE ANY.
*
*  DATA: fsname(30).
*  fsname = '(ZSTACKKLASSE2)A'.
*  ASSIGN (fsname) TO <fs>.
*
** <fs> value =
** {O:3*\PROGRAM=ZSTACKKLASSE2\CLASS=AUTO}
*
*  BREAK-POINT.
*
*  DATA: c TYPE char10.
**  CALL METHOD <fs>->get_color "ERROR
**    IMPORTING                 "ERROR
**      ecolor = c.             "ERROR
*
*ENDFUNCTION.

заранее спасибо
Юрий


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ASSIGN+ABAP_STACK прочитать значения класса вызывающей программы
СообщениеДобавлено: Чт, авг 28 2008, 15:31 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Jouri написал:
Добрый день.

у меня вопрос к теме как считать данные вызывающей программы при помощи ASSIGN если интересующая переменная является классом....

В программе ниже создан класс AUTO с методами get_color и set_color. Созданному объекту A присваивается цвет red. Затем в программе вызывается ФМ без интерфейса и в нём посредством ASSIGN получается значение класса {O:3*\PROGRAM=ZSTACKKLASSE2\CLASS=AUTO}. Вопрос как теперь плучить значения переменных класса.....

Т.е. вопрос как правильно написать "CALL METHOD <fs>->get_color" в ФМ....



заранее спасибо
Юрий

Скажите, а зачем Вам вообще нужны классы, если потом используются столь не объектно-ориентированные методы?
Как вариант - класс сделайте в словаре, тогда, возможно, получится обращаться к его методам через <fs>->get_color. Или динамический вариант oref->(meth_name)

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:25 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
надо объявить
FIELD-SYMBOLS: <fs> TYPE REF TO auto.
раз вы уж явно метод вызываете
или через CREATE DATA и т.д. если жестко переменную не хотите объявлять


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:34 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
dump написал(а):
надо объявить
FIELD-SYMBOLS: <fs> TYPE REF TO auto.
раз вы уж явно метод вызываете
или через CREATE DATA и т.д. если жестко переменную не хотите объявлять
Как можно объявлять REF TO auto, если auto является локальным классом, определённым в репорте ZSTACKKLASSE2?
Даже если вынести декларацию и реализацию в инклюды - то скорее всего система будет воспринимать их как разные классы, с последующими дампами невозможности приведения типов (хотя это надо проверить)

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:39 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
у меня все работает


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:40 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
пардон - я не функцию использовал а подпрограмму


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:40 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
dump написал(а):
у меня все работает
Что именно работате?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:45 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
ну то что вызывает ошибку и закомментировано в примере - вызов метода
DATA: c TYPE char10.
CALL METHOD <fs>->get_color "ERROR
IMPORTING "ERROR
ecolor = c. "ERROR
но я подпрограмму использовал а не функцию - лень создавать


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 16:59 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
dump написал(а):
ну то что вызывает ошибку и закомментировано в примере - вызов метода
DATA: c TYPE char10.
CALL METHOD <fs>->get_color "ERROR
IMPORTING "ERROR
ecolor = c. "ERROR
но я подпрограмму использовал а не функцию - лень создавать

Вы хоть прочитали в таком случае что я писал?
Подпрограмма это совершенно не то. Или вы делали вызов подпрограммы в другом репорте (perform ZTEST in program zystackklasse99)?
Это довольно принципиальный момент.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 17:16 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вс, окт 08 2006, 22:57
Сообщения: 81
Пол: Мужской
может случиться что Вы находитесь в USER-EXIT и есть доступ к какому то классу вызывающей прграммы (SAP-программы которую естественно изменять нельзя) посредством ASSIGN, но к тому же может случиться что класс определён не в DDIC а в программе...

На первый взгляд кажется, что можно определить в ФМ такой же класс и создать ещё один объект и передать в него значения....
но это тоже не очень хорошо.... может быть например класс ORDER или PURCHASE.... и при создании нового объекта в системе будет заложен второй ORDER -копия первого....

Я попробовал сделать как вы рекомендуете, но не через DDIC.
В TOP-Include был определён класс как и в программе:

Code:
FUNCTION-POOL ZOOPSTACKKLASSE.              "MESSAGE-ID ..

*----------------------------------------------------------------------*
*       CLASS auto DEFINITION
*----------------------------------------------------------------------*
CLASS auto DEFINITION.
  PUBLIC SECTION.
    METHODS: get_color EXPORTING ecolor TYPE char10.
    METHODS: set_color IMPORTING icolor TYPE char10.
  PRIVATE SECTION.
    DATA: color TYPE char10.
ENDCLASS.                    "auto DEFINITION

*----------------------------------------------------------------------*
*       CLASS auto IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS auto IMPLEMENTATION.
  METHOD get_color.
    ecolor = color.
  ENDMETHOD.                    "get_color
  METHOD set_color.
    color = icolor.
  ENDMETHOD.                    "set_color
ENDCLASS.                    "auto IMPLEMENTATION

и изменил ФМ:

FUNCTION zoopstackklasse1.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*"----------------------------------------------------------------------


*  FIELD-SYMBOLS: <fs> TYPE ANY.
  FIELD-SYMBOLS: <fs> TYPE REF TO auto.

  DATA: method(10).
  method = 'GET_COLOR'.

  DATA: fsname(30).
  fsname = '(ZSTACKKLASSE2)A'.
  ASSIGN (fsname) TO <fs>.


* <fs> value =
* {O:3*\PROGRAM=ZSTACKKLASSE2\CLASS=AUTO}

  BREAK-POINT.

  DATA: c TYPE char10.
*  CALL METHOD <fs>->get_color "ERROR
*    IMPORTING                 "ERROR
*      ecolor = c.             "ERROR
  CALL METHOD <fs>->get_color
    IMPORTING
      ecolor = c.

  CALL METHOD <fs>->(method)
    IMPORTING
      ecolor = c.

  BREAK-POINT.

ENDFUNCTION.

в этом случае происходит Runtime Error в момент
ASSIGN (fsname) TO <fs>.
>>> You attampted to assign a field to a typed field symbol, but the field does not have the required type.....

заранее спасибо
Юрий
www.1SAP1.de


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 17:22 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Jouri написал:
может случиться что Вы находитесь в USER-EXIT и есть доступ к какому то классу вызывающей прграммы (SAP-программы которую естественно изменять нельзя) посредством ASSIGN, но к тому же может случиться что класс определён не в DDIC а в программе...
...
Попробуйте поискать BAdI, вместо USER-EXIT. Вдруг тогда потребность в ASSIGN отпадёт?

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 17:23 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
Цитата:
fsname = '(ZSTACKKLASSE2)A'.

А что это за "A" на конце?..


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 17:25 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
Code:
FUNCTION zoopstackklasse1.
 
FIELD-SYMBOLS: <fs> TYPE ANY.
  DATA: lr_auto TYPE REF TO object,
  type_ref TYPE REF TO cl_abap_typedescr.
  DATA: fsname(30).
  fsname = '(ZYX)A'.
  ASSIGN (fsname) TO <fs>.

  BREAK-POINT.
  CALL METHOD cl_abap_typedescr=>describe_by_object_ref
    EXPORTING
      p_object_ref = <fs>
    RECEIVING
      p_descr_ref  = type_ref.

  CREATE OBJECT lr_auto TYPE (type_ref->absolute_name).

  DATA: c    TYPE char10,
        name TYPE char20 VALUE 'GET_COLOR'.

  CALL METHOD lr_auto->(name) "get_color "ERROR
    IMPORTING "ERROR
      ecolor = c. "ERROR


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 17:30 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Konstantin Anikeev написал:
Цитата:
fsname = '(ZSTACKKLASSE2)A'.

А что это за "A" на конце?..
Это которое
Code:
DATA: a TYPE REF TO auto.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, авг 28 2008, 17:32 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Вс, окт 08 2006, 22:57
Сообщения: 81
Пол: Мужской
@sy-uname

у меня был общий вопрос... это не принципиально
USER-EXIT или BADI ....
всегда может случиться что через интерфейс не всё передано....
а именно класс ... )))

Юрий


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

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


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

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


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

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