Списки значений для ODataDB
ODataDB поддерживает следующие функции:
- Списки значений ячеек
- Списки значений для свободного ввода
- Списки значений параметров
- Списки фиксированных значений
- Списки значений из таблиц и представлений
- Списки значений из хранимых процедур
- Списки значений из команд SQL
ODataDB автоматически создает необходимые объекты OData.
Встроенный клиент JavaScript и SaveToDB 8+ поддерживают эти функции из коробки.
Предположим, у нас есть база данных с следующими таблицами:

Определение EntityType для s02.cashbook выглядит следующим образом:
<EntityType Name="cashbook">
<Key>
<PropertyRef Name="id"/>
</Key>
<Property Name="id" Type="Edm.Int32" Nullable="false">
<Annotation Term="Core.Permission" EnumMember="Core.Permission/Read"/>
</Property>
<Property Name="date" Type="Edm.Date" Nullable="false"/>
<Property Name="account_id" Type="Edm.Int32" Nullable="false"/>
<Property Name="item_id" Type="Edm.Int32"/>
<Property Name="company_id" Type="Edm.Int32"/>
<Property Name="debit" Type="Edm.Decimal"/>
<Property Name="credit" Type="Edm.Decimal"/>
<NavigationProperty Name="account" Type="s02.accounts" Partner="cashbooks">
<ReferentialConstraint Property="account_id" ReferencedProperty="id"/>
</NavigationProperty>
<NavigationProperty Name="company" Type="s02.companies" Partner="cashbooks">
<ReferentialConstraint Property="company_id" ReferencedProperty="id"/>
</NavigationProperty>
<NavigationProperty Name="item" Type="s02.items" Partner="cashbooks">
<ReferentialConstraint Property="item_id" ReferencedProperty="id"/>
</NavigationProperty>
</EntityType>
Клиентские приложения могут использовать NavigationProperties для создания списков значений.
Предположим, таблица xls.handlers содержит следующие настройки:
| ID | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | EVENT_NAME | HANDLER_SCHEMA | HANDLER_NAME | HANDLER_TYPE | HANDLER_CODE |
|---|---|---|---|---|---|---|---|---|
| s02 | cashbook | account_id | ValidationList | s02 | accounts | TABLE | id, +name | |
| s02 | cashbook | item_id | ValidationList | s02 | items | TABLE | id, +name | |
| s02 | cashbook | company_id | ValidationList | s02 | companies | TABLE | id, +name |
Определение колонок account_id, item_id и company_id для s02.cashbook изменится следующим образом:
<EntityType Name="cashbook">
...
<Property Name="account_id" Type="Edm.Int32" Nullable="false">
<Annotation Term="ODataDB.ValueList" Path="default.default/accounts_select_id_name_order_by_name1"/>
</Property>
<Property Name="item_id" Type="Edm.Int32">
<Annotation Term="ODataDB.ValueList" Path="default.default/items_select_id_name_order_by_name1"/>
</Property>
<Property Name="company_id" Type="Edm.Int32">
<Annotation Term="ODataDB.ValueList" Path="default.default/companies_select_id_name_order_by_name1"/>
</Property>
...
</EntityType>
Аннотации ODataDB.ValueList содержат пути к объявленным FunctionImport в EntityContainer с именем схемы default:
<FunctionImport Name="s02_accounts_select_id_name_order_by_name1" Function="s02.accounts_select_id_name_order_by_name1" EntitySet="s02_accounts"/> <FunctionImport Name="s02_items_select_id_name_order_by_name1" Function="s02.items_select_id_name_order_by_name1" EntitySet="s02_items"/> <FunctionImport Name="s02_companies_select_id_name_order_by_name1" Function="s02.companies_select_id_name_order_by_name1" EntitySet="s02_companies"/>
Вот объявление функций в схеме s02:
<Function Name="accounts_select_id_name_order_by_name1">
<ReturnType Type="Collection(s02.accounts)"/>
</Function>
<Function Name="items_select_id_name_order_by_name1">
<ReturnType Type="Collection(s02.items)"/>
</Function>
<Function Name="companies_select_id_name_order_by_name1">
<ReturnType Type="Collection(s02.companies)"/>
</Function>
Пример настройки для процедуры s02.usp_cashbook, которая извлекает данные из таблицы s02.cashbook и имеет три параметра: account_id, item_id, company_id:
| ID | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | EVENT_NAME | HANDLER_SCHEMA | HANDLER_NAME | HANDLER_TYPE | HANDLER_CODE |
|---|---|---|---|---|---|---|---|---|
| s02 | usp_cashbook | account_id | ParameterValues | s02 | accounts | TABLE | id, +name | |
| s02 | usp_cashbook | item_id | ParameterValues | s02 | items | TABLE | id, +name | |
| s02 | usp_cashbook | company_id | ParameterValues | s02 | companies | TABLE | id, +name |
Вот объявление функций:
<EntityType Name="usp_cashbook_result" BaseType="s02.cashbook" OpenType="true"/>
<Function Name="usp_cashbook">
<Parameter Name="account_id" Type="Edm.Int32">
<Annotation Term="ODataDB.ValueList" Path="default.default/accounts_select_id_name_order_by_name"/>
</Parameter>
<Parameter Name="item_id" Type="Edm.Int32">
<Annotation Term="ODataDB.ValueList" Path="default.default/items_select_id_name_order_by_name"/>
</Parameter>
<Parameter Name="company_id" Type="Edm.Int32">
<Annotation Term="ODataDB.ValueList" Path="default.default/companies_select_id_name_order_by_name"/>
</Parameter>
<ReturnType Type="Collection(s02.usp_cashbook_result)"/>
</Function>
В этом примере также используется аннотация ODataDB.ValueList для указания функций получения списков значений.
Полную модель можно открыть онлайн:
https://odatadb.savetodb.com/v4/mssql-023/default/en-us/$metadata