Текущее время: Пн, июн 23 2025, 22:07

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 16:58 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Всем доброго дня, имею вопрос на засыпку :)

Внутри стандартной группы функций MIGO объявлен класс lcl_migo_kernel, причем его видно в se80 внутри группы функций, но нельзя открыть из se24.
Мне нужно научиться в своей программы создавать объект этого класса, вызывать метод и получать назад значение табличного атрибута PT_GOITEM.

Поиск на просторах интернета дал ответ с хитрыми трюками, который работает внутри badi к MIGO, когда экземпляр класса уже создан: https://scn.sap.com/thread/1221079
У меня другая ситуация: есть просто внешняя программа, т.е. надо для начала научиться создавать экземпляр класса lcl_migo_kernel.
Есть идеи, как это сделать?


Вот код из ссылки:
Code:
METHOD if_ex_mb_migo_badi~pbo_detail.
* define local data
  DATA: lo_obj    TYPE REF TO object.

  DATA: ld_class  TYPE string,
        ld_method TYPE string.

  FIELD-SYMBOLS:
   <lo_kernel>   TYPE ANY.


  DATA:
    ls_goitem     TYPE goitem,
    lt_goitems    TYPE STANDARD TABLE OF goitem,
    ld_line       TYPE sytabix,
    ld_tabix      TYPE sytabix,
    lx_dep_tables TYPE abap_bool.

  break uwsc.

  ld_class = '(SAPLMIGO)LCL_MIGO_GLOBALS=>KERNEL'.
  ASSIGN (ld_class) TO <lo_kernel>.

" Reference: SDN Wiki entry
" 'Accessing the Inacessible - Local Classes within Global Classes'
" https://wiki.sdn.sap.com/wiki/display/ABAP/Accessing+
" the+Inacessible+-+Local+Classes+within+Global+Classes
  lo_obj ?= <lo_kernel>.



  ld_method = 'LINE_GET'.

  ld_line = 1.

  REFRESH: lt_goitems.
  DO.
    ld_line = syst-index.

    CLEAR: ls_goitem.

"   NOTE: Public methods can be accessed using this approach
"         even if the instance is of TYPE REF TO object !!!
    CALL METHOD lo_obj->(ld_method)
      EXPORTING
        i_line    = ld_line
*      i_tabix             TYPE sytabix OPTIONAL
*      i_dependent_tables  = abap_false
      IMPORTING
*      et_goserial         TYPE ty_t_goserial
*      et_gofreight        TYPE ty_t_gofreight
        es_goitem = ls_goitem.

"   NOTE: Assumes that method default_line_get( ) [see below]
"         returns an empty structure.
    IF ( ls_goitem IS INITIAL ).
      EXIT.
    ELSE.
      APPEND ls_goitem TO lt_goitems.
    ENDIF.
  ENDDO.

  break uwsc.
ENDMETHOD.

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 17:03 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Добавляете в свою прогу инклюд с описанием этого класса и - вперед. после этого можно спокойно создавать экземпляры. Но я не смотрел внутрь ГФ. Если там сложные зависимости между этим классом и др. артефактами этой ГФ, то может и не получиться (просто заколебетесь все нужные связи добавлять в свою прогу).

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 18:15 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Кодер написал(а):
Добавляете в свою прогу инклюд с описанием этого класса и - вперед. после этого можно спокойно создавать экземпляры. Но я не смотрел внутрь ГФ. Если там сложные зависимости между этим классом и др. артефактами этой ГФ, то может и не получиться (просто заколебетесь все нужные связи добавлять в свою прогу).

Из своей программы вызвать любой ФМ для инициализации этой ФГ, а потом также через Assign получить доступ к переменной.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 18:27 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Кодер , спасибо, копаю в эту сторону.
Пока приходится копировать целиком всю клавную программу группы функций (с перечнем инклюдов), и то экранных контролов не хватает.
Разбираюсь..

Parazit, тоже была такая идея свести задачу к предыдущей, но подходящего ФМ не нашел.

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 18:52 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Пришлось еще скопировать в новую группу функций несколько экранов и о чудо - заработало!

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 18:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Цитата:
Из своей программы вызвать любой ФМ для инициализации этой ФГ, а потом также через Assign получить доступ к переменной.


Кстати да: есть вариант: расширить какой-то из инклюдов внутри ГФ на свою подпрограмму. В подпрограмме создавать экземпляр класса и возвращать его как выходной параметр подпрограммы. и ГФ копировать не надо. Да.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 19:00 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
LKU написал:
...

Parazit, тоже была такая идея свести задачу к предыдущей, но подходящего ФМ не нашел.

Я заглянул в две разные системы, в обеих ФМ CREATE_NEW_VARIANTS пустышка (уж не знаю почему) - разве не это "доктор прописал"?! :)

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 19:50 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Вт, май 17 2005, 13:35
Сообщения: 4871
Откуда: Москва
Пол: Мужской
Кодер, спасибо за идею!
Сделал новый form внутри энхансмента, новую группу функций удалил как ненужную.

Parazit, ваш вариант наверное тоже рабочий, но мне понадобилось делать несколько вызовов разных классов, делать их динамически как в примере из моего первого поста замучаешься.

Вариант Кодера изящнее.

_________________
Удача - результат нашего желания (© А. Нортон)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как вызвать метод класса lcl_migo_kernel из внешней программы?
СообщениеДобавлено: Сб, сен 12 2015, 20:00 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
LKU написал:
Parazit, тоже была такая идея свести задачу к предыдущей, но подходящего ФМ не нашел.

А как же старый трюк?
Code:
perform dummy_form in program saplmigo if exist.

Хотя вариант Кодера лучше :)

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


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

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


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

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


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

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