Вопросы по скриптам в Simple-Scada 2

Автор Simple-Scada, 29 января 2016, 15:19:20

deldemo

#555
Здравствуйте.
Ребята, сегодня добавил вот такой запрос в проект.
Код: pascal
var
{Заполняем таблицу tblSpisok_TH03 "Перечень компонентов ручного ввода"}
  aQuery:string;
begin
  aQuery :=    'SELECT    AR.AR_ARTICLE_ID              AS AR_ARTICLE_ID '+
                         ',AR.AR_NAME                   AS AR_NAME'+
                         ',SUM(TMP.TDB_DOSINGWEIGHT)    AS TDB_DOSINGWEIGHT'+
                         ',CASE TMP.TDB_ACTIVE WHEN 1 THEN ''Добавлен'' ELSE '''' end  AS ACTIVE '+
               'FROM TMP_DOSINGBATCHES TMP '+
               'INNER JOIN CFG_BATCHES BD ON BD.BD_PLC_BATCHNUMBER = TMP.TDB_PLC_BATCHNUMBER '+
               'INNER JOIN CFG_RAWMATERIAL RM ON RM.RM_RAWMAT_ID = TMP.TDB_RAWMAT_ID '+
               'INNER JOIN CFG_ARTICLE AR ON AR.AR_ARTICLE_ID = RM.RM_RAWMAT_ID '+
               'WHERE   BD_BATCHNUMBER = (SELECT MAX(BD_BATCHNUMBER) '+
               'FROM CFG_BATCHES '+
               'INNER JOIN TMP_DOSINGBATCHES ON TDB_PLC_BATCHNUMBER = BD_PLC_BATCHNUMBER '+
               'INNER JOIN CFG_WEIGHER ON WG_WEIGHER_ID = TDB_WEIGHER_ID '+
               'INNER JOIN CFG_UNITS ON UN_BATCHNUMBER = BD_BATCHNUMBER '+
               'INNER JOIN CFG_UNIT_DEVICES ON UN_UNIT_ID = UDS_UNIT_ID AND WG_DEVICE_ID = UDS_DEVICE_ID '+
               'AND UN_BATCHNUMBER > 1 '+
               'AND TDB_WEIGHER_ID = 6) '+
               'AND TMP.TDB_WEIGHER_ID = 6 '+
               'AND TMP.TDB_MODIFYTYPE <> ''D'' '+
               'GROUP BY TMP.TDB_PLC_BATCHNUMBER'+
               ',RTRIM(AR.AR_ARTICLECODE)'+
               ',AR.AR_NAME '+
               ',AR.AR_ARTICLE_ID '+
               ',TMP.TDB_WEIGHER_ID '+
               ',TMP.TDB_ACTIVE '+
               'ORDER BY TMP.TDB_PLC_BATCHNUMBER, MIN(TDB_SEQUENCENUMBER) ';

  tblSpisok_TH03.RunSQL(aQuery, tsSaveFixRow);
end.
   

Получается таблица похожая на эту:
+-------------------+---------------------+--------------------------+------------------+                   
|  AR_ARTICLE_ID |       AR_NAME       |  TDB_DOSINGWEIGHT |       ACTIVE       |
+-------------------+---------------------+--------------------------+------------------+
|           32           |  Магния оксид      |                 24.2232      |   Добавлен       |
+-------------------+---------------------+--------------------------+------------------+

Но есть одно Но. Когда запрос выполняется в SQL, все проходит гладко и происходит подстановка
в колонку ACTIVE значения вместо 1 - 'Добавлен', а вместо 0 - пустую строку с помощью  CASE.
Но если тот же запрос выполнять через клиент с автозаполнением таблицы, то в колонке ACTIVE всегда записывается 'Добавлен'

deldemo

Все вопрос снят.
Вообщем ситуация следующая. Если в таблицу с автозаполнением вписать статичный текст а при запросе к SQL будет возвращаться пустая строка, то выше указанный статичный текст будет множится на все пустые строки.
(статичный текст вписывал для проб и настройки шрифтов)

Romz_ru

Подскажите пожалуйста, как в редакторе скриптов отменить изменения в коде (обычный Ctrl+Z не работает).

Victor_P.

Расскажите пожалуйста более подробно, как (последовательно/параллельно) исполняются скрипты. Какие есть приоритеты исполнения, последовательность и т.п.
Вот, например, у меня есть скрипт, который при изменении переменной делает в цикле несколько однотипных SQL-запросов (инсертов) с разными данными.
Пока работает все норм., но хотелось бы понять саму "механику" работы. Как идут эти запросы в базу? Просто перемещаются в какую-то очередь и исполняются один за другим с ожиданим подтверждения/ошибки исполнения от предидущего или посылаются в базу без ожидания ответа (который просто обрабатывается в другом скрипте по событию).
Может ли быть ситуация, когда один из этих запросов не обработается по причине занятости СУБД обработкой предидущего запроса?
Когда возникает событие "выполнен SQL-запрос" в этой ситуации? Если после выполнения каждого, тода получается, что это событие может прерывать выполнение цикла в текущем скрипте, что врядли. Или же это событие будет наступать только после отправки последнего запроса из цикла и завершения выполнения текущего скрипта.
Вот такого плана информация интересует.

Simple-Scada

#559
Цитата: Romz_ru от 20 декабря 2017, 00:28:28Подскажите пожалуйста, как в редакторе скриптов отменить изменения в коде (обычный Ctrl+Z не работает).
Комбинация Ctrl+Z отвечает за отмену действия. Может быть Вы используете старую версию скады? (отмена действий доступна с версии 2.2.2.0 и выше).
В ином случае убедитесь, что во время нажатия комбинации Ctrl+Z курсор установлен в редактор кода. Используйте комбинацию несколько раз, т.к. перемещения курсора тоже могут считаться за действие.

Цитата: Victor_P. от 20 декабря 2017, 09:01:30Расскажите пожалуйста более подробно, как (последовательно/параллельно) исполняются скрипты.
Скрипты выполняются последовательно в том порядке, в котором были вызваны. Запросы к БД ставятся в очередь, а затем выполняются в отдельных потоках параллельно. После выполнения любого из запросов вызываются скрипты с типом "Выполнен SQL-запрос". При возникновении ошибки во время выполнения SQL-запроса вызываются скрипты с типом "Ошибка SQL-запроса".

ЦитироватьМожет ли быть ситуация, когда один из этих запросов не обработается по причине занятости СУБД обработкой предидущего запроса?
Нет, иначе работа с СУБД была бы крайне ненадежной.

ЦитироватьКогда возникает событие "выполнен SQL-запрос" в этой ситуации? Если после выполнения каждого, тода получается, что это событие может прерывать выполнение цикла в текущем скрипте, что врядли. Или же это событие будет наступать только после отправки последнего запроса из цикла и завершения выполнения текущего скрипта.
В этом случае сначала пройдет весь цикл, запросы добавятся в очередь и скрипт завершится (это займёт миллисекунды). Далее скада будет брать сразу несколько запросов и выполнять их в отдельных потоках параллельно. Тот, который выполнится первым вызовет событие "выполнен SQL-запрос" первым. Выполнится вторым, вызовет "выполнен SQL-запрос" вторым и т.д.

AndreiKov

Добрый день.
Возможно ли в скрипте получить текущее количество неподтвержденных или активных сообщений?

Victor_P.

#561
А есть какая-нибудь команда для открытия(показа) окна?
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.

AndreiKov

Цитата: Victor_P. от 21 декабря 2017, 08:58:22А есть какая-нибудь команда для открытия(показа) окна?
Например, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
https://simple-scada.com/help/script/tmwindow.html

Simple_Scada

#563
Здравствуйте!

ЦитироватьВозможно ли в скрипте получить текущее количество неподтвержденных или активных сообщений?
Нет. Пожалуйста опишите для чего это может потребоваться?

ЦитироватьНапример, хочу сделать, чтоб при наступлении события ошибки исполнения определенных SQL-запросов скрипт открывал окно с текстом ошибки.
Victor_P., для этой цели лучше подойдут процедуры ShowMessageClient и ShowMessageAll.

AndreiKov

#564
Цитата: Simple_Scada от 21 декабря 2017, 11:26:16Нет. Пожалуйста опишите для чего это может потребоваться?
После подтверждения сообщения оператор может забыть(или не передать по смене), что событие ещё активно.
Нужно отображать предупреждение, если есть активные сообщения(неустранённые аварии).

Simple_Scada

Для этого можно использовать компонент "Список сообщений", выбрав в свойстве "Группа" пункт "Активные сообщения", тогда в списке будут отображаться только активные сообщения.

AndreiKov

Цитата: Simple_Scada от 21 декабря 2017, 12:22:19Для этого можно использовать компонент "Список сообщений", выбрав в свойстве "Группа" пункт "Активные сообщения", тогда в списке будут отображаться только активные сообщения.
Это понятно. Но хочется сделать как на картинке, компактную кнопку, появляющуюся, если есть активные сообщения.
Список сообщений занимает много лишнего места и отображает пустоту, когда активных сообщений нет.

Simple-Scada

AndreiKov в ближайшем обновлении добавим функцию которая позволит реализовать описанное.

Victor_P.

Подскажите, как сделать переключатель.
Например, у меня есть 5 кнопок (bt0 .. bt4) и переменная Val типа byte. Кнопки привязаны к переменной, каждая к своему биту (0 .. 4) и в их свойствах прописаны тиги (0 .. 4).
На обработчик события OnClick каждой кнопки повешен скрипт:
Код: pascal
if not GetBit(Val.AsInt, Sender.Tag) then Val.Value := 0;
Все работает,- при нажатии на каждую кнопку, лбая другая нажатая отжимается, но...! Если я нажимаю на нажатую кнопку, то она тоже отжимается.
Как сделать, чтобы нажимались только отжатые кнопки, а при нажатии на нажатую она не реагировала? Т.е. как сделать переключатель, в котором одна кнопка обязательно должна быть нажата?

pan2000

#569
Victor_P., эги  кнопок по значениям битов: 1, 2, 4, 8, 16. Обработчик событий OnClick и OnMouseUp:
Код: pascal
Val.Value := Sender.Tag;
Первый изменяет вид кнопки при нажатии, а второй - фиксирует нажатую кнопку.
Пример во вложении. Обратите внимание на возможность любой исходной комбинации включенных кнопок (!).