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

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

Автор Тема: Переход на подстраницы  (Прочитано 887 раз)

ART63

  • Постоялец
  • ***
  • Сообщений: 149
    • Просмотр профиля
Переход на подстраницы
« : 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.
« Изменён: 07 Апреля 2022, 15:50:16 от Simple-Scada »

Simple Scada

  • Глобальный модератор
  • *****
  • Сообщений: 166
    • Просмотр профиля
    • Simple-Scada
Re: Переход на подстраницы
« Ответ #1 : 05 Апреля 2022, 14:51:20 »
Здравствуйте.

Внимательно ознакомьтесь с описанием функции GetClientName. В скрипте на событие "Выполнен SQL-запрос" данная функция работать не будет. В этом скрипте можно указывать только какое-то конкретное имя клиента.
« Изменён: 06 Апреля 2022, 09:28:48 от Simple-Scada »

ART63

  • Постоялец
  • ***
  • Сообщений: 149
    • Просмотр профиля
Re: Переход на подстраницы
« Ответ #2 : 06 Апреля 2022, 12:38:15 »
Добрый день!

Можно было бы создать переменную vCurrentClient и при нажатии на кнопку присвоить ей GetClientName, а потом обработать ее в скрипте "Выполнен SQL-запрос".
Но, как я понимаю, эта переменная общая и возможен вариант, когда другой пользователь ее изменит в процессе выполнения запроса.

Simple_Scada

  • Администратор
  • *****
  • Сообщений: 1178
    • Просмотр профиля
Re: Переход на подстраницы
« Ответ #3 : 07 Апреля 2022, 11:12:23 »
Цитировать
Но, как я понимаю, эта переменная общая и возможен вариант, когда другой пользователь ее изменит в процессе выполнения запроса.
Все верно, если пользователей будет несколько, то данный способ будет работать некорректно, т.к. будут возникать ситуации, когда несколько пользователей нажмут кнопку примерно в одно время и переменная изменится несколько раз.

pan2000

  • Постоялец
  • ***
  • Сообщений: 171
    • Просмотр профиля
Re: Переход на подстраницы
« Ответ #4 : 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 и т.д.
При некотором терпении, "двойной клик ЛКМ" может вызвать два перехода - см. счетчик максимального заполнения списка.

ART63

  • Постоялец
  • ***
  • Сообщений: 149
    • Просмотр профиля
Re: Переход на подстраницы
« Ответ #5 : 11 Апреля 2022, 14:33:28 »
Добрый день!

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