Набор данных. Types/source:DataSet

Набор данных — это комплексный объект, содержащий рекордсеты, рекорды и скалярные значения.

Набор данных возвращают методы call() и query() источников данных. Это используется для решения следующих задач:

  • возможность рассмотреть любой тип результата, возвращаемого произвольным методом;
  • оптимизация количества запросов: вместо вызова нескольких методов можно вызвать один, который умеет возвращать сразу несколько результатов.

Возможности

  • получение рекордсета/рекорда/скаляра, ассоциированного с именем свойства;
  • использование сырых данных в разных форматах;
  • внедрение собственных конструкторов рекордов и рекордсетов.

Важно

По умолчанию используется адаптер для данных в формате JSON. Если вы используете данные в каком-либо другом формате (СБИС-JSON, XML), то нужно подключить соответствующий адаптер.

Примеры

Создадим комплексный набор в формате JSON из двух выборок "Заказы" и "Покупатели", одной записи "Итого" и даты выполнения запроса:

var data = new source.DataSet({
    rawData: {
        orders: [
            {id: 1, buyer_id: 1, date: '2016-06-02 14:12:45', amount: 96},
            {id: 2, buyer_id: 2, date: '2016-06-02 17:01:12', amount: 174},
            {id: 3, buyer_id: 1, date: '2016-06-03 10:24:28', amount: 475}
        ],
        buyers: [
            {id: 1, email: 'tony@stark-industries.com', phone: '555-111-222'},
            {id: 2, email: 'steve-rogers@avengers.us', phone: '555-222-333'}
        ],
        total: {
            date_from: '2016-06-01 00:00:00',
            date_to: '2016-07-01 00:00:00',
            amount: 745,
            deals: 3,
            completed: 2,
            paid: 2,
            awaited: 1,
            rejected: 0
        },
        executeDate: '2016-06-27 11:34:57'
    },
    keyProperty: 'id'
});

var orders = data.getAll('orders');

// 3
orders.getCount();

// 96
orders.at(0).get('amount');

var buyers = data.getAll('buyers');

// 2
buyers.getCount();

// 'tony@stark-industries.com'
buyers.at(0).get('email');

var total = data.getRow('total');

// 745
total.get('amount');

// '2016-06-27 11:34:57'
var executeDate = data.getScalar('executeDate');

Тот же самый набор данных ("Заказы" и "Покупатели", "Итого", дата выполнения запроса) можно представить в виде XML:

<?xml version="1.0"?>
<response>
    <orders>
        <order>
            <id>1</id>
            <buyer_id>1</buyer_id>
            <date>2016-06-02 14:12:45</date>
            <amount>96</amount>
        </order>
        <order>
            <id>2</id>
            <buyer_id>2</buyer_id>
            <date>2016-06-02 17:01:12</date>
            <amount>174</amount>
        </order>
        <order>
            <id>3</id>
            <buyer_id>1</buyer_id>
            <date>2016-06-03 10:24:28</date>
            <amount>475</amount>
        </order>
    </orders>
    <buyers>
        <buyer>
            <id>1</id>
            <email>tony@stark-industries.com</email>
            <phone>555-111-222</phone>
        </buyer>
        <buyer>
            <id>2</id>
            <email>steve-rogers@avengers.us</email>
            <phone>555-222-333</phone>
        </buyer>
    </buyers>
    <total>
        <date_from>2016-06-01 00:00:00</date_from>
        <date_to>2016-07-01 00:00:00</date_to>
        <amount>475</amount>
        <deals>3</deals>
        <completed>2</completed>
        <paid>2</paid>
        <awaited>1</awaited>
        <rejected>0</rejected>
    </total>
    <executeDate>2016-06-27 11:34:57</executeDate>
</response>

И работать с XML, подключив соответствующий адаптер:

var data = new source.DataSet({
    rawData: '<?xml version="1.0"?>...',
    adapter: new XmlAdapter(),
    keyProperty: 'id'
});

// XPath syntax
var orders = data.getAll('orders/order');

// 3
orders.getCount();

// 96
orders.at(0).get('amount');

// XPath syntax
var buyers = data.getAll('buyers/buyer');

// 2
buyers.getCount();

// 'tony@stark-industries.com'
buyers.at(0).get('email');

var total = data.getRow('total');

// 745
total.get('amount');

// '2016-06-27 11:34:57'
var executeDate = data.getScalar('executeDate');

Создадим комплексный набор в формате СБИС-JSON, состоящий из рекордсета:

var data = new source.DataSet({
    adapter: new SbisAdapter(),
    rawData: {
        _type: 'recordset',
        d: [
            [1, 'Иванов'],
            [2, 'Петров'],
            [3, 'Сидоров']
        ],
        s: [
            {n: 'Ид', t: 'Число целое'},
            {n: 'Фамилия', t: 'Строка'}
        ]
    },
    keyProperty: 'Ид'
});

var users = data.getAll();

// 3
users.getCount();

// 'Иванов'
orders.at(0).get('Фамилия');

Создадим комплексный набор в формате СБИС-JSON, состоящий из рекорда:

var data = new source.DataSet({
    adapter: new SbisAdapter(),
    rawData: {
        _type: 'record',
        d: [1, 'Иванов'],
        s: [
            {n: 'Ид', t: 'Число целое'},
            {n: 'Фамилия', t: 'Строка'}
        ]
    },
    keyProperty: 'Ид'
});

var user = data.getRow();

// 'Иванов'
orders.get('Фамилия');

Диаграмма класса

См. также