Пример взаимодействия с СУБД
Вопрос:
Как использовать элементы управления и функциональные блоки (далее – ФБ), позволяющие осуществлять просмотр и редактирование данных СУБД.

Ответ:
Рассмотрим на примере.

1. Настоящий пример разработан в целях демонстрации принципа использования следующих элементов:
- Функционального блока SqlRequestWithResult, служащего типом для экземпляра функционального блока способного выполнять запросы к СУБД и получать ответы.
- Функционального блок SqlRequest, служащего для выполнения запросов к СУБД.
- Таблицы данных – элемента, предназначенного для отображения массивов структур в табличном виде, когда каждый элемент массива структур представлен в виде строки. Количество строк соответствует количеству элементов в массиве.
Созданный проект демонстрирует работу MasterScada 4D в качестве приложения обработки данных: получения списка значений из таблиц базы данных и отображения полученных значений в визуальном элементе управления «Таблица данных», редактирования, добавления и удаления строк.
Обработка данных может осуществляться независимо, то есть в разных экземплярах приложения, разными пользователями.
Рис. 1 Отображение данных в Microsoft Edge и редактирование записи в браузере Google Chrome
1.1. Принцип работы приложения

Вывод строк в элемент управления «Таблица данных» осуществляется программой FBD (prSelectCommand), которая с использованием функционального блока SqlRequestWithResult, с определённой в проекте периодичностью, вызывает хранимую процедуру ([dbo].[SelectObjectsCommand]) на Microsoft SQL Server, возвращающую список строк.

В целях редактирования строк используется встроенная функциональная возможность элемента управления «Таблица данных», но результат редактирования будет доступен другим пользователям, использующим собственные экземпляры приложения, только после вызова программы ST (prUpdateCommand), запускаемую нажатием кнопки «Сохранить», в следующем цикле выполнения программы prSelectCommand. Программа prUpdateCommand проходит циклом записи, отображаемые в элементе управления «Таблицы данных», выполняя хранимую процедуру ([dbo].[UpdateObjectsCommand]) на Microsoft SQL Server.

За удаление записей отвечает программа ST (prDeleteCommand), запускаемая нажатием кнопки, которая вызывает хранимую процедуру ([dbo].[DeleteObjectsCommand]) на Microsoft SQL Server. Как и в случае с обновлением данных, результат удаления будет доступен другим пользователям, использующим собственные экземпляры приложения, только после очередного цикла выполнения программы prSelectCommand.

Для добавления данных, как и для других операций, создана отдельная программа (prInsertCommand), запускаемая нажатием кнопки, выполняющая хранимую процедуру ([dbo].[InsertObjectsCommand]). Ввод новых данных осуществляется во вспомогательном окне – окне детализации. Результат добавления будет доступен другим пользователям, использующим собственные экземпляры приложения, только после очередного цикла выполнения программы prSelectCommand.

2. Требования к системе для реализации примера в информационной системе

- Установленный экземпляр Microsoft SQL Server с разрешение выполнять сценарии SQL, создающих таблицы и хранимые процедуры
- Среда разработки MasterScada 4D

3. Формирование объектов в базе данных

3.1. Необходимо выполнить сценарий из файла (см. файл «MakeStoreProc.sql»). Данный сценарий создаст в базе данных следующие объекты:

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

Перед выполнением, в первой строке сценария SQL необходимо указать имя базы данных, где должны быть созданы объекты (см. рисунок)
В настоящем примере имя базы данных - mps_p1

В результате выполнения сценария будут созданы следующие объекты:
4. Создание подключения к СУБД

4.1. В среде разработки необходимо добавить АРМ в дерево Системы проекта.

4.2. На ветку АРМ «Протоколы» добавить протокол MSSQL

4.3. В свойствах протокола MSSQL задать параметры подключения к базе данных. В настоящем примере параметры подключения выглядят следующим образом:

, где:
сервер – имя экземпляра Microsoft SQL Server;

База – специально созданная для данного примера база данных mps_p1;

Порт – номер порта, по которому сервер будет отвечать на запросы, поступающие по сети (см. рисунок)
5. Создание программы, осуществляющей выборку данных.

5.1. Выборку данных из таблицы в проекте будет осуществлять программа, типа MasterSCADA.Program.ProgramFBD с именем «prSelectCommand». Запрос данных будет осуществляться с помощью ФБ SqlRequestWithResult, который необходимо добавить в локальную библиотеку и соответствующим образом настроить.

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

TYPE Структура_Объекты:
STRUCT
id_rec: UINT := 0;
ObjectName: STRING;
Descr: STRING;
END_STRUCT;
END_TYPE

В настоящем примере создана структура с именем «Структура_Объекты»
5.1.2. SqlRequestWithResult имеет параметр «Result», в который должен помещаться результат выборки в виде массива структур. Необходимо переопределить тип значения для параметра, указав в качестве типа одномерный массив в виде структуры «Структуры_Объекты»
5.1.3. Ранее подготовленный в локальной библиотеке ФБ «SqlRequestWithResult» добавляется в программу «prSelectCommand» и устанавливаются значение необходимых параметров.
5.1.4. В программу добавляются параметры:

- Входной параметр «pCommand», типа STRING , которому присваивается значение в виде текста (T-SQL), содержащего вызов хранимой процедуры EXEC [dbo].[SelectObjectsCommand], передающий значение в параметр ФБ «Command»;

Примечание: в настоящем примере процедура выборки «SelectObjectsCommand» не имеет параметров, которые можно применить в качестве критериев отбора данных, так как фильтрация данных будет осуществляться в элементе управления «Таблица данных»

- Выходной параметр «Результат», типа одномерный массива структуры «Структуры_Объекты», принимающий значение из параметра ФБ «Result»;

- Выходной параметр «pError» , типа STRING , принимающий сообщения об ошибках из параметра ФБ «Error»;

6. Создание пользовательского интерфейса

6.1. В целях отображения данных создаётся пользовательский интерфейс.

6.1.1. В проект добавляется Окно с именем «ОкноСписок», назначаемое стартовым окном АРМ.

6.1.2. На окно добавляется элемент управления «Таблица данных», свойство «Источник данных» которого, связывается с параметром программы «prSelectCommand.Результат».

6.1.3. В режиме редактирования элемента управления «Таблица данных» добавляются отображаемые столбцы и задаются их свойства
6.2. При запуске проекта на исполнение, в окне клиента будет выведена информация из базы данных
7. Создание программы, осуществляющей обновление данных.

7.1. Обновление данных в таблице будет осуществлять программа, типа MasterSCADA.Program.ProgramST с именем «prUpdateCommand». Обновление данных будет осуществляться с помощью ФБ SqlRequest.

7.1.1. В локальную библиотеку помещается функциональный блок Библиотеки.Protocols.ФБ.SqlRequest, который затем модернизируется, добавлением параметров, соответствующих столбцам таблицы:
7.1.2. Модернизированный в локальной библиотеке ФБ.SqlRequest добавляется в программу ST «prUpdateCommand»

7.1.3. В программу добавляются параметры:
- «Результат», типа ARRAY [*] OF Структура_Объекты, начальное значение которого, связано с Объекты.ОбъектКлиентБД.Ресурсы.Окна.ОкноСписок.Схема.ТОбъекты.Параметры.Источник данных;

- «pCommand», типа STRING, начальное значение которого, содержит вызов хранимой процедуры с параметрами:

EXEC [dbo].[UpdateObjectCommand] @id_rec = {id_rec}, @ObjectName = {ObjectName}, @Descr = {Descr}

где: {id_rec}; {ObjectName}; {Descr} – именованные параметры ФБ.SqlRequest,

@id_rec; @ObjectName; @Descr – параметры хранимой процедуры, получающие значения из именованных параметров ФБ.SqlRequest.

7.1.5. В процессе выполнения программы осуществляется циклическое прохождение по элементам массива «Результат» и для каждого элемента вызывается ФБ. SqlRequest с заполнением параметров значениями элемента массива:

VAR
i: UINT := 0; //счётчик
L: UINT := 1; //количество записей в таблице данных
END_VAR
L:= UPPER_BOUND(ARR:=Результат , DIM:= 0);

FOR i :=0 TO L - 1 DO

i:= i +1;

SqlRequest_1(Command:= pCommand, Transaction:= pTransaction, id_rec:=Результат[i].id_rec , ObjectName:= Результат[i].ObjectName, Descr:= Результат[i].Descr, Error => pError);

END_FOR;


7.1.6. Вызов программы осуществляется кнопкой «Сохранить», для которой определено событие «Клик мыши» с вызовом программы

8. Реализация процедуры добавления и удаления строк почти не отличается от процедуры обновления.

8.1. Для удаления определённой строки необходимо получить идентификатор удаляемой записи из колонки «Идентификатор» элемента управления «Таблица данных».

В целях получения идентификатора используется событие элемента управления «Таблица данных» - «Клик по ячейке», с помощью которого можно получить значение текущей строки, а затем значение ячейки строки, содержащей идентификатор, который передаётся программе, осуществляющей удаление записей.