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

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


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

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


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

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