Загрузка данных в xml формате

В Forecast NOW! можно загружать данные в xml формате. Данные о продажах, классификации и параметрах товара может содержаться в одном файле (при использовании автоматической загрузке через консольную утилиту), в случае загрузки через Данные-Загрузить должны грузится отдельные файлы.

Загрузка истории продаж

Данные по продажам сохраняются в тэге <sales>. Каждой продаже соответствует запись с тэгом <sale>.

Запись продажи содержит в виде атрибутов:

storage - склад

product – id товара

client - клиент

date – дата продажи

аmount – количество проданного

cost – выручка (объём продаж в ценах реализации)

purchaseCost – себестоимость (объём продаж в ценах закупки)

lostDemand – упущенный спрос

profit – прибыль

В виде элементов содержатся:

  • Остатки (<rest>):

amount - остаток

inTransit – в пути

inOrder - заказано

inReserve – в резерве

backorder – не выполненный заказ

  • Цены (<salePrice>):

sell – цена продажи

purchase – цена закупки

discount – учётная цена

Пример файла

<export_data>
    <sales>
        <sale amount="1.00" cost="1.00" purchaseCost="1.00" storage="s1" product="p1" client="c1" date="2016-03-14" lostDemand="1.00" profit="1.00">
            <rest amount="1.00" inTransit="1.00" inOrder="1.00" inReserve="1.00" backorder="1.00"/>
            <salePrice sell="1.00" purchase="1.00" discount="1.00"/>
        </sale>
    </sales>
</export_data>

Список возможных ошибок при загрузке

Пропущен обязательный атрибут

Необъявленное пространство имён

Нет информации о продажах

Несуществующая дата

Неверное значение

Противоречивые данные о продажах

Обнаружен неизвестный атрибут элемента

Обнаружен неизвестный элемент 'название элемента

Неверная структура файла

Неверный формат даты

Файл пуст

Противоречивые наборы параметров

Противоречивые параметры

Ожидается закрытие элемента

Недопустимое значение атрибута

Пустая строка в значении атрибута

Пропущен символ '='(равно)

Пропущен символ ' '(пробел)

Неверное значение атрибута 'название атрибута

Незакрытый элемент

Пропущено имя атрибута

В документе присутствует незакрытый элемент

В документе присутствуют символы, не предусмотренные моделью

Не предусмотренные моделью символы или запись

Непредусмотренное значение

Некорректное значение

Не удалось открыть файл

Пустой набор элементов

Противоречивые данные для группы

Противоречивые данные для товара

Цикл в классификации

Дублирование свойства группы

Схема загрузки истории продаж в xml

Файл импорта должен соответствовать схеме, проверить соответствие можно при помощи программного обеспечения.

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <!--Ограничение для double-->
 <xsd:simpleType name="moreThanZeroDouble">
  <xsd:restriction base="xsd:decimal">
   <xsd:minInclusive value="0"/>
  </xsd:restriction>
 </xsd:simpleType>
 <!--Ограничение для int-->
 <xsd:simpleType name="moreThanZeroInteger">
  <xsd:restriction base="xsd:integer">
   <xsd:minInclusive value="0"/>
  </xsd:restriction>
 </xsd:simpleType>
 <xsd:element name="export_data">
  <xsd:complexType>
   <xsd:choice maxOccurs="unbounded" minOccurs="0">
    <xsd:sequence>
     <xsd:element maxOccurs="unbounded" minOccurs="0" name="sales">
      <!--Секция истории продаж-->
      <xsd:complexType>
       <xsd:sequence>
        <!--Одна запись продажи-->
        <xsd:element maxOccurs="unbounded" minOccurs="1" name="sale">
         <xsd:complexType>
          <xsd:sequence>
           <!--Элемент остатков (необязательный)-->
           <xsd:element maxOccurs="1" minOccurs="0" name="rest">
            <xsd:complexType>
             <xsd:simpleContent>
              <xsd:extension base="xsd:string">
               <!--Атрибут остатки (необязательный)-->
               <xsd:attribute use="optional" name="amount" type="xsd:decimal"/>
               <!--Атрибут остатки 'в пути' (необязательный)-->
               <xsd:attribute use="optional" name="inTransit" type="xsd:decimal"/>
               <!--Атрибут остатки 'заказано' (необязательный)-->
               <xsd:attribute use="optional" name="inOrder" type="xsd:decimal"/>
               <!--Атрибут остатки 'в резерве' (необязательный)-->
               <xsd:attribute use="optional" name="inReserve" type="xsd:decimal"/>
               <!--Атрибут остатки 'backorder' (необязательный)-->
               <xsd:attribute use="optional" name="backorder" type="xsd:decimal"/>
              </xsd:extension>
             </xsd:simpleContent>
            </xsd:complexType>
           </xsd:element>
           <!--Элемент цен (необязательный)-->
           <xsd:element maxOccurs="1" minOccurs="0" name="salePrice">
            <xsd:complexType>
             <xsd:simpleContent>
              <xsd:extension base="xsd:string">
               <!--Атрибут с ценой продажи (обязательный)-->
               <xsd:attribute use="required" name="sell" type="moreThanZeroDouble"/>
               <!--Атрибут с ценой закупа (обязательный)-->
               <xsd:attribute use="required" name="purchase" type="moreThanZeroDouble"/>
               <!--Атрибут с ценой учёта (необязательный)-->
               <xsd:attribute use="optional" name="discount" type="moreThanZeroDouble"/>
              </xsd:extension>
             </xsd:simpleContent>
            </xsd:complexType>
           </xsd:element>
          </xsd:sequence>
          <!--Атрибут с наименованием склада (необязательный)-->
          <xsd:attribute default="" use="optional" name="storage" type="xsd:string"/>
          <!--Атрибут с наименованием товара (обязательный)-->
          <xsd:attribute use="required" name="product" type="xsd:string"/>
          <!--Атрибут с наименованием клиента (необязательный)-->
          <xsd:attribute default="" use="optional" name="client" type="xsd:string"/>
          <!--Атрибут с количеством продаж (обязательный)-->
          <xsd:attribute use="required" name="amount" type="xsd:decimal"/>
          <!--Атрибут со стоимостью (необязательный)-->
          <xsd:attribute default="0" use="optional" name="cost" type="xsd:decimal"/>
          <!--Атрибут с стоимостью закупа (необязательный)-->
          <xsd:attribute default="0" use="optional" name="purchaseCost" type="xsd:decimal"/>
          <!--Атрибут с датой (обязательный)-->
          <xsd:attribute use="required" name="date" type="xsd:date"/>
          <!--Атрибут с упущенным спросом (необязательный)-->
          <xsd:attribute default="0" use="optional" name="lostDemand" type="xsd:decimal"/>
          <!--Атрибут с прибылью (необязательный)-->
          <xsd:attribute default="0" use="optional" name="profit" type="xsd:decimal"/>
         </xsd:complexType>
        </xsd:element>
       </xsd:sequence>
      </xsd:complexType>
      <!--Блок проверки на противоречивость-->
      <xsd:unique name="suspiciousSales">
       <xsd:selector xpath="sale"/>
       <xsd:field xpath="@storage"/>
       <xsd:field xpath="@product"/>
       <xsd:field xpath="@client"/>
       <xsd:field xpath="@date"/>
      </xsd:unique>
     </xsd:element>
    </xsd:sequence>
   </xsd:choice>
  </xsd:complexType>
 </xsd:element>
</xsd:schema>
</file>

Загрузка классификации

Данные по классификации сохраняются в тэге <ontology>. Данные могут содержать информацию по группам в тэге <ontologyClass> и информацию по конкретным товарам в тэге <ontologyProduct>.

Информация о группе храниться в тэге <ontologyClass>.

Атрибутами тэга являются:

id – наименование группы parentId – наименование родительской группы

Тэг может содержать подэлементы <property> с единственным атрибутом id соответствующие свойствам группы с определённым названием.

Информация по товарам храниться в тэге <ontologyProduct>.

id – наименование товара

parentId – группа товара

Тэг может содержать подэлементы <propertyValue> с атрибутами property и value соответствующие наименованию свойства и его значению товара.

Пример файла

<export_data>
    <ontology>
        <ontologyClass id="Все товары">
            <property id="Название"/>
        </ontologyClass>
        <ontologyClass id="Группа" parentId="Все товары">
            <property id="Поставщик"/>
        </ontologyClass>
        <ontologyProduct id="111111 parentId="Группа">
            <propertyValue property="Название" value="Товар1"/>
            <propertyValue property="Поставщик" value="Поставщик1"/>
        </ontologyProduct>
    </ontology>
</export_data> 

Загрузка параметров

Данные по параметрам сохраняются в тэге <properties> в виде набора элементов <itemProperties>.

Данные тэга <itemProperties> соответствуют параметрам товара. В виде атрибутов тэга заданы склад (storage) и id товара (product). Тэг содержит множество подэлементов <property>, каждый из которых соответствует значению (атрибут value) определённого параметра (атрибут id).

Пример файла

<export_data>
    <properties>
        <itemProperties storage="s1" product="p2">
            <property id="Минимальная дата" value="2016-03-18"/>
            <property id="Зона хранения" value="area1"/>
        </itemProperties>
    </properties>
</export_data>

Ожидаемые поступления с датами

<export_data>
<arrivals>
<arrival date="" storage="" product="" report="" value=""/>
...
</arrivals>
</export_data>

date=дата ожидаемого прихода

storage=склад

product=уникальный идентификатор

report=ID/название заказа

value= количество товара в пути

Пример

<export_data>
<arrivals>
<arrival date="2017-12-22" storage="s2" product="p2" report="report" value="616.00"/>
.....
<arrival date="2017-12-24" storage="s1" product="p1" report="report1" value="33.00"/>
</arrivals>
</export_data>

Загрузка комплекса данных

Данные по продажам, классификации и параметрам в формате xml можно загружать из одного файла.

В интерфейсе программы это можно сделать через Данные - Загрузить - комплекс данных

В диалоге нужно указать режим (обновление/замена) для истории продаж, параметров и классификации, а также сохранять ли значения свойств в классификации при замене и имя файла:

Также загрузка доступна в автоматическом режиме при помощи команды

import --all "путь к файлу" "путь к базе" [-r | -a] {-s}. 
[-r | -a] - режим загрузки (замена или обновление)
 {-s | --save-properties} - нужно ли сохранять свойства в классификации при замене.

Для комплексного файла можно указывать режим загрузки для каждого типа данных отдельно при помощи флагов:

--removesales и --updatesales - замена и обновление продаж соответственно
--removeparameters и --updateparameters - параметров
--removeontology и --updateontology - классификации

Пример:

import --all source target  --removesales --updateparameters --removeontology - продажи и классификация будут загружены с заменой, а параметры в режиме обновления
import --all source target -r - всё загрузится в режиме замены
import --all source target -r --updateontology - всё загрузится в режиме замены, а классификация в режиме обновления