Здравствуйте. Хочу написать скрипт, который срабатывает при нажатии на кнопку. Как я понимаю, ошибка в теле if then, переменной не присваивается значение aCell. Никак не могу решить данную проблему. Если сможете помогите, пожалуйста.
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
Здравствуйте.
Т.е. скрипт успешно компилируется, но во время работы не выполняет своих функций? Если так, значит какие-то из условий которые Вы описали в скрипте - не выполняются. После выполнения скрипта посмотрите журнал сервера (https://simple-scada.com/help/manual/server-journal.html), нет ли там сообщений об ошибках в скрипте? Также обратите внимание, что правильный цикл по всем строкам таблицы должен выглядеть так:
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)". Во-первых это разные ячейки (с разными индексами строки/столбца). Во-вторых это ячейки разных таблиц. Поэтому они никак не могут быть равны и условие никогда не выполнится. Если нужно сравнивать содержимое ячеек, то нужно писать так:
if (aCell2.Text = aCell.Text) then
, такое условие пройдёт если текст в ячейках полностью совпадает.
Здравствуйте.
Возник вопрос. Есть пример скрипта "Выполнен SQL-запрос", который выполняется только тогда когда набор данных помечен тегом 20
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.
Здравствуйте. Подскажите почему не работает данный фрагмент кода при нажатии на кнопку событие On_Click
btnAutoControl.Color:= clRed;
Здравствуйте.
Получить текст выбранной строки раскрывающегося списка можно через свойство Text (https://simple-scada.com/help/script/cmbtext.html).
Назначьте на событие OnDataChange раскрывающегося списка следующий код:
begin
myStrVar.Value := myComboBox.Text;
end.
, где myStrVar - это переменная в которую будет записан текст выбранной строки;
myComboBox - это сам раскрывающийся список.
Здравствуйте, возникала следующая проблема.
Написал скрипт по изменению значения переменной выпадающего списка, который вызывает следующий скрипт
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 значение, первая строка остается пустой, а нужное значение записывается в следующее.
Здравствуйте.
После выбора строки из более длинного списка и обновлении списка на более короткий, переменная индекса выбранной строки (авто-генерируемая или основная) сохранила значение и стала указывать на несуществующую строку списка.
Для указания индекса следует явно использовать основную переменную и обнулять при выполнении процедуры Clear:
. . .
comboBoxIdDriver.Clear; // очищаем список список
comboBoxIdDriverIndex.Value := 0; // устанавливаем индекс выбранной строки на начало списка
. . .
При удалении строк из списка может возникнуть аналогичная ситуация - пустая строка выбора, причем основная переменная-индекс после удаления строки перестает быть непрерывной. Так что для исключения "артефакта пустой строки" при удалении строк наиболее приемлемый способ это полная перезапись списка с коррекцией переменной-индекса.
Посмотреть поведение списков с переменной и авто-переменной можно в проекте из вложения.