Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: ART63 от 05 Апреля 2022, 13:46:10

Название: Переход на подстраницы
Отправлено: ART63 от 05 Апреля 2022, 13:46:10
Добрый день!

При нажатии на кнопку экземпляра шаблона должен осуществляться переход на соответствующую подстраницу.
Информация по странице берется из БД. Вот код процедуры.
Код: (delphi)
var
  sResult: string;
  lSubpage: TM_Subpage;
begin
  if DataSet.Tag=2 then
    begin
      sResult:='spg' + DataSet.Fields[0].AsStr;
      lSubpage:=GetSubpageByName(sResult);
      if lSubpage <> nil then
        begin
          AddMessage(Now,mkMessage,'Переход на подстраницу ' + sResult,false,true);
          lSubpage.GoToSubpageClient(GetClientName);
//          spg22.GoToSubpageClient(GetClientName);
        end;
    end;
end.
Имя страницы формируется корректно, о чем свидетельствует наличие сообщений в журнале. Но переход не происходит.
Пишу явный переход (под комментарием). Перехода все равно нет. В чем может быть проблема? Что не так делаю? Версия 2.5.15.3.
Название: Re: Переход на подстраницы
Отправлено: Simple Scada от 05 Апреля 2022, 14:51:20
Здравствуйте.

Внимательно ознакомьтесь с описанием функции GetClientName (https://simple-scada.com/help/script/getclientname.html). В скрипте на событие "Выполнен SQL-запрос" данная функция работать не будет. В этом скрипте можно указывать только какое-то конкретное имя клиента.
Название: Re: Переход на подстраницы
Отправлено: ART63 от 06 Апреля 2022, 12:38:15
Добрый день!

Можно было бы создать переменную vCurrentClient и при нажатии на кнопку присвоить ей GetClientName, а потом обработать ее в скрипте "Выполнен SQL-запрос".
Но, как я понимаю, эта переменная общая и возможен вариант, когда другой пользователь ее изменит в процессе выполнения запроса.
Название: Re: Переход на подстраницы
Отправлено: Simple_Scada от 07 Апреля 2022, 11:12:23
Цитировать
Но, как я понимаю, эта переменная общая и возможен вариант, когда другой пользователь ее изменит в процессе выполнения запроса.
Все верно, если пользователей будет несколько, то данный способ будет работать некорректно, т.к. будут возникать ситуации, когда несколько пользователей нажмут кнопку примерно в одно время и переменная изменится несколько раз.
Название: Re: Переход на подстраницы
Отправлено: pan2000 от 09 Апреля 2022, 19:53:02
    Здравствуйте.

Кроме конфликта клиентов для Вашего примера еще есть конфликт SQL-запросов и конфликт двух одиночных нажатий ЛКМ (двойной клик) оператором.
С оператором, увы, сделать ничего нельзя. Разрешить первые два эти конфликта можно двумя способами:

1. "кто первый встал тому и тапки" - отклонением действий всех клиентов, кроме первого. В качестве флажка возможности перехода можно использовать "пустое" значение переменной vCurrentClient.
Скрипт по нажатию кнопки:
Код: (delphi)
begin
  if vCurrentClient.AsStr <> '' then exit;
  vCurrentClient.Value := GetClientName;
  RunSQL('...', nil, 2);
  . . .
end.
Скрипт обработки SQL-запроса:
Код: (delphi)
begin 
  . . .
  GetSubpageByName('spg' + DataSet.Fields[0].AsStr).GoToSubpageClient(vCurrentClient.AsStr);
  vCurrentClient.Value "= '';
  ...
end.
2. Использовать список клиентов, запросивших переход к подстранице. Список обслуживается аналогично пункту 1. Размер списка определяет количество одновременно обслуживаемых клиентов и теоретически равен удвоенному числу клиентов, максимально возможных к одновременному подключению.
Во вложении пример подстраничного перехода для списка из 6 элементов. К проекту необходимо предварительно подключить БД. В индикации (одной на всех) указаны имя подстраницы перехода, имя клиента и Tag запроса. Первый запрос имеет Tag=1, второй - 2 и т.д.
При некотором терпении, "двойной клик ЛКМ" может вызвать два перехода - см. счетчик максимального заполнения списка.
Название: Re: Переход на подстраницы
Отправлено: ART63 от 11 Апреля 2022, 14:33:28
Добрый день!

Большое спасибо за ваши решения! Пока реализовал первый вариант, чтоб закрыть вопрос.