Текущее время: Ср, май 14 2025, 09:26

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Передача динамической таблицы в память
СообщениеДобавлено: Вс, дек 09 2012, 11:57 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 09 2007, 15:00
Сообщения: 79
Всем доброго время суток!

Задача следующая: есть таблица TYPE ANY TABLE, нужно передать эту таблицу в память чтобы потом считать при выполнении другой программы.

Что пробовал:
1. Делать через IMPORT/EXPORT. Не получается, т.к. при импорте надо знать тип данных который мы импортируем;
2. Добавлять передачу в памяти филдкаталога, чтобы при IMPORT сначала импортировать филдкаталог, затем создавать create_dynamic_table. Не получилось в связи с тем, что неправильно обрабатываются flat structure поля при формировании филдкаталога;
3. Создал класс Shared Memory. Реализацию смотрел здесь http://pavelgk.pbworks.com/f/shared_memory_abap.pdf. Там есть на 6ой странице сохранение данных во внутреннюю ссылку dref. То есть это возможно. Всё бы хорошо, да только там пример для полностью типизированной ссылки. А при объявлении ссылки TYPE REF TO DATA, при CREATE DATA надо ещё указывать тип. Типа в словаре данных естественно нет. А если я указываю тип через LIKE, тогда он падает в дамп "Тип \TYPE=%_T00003S00000155O0000006324 на данный момент не может быть создан в памяти совместно используемых объектов." Аналогичный дамп и при использовании созданного типа через generic types. Т.е. Shared Memory должна быть полностью инкапсулирована и не использовать никаких внешних ссылок. А как тогда задать типизацию?

В общем, я думаю SHM самый правильный путь, и вроде я где-то близко.. Но пока безуспешно.

Резюмируя пост можно сформулировать мой вопрос одним предложением: как передать через Shared Memory объект типа TYPE ANY TABLE?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Вс, дек 09 2012, 14:57 
Ассистент
Ассистент

Зарегистрирован:
Чт, мар 11 2010, 18:35
Сообщения: 33
parameters: pi_tbl(5) type c obligatory. "The table name - input from the user. can be jibberish.

data: gr_tabref type ref to data.
field-symbols:<gfs_tab> type any table.

form create_dynamic_gr_tabref .
data: lo_struct type ref to cl_abap_structdescr,
lo_tabref type ref to cl_abap_tabledescr.
lo_struct ?= cl_abap_typedescr=>describe_by_name( pi_tbl ).
try.
call method cl_abap_tabledescr=>create
exporting
p_line_type = lo_struct
receiving
p_result = lo_tabref
.
catch cx_sy_table_creation .
message 'Couldn''t create the table description. Quitting' type 'E'.
endtry.
create data gr_tabref type handle lo_tabref.

assign gr_tabref->* to <gfs_tab>.

select * from (pi_tbl) into table <gfs_tab> up to 200 rows.
data: lv_memory_id(30) type c.
lv_memory_id = 'MYMEMORYID'.

export itab from <gfs_tab> to memory id lv_memory_id.

endform. " CREATE_DYNAMIC_GR_TABREF


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Вс, дек 09 2012, 19:57 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 09 2007, 15:00
Сообщения: 79
Helper, вы не совсем поняли вопрос.
Как создать ссылку на таблицу, приассайнить её к fs и экспортировать в память я понимаю.
Вопрос в другом.
Как таблицу произвольного типа (не сгенерированную на основе типа из АВАР словаря, а именно произвольную, т.е. я заранее не знаю какой набор полей эта таблица будет содержать) передать в память, а потом считать оттуда?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Вс, дек 09 2012, 23:28 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
если я правильно понял вопрос, то вместо памяти может быть и таблица с кластерными полями, например INDX ?
тогда напрашивается пара переменных, одна для содержимого другая для структуры.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Пн, дек 10 2012, 05:53 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Попробуйте сериализовать вашу переменную в xml, передать xml с типом xstring, а потом десериализовать обратно.
Сериализация:
Code:
  call transformation id source struct = ls_struct
                         result xml lv_xml.

Десериализация:
Code:
  call transformation id source xml lv_xml
                         result struct = ls_struct.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Пн, дек 10 2012, 07:34 
Ассистент
Ассистент

Зарегистрирован:
Чт, мар 11 2010, 18:35
Сообщения: 33
Ничего не мешает сделать
lo_struct ?= cl_abap_typedescr=>describe_by_name( <YOUR_TABLE_OR_STRU> ).
где <YOUR_TABLE_OR_STRU> - ваша табл или структура.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Пн, дек 10 2012, 14:07 
Директор
Директор
Аватара пользователя

Зарегистрирован:
Пн, дек 20 2004, 16:05
Сообщения: 1080
Откуда: 4.0B
Пол: Мужской
Добрый день.

Смотрите в сторону EXPORT .. to data buffer.
Передать туда можете 1 - дескрипшен вашей таблицы
2 - саму таблицу
Правда, в Вашем случае, можете обойтись и без передачи, дескрипшена, я думаю.

P.S. Хотя нет, прогнал. Если у Вас действительно динамическая таблица, то дескрипшен, конечно, нужен, чтобы таблицу создать.

_________________
Я слышу и забываю,
Я вижу и помню долго,
Я делаю и — понимаю.


Последний раз редактировалось Lars Пн, дек 10 2012, 14:33, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Пн, дек 10 2012, 14:25 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, июл 28 2007, 20:38
Сообщения: 364
Уточнение: сколько аппл. серверов в системе? Почти все предлагаемые методы будут работать только в случае запуска на одном аппл. сервере.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Вт, дек 11 2012, 09:24 
Старший специалист
Старший специалист

Зарегистрирован:
Вт, ноя 18 2008, 10:40
Сообщения: 342
Откуда: Пермь
Пол: Мужской
printfalex написал(а):
Как таблицу произвольного типа (не сгенерированную на основе типа из АВАР словаря, а именно произвольную, т.е. я заранее не знаю какой набор полей эта таблица будет содержать) передать в память, а потом считать оттуда?

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Вт, дек 11 2012, 09:31 
Почетный гуру
Почетный гуру
Аватара пользователя

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

При работе в рамках одной программы предлагаемые методы и будут выполняться на одном сервере приложений. Если не использовать параллельный запуск ФМ и фоновые задания.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Пт, дек 14 2012, 20:34 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
printfalex написал(а):
есть таблица TYPE ANY TABLE, нужно передать эту таблицу в память чтобы потом считать при выполнении другой программы.
Что пробовал:
1. Делать через IMPORT/EXPORT. Не получается, т.к. при импорте надо знать тип данных который мы импортируем
printfalex написал(а):
Как таблицу произвольного типа (не сгенерированную на основе типа из АВАР словаря, а именно произвольную, т.е. я заранее не знаю какой набор полей эта таблица будет содержать) передать в память, а потом считать оттуда?
??? вроде работает
Code:
PERFORM main.

CLASS lcl_test DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS: export IMPORTING t TYPE ANY TABLE.
    CLASS-METHODS: import EXPORTING t TYPE ANY TABLE.
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
  METHOD import.
    IMPORT t = t FROM MEMORY ID 'LAT'.
  ENDMETHOD.

  METHOD export.
    EXPORT t = t TO MEMORY ID 'LAT' COMPRESSION OFF.
  ENDMETHOD.
ENDCLASS.

FORM main.
  DATA: t_usr02 TYPE TABLE OF usr02.

  SELECT * FROM usr02 INTO TABLE t_usr02.
  lcl_test=>export( t_usr02 ).
  CLEAR: t_usr02.
  lcl_test=>import( IMPORTING t = t_usr02 ).
ENDFORM.
Или речь о том, что 2-я программа не знает, с таблицей какого типа она работает? Что Вы тогда собираетесь делать с таблицей во 2-й программе?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Сб, дек 15 2012, 01:04 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, окт 09 2007, 15:00
Сообщения: 79
Всем спасибо.
Реализовал просто через EXPORT/IMPORT передавая fieldcatalog и саму таблицу.
В программе отправителе: формирую филдкаталог, делаю экспорт в память таблицы с данными и филдкаталога.
В программе получателе: сначала читаю из памяти филдкаталог, затем создаю динамический тип, затем читаю из памяти таблицу данных.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Ср, окт 28 2015, 16:14 
Начинающий
Начинающий

Зарегистрирован:
Пн, мар 16 2015, 19:01
Сообщения: 11
А вот у меня так не получается((
Говорит что TYPE MISSMATCH , хотя и там и там таблица по 64 поля


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Передача динамической таблицы в память
СообщениеДобавлено: Ср, окт 28 2015, 19:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
Toni написал(а):
А вот у меня так не получается((
Говорит что TYPE MISSMATCH , хотя и там и там таблица по 64 поля

Код приведите.

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


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

Зарегистрирован:
Вт, июл 23 2013, 17:41
Сообщения: 36
Пол: Мужской
Рассматривал эту тему очень подробно: на основе отчетов моделирования амортизации, а именно пытался передавать в память динамическую таблицу из отчета RASIMU02.

По итогу помог только Shared Memory Object (SHMA) и элементы RTTS.
В сам класс обертку я передавал объект типа Type Ref To DATA, а не саму таблицу (точнее FS на нее).

Я писал очень жесткую оболочку, которая позволяла разделять пользователей между собой и была контекстно независимой.
Помните только, использование SHMA это самый крайний случай когда уже ни что не помогает.

Обычный импорт/экспорт Вам не поможет, если рассмотрите их принципы более подробно поймете почему

_________________
- Хочу выучить весь SAP
- А ты не лопнешь деточка???


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

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


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

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


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

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