Текущее время: Пт, мар 29 2024, 17:43

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




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: XSLT mapping.
СообщениеДобавлено: Чт, окт 02 2014, 09:16 
Старший специалист
Старший специалист

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

Появилась задача доработать xslt мапинг, а я не понимаю, как это сделать. Условие такое:
Из САП ЕРП выгружается IDOC с ценами, содержащий активные цены и налоговые настройки.
Вид во какой:
Code:
<сегмент1>
   <filial> код_филиала</filial>
   <товар>код_товара</товар>
   <ценовое_условие>
      <тип_цены>тип1</тип_цены>
      <цена>ХХХ</цена>
      <дата_начала>ГГГГММДД</дата_начала>
      <дата_окончания>ГГГГММДД</дата_окончания>
   </ценовое_условие>

   <ценовое_условие>
      <тип_цены>тип2</тип_цены>
      <цена>ХХХ</цена>
      <дата_начала>ГГГГММДД</дата_начала>
      <дата_окончания>ГГГГММДД</дата_окончания>
   </ценовое_условие>

   <ценовое_условие>
      <тип_цены>тип3</тип_цены>
      <цена>ХХХ</цена>
      <дата_начала>ГГГГММДД</дата_начала>
      <дата_окончания>ГГГГММДД</дата_окончания>
   </ценовое_условие>
</сегмент1>


Сейчас во внешней системе используются типы "тип1" и "тип2". "тип3" - просто игнорируется, то есть в xslt стоит

<xsl:for-each select="$товар[substring(ценовое_условие/тип_цены, 4, 1) != '3']">

и для них формируется выходная структура. Сейчас нужно сделать, чтобы для тех товаров, у которых есть только "тип3" где-то в конце документа формировалась некая информация.

Как сделать выборку <для всех товаров, у которых есть только "тип3"> ?

Помогите, пожалуйста.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT mapping.
СообщениеДобавлено: Чт, окт 02 2014, 09:29 
Специалист
Специалист
Аватара пользователя

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

<xsl:for-each select="$товар[substring(ценовое_условие/тип_цены, 4, 1) = '3']">

Или я чего-то не допонял?

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT mapping.
СообщениеДобавлено: Чт, окт 02 2014, 09:38 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
;-)
нет, нужно не для всех "тип3", а только для тех, рядом с которыми (в том же сегменте) нет других типов.

например:
Code:
<сегмент1>
   <filial>U003</filial>
   <товар>00000000001332321</товар>
   <ценовое_условие>
      <тип_цены>тип1</тип_цены>
      <цена>99.2</цена>
      <дата_начала>20140913</дата_начала>
      <дата_окончания>20150913</дата_окончания>
   </ценовое_условие>

   <ценовое_условие>
      <тип_цены>тип2</тип_цены>
      <цена>90.1</цена>
      <дата_начала>20140915</дата_начала>
      <дата_окончания>20140917</дата_окончания>
   </ценовое_условие>

   <ценовое_условие>
      <тип_цены>тип3</тип_цены>
      <цена>111</цена>
      <дата_начала>20141001</дата_начала>
      <дата_окончания>20141013</дата_окончания>
   </ценовое_условие>
</сегмент1>

<сегмент1>
   <filial>U004</filial>
   <товар>00000000001332321</товар>
   <ценовое_условие>
      <тип_цены>тип3</тип_цены>
      <цена>112</цена>
      <дата_начала>20141001</дата_начала>
      <дата_окончания>20141013</дата_окончания>
   </ценовое_условие>
</сегмент1>

<сегмент1>
   <filial>U005</filial>
   <товар>00000000001332321</товар>
   <ценовое_условие>
      <тип_цены>тип1</тип_цены>
      <цена>110</цена>
      <дата_начала>20141001</дата_начала>
      <дата_окончания>20141013</дата_окончания>
   </ценовое_условие>
</сегмент1>



Вот для филиала U004 нужно создать некий блок информации в конце, а для U003 и U005 - нет


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT mapping.
СообщениеДобавлено: Чт, окт 02 2014, 10:42 
Специалист
Специалист
Аватара пользователя

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

Если в файле гарантированная последовательность (то есть Тип1 и Тип2 не могут стоять после Тип3 в рамках одного сегмента), то:

Для каждого <сегмент>
Если Тип 1 или Тип 2 - флаг=1
Если Тип 3 и флаг = 0 то формируем запись про Тип 3.

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: XSLT mapping.
СообщениеДобавлено: Чт, окт 02 2014, 10:51 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
Это интересно. На сколько я понимаю, XSLT обрабатывает входящий документ не последовательно, а параллельно. Тогда при любом порядке Ваше предложение должно сработать.
Будем подумать...

ЗЫ: что-то не выходит :( . получается в xslt нет переменных в обычном понимании этого слова. там все переменные - константы.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: XSLT mapping.
СообщениеДобавлено: Пт, окт 03 2014, 14:46 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, ноя 22 2012, 10:25
Сообщения: 322
Помогите разобраться с проблемой:

Вот часть кода, который есть сейчас (написан давно и не мной ;-( ) Это тестовая версия, так что тут есть что-то прибито гвоздями, что-то не выводится, но этого достаточно, чтобы посмотреть, что происходит.

тут явно отбрасываются все узлы, где KONDART начинается с MW. Очень бы хотелось, чтобы если для данного артикула и единицы измерения нет ничего, кроме MW, в конце (ну или не в конце) выводилось то же самое, что и при обработке других кодов.

Code:
<xsl:for-each select="/WP_PLU03/IDOC/E1WPA01/FILIALE">
                            <xsl:variable name="FILEALE" select=".."/>
                            <xsl:for-each select="$FILEALE/ARTIKELNR">
                                <xsl:variable name="ARTIKELNR" select=".."/>
                                <xsl:for-each select="$ARTIKELNR[substring(E1WPA04/KONDART, 1, 2) != 'MW']/POSME">
                                    <xsl:variable name="POSME" select=".."/>
                                    <xsl:for-each select="$POSME/E1WPA04[substring(KONDART, 1, 2) != 'MW']">
                                        <xsl:variable name="condition" select="."/>
                                        <ns0:arPricesEl>
                                            <ns0:currency>
                                                <xsl:value-of select="$condition/E1WPA05/CURRENCY"/>
                                            </ns0:currency>
                                            <ns0:department>
                                                <xsl:value-of select="$POSME/FILIALE"/>
                                            </ns0:department>
                                            <ns0:startDate>
                                                <xsl:value-of select="$condition/BEGINDATUM"/>
                                            </ns0:startDate>
                                            <ns0:endDate>
                                                <xsl:value-of select="$condition/ENDDATUM"/>
                                            </ns0:endDate>
                                            <ns0:type>
                                                <xsl:value-of select="$condition/KONDART"/>
                                            </ns0:type>
                                            <ns0:goodCode>
                                                <xsl:value-of select="$POSME/ARTIKELNR"/>
                                            </ns0:goodCode>
                                            <ns0:measureIso>
                                                <xsl:value-of select="$POSME/POSME"/>
                                            </ns0:measureIso>
                                            <ns0:ndsRate>
                                                <xsl:choose>
                                                    <xsl:when test="$POSME/E1WPA07/MWSKZ = 'B1'"><xsl:text>10</xsl:text></xsl:when>
                                                    <xsl:when test="$POSME/E1WPA07/MWSKZ = 'B2'"><xsl:text>18</xsl:text></xsl:when>
                                                    <xsl:when test="$POSME/E1WPA07/MWSKZ = 'Z3'"><xsl:text>0</xsl:text></xsl:when>
                                                    <xsl:when test="$POSME/E1WPA07/MWSKZ = 'A4'"><xsl:text>18</xsl:text></xsl:when>
                                                    <xsl:otherwise><xsl:text>18</xsl:text></xsl:otherwise>
                                                </xsl:choose>
                                            </ns0:ndsRate>
                                            <ns0:price>
                                                <xsl:value-of select="round($condition/E1WPA05/KONDWERT * 100)"/>
                                            </ns0:price>
                                        </ns0:arPricesEl>
                                    </xsl:for-each>
                                </xsl:for-each>
                            </xsl:for-each>
                        </xsl:for-each>



PS: Общий смысл в том, чтобы не терялись артикулы, у которых есть только настройка MW, но нет других записей. Но если есть другие записи - настройка MW не нужна. Казалось бы, чего проще: выводить все, что есть и пусть целевая система разбирается, но при больших объемах выгрузки, растет объем передаваемой информации. А это не желательно.


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

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


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

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


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

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