Текущее время: Пт, авг 22 2025, 21:04

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




Начать новую тему Ответить на тему  [ Сообщений: 18 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Динамическое формирование имени файла
СообщениеДобавлено: Ср, дек 11 2013, 14:40 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
Добрый день, коллеги.

Есть проблема: нужно заставить файловый канал формировать имена файлов по стандарту принимающего ФТП сервера.
например, у меня IDOC содержит
Code:
<RECIPNT_NO>0000400002</RECIPNT_NO>

нужно получить имя файла
\IN\cust400002\folder\file%DATE%.xml

получить \IN\cust0000400002\folder\file%DATE%.xml - просто, через подстановку. Но как сделать минимальное преобразование?
Корежить IDOC на мапинге - не выход, так как не совсем ясно, что на принимающей стороне с ним делать собираются.
Есть ли какие-то возможности не просто взять payload:ххх, а, например, сделать substring(payload:xxx)?
А может можно как-то на этапе мапинга определить какую-то переменную, которая будет доступна при формировании имени файла, но не попадет в выходной документ?

Помогите, пожалуйста! Нужно достаточно срочно.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла  Тема решена
СообщениеДобавлено: Ср, дек 11 2013, 15:33 
Специалист
Специалист

Зарегистрирован:
Пт, авг 24 2012, 11:48
Сообщения: 200
Насколько понял из сообщения динамической должна быть папка, а не файл?

Вот это думаю подойдет:
http://wiki.scn.sap.com/wiki/display/XI ... sibilities
Timestamp можно добавлять в свойствах комм.канала.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Ср, дек 11 2013, 15:57 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
спасибо. Позже я посмотрю "Adapter-Specific Message Attributes and Dynamic Configuration". Сейчас временно сделал маппинг и исковеркал поле
Code:
<RCVPRN>400002</RCVPRN>

в шапке IDOC. вроде доходит нормально.
IMHO, программить такие простейшие вещи это как палить из рельсотрона по воробьям. Неужели в переменных нельзя было сделать простейший набор функций обработки строк?


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

Зарегистрирован:
Сб, фев 25 2012, 02:52
Сообщения: 141
Откуда: Москва
Пол: Мужской
Вечер добрый!

Вот пример мэппинга Adapter-Specific Message Attributes через user-defined function, там просто достаточно:
http://help.sap.com/saphelp_nw04/helpda ... ameset.htm

Если в нем заменить имя параметра на Directory - получите искомое, тут технические имена есть:
http://help.sap.com/saphelp_nw04/helpda ... ameset.htm

_________________
Сажаем самолеты по телефону. :)
SAP - фрилансер.
sap.pitroff.ru


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Чт, дек 12 2013, 08:57 
Специалист
Специалист

Зарегистрирован:
Пт, авг 24 2012, 11:48
Сообщения: 200
Цитата:
Вот пример мэппинга Adapter-Specific Message Attributes через user-defined function, там просто достаточно:
http://help.sap.com/saphelp_nw04/helpda ... ameset.htm


Есть два варианта, либо как автор делал - через маппинг поля. Но это тогда для каждого процесса делать надо (хотя и не долго).
Либо - второй вариант - сделать подмену adapter-specific параметра, как по ссылке. Только, если эту штуку не в UDF прописать, а в Adapter Module, чтобы уже раз и навсегда.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Чт, дек 12 2013, 16:13 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, фев 25 2012, 02:52
Сообщения: 141
Откуда: Москва
Пол: Мужской
Shvetz написал(а):
Есть два варианта, либо как автор делал - через маппинг поля. Но это тогда для каждого процесса делать надо (хотя и не долго).

Тут есть небольшая "закавыка" - в данном конкретном случае это работает, если система-получатель не делает различия между 00000111 и 111.
Если же для получателя это критично (предположим, это будет текстовое поле) - такой фокус уже не пройдет.

Shvetz написал(а):
Либо - второй вариант - сделать подмену adapter-specific параметра, как по ссылке. Только, если эту штуку не в UDF прописать, а в Adapter Module, чтобы уже раз и навсегда.

А как в модуле получить значение RECIPNT_NO, убрать нули и сформировать нужный путь?
Стандартный DynamicConfigurationBean вроде такого не позволяет, а писать тут свой модуль - это разработка "рельсотрона", ИМХО. :)

_________________
Сажаем самолеты по телефону. :)
SAP - фрилансер.
sap.pitroff.ru


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Пт, дек 13 2013, 06:29 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
Вот почему бы в описании пеменных для подстановки не сделать элементарные строковые функции?их всего-то штуки 4 надо, substr replace repeat ну и убрать незначащие нули. Ну или просто регэкспы как в перле.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Пт, дек 13 2013, 09:25 
Специалист
Специалист

Зарегистрирован:
Пт, авг 24 2012, 11:48
Сообщения: 200
Цитата:
Тут есть небольшая "закавыка" - в данном конкретном случае это работает, если система-получатель не делает различия между 00000111 и 111.
Если же для получателя это критично (предположим, это будет текстовое поле) - такой фокус уже не пройдет.


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

Цитата:
А как в модуле получить значение RECIPNT_NO, убрать нули и сформировать нужный путь?
Стандартный DynamicConfigurationBean вроде такого не позволяет, а писать тут свой модуль - это разработка "рельсотрона", ИМХО.


Я имел в виду не стандартный модуль, а свой разработанный под этот случай. В классах при разработке модуля есть доступ к payload, получить значение и убрать нули это сделать быстро. Далее поменять свойство сообщения "http://sap.com/xi/XI/System/File". Сам я так не пробовал делать, так как не было необходимости, я через переменные параметры comm.channel делал.
Модуль долго делается только в первый раз обычно, дальше уже не страшно :) Ну и главное замечание - это естественно имеет смысл только в случае, если много процессов и много маппингов приходится менять.

Цитата:
Вот почему бы в описании пеменных для подстановки не сделать элементарные строковые функции?их всего-то штуки 4 надо, substr replace repeat ну и убрать незначащие нули. Ну или просто регэкспы как в перле.


Это надо уже в SAP предъявы писать :mrgreen:


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Сб, дек 14 2013, 13:40 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, фев 25 2012, 02:52
Сообщения: 141
Откуда: Москва
Пол: Мужской
Shvetz написал(а):
А в этой теме папка без нулей всегда, для этого случая вроде нормальный вариант с маппингом, как мне кажется.

Условие по папке - да, без нулей. Но в процессе мэппинга получается поле RECIPNT_NO, которое отличается от исходного. Конечная система это поле принимает.
А вот если с точки зрения бизнеса не все равно, каким будет номер получателя - с нулями или без - то такой вариант не пройдет.

Что-то много слов написал. :) Короче, это не очень хорошо - менять бизнес-содержимое ради технических настроек.

Цитата:
Я имел в виду не стандартный модуль, а свой разработанный под этот случай. В классах при разработке модуля есть доступ к payload, получить значение и убрать нули это сделать быстро. Далее поменять свойство сообщения "http://sap.com/xi/XI/System/File". Сам я так не пробовал делать, так как не было необходимости, я через переменные параметры comm.channel делал.
Модуль долго делается только в первый раз обычно, дальше уже не страшно :) Ну и главное замечание - это естественно имеет смысл только в случае, если много процессов и много маппингов приходится менять.

Согласен, структура у модуля вполне понятна и логична - главное, один раз разобраться. Но, имхо, их лучше делать тогда, когда задача не решается стандартными методами и инструментами.
А то очень "тяжелая" операция в интерфейсе появляется - загрузить весь payload, распарсить, вытащить нужное значение. Создание пути к файлу того не стоит. :)

_________________
Сажаем самолеты по телефону. :)
SAP - фрилансер.
sap.pitroff.ru


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Пн, дек 16 2013, 08:21 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
Спасибо, коллеги.
На данный момент бизнес позволяет курочить шапку IDOC. Если не будет позволять, никто не мешает сделать новое поле в выходном документе. Ну если и этого нельзя - буду осваивать программирование модулей ;-)

Кстати, в мапинге можно создавать переменные. они используются только на время мапинга или их можно выцепить при формировании имени файла?


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

Зарегистрирован:
Сб, фев 25 2012, 02:52
Сообщения: 141
Откуда: Москва
Пол: Мужской
Да не надо тут модулей, одной маленькой Java-функции достаточно. :)

Adapter-Specific Message Attributes сохраняются в заголовке сообщения и живут там до тех пор, пока идет обработка в XI.

То есть Вы в своей функции в мэппинге формируете путь, он сохраняется в заголовке XI-SOAP (можно через SXI_MONITOR посмотреть - после мэппинга появится отдельный подпункт в Header).
Само бизнес-содержимое при этом остается неизменным.
А затем его может использовать адаптер, причем файловый адаптер - в стандарте, нужно только установить следующие параметры канала связи:

Use Adapter-Specific Message Attributes
Fail If Adapter-Specific Message Attributes Missing - если нужно, чтобы использовались только атрибуты, без этого параметра PI попытается получить путь из стандартных настроек.

Ну и выбрать, какой из параметров брать из заголовка:
Изображение
На скриншоте - 7.4, в других версиях может выглядеть по-другому.

_________________
Сажаем самолеты по телефону. :)
SAP - фрилансер.
sap.pitroff.ru


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Вт, дек 17 2013, 09:08 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
ага! интересно. Я попытался нагуглить, как это делается. Понятного ХАУТУ или СТЕП-БАЙ-СТЕП не нашел. Все требует каких-то пререквизитных знаний.

Правильно ли я понял, в мессеж мапинге в , во вкладке Functions в окошке Functions and Java Areas выбрать Attributes and Methods. Затем в правой части (в редакторе) написать код на JAVA. в коде нужно написать как-то так (бесстыдно выдрано у Grzegorz Glowacki. http://wiki.scn.sap.com/wiki/display/XI/Dynamic+file+name+and+directory+in+Receiver+File+Adapter+-+summary+of+possibilities):
Code:
String filename = new String("");
DynamicConfiguration conf1 = (DynamicConfiguration) container.getTransformationParameters().get(StreamTransformationConstants.DYNAMIC_CONFIGURATION);
DynamicConfigurationKey key1 = DynamicConfigurationKey.create("http:/"+"/sap.com/xi/XI/System/File","FileName");
filename = "xi_output_" + variablePart + ".xml";
conf1.put(key1,filename);
return variablePart;


но использовать не FileName, а Directory.
но потом , этот товарищь делает графический мапинг полученного значения в выходное сообщение и выполняет подстановку как и я, что меня не устраивает.

Кстати, нужны ли жабовские обертки для кода? Ну типа, всякие заклинания class? или , там, всякие фигурные скобки {} ? как определяются входные параметры этой UDF?

Помогите разобраться.
Вот еще нашел :http://wiki.scn.sap.com/wiki/display/XI/Accessing+Adapter-specific+attributes пока покурю его.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Вт, дек 17 2013, 12:09 
Специалист
Специалист

Зарегистрирован:
Пт, авг 24 2012, 11:48
Сообщения: 200
Цитата:
но потом , этот товарищь делает графический мапинг полученного значения в выходное сообщение и выполняет подстановку как и я, что меня не устраивает.


Чтобы вызвать UDF его надо использовать в мэппинге, даже если не планируется изменять поля Payload. Что-то вроде фиктивного вызова. Сделать UDF действительно лучше, чем изменять бизнес поле, но маппинг все равно у вас будет присутствовать и тот же Payload подгружать.

Этот способ не поможет вам избавиться от MessMapping в каждом из процессов, которые идут на файловый CommChannel. Повторюсь, если процессов мало (1 или 2) смело добавляйте то что написано тут и не парьтесь:

http://wiki.scn.sap.com/wiki/display/XI/Dynamic+file+name+and+directory+in+Receiver+File+Adapter+-+summary+of+possibilities


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Вт, дек 17 2013, 12:17 
Специалист
Специалист

Зарегистрирован:
Пт, авг 24 2012, 11:48
Сообщения: 200
Вот еще интересная инфа по модулям для динамического пути:

http://scn.sap.com/docs/DOC-46112

Не обратил сначала внимание, а ведь можно папку для выгрузки изменить стандартным парсингом строки без подгрузки payload:
String dynamicpath = msg.getMessageProperty("http://sap.com/xi/XI/System/File", "Directory");


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Динамическое формирование имени файла
СообщениеДобавлено: Ср, дек 18 2013, 15:04 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Сб, фев 25 2012, 02:52
Сообщения: 141
Откуда: Москва
Пол: Мужской
Инфа по ссылке хороша для понимания работы модуля, но там значения пути зависят от неких букв в имени файла и задаются через константы в самом модуле.

Shvetz написал(а):
Не обратил сначала внимание, а ведь можно папку для выгрузки изменить стандартным парсингом строки без подгрузки payload:
String dynamicpath = msg.getMessageProperty("http://sap.com/xi/XI/System/File", "Directory");


Да, затем записать через:

String path = "C:\temp\blabla";
MessagePropertyKey dynParamPath = new MessagePropertyKey("http://sap.com/xi/XI/System/File", "Directory");
msg.setMessageProperty(dynParamPath,path);

Но поскольку в пути должно участвовать измененное содержимое поля RECIPNT_NO - парсить сообщение все равно придется, что в UDF, что в модуле.
Просто почему-то мне кажется, что message mapping сделает это более оптимально.

_________________
Сажаем самолеты по телефону. :)
SAP - фрилансер.
sap.pitroff.ru


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

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


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

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


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

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