Получить значение из БД

> [HTML Version](getvardb.html)

Пусть имеется база данных с таблицей "table\_1". Таблица имеет три колонки (или поля): "ID", "A", "B". Также она включает десять строк.

 _(./images/script_recommendations_6.png)_

**Задача:** получить в скада-систему одно значение колонки "A" из строки номер шесть. Оно равно "32.4". Для этого сначала нужно составить SQL-запрос на выборку нужного значения. Он будет выглядеть так:

````
 SELECT \`A\` FROM \`table\_1\` WHERE ID = 6;

````
 

Результатом выполнения этого запроса станет крошечная таблица, которая состоит из одной колонки "A" и одной строки: 

_(./images/script_recommendations_7.png)_

 

Соответственно, она будет содержать всего одно нужное нам значение - "32.4". Итак, запрос у нас есть, теперь можно перейти к реализации в Simple-Scada. Добавим в проект новую кнопку "Button1" и [создадим скрипт по событию](by-obj-event.md) "OnClick":

````
var  
  aQuery: string;  
begin  
  // Формируем запрос к БД  
  aQuery := 'SELECT \`A\` FROM \`table\_1\` WHERE ID = 6;';  
  // Отправляем запрос на выполнение c тегом = 1  
  RunSQL(aQuery, nil, 1);   
end.

````


Теперь при нажатии на кнопку будет выполняться наш запрос. Осталось получить результат выполнения запроса и отобразить его в скада-системе. Для этого в редакторе скриптов необходимо создать новый скрипт, причем при создании нужно выбрать тип события "Выполнен SQL-запрос". Такой скрипт будет вызываться скада-системой каждый раз, когда выполнился пользовательский SQL-запрос. Также, этот скрипт будет содержать параметр "[DataSet](tmdataset.md)" - это таблица, которая была получена в результате выполнения запроса. Нам известно, что запрос вернет только одну колонку с одной строкой, поэтому можно брать значение напрямую, вот так:

````
begin  
  if DataSet.Tag = 1 then  
    Text1.Text := DataSet.Fields\[0\].AsStr;  
end.

````
Сначала мы убедились что "DataSet" - это результат нашего запроса, так как мы помечали его тегом = 1. Затем, мы обращаемся к первой колонке (Fields\[0\] - в нашем случае это колонка \`A\`) и берем значение в виде строки в объект "Text1". Также, обращаться к колонкам можно используя более короткую запись:

````
begin  
  if DataSet.Tag = 1 then  
    Text1.Text := DataSet\[0\].AsStr;  
end.

````
Проверить свои SQL-запросы и увидеть результат их выполнения, можно используя бесплатное приложение [MySQL Workbench](https://simple-scada.com/help/manual/mysql-workbench.html). Это поможет лучше понять SQL и БД.



**Работа с выборкой из множества строк**[(./images/link.png)](https://simple-scada.com/help/script/getvardb.html?anchor=mulsel)

Для перемещения курсора в наборе данных на следующую позицию используйте Next, а на предыдущую позицию - Prior. Если нужно перебрать весь набор данных, то цикл будет таким:

````
begin  
  // выполнять цикл пока не достигнем конца набора данных  
  while not DataSet.EOF do  
  begin  
    // здесь работаем с текущей строкой  
    DataSet.Next;  // переходим на следующую строку  
  end;  
end.

````


А это тот же код, но добавлен проход по ячейкам строки:

````
var  
  I: Integer;  
  aStr: string;  
begin  
  // выполнять цикл пока не достигнем конца набора данных  
  while not DataSet.EOF do  
  begin  
    // проходим по каждой ячейке текущей строки  
    for I := 0 to DataSet.FieldCount - 1 do  
      aStr := DataSet\[I\].AsStr;  // получаем значение текущей ячейки переведённое в строку и записываем его в переменную aStr.  
   
    DataSet.Next;                // переходим на следующую строку  
  end;  
end.

````


Обратите внимание, если нужно вывести данные в компонент "Таблица", то можно использовать автоматическое заполнение таблицы при помощи метода RunSQL. Например, если в проекте есть таблица с именем Table1, то можно написать такой скрипт:

````
var  
  aQuery: string;  
begin  
  aQuery := 'SELECT \* FROM \`my\_table\`';  // формируем запрос к БД на выборку всех данных из таблицы \`my\_table\`  
  Table1.RunSQL(aQuery, tsAll);          // выполнить запрос и заполнить таблицу результатом выполнения  
end.
````