Skip to end of metadata
Go to start of metadata
Пример 1
Условие

Есть заказы на продажу покупателям некоторых книг.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 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-формат.

Решение

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 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. Оно показывает файл в приложении, ассоциированном с его расширением (в данном случае .json).

Результирующий 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, в который необходимо сделать выгрузку, то можно пользоваться следующими правилами.

Любой тэг в результирующем файле генерируется одним из четырех элементов :

  1. Свойством (объявляется при помощи PROPERTIES).
  2. Объектом (объявляется при помощи OBJECTS).
  3. Группой свойств (объявляется при помощи GROUP за пределами формы).
  4. Формой (самый верхний тэг)
  • Если тэг повторяется несколько раз подряд (например, Detail), то должен быть объявлен объект соответствующим именем.
  • Если тэг содержит вложенные тэги, но при этом сам встречается ровно один раз (например, Specification), то для него должна быть объявлена группа свойств.
  • Если тэг содержит атрибуты (например, count = "2"), то он должен генерироваться либо группой свойств, либо объектом (как правило, в зависимости от того один или несколько раз встречается этот тэг).
  • Если тэг содержит значение, то он генерируется либо свойством (например, nameBook или quantity) с соответствующим именем, либо группой свойств / объектом с единственным "вложенным" свойством с EXTID 'value').

Пример 2
Условие

Аналогично Примеру 1.

Нужно сделать кнопку, которая выгрузит содержимое заказа в JSON-формат.

Решение

1
2
3
4
5
6
7
8
 exportToJSON 'Экспорт в JSON' (Order o) {
    EXPORT Order OBJECTS order = o JSON;
    open(exportFile());
}

EXTEND FORM orders
    PROPERTIES(o) exportToJSON TOOLBAR
;

Результирующий файл будет выглядеть следующим образом :

{  
   "timeStamp":"13.11.18 15:11:45",
   "Info":{  
      "date":"13.11.18",
      "number":"12",
      "Customer":{  
         "address":"Адрес 2",
         "name":"Покупатель 2"
      }
   },
   "Specification":{  
      "count":2,
      "Detail":[  
         {  
            "quantity":1,
            "price":3.99,
            "nameBook":"Книга 2"
         },
         {  
            "quantity":2,
            "price":4.99,
            "nameBook":"Книга 1"
         }
      ]
   }
}

Следует отметить, что в случае выгрузки в формат JSON инструкция ATTR игнорируется.

Пример 3
Условие

Аналогично Примеру 1.

Нужно сделать кнопку, которая выгрузит все заказы за определенную дату в CSV формат.

Решение

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 exportToCSV (DATE date) {
    LOCAL file = FILE();
    EXPORT CSV HEADER FROM number = number(order(OrderDetail d)), 
                    customer = nameCustomer(order(d)), 
                    book = nameBook(d), 
                    quantity(d), 
                    price(d) 
           WHERE date(order(d)) = date TO file;
    WRITE CLIENT DIALOG file() TO 'orders';
}

FORM exportParameters 'Параметры'
    OBJECTS d = DATE PANEL
    PROPERTIES(d) 'Дата' = VALUE
;
exportToCSV 'Экспорт в CSV' () {
    DIALOG exportParameters OBJECTS d INPUT DO
        exportToCSV(d);
}

EXTEND FORM orders
    PROPERTIES() exportToCSV DRAW o TOOLBAR 
;

Первое действие принимает на вход дату и, при помощи оператора EXPORT, формирует плоский файл CSV с разделителем точка с запятой. Файл будет выглядеть следующим образом :

number;customer;book;quantity;price
14;Покупатель 1;Книга 1;2;8.99
12;Покупатель 2;Книга 2;1;3.99
12;Покупатель 2;Книга 1;2;4.99

Для первых трех параметров переопределено имя колонки, а остальные два используют имя соответствующих свойств. Результат сначала записывается в локальное свойство file, из которого затем, при помощи оператора WRITE, пользователю будет предложено сохранить его на рабочий компьютер.

Второе действие открывает форму, запрашивает у пользователя дату и вызывает первое действие по экспорту данных.

  • No labels