Текущее время: Пн, июл 21 2025, 00:02

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


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

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


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

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