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

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

Автор Тема: Список он же ComboBox  (Прочитано 2962 раз)

Серега

  • Старожил
  • ****
  • Сообщений: 290
    • Просмотр профиля
Список он же ComboBox
« : 25 Февраля 2020, 18:04:48 »
Добрый день!
Задачу поставили но столкнулся с непоняткой.
Есть таблица. Скрипт на полный запуск проекта заполняет через Таблица_в_СКАДЕ.RunSQL('SELECT * FROM `Таблица_в_БД`', tsSaveFixRow) данными Таблица_в_СКАДЕ.
Иногда значения в таблице нужно перезаписать полностью и по принципу заполнения рецептов это в ручную можно долго и нудно сделать.
Но если использовать элемент список вроде все просто. Без привязки к внутренней/внешней переменной.
Согласно индексу выбранной строки делаем соответствующий SQL запрос через IF. Пусть это будет универсальный скрипт.
Код: (delphi)
var
  I: Integer;
  aQuery: string;
begin
  I := ComboBox1.ItemIndex; // получить индекс выбранной строки списка
  if I = 0  then
    tblWaysLimits_f.RunSQL('SELECT * FROM '+ Chr(96) + UpdateInfoLimits_f.AsStr + Chr(96), tsSaveFixRow);

  if I = 1 then
    tblWaysLimits_f.RunSQL('SELECT * FROM '+ Chr(96) + UpdateInfoLimits_f.AsStr + '_1' + Chr(96), tsSaveFixRow);

  if I = 2  then
    ShowMessageClient(GetClientName, 'Alarm!', '2');

  if I = 3  then
    ShowMessageClient(GetClientName, 'Alarm!', '3');
end.

И вот тут начинаются вопросы.
1. данный универсальный скрипт нужно вешать на какую реакцию? по нажатию, но тогда индекс строки будет равен той которая выбрана именно  сейчас. Если выбираем 2 строку, то только со второго нажатия получиться. Правда не получилось на тест-серваке (клон боевого) повторить.
2. если текст скрипта перенести в секундный, то вроде работает. Но
2.1. если у клиента нет имени работает
2.2. если установить имя в настройках не работает на половину. Скрипт вверху запросы делает, а вот вывод сообщений нет.
Правда еще "игрался" с пользователями. Но вроде они ни на что не влияют.
Да версия у нас сейчас 2.3.6.8.
3. Пытался с привязкой к внутренней переменной повторить, но запутался.
Резюме. В целом задача сводиться к следующему:
На одном конкретном клиенте (имя известно и только на нем) конкретный пользователь (имя известно и только он) через список (конкретный и автоматически формирующейся в зависимости от условий выбора, проверено работает так как надо) может изменить через SQL-запрос значения в массиве данных (таблицы), если надо и загрузить начальный массив или модернизированный куда надо. Вот. Надеюсь понятно написал.
Пока просто проверьте у себя с сообщениями.
И может как работать со списком более подробно опишите.
Жду вопросов и предложений.
« Изменён: 25 Февраля 2020, 18:06:03 от Simple-Scada »

Серега

  • Старожил
  • ****
  • Сообщений: 290
    • Просмотр профиля
Re: Список он же ComboBox
« Ответ #1 : 26 Февраля 2020, 12:03:37 »
Добрый день!
Блин извиняюсь. Завел всех в заблуждение.
С показом сообщения и в универсальном и в секундном скриптах разобрались и поняли. И читать надо хэлп ВНИМАТЕЛЬНО!
Цитировать
"... Важно! Данная функция не работает ... а также при вызове из системных типов событий ... , "Прошла секунда", ..."
Ну а поводу Списка вопросы остаются.

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3224
    • Просмотр профиля
    • Simple-Scada
Re: Список он же ComboBox
« Ответ #2 : 26 Февраля 2020, 15:27:13 »
Здравствуйте.

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

Также в коде можно использовать case:
Код: (delphi)
var
  I: Integer;
  aQuery: string;
begin
  I := ComboBox1.ItemIndex; // получить индекс выбранной строки списка
  case I of
    0: tblWaysLimits_f.RunSQL('SELECT * FROM '+ Chr(96) + UpdateInfoLimits_f.AsStr + Chr(96), tsSaveFixRow);
    1: tblWaysLimits_f.RunSQL('SELECT * FROM '+ Chr(96) + UpdateInfoLimits_f.AsStr + '_1' + Chr(96), tsSaveFixRow);
    2: ShowMessageClient(GetClientName, 'Alarm!', '2');
    3: ShowMessageClient(GetClientName, 'Alarm!', '3');
  end;
end.
« Изменён: 26 Февраля 2020, 15:29:34 от Simple-Scada »