Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Не добавляются данные с формы SCADA в БД  (Прочитано 8737 раз)

InSanityIsPeace

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
День добрый, столкнулся с следующей проблемой: по данному руководству сделал таблицу рецептов, в Скаде все формы отрабатывают хорошо, кроме некоторых "багов", но главное - не отправляются запросы в базу данных MySQL. К базе подключение есть, таблицы созданы, названия на всякий случай перепроверил и права доступа в самой БД - всё в норме. При этом я сформировал одну строку непосредственно в БД - в Скаде в таблице строка отображается, но добавить или изменить строку я не могу, зато могу удалить строку из таблицы.

В чём я мог ошибиться? Как исправить?

Timothy Clement

  • Постоялец
  • ***
  • Сообщений: 166
  • ОАО Борисовский завод "Металлист"
    • Просмотр профиля
    • Полымя
Re: Не добавляются данные с формы SCADA в БД
« Ответ #1 : 31 Января 2025, 09:28:45 »
Добрый день. После попытки записи в скаду, остановите проект и сервер, в папке со скадой найдите папку Logs (запись логов должна быть включена  настройках). Откройте Server-log, там найдете сообщение об ошибке после выполнения скрипта записи в БД.
Либо используйте скрипт  Ошибка SQL-запроса

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 288
    • Просмотр профиля
    • Simple-Scada
Re: Не добавляются данные с формы SCADA в БД
« Ответ #2 : 31 Января 2025, 10:01:28 »
Здравствуйте.

Обработать ошибки выполнения SQL-запроса можно в скрипте "Ошибка SQL-запроса". Также для поиска ошибок в SQL-запросе можно включить опцию "Лог пользовательских SQL-запросов". При активации данной опции все пользовательские SQL-запросы будут записываться в лог-файл сервера с указанием имени скрипта, из которого была вызвана процедура и текстом SQL-запроса. Таким образом, можно просмотреть нужный SQL-запрос, отправленный в БД, и проверить, нет ли в нем ошибок. Данную опцию можно использовать только для отладки проекта, иначе она будет создавать лишнюю нагрузку на сервер. После отладки опцию нужно обязательно выключить.

У Вас в обоих скриптах "Add_Recipe_Form_Script" и "Edit_Recipe_Form_Script" в запросе добавляется лишняя запятая:
Цитировать
QuotedStr(FormData[fld_add_add_comp_4].AsStr) + ', ' +
и
Цитировать
'`comp_add_4`=' + QuotedStr(FormData[fld_edit_add_comp_4].AsStr) + ', ' +
Удалите их, тогда все будет работать правильно.

Также обратили внимание, что в проекте большое количество однотипных скриптов. Например скрипты "Image1_OnClick", "Image35_OnClick", "Image52_OnClick" и т.д. полностью идентичны. Все эти скрипты можно удалить и создать один универсальный:
Код: (delphi)
begin
  if Sender is TM_Image then    // проверяем, что скрипт вызван изображением
    with Sender as TM_Image do  // приводим Sender к типу "TM_Image"
      Value := not AsBool;      // записываем в переменную обратное значение 0/1, 1/0
end.
Данный универсальный скрипт можно использовать сразу для всех изображений, по нажатию на которые необходимо менять значение переменной, связанной с этим изображением.

Скрипты "Image1_OnDataChange", "Image35_OnDataChange" и т.д. также полностью идентичны. Пример универсального скрипта для изменения цвета объекта можно найти в руководстве по ссылке (пример №2). По аналогии можно заменить все остальные скрипты, в которых используется одинаковый код.

Также, рекомендуем ознакомиться с разделами "Рекомендации по работе со скриптами" и "Отладка скриптов". Примеры наиболее часто используемых скриптов можно посмотреть по ссылке.

InSanityIsPeace

  • Новичок
  • *
  • Сообщений: 2
    • Просмотр профиля
Re: Не добавляются данные с формы SCADA в БД
« Ответ #3 : 31 Января 2025, 11:31:21 »
По БД - спасибо, помогло, но теперь один момент есть - id в базе настроен на "A_I", но учитывая, что через Скаду пользователь возможно будет удалять какие-либо строки, есть ли какой-нибудь скрипт, который бы обновлял таблицу по части id? Ну, т.е. были рецепты с id "1", "2", "3", после чего рецепт-id "2" удалили и следующий добавленный рецепт будет с id 3, а в таблице будет  "1", "3", "4" и т.д. Хотелось бы, чтобы id вставали по порядку...

По скриптам - спасибо, приму к сведению, проработаю момент. Самоучка по Скаде, такая вот производственная необходимость.

А, и ещё момент: данный проект будет скидываться клиентам как "демонстрация возможностей". С картинками и анимациями - понятно, это необходимость, но у меня встаёт вопрос с БД - её можно как-то к проекту прикрепить, чтобы не было надобности разворачивать БД у того, кому скинут и устанавливать коннект с БД?

ARV

  • Постоялец
  • ***
  • Сообщений: 117
    • Просмотр профиля
Re: Не добавляются данные с формы SCADA в БД
« Ответ #4 : 31 Января 2025, 12:16:14 »
А, и ещё момент: данный проект будет скидываться клиентам как "демонстрация возможностей". С картинками и анимациями - понятно, это необходимость, но у меня встаёт вопрос с БД - её можно как-то к проекту прикрепить, чтобы не было надобности разворачивать БД у того, кому скинут и устанавливать коннект с БД?
Коннект с базой должен быть установлен стандартными средствами, а все дополнительные таблицы в базу можно добавить так: написать текстовый файл, содержащий все SQL-запросы для добавления данных в базу, и при старте проекта скриптом загружать содержимое этого файла и отправлять в RunSQL.

Как-то так:
Код: (sql)
DROP TABLE IF EXISTS my_added_table;
CREATE TABLE my_added_table (
/* тут все столбцы, как надо */
);
INSERT INTO my_added_table VALUES ( /*строка 1*/);
INSERT INTO my_added_table VALUES ( /*строка 2*/);
// сколько надо строк
INSERT INTO my_added_table VALUES ( /*строка N*/);
« Изменён: 03 Февраля 2025, 16:59:12 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 288
    • Просмотр профиля
    • Simple-Scada
Re: Не добавляются данные с формы SCADA в БД
« Ответ #5 : 05 Февраля 2025, 22:26:59 »
Здравствуйте.

Цитировать
есть ли какой-нибудь скрипт, который бы обновлял таблицу по части id?
Если обязательно необходимо иметь нумерацию рецептов по порядку, то в таблицу рецептов "tblRecipes" можно добавить дополнительный столбец "№ рецепта" (колонку с id рецепта можно максимально уменьшить, чтобы она не отображалась – см. свойство колонки "Ширина"). После этого при выборке данных из таблицы БД, используя функцию "ROW_NUMBER" можно формировать дополнительный столбец с нумерацией по порядку. Пример запроса:
Код: (delphi)
var
  aQuery: string;
begin
  aQuery := 'SELECT `id`, ROW_NUMBER() OVER (ORDER BY id) AS "№ рецепта", ' +
            '`name`, `comp_1`, `comp_2`, `comp_3`, `comp_4`, ' +
            'FROM `recipes`;';

  tblRecipes.RunSQL(aQuery, tsSaveFixRow);
end.
При этом следует учитывать, что скрипты для кнопок "Изменить" и "Задействовать" необходимо отредактировать с учетом добавления нового столбца "№ рецепта" в таблицу рецептов "tblRecipes". Внесли соответствующие изменения в Ваш проект – во вложении. Перед тестированием перейдите в настройки подключения к БД через меню "Проект -> Настройки -> База данных" и укажите свои параметры для подключения к БД.

Цитировать
А, и ещё момент: данный проект будет скидываться клиентам как "демонстрация возможностей". С картинками и анимациями - понятно, это необходимость, но у меня встаёт вопрос с БД - её можно как-то к проекту прикрепить, чтобы не было надобности разворачивать БД у того, кому скинут и устанавливать коннект с БД?
Настроить подключение к БД можно только вручную. На ПК клиентов предварительно должна быть установлена СУБД. Если на ПК клиентов настройки подключения к БД будут аналогичные Вашим, то после копирования проекта вносить изменения в настройки не потребуется.

Создание собственной таблицы рецептов можно реализовать с помощью выполнения соответствующего SQL-запроса при первом запуске проекта. Пример создания пользовательской таблицы в БД при запуске проекта можно найти в демо-проекте – скрипт "CreateRecipesTable".
« Изменён: 05 Февраля 2025, 22:48:51 от Simple_Scada »