Текущее время: Пт, июл 18 2025, 17:47

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Вт, авг 26 2014, 16:09 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Есть класс. Он находится в отдельном INCLUDE. Этот класс подключается в группе функций.
Из программы вызываю ФМ этой группы функций. Этот ФМ вызывает подпрограмму обратного вызова (это у меня своя реализация REUSE с блэкджекомишлюхами) и в качестве параметра этой подпрограммы передается параметр "type ref to CL_МОЙ_КЛАСС". Соответственно в программе я тоже подключаю этот класс. Однако при вызове получаю дамп, так как хотя INCLUDE один, но раз подключен дважды, то для ABAP-а это разные классы. Сделал в подпрограмме параметр "type ANY". Программа в дамп не падает при вызове. Но мне то нужно чтобы тип был не ANY, а "ref to CL_МОЙ_КЛАСС".
Можно ли как-то это исправить? Или все-таки сделать преобразование?
т.е. схема такая
Code:
FORM callback using ptr type ANY.

DATA:
  l_ptr type ref to CL_МОЙ_КЛАСС
.
" как бы тут ptr преобразовать в l_ptr? Или это в принципе невозможно?
ENDFORM.


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

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
представь, что класс это тип, объект класса это переменная данного типа,
в каждой программе локальные типы таковыми и являются и имеют врем. идентификатор (Прогр=..., Тип=%_T000...).

если тип объявлен в инклуде, который входит в две разные программы,
он по сути как лист в тетрадке - когда компилятор собирает программу,
строится дерево инклудов по d010inc, затем все инклуды склеиваются в большой исходник,
который разбирается abap-грамматикой (синтаксич. проверка);
а значит получается два разных больших исходника-программы, и в каждой свои лок. типы,
локальный тип адресуется примерно так - (программа, лок.тип),
и для runtime типы будут разными: (прогр А, лок класс А) и (прогр Б, лок класс Б).

чтобы приведение типов работало для объектов (cast), можно создать глоб интерфейс с нужными методами,
от которого отнаследоваться в лок классах - т.е. передавать ссылки на zif_my_interface,
или сразу создать глоб. класс и передавать ссылки на него


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Вт, авг 26 2014, 17:49 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Глобальный интерфейс не подходит, так как весь смысл - хранить класс в отдельном INCLUDE. Так его легче таскать между системами.

В общем выкрутился. Убрал включение класса из группы функций. Так что теперь группа функций о классе ничего не знает. По идее это даже лучше, так как позволяет использовать этот ФМ с разными версиями класса.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Вт, авг 26 2014, 19:09 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Валерка написал(а):
Глобальный интерфейс не подходит, так как весь смысл - хранить класс в отдельном INCLUDE. Так его легче таскать между системами.

В ERP появилась возможность работать с глобальными классами на основе исходного текста. Так что перетащить глобальный класс между системами - не проблема. :wink:

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Вт, авг 26 2014, 19:43 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
Валерка написал(а):
Глобальный интерфейс не подходит, так как весь смысл - хранить класс в отдельном INCLUDE. Так его легче таскать между системами.


GoF и SAPLink смотрят на ваше решение как на ... Ну вы поняли? Зачем отказываться от нормального решения как в части совместимости(собственно глоб.интерфейс и совместимость по нему - это нормальное решение), так и в части переносов(SAPLink)?
Наследование и использование интерфейсов в ООП - отличные плюшки технологии. Что ж вы себя лишаете всех бонусов?

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Ср, авг 27 2014, 08:28 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Кодер написал(а):
GoF и SAPLink смотрят на ваше решение как на ...
Да я и сам смотрю также. :) Но действительность такова, что проще хранить в одном INCLUDE.
Даже стиль именования классов может отличаться в разных системах. А в INCLUDE у меня внутренний класс, который я как хочу, так и назову.

Удав написал(а):
В ERP появилась возможность работать с глобальными классами на основе исходного текста.

Системы отличаются версиями и что есть в одной системе, может не быть в другой. INCLUDE вроде везде есть.

p.s.Мне тут как-то пришлось дорабатывать программу (хотя существовала мной же написанная программа с аналогичным функционалом) потому что СОГЛАСОВЫВАТЬ документацию на эту новую программу нужно у начальства и ПРОЩЕ дать задание программисту вставить в другую программу аналогичный функционал. Проще для постановщиков, но, само собой, не для меня. Так что правильные решения не всегда подходят в практических условиях. :)


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Ср, авг 27 2014, 10:23 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Валерка написал(а):
Системы отличаются версиями и что есть в одной системе, может не быть в другой.

Так тогда вам и инклюд не поможет :wink:

Валерка написал(а):
Мне тут как-то пришлось дорабатывать программу (хотя существовала мной же написанная программа с аналогичным функционалом) потому что СОГЛАСОВЫВАТЬ документацию на эту новую программу нужно у начальства и ПРОЩЕ дать задание программисту вставить в другую программу аналогичный функционал. Проще для постановщиков, но, само собой, не для меня. Так что правильные решения не всегда подходят в практических условиях. :)

Каждый работает, как привык. :roll:
Кто мешает вам один раз написать документацию на свою программу?

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Ср, авг 27 2014, 16:02 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Удав написал(а):
Валерка написал(а):
Мне тут как-то пришлось дорабатывать программу (хотя существовала мной же написанная программа с аналогичным функционалом) потому что СОГЛАСОВЫВАТЬ документацию на эту новую программу нужно у начальства и ПРОЩЕ дать задание программисту вставить в другую программу аналогичный функционал. Проще для постановщиков, но, само собой, не для меня. Так что правильные решения не всегда подходят в практических условиях. :)

Каждый работает, как привык. :roll:
Кто мешает вам один раз написать документацию на свою программу?
Сложность была не в написании документации, а в согласовании у "ого-го какого начальства". Так что если бы я написал, то потратил бы зря время.


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Ср, авг 27 2014, 23:23 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
То есть портируемый во все системы класс не нужен начальству?
Тут или с начальством проблемы, или с документацией...
Сорри за оффтоп :roll:

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Пт, авг 29 2014, 02:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
в принципе, можно попробовать инклуд с классом преобразовать в пул классов или обычный пул,
(тут наверное без разницы, т.к. класс не словарный и глобальной видимости не возникнет)
и сделать подпрогр. фабрику которая будет выдавать обезличенные ссылки,
тип которых для внешних программ будет одинаковым (пул, %_t000..).


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Пт, авг 29 2014, 09:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Валерка написал(а):
Кодер написал(а):
GoF и SAPLink смотрят на ваше решение как на ...
Да я и сам смотрю также. :) Но действительность такова, что проще хранить в одном INCLUDE.
Даже стиль именования классов может отличаться в разных системах. А в INCLUDE у меня внутренний класс, который я как хочу, так и назову.

Я раньше тоже так думал и поступал. Но всё время ощущал неудобства из-за невозможности пользоваться словарём. Хорошим решением для меня стала собственная система на ноутбуке а так же утилита для переноса объектов разработки. Теперь с превеликим удовольствием пишу глобальные классы, код становится более прозрачным. На всякий случай использую уникальные префиксы для своих глобальных и словарных объектов. В случае, если нужно поменять их имена, сначала импортирую в систему клиента со своими именами, а потом копирую в нужные стандартными средствами SAP. Свои потом удаляю. Если не хочу светить класс как глобальный, например набор собственных утилит, экспортирую его в исходный текст штатным средством - в новых системах есть кнопочка, в старых (вплоть до 4.6D) прога SEO_SHOW_CLIF_INCLUDES или ручная команда show_clif в se24.
Валерка написал(а):
Удав написал(а):
В ERP появилась возможность работать с глобальными классами на основе исходного текста.

Системы отличаются версиями и что есть в одной системе, может не быть в другой. INCLUDE вроде везде есть.
...

Штатный импорт из исходного в глобальный есть даже в 4.6D, если не ошибаюсь.

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Пт, авг 29 2014, 17:10 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 304
Parazit а из-за такого копирования туда-сюда не возникает проблем с обновлением класса? Т.е. добавил новые фишки в системе 1 и нужно их вставить в систему 2?
С INCLUDE все понятно, обновил текст и все. А вот с глобальным классами, они тоже при экспорте/импорте обновляются?


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?
СообщениеДобавлено: Пт, авг 29 2014, 17:21 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Валерка написал(а):
Parazit а из-за такого копирования туда-сюда не возникает проблем с обновлением класса? Т.е. добавил новые фишки в системе 1 и нужно их вставить в систему 2?
С INCLUDE все понятно, обновил текст и все. А вот с глобальным классами, они тоже при экспорте/импорте обновляются?

Из текста не пробовал, а утилита просто грохает класс и импортит с нуля. В любом случае, руками так же грохнуть можно.

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


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как обойти не идентичность классов при INCLUDE?  Тема решена
СообщениеДобавлено: Пн, сен 08 2014, 19:58 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
Валерка написал(а):
Есть класс. Он находится в отдельном INCLUDE. Этот класс подключается в группе функций.
Из программы вызываю ФМ этой группы функций. Этот ФМ вызывает подпрограмму обратного вызова (это у меня своя реализация REUSE с блэкджекомишлюхами) и в качестве параметра этой подпрограммы передается параметр "type ref to CL_МОЙ_КЛАСС". Соответственно в программе я тоже подключаю этот класс. Однако при вызове получаю дамп, так как хотя INCLUDE один, но раз подключен дважды, то для ABAP-а это разные классы. Сделал в подпрограмме параметр "type ANY". Программа в дамп не падает при вызове. Но мне то нужно чтобы тип был не ANY, а "ref to CL_МОЙ_КЛАСС".
Можно ли как-то это исправить? Или все-таки сделать преобразование?
т.е. схема такая
Code:
FORM callback using ptr type ANY.

DATA:
  l_ptr type ref to CL_МОЙ_КЛАСС
.
" как бы тут ptr преобразовать в l_ptr? Или это в принципе невозможно?
ENDFORM.
Параметр ref to object + динамический вызов метода.


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

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


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

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


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

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