Перейти к содержанию

Введение#

Для выполнения произвольного sql-запроса в Лексеме существует такой инструмент как «Запрос». Как и модель, запрос может быть источником данных для выпадающего списка (lookup).

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

Запрос состоит из файла с описанием (.query.json) и файла(-ов) c sql-запросом (.sql), которые располагаются в каталоге проекта queries.

Свойства#

Файл query.json содержит описание объекта, которое может иметь следующие свойства:

Наименование Тип Описание Обязательное
rights Объект Права доступа для данного объекта. Да
parameters Объект Параметры запроса. nan
select, insert, update, delete Объект Описывают для каждого типа действия текст запроса и доступные параметры. Запрос должен содержать как минимум одно из этих свойств. Да

Rights#

Описывает права для данного объекта. Представляет собой объект. Для каждого действия (create, read, update, delete) задается массив ролей, для которых это действие будет доступно.

Пример:

1
2
3
4
5
6
rights: {
  "create": [],
  "read": ["super", "manager" ],
  "update": [],
  "delete": []
}

В примере чтение данных доступно только для ролей super и manager, остальные действия не доступны ни для одной роли.

Parameters#

Описывает параметры запроса. Представляет собой объект. Каждый параметр представляется в виде «имя параметра: имя типа». Имя типа берется из словаря примитивов и является регистрозависимым значением. В примере у запроса два параметра: параметр с именем VCode и типом bigint и параметр с именем test и типом string.

Пример

1
2
3
4
parameters: {
    "VCode": "bigint",
    "test": "string"
  }

Примитивы:

[
  "bigint",
  "bool",
  "date",
  "dateTime",
  "dateTimeOffset",
  "double",
  "file",
  "int",
  "longstring",
  "money",
  "string",
  "time",
  "tinyint",
  "varbinary(max)",
  "uuid"
]

select, insert, update, delete#

Описывают для каждого типа действия текст запроса и доступные параметры. Представляют собой объекты. Запрос должен содержать как минимум одно из этих свойств.

Содержит свойства:

  • text – ссылка на файл с текстом sql-запроса
  • parameters – массив передаваемых в запрос параметров из объекта parameters.

В качестве значения свойства text указывается относительный путь к файлу с sql-скриптом, а в качестве значения свойства parameters в виде массива указываются имена параметров из объекта parameters запроса.

Пример

Файл getStorage.query.json

1
2
3
4
5
6
7
8
select: {
  "text": "./getStorage.sql",
  "parameters": [ "vcode" ]
},
"parameters": {
    "VCode": "bigint",
    "test": "string"
  }

Файл getStorage.sql

select * from Storage where vcode = @vcode

В данном примере запрос выполнит sql-скрипт из файла getStorage.sql, передав туда параметр vcode. В sql-скрипте он будет инициализирован как переменная @vcode типа bigint. Поэтому в sql-скрипте не должно быть инициализации переменной с таким именем, иначе это может привести к ошибке.

Выполнение#

В Лексеме выполнение запроса реализовано с помощью класса QuerySource. При создании экземпляра этого класса в конструктор надо передать запрос. После применить одну из следующих функций:

  • load
  • insert
  • delete
  • update

Функция принимает в качестве параметра объект со свойствами, описанными в parameters.

Функции асинхронные, поэтому возвращают объект типа deferred (см. документацию к библиотеке jQuery https://api.jquery.com ).

Пример

import { Form, QuerySource } from 'ecosoft-lexema8';
import query from '../queries/GetDocuments.query.json';
...
export default class MyForm extends Form {
...
LoadQuery() {
    const parameters = {
      BDate: this.controls.DateTimeInputBDate.value,
      EDate: this.controls.DateTimeInputEDate.value    
    };
    PageBlocker.on();
    (new QuerySource(query)).load(parameters)
      .done(result => {
        console.log('result', result);
        PageBlocker.off();
      });
  }
}

Примеры#

  • Запрос возвращает код и имя всех контрагентов.

Файл allContractors.query.json:

1
2
3
4
5
6
7
8
{
  "select": {
    "text": "./allContractors_select.sql"
  },
  "rights": {
    "read": [ "super" ]
  }
}

Файл allContractors_select.sql:

1
2
3
4
5
SELECT
    VCode,
    Name
FROM
    dbo.Contractor
  • Запрос возвращает код и имя контрагента по заданному в качестве параметра коду.

Файл getContractor.query.json:

{
  "select": {
    "text": "./getContractor_select.sql",
    "parameters": [ "VCode" ]
  },
  "parameters": {
    "VCode": "bigint"
  },
  "rights": {
    "read": [ "super" ]
  }
}

Файл getContractor_select.sql:

1
2
3
SELECT VCode, Name
FROM dbo.Contractor
WHERE VCode = @VCode