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

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


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

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


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

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