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

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

Просмотр сообщений

В этом разделе можно просмотреть все сообщения, сделанные этим пользователем.


Сообщения - ARV

Страницы: [1] 2 3 ... 8
1
Можно каждую секунду по таймеру делать запрос к базе данных, который возвращал бы количество записей в таблице messages с  нужными вам значениями столбца gid и т.п.
Соответственно, получив ответ, подсвечивать символ аварии...

2
А, и ещё момент: данный проект будет скидываться клиентам как "демонстрация возможностей". С картинками и анимациями - понятно, это необходимость, но у меня встаёт вопрос с БД - её можно как-то к проекту прикрепить, чтобы не было надобности разворачивать БД у того, кому скинут и устанавливать коннект с БД?
Коннект с базой должен быть установлен стандартными средствами, а все дополнительные таблицы в базу можно добавить так: написать текстовый файл, содержащий все 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*/);

3
Не помню, была ли уже такая просьба или нет: Добавить фильтр по шаблону (т.е. с подстановочными символами или regexp) для импорта переменных с OPC-серверов.
то есть чтобы не все подряд переменные из группы импортировать, а только удовлетворяющие шаблону.

4
Ваши вопросы / Re: Таблица
« : 30 Января 2025, 13:37:03 »
Сделать из таблицы запрос к базе данных (выборка из таблицы variables) , который вернет все нужные переменные и затем по событию таблицы OnDoneSQL перебрать все строки и присвоить нужным ячейкам переменные из базы - таблица сама будет показывать значения все переменных.

5
В скриптах нет возможности динамически добавлять/удалять строки таблицы.
Но можно извратиться при помощи базы данных и SQL-запроса: сначала в БД создаем табличку с теми строками, которые надо впихнуть в таблицу, а затем, когда этот запрос отработает, делаем запрос из таблицы Simple-Scada... Потом можно в базе таблицу удалить.

6
Ваши вопросы / Re: Ошибка SQL-запроса
« : 14 Января 2025, 12:41:17 »
Спасибо!

7
Ваши вопросы / Re: Вопрос по окну трендов
« : 10 Января 2025, 15:41:10 »
Пожалуйста, не забудьте сделать свойство групп "Название" доступным для записи из скриптов, я уже просил об этом!

Попутно еще вопрос: а можно будет сделать возможность перехода в то место, где все имеющиеся группы трендов перечислены? Т.е. мы можем перейти сразу к группе, а хотелось бы переходить к выбору групп.

8
Ваши вопросы / Re: Ошибка SQL-запроса
« : 10 Января 2025, 15:30:51 »
Для удобства я написал такую функцию
Код: (delphi)
{ упрощенная реализация форматированного вывода
  fmt содержит подстановки:
  % - очередной аргумент (string, integer, boolean, single, double, extended)
  %% - процент
  формат вывода чисел по умолчанию (как в системе)
  если в массиве аргументов не хватает или больше, чем надо, ничего не происходит
  если в массиве неподдерживаемый аргумент, выводится знак вопроса
  использование:
    S := format('% % + % = %',['Результат', 1, 2, 1+2]);
    S = 'Результат 1 + 2 = 3';
}
function  format(const fmt : string; args : array of const) : string;
var
  position : integer;
  argpos : integer;
  Ch : string;
  V : Variant;
  S : string;
  VR : TVarRec;
  TS : string;
type TPS = ^string;
begin
  Result := '';
  position := 0;
  argpos := 0;

  while position <= length(fmt) do begin
    inc(position);
    Ch := fmt[position];
    if Ch <> '%' then begin
      // все, кроме %, копируется на выход
      Result := Result + Ch;
      continue;
    end;

    if position < length(fmt) then // добавлено 12.01.25: этой проверки не было, возможно, проблема с SQL была тут
    Ch := fmt[position+1];
    if Ch = '%' then begin
      // задвоенный % - это просто %
      Result := Result + '%';
      inc(position);
      continue;
    end else if argpos < length(args) then begin
      // поочередный вывод аргумента
      VR := args[argpos];
      inc(argpos);
      // в зависимости от типа аргумента
      case VR.VType of
      vtInteger     : S := IntToStr(VR.VInteger);
      vtBoolean     : if VR.VBoolean then S := 'true' else S := 'false';
      vtChar        : S := VR.VChar;
      vtExtended    : S := FloatToStr(VR.VExtended^);
      17 {!string!} : S := TPS(@args[argpos-1])^;
      else // неизвестно что
        S := '?';
      end;
      Result := Result + S;
    end;
  end;
end;
В ней всё прекрасно, кроме того, что "законными" средствами добраться до строки в массиве параметров невозможно, пришлось использовать грязный хак (см. пометку !string!). Не могли бы вы пояснить, почему обычный, то есть S := VR.VString^, не работает? И почему vtString в case тоже не даёт доступ к строке?

Предполагаю, что каким-то образом использование этой функции при построении запросов и влияло, но каким именно - не выяснил.

9
Ваши вопросы / Ошибка SQL-запроса
« : 09 Января 2025, 11:38:39 »
Почему возникает такая ошибка, как на скриншоте?
Запрос вроде бы корректный SHOW TABLES LIKE 'ut_%';, во всяком случае в MySQL Workbench выполняется без проблем (второй скриншот).

10
спасибо

11
Если попытаться установить "Не архивировать" для выделенной группы переменных, то это не происходит.

12
Спасибо.
Изначально я предполагал. что все однотипные скрипты вызываются при соответствующем условии, но в процессе работы что-то не заладилось у меня, и я начал думать, что или порядок важен, или вызывается только один скрипт, поэтому задал вопрос.
Теперь все стало по полочкам.

13
Вопрос такой: если имеется несколько скриптов типа "Выполнен SQL-запрос", каков порядок их обработки?
Или в проекте должен быть только один скрипт такого типа, который должен обрабатывать все возможные запросы?

Похоже, что вариант второй, но либо я проглядел, где это сказано, либо с этим надо что-то делать...

14
Ваши вопросы / Re: Copy-Paste
« : 16 Декабря 2024, 10:13:15 »
Скажите пожалуйста, а для операций Copy-Paste объектов (не текста и чисел) используется именно технология буфера обмена Windows или внутренние какие-то методы редактора?
То есть в буфер обмена Windows помещается полностью копируемые объекты или нет?

К чему вопрос: если я в редакторе объект скопирую, я смогу вставить его в другой редактор, запущенный на виртуальной машине (естественно, включив "разделение" буфера обмена)?

Отвечаю сам себе: нет, ничего не выйдет, через буфер обмена передаётся только текстовое содержимое, но не объекты.

15
Round() Возвращает число X округленное до ближайшего целого
Ну, тогда есть Trunc()

Принудительное преобразование типов по-настоящему требуется достаточно редко, и чаще всего свидетельствует о недопонимании чего-то важного...

Страницы: [1] 2 3 ... 8