Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: niyaz от 23 Декабря 2019, 21:55:08

Название: Вопрос при написании скрипта
Отправлено: niyaz от 23 Декабря 2019, 21:55:08
Здравствуйте. Хочу написать скрипт, который срабатывает при нажатии на кнопку. Как я понимаю, ошибка в теле if then, переменной не присваивается значение aCell. Никак не могу решить данную проблему. Если сможете помогите, пожалуйста.
Код: (delphi)
   for i:=1 to (tblStructure.RowCount) do
     begin
      aCell:= tblStructure.GetCell(3,i);  // берем id игредиента из таблицы tblStructure
      aCell1:= tblStructure.GetCell(5,i); // берем значение используемой массы ингредиента
        for j:=1 to (tblIngredients.RowCount) do
         begin
          aCell2:= tblIngredients.GetCell(0,j); // берем id игредиента из таблицы tblIngredients
          aCell3:= tblIngredients.GetCell(2,j); //берем массу ингредиента на складе
           if (aCell2 = aCell) then             //если id ингридиента сопадают то
            begin
             usemass:= StrToFloat(aCell1.Text);
             ingmass:= StrToFloat(aCell3.Text);
             difmass:= ingmass-usemass;         // оставшаяся масса ингредиента на складе
             aQuery:= 'UPDATE ingredients '+    // обновляем таблицу
                      'SET mass_ingredients= ' + QuotedStr(FloatToStr(difmass))+' '+
                      'WHERE id_ingredients= ' + QuotedStr(aCell2.Text);
             RunSQL(aQuery, nil, 23);
            end;
         end;
     end
Название: Re: Вопрос при написании скрипта
Отправлено: Simple-Scada от 24 Декабря 2019, 11:18:37
Здравствуйте.

Т.е. скрипт успешно компилируется, но во время работы не выполняет своих функций? Если так, значит какие-то из условий которые Вы описали в скрипте - не выполняются. После выполнения скрипта посмотрите журнал сервера (https://simple-scada.com/help/manual/server-journal.html), нет ли там сообщений об ошибках в скрипте? Также обратите внимание, что правильный цикл по всем строкам таблицы должен выглядеть так:
Код: (delphi)
for i := 0 to (tblStructure.RowCount - 1) do
т.к. нумерация строк начинается  с нуля. То же касается функции GetCell (https://simple-scada.com/help/script/tgetcell.html), в неё тоже нужно передавать индекс строки и столбца отсчитывая с нуля.

Также учитывайте, что условие "if (aCell2 = aCell) then" никогда не выполнится. Ведь в переменную "aCell" Вы сначала записываете ячейку "tblStructure.GetCell(3, i)", а в переменную "aCell2" записываете ячейку "tblIngredients.GetCell(0, j)". Во-первых это разные ячейки (с разными индексами строки/столбца). Во-вторых это ячейки разных таблиц. Поэтому они никак не могут быть равны и условие никогда не выполнится. Если нужно сравнивать содержимое ячеек, то нужно писать так:
Код: (delphi)
if (aCell2.Text = aCell.Text) then
, такое условие пройдёт если текст в ячейках полностью совпадает.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 24 Декабря 2019, 14:52:23
Спасибо вам огромное, все заработало.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 08 Января 2020, 20:13:34
Здравствуйте.
В Demo-проект есть пример секундомер, как можно переделать его под таймер. Задача в том, есть значения времени в минутах и при нажатии кнопки таймер должен отсчитывать время до этого значения, после чего изменяется значение другой переменной. Как это можно реализовать? Есть возможность поменять, где будет отображаться окно подтверждения(например в центре экрана, а не по координатам), который выбирается в свойствах объектов ? Возник вопрос про многомониторный режим, возможно ли так сделать, чтобы на другом экране отображалась только одна страница, а на основном все?
Название: Re: Вопрос при написании скрипта
Отправлено: Simple-Scada от 10 Января 2020, 12:16:14
Здравствуйте.

Все таймерные функции описаны здесь (https://simple-scada.com/help/script/timers.html). Для работы таймера нужно предварительно создать отдельную переменную типа DateTime в разделе редактирования переменных (https://simple-scada.com/help/manual/variable-new.html). Далее на основе этой переменной можно запустить таймер через процедуру TimerStart и скада начнёт отсчитывать в ней время. Как дальше работать с этим временем - зависит от Вас. Вы можете в отдельном секундном скрипте проверять не достигло ли отсчитанное время нужного количества минут. И если достигло, то выполнить какие-то действия.
Можно пойти и другим путём: вместо таймерных функций реализовать свой собственный таймер в скрипте с типом события "Прошла секунда". Например можно выделить отдельную переменную и в скрипте каждый раз увеличивать её на 1. Т.е. в переменной будет идти отчет секунд. И в зависимости от кол-ва секунд делать необходимые действия.

Цитировать
Есть возможность поменять, где будет отображаться окно подтверждения
Такой возможности нет, окна подтверждения всегда отображаются рядом с объектом.

Цитировать
Возник вопрос про многомониторный режим, возможно ли так сделать, чтобы на другом экране отображалась только одна страница, а на основном все?
Нет, многомониторный режим - это отображение текущего состояния проекта сразу на нескольких мониторах. Если все страницы в проекте видны, то они будут видны на всех мониторах.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 10 Января 2020, 13:13:39
Спасибо большое
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 13 Января 2020, 17:30:56
Здравствуйте.
Возник вопрос. Есть пример скрипта "Выполнен SQL-запрос", который выполняется только тогда когда набор данных помечен тегом 20
Код: (delphi)
var
s: string;
begin
  if DataSet.Tag = 20 then         // если набор данных помечен тегом 20
  begin
    ComboBox3.Clear;               // очищаем список
    if DataSet.IsEmpty then Exit;  // прерываем выполнение, если набор данных пуст
    while not DataSet.EOF do       // проходим в цикле по всем строкам полученного набора данных
    begin
      ComboBox3.AddItem(DataSet.Fields[0].AsStr);  // добавляем строку из первой колонки набора данных в список ComboBox3
      DataSet.Next;                // переходим к следующей строке набора данных
    end;
  end;
end.
Есть ли возможность, написать такой же скрипт для события "Ошибка SQL-запроса", то есть если не выполнен скрипт описанный выше с тегом 20.
Название: Re: Вопрос при написании скрипта
Отправлено: Simple-Scada от 14 Января 2020, 08:35:36
Здравствуйте. Нет, тег запроса получить нельзя. Доступен только параметр Msg, который содержит текст ошибки.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 18 Января 2020, 19:34:59
Здравствуйте.
Есть ли возможность изменить размер шрифта на другие, то есть нужно изменить размер шрифта больше чем 112-тонкий ?
Название: Re: Вопрос при написании скрипта
Отправлено: Simple-Scada от 19 Января 2020, 19:32:59
Здравствуйте. Нет, можно использовать только имеющиеся шрифты с максимальным размером 112.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 25 Января 2020, 18:42:43
Здравствуйте. Пишу данный фрагмент кода:
Код: (delphi)
btnUse.Enabled:= False;
В одном случае кнопка становится полностью недоступным, то есть нажать на кнопку больше нельзя, другом случае скрипт кнопки не работает, но нажать на кнопку можно. В чем заключается причина такого поведения?
Название: Re: Вопрос при написании скрипта
Отправлено: Simple_Scada от 27 Января 2020, 09:20:24
Здравствуйте.

Пришлите проект для проверки на support@simple-scada.com и уточните с какими кнопками не работает код, мы укажем в чем может быть ошибка.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 27 Января 2020, 22:54:34
Здравствуйте. Разобрался с вопросом при включении подсказки кнопка не работала, то есть скрипты прописанные для нее не срабатывали, но сама она прожималась. При отсутствии подсказки кнопка полностью стала неактивной.   
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 28 Января 2020, 16:36:03
Здравствуйте. Подскажите почему не работает данный фрагмент кода при нажатии на кнопку событие On_Click
Код: (delphi)
 btnAutoControl.Color:= clRed; 
Название: Re: Вопрос при написании скрипта
Отправлено: Simple_Scada от 28 Января 2020, 16:49:31
Здравствуйте.
Цвет нужно менять у необходимого состояния кнопки (https://simple-scada.com/help/script/btnstates.html). Обычно цвет кнопки для каждого состояния задается через редактор(см. свойство кнопки "Состояние" (https://simple-scada.com/help/manual/button.html)) без использования скриптов.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 28 Января 2020, 22:50:51
Добрый вечер. Благодарю за ответ.
Получается для того, чтобы цвета и текст кнопки менялись, которые мы указали на разных состояниях в редакторе, необходимо  связать с кнопкой какую либу переменную? Спасибо.
Название: Re: Вопрос при написании скрипта
Отправлено: Simple_Scada от 29 Января 2020, 11:12:13
Да, кнопка меняет состояния в соответствии со значениями связанной с ней переменной.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 28 Марта 2020, 19:37:43
Здравствуйте. Как получить значения выбранного из выпадающего списка ComboBox ? В списке есть, например горох, пшеница, овес. Необходимо, когда пользователь выбрал какую-нибудь из них, например горох в переменную записалось слово горох. Как это реализовать?
Название: Re: Вопрос при написании скрипта
Отправлено: Simple-Scada от 29 Марта 2020, 21:28:31
Здравствуйте.

Получить текст выбранной строки раскрывающегося списка можно через свойство Text (https://simple-scada.com/help/script/cmbtext.html).
Назначьте на событие OnDataChange раскрывающегося списка следующий код:
Код: (delphi)
begin
  myStrVar.Value := myComboBox.Text;   
end.
, где myStrVar - это переменная в которую будет записан текст выбранной строки;
  myComboBox - это сам раскрывающийся список.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 30 Марта 2020, 02:47:19
Спасибо большое. Подскажите пожалуйста, как сделать так, чтобы слова в в ячейке таблицы переходили на следующую строку(слова находятся в одной ячейке таблицы).
Название: Re: Вопрос при написании скрипта
Отправлено: Simple_Scada от 31 Марта 2020, 10:46:57
Здравствуйте.
Возможности переноса текста в ячейках таблицы нет.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 02 Октября 2020, 23:20:02
Здравствуйте, возникала следующая проблема.
Написал скрипт по изменению значения переменной выпадающего списка, который вызывает следующий скрипт
Код: (delphi)
begin
  if DataSet.Tag = 8 then         // если набор данных помечен тегом 8
  begin
    comboBoxIdDriver.Clear;                 // очищаем список список
      if DataSet.IsEmpty then Exit;  // прерываем выполнение, если набор данных пуст
      while not DataSet.EOF do       // проходим в цикле по всем строкам полученного набора данных
        begin
          comboBoxIdDriver.AddItem(DataSet.Fields[0].AsStr);  // добавляем строку из первой колонки набора данных в список comboBoxDriver
          DataSet.Next;                // переходим к следующей строке набора данных
        end;
  end;
end.
Данные в список вносятся, количество строк в списке может меняться. Если в списке выбрать вторую строку, затем вызвать скрипт представленный выше, данные в списке отображаются некорректно. Первая строка остается пустой, приходится выбирать необходимое значение из списка. Можно ли это как это исправить и в чем может заключаться проблема?
Описание скриншотов: выбрал значение в правом выпадающем списке, который вызывал скрипт  заполнения левого списка, выбрал вторую строку из левого списка. Затем еще раз выбрал значения из правого списка, в данном случае в левый список должно записаться только 1 значение, первая строка остается пустой, а нужное значение записывается в следующее. 
Название: Re: Вопрос при написании скрипта
Отправлено: pan2000 от 04 Октября 2020, 02:51:19
      Здравствуйте.

После выбора строки из более длинного списка и обновлении списка на более короткий, переменная индекса выбранной строки (авто-генерируемая или основная) сохранила значение и стала указывать на несуществующую строку списка.
Для указания индекса следует явно использовать основную переменную и обнулять при выполнении процедуры Clear:
Код: (delphi)
 . . .
    comboBoxIdDriver.Clear;                 // очищаем список список
    comboBoxIdDriverIndex.Value := 0;       // устанавливаем индекс выбранной строки на начало списка
. . .
При удалении строк из списка может возникнуть аналогичная ситуация - пустая строка выбора, причем основная переменная-индекс после удаления строки перестает быть непрерывной. Так что для исключения "артефакта пустой строки" при удалении строк наиболее приемлемый способ это полная перезапись списка с коррекцией переменной-индекса.
Посмотреть поведение списков с переменной и авто-переменной можно в проекте из вложения.
Название: Re: Вопрос при написании скрипта
Отправлено: niyaz от 06 Октября 2020, 00:01:22
Спасибо за ответ и примеры, очень помогло.