Текущее время: Сб, авг 23 2025, 04:25

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


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

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


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

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