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

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

Автор Тема: Вопрос при написании скрипта  (Прочитано 10601 раз)

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Вопрос при написании скрипта
« : 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
« Изменён: 24 Декабря 2019, 11:01:07 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3225
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос при написании скрипта
« Ответ #1 : 24 Декабря 2019, 11:18:37 »
Здравствуйте.

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

Также учитывайте, что условие "if (aCell2 = aCell) then" никогда не выполнится. Ведь в переменную "aCell" Вы сначала записываете ячейку "tblStructure.GetCell(3, i)", а в переменную "aCell2" записываете ячейку "tblIngredients.GetCell(0, j)". Во-первых это разные ячейки (с разными индексами строки/столбца). Во-вторых это ячейки разных таблиц. Поэтому они никак не могут быть равны и условие никогда не выполнится. Если нужно сравнивать содержимое ячеек, то нужно писать так:
Код: (delphi)
if (aCell2.Text = aCell.Text) then
, такое условие пройдёт если текст в ячейках полностью совпадает.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #2 : 24 Декабря 2019, 14:52:23 »
Спасибо вам огромное, все заработало.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #3 : 08 Января 2020, 20:13:34 »
Здравствуйте.
В Demo-проект есть пример секундомер, как можно переделать его под таймер. Задача в том, есть значения времени в минутах и при нажатии кнопки таймер должен отсчитывать время до этого значения, после чего изменяется значение другой переменной. Как это можно реализовать? Есть возможность поменять, где будет отображаться окно подтверждения(например в центре экрана, а не по координатам), который выбирается в свойствах объектов ? Возник вопрос про многомониторный режим, возможно ли так сделать, чтобы на другом экране отображалась только одна страница, а на основном все?
« Изменён: 09 Января 2020, 13:48:51 от niyaz »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3225
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос при написании скрипта
« Ответ #4 : 10 Января 2020, 12:16:14 »
Здравствуйте.

Все таймерные функции описаны здесь. Для работы таймера нужно предварительно создать отдельную переменную типа DateTime в разделе редактирования переменных. Далее на основе этой переменной можно запустить таймер через процедуру TimerStart и скада начнёт отсчитывать в ней время. Как дальше работать с этим временем - зависит от Вас. Вы можете в отдельном секундном скрипте проверять не достигло ли отсчитанное время нужного количества минут. И если достигло, то выполнить какие-то действия.
Можно пойти и другим путём: вместо таймерных функций реализовать свой собственный таймер в скрипте с типом события "Прошла секунда". Например можно выделить отдельную переменную и в скрипте каждый раз увеличивать её на 1. Т.е. в переменной будет идти отчет секунд. И в зависимости от кол-ва секунд делать необходимые действия.

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

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

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #5 : 10 Января 2020, 13:13:39 »
Спасибо большое

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #6 : 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.
« Изменён: 13 Января 2020, 17:55:46 от niyaz »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3225
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос при написании скрипта
« Ответ #7 : 14 Января 2020, 08:35:36 »
Здравствуйте. Нет, тег запроса получить нельзя. Доступен только параметр Msg, который содержит текст ошибки.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #8 : 18 Января 2020, 19:34:59 »
Здравствуйте.
Есть ли возможность изменить размер шрифта на другие, то есть нужно изменить размер шрифта больше чем 112-тонкий ?
« Изменён: 18 Января 2020, 20:02:01 от niyaz »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3225
    • Просмотр профиля
    • Simple-Scada
Re: Вопрос при написании скрипта
« Ответ #9 : 19 Января 2020, 19:32:59 »
Здравствуйте. Нет, можно использовать только имеющиеся шрифты с максимальным размером 112.

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #10 : 25 Января 2020, 18:42:43 »
Здравствуйте. Пишу данный фрагмент кода:
Код: (delphi)
btnUse.Enabled:= False;
В одном случае кнопка становится полностью недоступным, то есть нажать на кнопку больше нельзя, другом случае скрипт кнопки не работает, но нажать на кнопку можно. В чем заключается причина такого поведения?

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1414
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #11 : 27 Января 2020, 09:20:24 »
Здравствуйте.

Пришлите проект для проверки на support@simple-scada.com и уточните с какими кнопками не работает код, мы укажем в чем может быть ошибка.
« Изменён: 27 Января 2020, 09:23:20 от Simple-Scada »

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #12 : 27 Января 2020, 22:54:34 »
Здравствуйте. Разобрался с вопросом при включении подсказки кнопка не работала, то есть скрипты прописанные для нее не срабатывали, но сама она прожималась. При отсутствии подсказки кнопка полностью стала неактивной.   

niyaz

  • Новичок
  • *
  • Сообщений: 43
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #13 : 28 Января 2020, 16:36:03 »
Здравствуйте. Подскажите почему не работает данный фрагмент кода при нажатии на кнопку событие On_Click
Код: (delphi)
 btnAutoControl.Color:= clRed; 

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1414
    • Просмотр профиля
Re: Вопрос при написании скрипта
« Ответ #14 : 28 Января 2020, 16:49:31 »
Здравствуйте.
Цвет нужно менять у необходимого состояния кнопки. Обычно цвет кнопки для каждого состояния задается через редактор(см. свойство кнопки "Состояние") без использования скриптов.