How-to: Экспорт данных
Пример 1
Условие
Есть заказы на продажу покупателям некоторых книг.
REQUIRE Time;
CLASS Book 'Книга';
name 'Наименование' = DATA ISTRING[100] (Book) IN id;
CLASS Customer 'Покупатель';
name 'Наименование' = DATA ISTRING[50] (Customer) IN id;
address 'Адрес' = DATA ISTRING[50] (Customer) IN base;
CLASS Currency 'Валюта';
name 'Наименование' = DATA ISTRING[50] (Currency) IN id;
CLASS Order 'Заказ';
date 'Дата' = DATA DATE (Order);
number 'Номер' = DATA STRING[10] (Order);
customer 'Покупатель' = DATA Customer (Order);
nameCustomer 'Покупатель' (Order o) = name(customer(o));
CLASS OrderDetail 'Строка заказа';
order 'Заказ' = DATA Order (OrderDetail) NONULL DELETE;
book 'Книга' = DATA Book (OrderDetail) NONULL;
nameBook 'Книга' (OrderDetail d) = name(book(d));
quantity 'Количество' = DATA INTEGER (OrderDetail);
price 'Цена' = DATA NUMERIC[14,2] (OrderDetail);
currency 'Валюта' = DATA Currency (OrderDetail);
nameCurrency 'Валюта' (OrderDetail d) = name(currency(d));
FORM order 'Заказ'
OBJECTS o = Order PANEL
PROPERTIES(o) date, number, nameCustomer
OBJECTS d = OrderDetail
PROPERTIES(d) nameBook, quantity, nameCurrency, price, NEW, DELETE
FILTERS order(d) == o
EDIT Order OBJECT o
;
FORM orders 'Заказы'
OBJECTS o = Order
PROPERTIES(o) READONLY date, number, nameCustomer
PROPERTIES(o) NEWSESSION NEW, EDIT, DELETE
;
NAVIGATOR {
NEW orders;
}
Нужно сделать кнопку, которая выгрузит содержимое заказа в XML-формат.
Решение
GROUP Info;
GROUP Customer : Info;
GROUP Specification;
GROUP price;
FORM Order
PROPERTIES timeStamp = currentDateTime() ATTR
OBJECTS order = Order
PROPERTIES(order) IN Info date, number
PROPERTIES IN Customer nameCustomer(order) EXTID 'name', =address(customer(order)) EXTID 'address'
PROPERTIES IN Specification count = [GROUP SUM 1 BY order(OrderDetail d)](order) ATTR
OBJECTS Detail = OrderDetail IN Specification
PROPERTIES(Detail) nameBook, quantity,
nameCurrency IN price EXTID 'currency' ATTR, price IN price EXTID 'value'
FILTERS order(Detail) = order
;
exportToXML 'Экспорт в XML' (Order o) {
EXPORT Order OBJECTS order = o XML;
open(exportFile());
}
EXTEND FORM orders
PROPERTIES(o) exportToXML TOOLBAR
;
Для выгрузки в XML формат, сначала создается форма соответствующей структуры, а затем вызывается оператор EXPORT
. Он на основе формы формирует файл и складывает его в свойство exportFile
, которое затем открывается на клиенте при помощи действия open
. Оно показывает файл в приложении, ассоциированном с его расширением (в данном случае .xml).
Результирующий xml будет выглядеть следующим образом :
<Order timeStamp="13.11.18 12:28:58">
<Info>
<date>13.11.18</date>
<number>12</number>
<Customer>
<name>Покупатель 2</name>
<address>Адрес 2</address>
</Customer>
</Info>
<Specification count="2">
<Detail>
<nameBook>Книга 2</nameBook>
<quantity>1</quantity>
<price currency="USD">3.99</price>
</Detail>
<Detail>
<nameBook>Книга 1</nameBook>
<quantity>2</quantity>
<price currency="EUR">4.99</price>
</Detail>
</Specification>
</Order>
Верхний тэг Order
совпадает с именем формы. Все остальные имена тэгов определяются либо именем свойством на форме (например, date
, number
или count
), либо при помощи специального параметра EXTID
(например, name
и address
). Использование EXTID
предпочтительнее в тех случаях, когда на форме будут свойства с одним именем, но для разных объектов.
Для создания "промежуточных" тэгов (например, Info
, Customer
или Specification
) создаются группы, соответствующим образом вложенные друг в друга, к которым затем привязываются нужные свойства.
Использование атрибута ATTR
позволяет поместить значение не в отдельный тэг, а в атрибут верхнего "родительского" тэга (например, timeStamp
или count
).
Для того, чтобы поместить в тэг price
атрибут валюты, создается группа с соответствующим именем, в которую затем помещаются два свойства : nameCurrency
(с валютой) и price
(сама цена). Для валюты задается атрибут ATTR
- поэтому она попадает в тэг price
атрибутом. Для цены же задается предопределенный EXTID 'value'
, благодаря чему значение пишется непосредственно в тэг price
. Без указания всех этих параметров результат бы выглядел следующим образом:
<price><currency>USD</currency><price>4.99</price></price>
Если есть формат требуемого файла XML, в который необходимо сделать выгрузку, то можно пользоваться следующими правилами.
Любой тэг в результирующем файле генерируется одним из четырех элементов:
- Свойством (объявляется при помощи
PROPERTIES
). - Объектом (объявляется при помощи
OBJECTS
). - Группой свойств (объявляется при помощи
GROUP
за пределами формы). - Формой (самый верхний тэг)
-
Если тэг повторяется несколько раз подряд (например,
Detail
), то должен быть объявлен объект соответствующим именем. -
Если тэг содержит вложенные тэги, но при этом сам встречается ровно один раз (например,
Specification
), то для него должна быть объявлена группа свойств. -
Если тэг содержит атрибуты (например,
count = "2"
), то он должен генерироваться либо группой свойств, либо объектом (как правило, в зависимости от того один или несколько раз встречается этот тэг). -
Если тэг содержит значение, то он генерируется либо свойством (например,
nameBook
илиquantity
) с соответствующим именем, либо группой свойств / объектом с единственным "вложенным" свойством сEXTID 'value'
).