Повторение сегментов
Как вы могли заметить, в примере документа некоторые сегменты повторяются. Некоторые из них идут сразу друг за другом (DTM, PER), некоторые повторяются в составе групп (PO1/PID/ITA и N1/(N2)/N3/N4). Существует два типа «повторения» сегментов:
Возможность многократного использования сегмента.
В данном случае сегмент может повториться несколько раз, но при этом каждый сегмент имеет различное значение, т.е. несет разную информацию (сходную по смыслу, но разную по содержанию). Например, два DTM сегмента в примере документа определяют даты, но первый из них (DTM*002*20060625~) определяет дату поставки, а второй (DTM*010*20060618~) – дату погрузки. Аналогично PER сегменты – каждый определяет контактную информацию, при этом первый (PER*BD*DON SMITH~) определяет имя или название покупателя, а второй (PER*DC**TE*(123) 456-7890~) – телефон контактного лица по вопросам доставки. В документе для печати (который используется людьми) это могло бы выглядеть так:
Отдел продаж: +7 812 765 4321, Василий Смирнов
Отдел доставки: +7 812 123 4567, Иван Иванов
Склад: +7 812 321 7654, Петр Петров
Следует отметить, что часто уникальность сегмента заключается в использовании различных значений элемента (одного или иногда больше) идентификатора. В большинстве случаев в сегменте есть специальный элемент, который идентифицирует содержание сегмента. В сегменте DTM это, например, элемент DTM-01, в сегменте PER – PER-01.
Стандарт определяет максимально возможное количество таких повторений (max use).
Пример:
рис 4.
Циклическое повторение данных (Loops).
Циклическая группа сегментов (loop) – это набор связанных друг с другом сегментов, которые повторяются в EDI документе в определенной последовательности. Например, группа сегментов N1/N2/N3/N4 представляет информацию об адресе, причем N1 несет информацию об этом адресе, N3 – непосредственно сам адрес, и N4 – географическое расположение.
N1*ST*A1 STORES*93*0655~
N3*142 WAGON DRIVE~
N4*MIDDLETOWN*AR*72222~
N1*BT*A1 STORES*93*0655~
N3*75 CROSS ROAD~
N4*MIDDLETOWN*AR*72222~
Группа PO1/PID/ITA несет информацию о заказанном товаре, его цене и количестве (PO1), описание этого товара (PID) и скидке/наценке (ITA).
PO1*001002003*10*EA*15**BP*123456411~
PID*A****ADIDAS BLUE T-SHIRT~
ITA*A***CC***1000~
PO1*002003004*20*EA*20**BP*123456817~
PID*A****NIKE RED T-SHIRT~
ITA*A***CC***1500~
Такие циклические группы в свою очередь могут включать в себя другие циклические группы.
Пример:
X12 определяет два типа циклических повторений (loops) – связанные (Bounded) и несвязанные (Unbounded).
Несвязанные повторения имеют стартовый сегмент, который определяет всю группу. «Внутри» этой группы находятся остальные сегменты, их опциональность определяется, как указано выше, однако эти «дочерние» сегменты группы не могут существовать отдельно от стартового сегмента. В нашем примере PO1/PID/ITA сегменты PID и ITA не могут присутствовать в документе, если им не предшествует сегмент PO1. Может быть ситуация когда либо сегмент PID, либо сегмент ITA отсутствуют в группе (так как они опциональны), но ситуации когда PID и/или ITA присутствуют но нет сегмента PO1 быть не может. Это верно, даже если сама группа является опциональной. Следующая группа определяется стартовым сегментом, например N1/N2/N3/N4/N1/N2/N3/N4/N1/N2/N3/N4/… (стартовый сегмент - N1) или PO1/PID/ITA/PO1/PID/ITA/PO1/PID/ITA/PO1/PID/ITA… (стартовый сегмент – PO1) – тоесть, если в документе появляется стартовый сегмент, то он указывает на очередную группу.
Связанные повторения очень похожи на несвязанные, однако имеют отличие – такие группы сегментов ограничены «сверху» и «снизу» специальными сегментами – LS (Loop Start) и LE (Loop End). Такой подход используется стандартом, когда может быть невозможно определение начала и конца группы. В таких случаях начало и конец группы определяется не по стартовому сегменту собственно самой и следующей групп, а специальными сегментами LS и LE соответственно.
Как и в предыдущем случае, стандарт указывает максимальное количество повторений (Max Use) групп сегментов.