CftClub.ru
Клуб специалистов ЦФТ-Банк

Расширение с исполнением клиент-скрипта
На страницу 1, 2  След.
 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы
Предыдущая тема :: Следующая тема  
Автор Сообщение
IXaNI
Участник со стажем


Вступление в Клуб: 27.08.2012
СообщениеСр Фев 15, 2017 11:22   Расширение с исполнением клиент-скрипта Ответить с цитатой
Полезность: Нет оценки
Коллеги, добрый день!

Стоит задача повесить на операцию расширение, которое будет по нажатию на "ОК" на ЭФ вызывать и исполнять в клиент-скрипте код:

Код:
'if MsgBox("'||err_msg||'. Продолжить?", vbQuestion + vbYesNo) <> vbYes Then
   Main = null
end if'


Подскажите, как это можно сделать? И возможно ли в принципе?
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеСр Фев 15, 2017 13:34    Ответить с цитатой
Полезность: Нет оценки
Можно. У меня даже сработало с невалидируемым OK.

В расширении

Код:

Public Function Main(LastControl)
   Execute V_DEST_EXT.TEXT
   V_DEST_EXT.TEXT = ""


   If LastControl Is Nothing Then
      ' Действия при загрузке формы
   Else
      ' Действия при потере фокуса валидируемого контрола LastControl

   End If
   Main = True ' Результирующее значение валидатора (True или False)   
End Function


Private Sub OK_OnClick
   MsgBox "!"
end sub


В расширении Дополнительные свойства - проверки
Сервер, Клиент
Сервер, Клиент

надо выставить и проверить, у меня ругался Администратор несколько раз (16.5) потом выставилось как то

V_DEST_EXT завести в переменных строка 32к, положить в редакторе на форму расширения
Alkov
Профи


Вступление в Клуб: 23.09.2010
СообщениеЧт Фев 16, 2017 03:44    Ответить с цитатой
Полезность: Нет оценки
Только
Main = True ' Результирующее значение валидатора (True или False)
должно быть до
Execute V_DEST_EXT.TEXT
а не после,
а то переопределит Main
и в err_msg не должно быть двойных кавычек...
IXaNI
Участник со стажем


Вступление в Клуб: 27.08.2012
СообщениеЧт Фев 16, 2017 16:19    Ответить с цитатой
Полезность: Нет оценки
Спасибо за ответы)
Уже сам справился.
KhrushchevAV
Участник со стажем


Вступление в Клуб: 17.10.2014
СообщениеПн Фев 20, 2017 09:02   Расширение и клиент скрипт Ответить с цитатой
Полезность: Нет оценки
Похожая задача. Может подскажите, пока не забылась проблема Smile.

Надо сделать дополнительную проверку, и предупредить пользователя.

Делаем расширение. Пишем в секции "проверка":
Код:
if (p_message = 'DEFAULT') then
  [CSMD].init_form(V_DEST_STR, &METHOD$CLASS, &METHOD$SNAME);
   
  -- наша проверка
  if (..) then
    [CSMD].MessageBox(V_DEST_STR,'Внимание!','Наше сообщение');
    debug_pipe('V_DEST_STR='||V_DEST_STR);   
  end if;

end if;

В клиент скрипте, как в писании сказано:
Код:
Public Function Main(LastControl)
   Execute V_DEST_STR.TEXT
   Main = true
End Function

Переменная V_DEST_STR уже есть и на форме и в переменных (в дистрибутивной операции которую мы расширяем).
Проверки в свойствах операции стоят правильные "Сервер, клиент".

Ну и ... Не работает. (Зачем бы иначе писать?).
debug_pipe выводит правильную V_DEST_STR , но пользователь никакого сообщения не получает.

Ну... Думаю я. Забыл какой-то пируэт из шаманского танца с [CSMD].
Перечитал. Нет вроде все ок.
Создал новую операшку, повторил все в ней - работает с первого запуска. (Да, все программисты знают, что это подозрительно. Но для операции из 5 строк в принципе допустимоSmile ).

Вывод.
Какая-то хитрость именно с расширением.
Задача вроде относительно стандартная. Так что, кто-то наверняка сталкивался. Поделитесь, плз.
IXaNI
Участник со стажем


Вступление в Клуб: 27.08.2012
СообщениеПн Фев 20, 2017 09:27    Ответить с цитатой
Полезность: Нет оценки
KhrushchevAV, похоже у меня как раз такая же ситуация была. Вы проверку куда в расширении ставите?
До или после исполнения
Код:
&BASE$SETVARS;
&BASE$VALIDATE;
&BASE$GETVARS;

??

В моем случае я строку для валидатора (V_VB) так же использовал уже имеющуюся в дистрибутивной операции. И если заполнять ее после строки &BASE$SETVARS;, то V_VB обнулялась до выполнения клиент-скрипта (т.к. по сути не передавалась в базовую операцию).
Соответственно, попробуйте написать в таком виде:
Код:

begin
   if (p_message = 'DEFAULT') then
     [CSMD].init_form(V_DEST_STR, &METHOD$CLASS, &METHOD$SNAME);
      
     -- наша проверка
     if <...> then
       [CSMD].MessageBox(V_DEST_STR,'Внимание!','Наше сообщение');
       debug_pipe('V_DEST_STR='||V_DEST_STR);   
     end if;
   
   end if;
   
   &BASE$SETVARS;
   
   <...>
end;


А лучше создать свою переменную, и использовать ее)

Еще, проверка должна работать по нажатию на "ОК" на ЭФ? Если так, проверьте, валидируется ли кнопа "ОК". А лучше исполнение V_DEST_STR поставить отдельно:

Код:
Private Sub OK_OnClick
   Execute V_DEST_STR.Text
   V_DEST_STR.Text = ""
end sub


Последний раз редактировалось: IXaNI (Пн Фев 20, 2017 09:30), всего редактировалось 1 раз
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПн Фев 20, 2017 09:28   Re: Расширение и клиент скрипт Ответить с цитатой
Полезность: Нет оценки
KhrushchevAV пишет:
Переменная V_DEST_STR уже есть и на форме и в переменных (в дистрибутивной операции которую мы расширяем).
Проверки в свойствах операции стоят правильные "Сервер, клиент".


Я заводил в расширении отдельную переменную для исполнения кода VBA в клиент-скрипте ( V_DEST_EXT например, и не забыть после положения на форму в "элементе" поменять валидируемое имя что то типа text1 на V_DEST_EXT).

Отдельную переменную, Карл Smile
KhrushchevAV
Участник со стажем


Вступление в Клуб: 17.10.2014
СообщениеПн Фев 20, 2017 09:40    Ответить с цитатой
Полезность: Нет оценки
Цитата:
Я заводил в расширении отдельную переменную для исполнения кода VBA в клиент-скрипте ( V_DEST_EXT например


Идея хорошая.
Но. Ведь эту переменную придется положить на форму?!
А я как-то надеялся обойтись без изменения оригинальной формы дистрибутивной операции...
Нерешаемо?

Цитата:
Вы проверку куда в расширении ставите?
До или после исполнения


До $BASE% ставил.
Передается переменная, вроде. И в том клиент-скрипте должна бы тоже исполняться, вроде.

По задумке проверка должна отработать в самом начале до поднятия экранной формы. И предупредить пользователя сразу. Т.е. не по "Ок" и не по "Cancel"...
IXaNI
Участник со стажем


Вступление в Клуб: 27.08.2012
СообщениеПн Фев 20, 2017 09:53    Ответить с цитатой
Полезность: Нет оценки
KhrushchevAV пишет:

По задумке проверка должна отработать в самом начале до поднятия экранной формы. И предупредить пользователя сразу. Т.е. не по "Ок" и не по "Cancel"...


В таком случае свою проверку ставьте после "&BASE$GETVARS;". И в Клиент-скрипте пишите:
Код:
Public Function Main(LastControl)
   If LastControl Is Nothing Then
      ' Действия при загрузке формы
        Execute V_DEST_STR.TEXT
       V_DEST_STR.Text = ""
   Else
      ' Действия при потере фокуса валидируемого контрола LastControl

   End If
   Main = True 'Результат валидатора (True, False, NULL)   
   
End Function


И все же, лучше использовать свою переменную) На ЭФ вы ее все равно скроете.
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПн Фев 20, 2017 10:03    Ответить с цитатой
Полезность: Нет оценки
KhrushchevAV пишет:
Но. Ведь эту переменную придется положить на форму?!
А я как-то надеялся обойтись без изменения оригинальной формы


и в чем проблема - не охота лишний раз двинуть мышкой ?
переменную сделать невидимой, визуально на форме ничего не поменяется.
lexus
Профи


Вступление в Клуб: 28.09.2007
СообщениеПн Фев 20, 2017 11:36    Ответить с цитатой
Полезность: Нет оценки
...дополнительная закладка на форме появится
IXaNI
Участник со стажем


Вступление в Клуб: 27.08.2012
СообщениеПн Фев 20, 2017 11:40    Ответить с цитатой
Полезность: Нет оценки
lexus пишет:
...дополнительная закладка на форме появится


Так у этой закаладки тоже можно видимость убрать...
KhrushchevAV
Участник со стажем


Вступление в Клуб: 17.10.2014
СообщениеПн Фев 20, 2017 12:08    Ответить с цитатой
Полезность: Нет оценки
Цитата:
и в чем проблема - не охота лишний раз двинуть мышкой ?


Ну...
Я конечно ленивый парень. Ну один раз бы шевельнул мышкой Smile
Ну, как мы все понимаем, это надо будет не забыть делать каждый раз при накате патча. И если когда-нибудь, я это сделать забуду, то вкладчики в далеком сибирском филиале, поднимут бунт, еще до того, как я на работу приду. И я буду во всем виноват. Что неприятно...
Да, строго говоря, а зачем вообще расширение делать, если можно if прямо в дистрибутивную операцию вписать.
Хотелось бы все же не ломая оригинал...

Но что-то тут действительно какие-то непонятки.
Спасибо, IXaNI, перенес свою проверку после вызова базовой и заработал клиент скрипт.
В чем тут магия? В том кто чистит эту самую V_DEST_STR видимо?
Похоже, при этом перестали работать кусочки оригинальной операции использующие [CSMD]
Sad
Классический случай "оба хуже".
Однако, большое спасибо за помощь, коллеги!
KhrushchevAV
Участник со стажем


Вступление в Клуб: 17.10.2014
СообщениеПн Фев 20, 2017 12:26    Ответить с цитатой
Полезность: 1
Коллеги, пока остановился вот на каком варианте (может кому пригодится):

- Из расширения совсем убрал клиент скрипт. Родительский нормально работает.
- Из кода убрал [CSMD].init_form(V_DEST_STR) и V_DEST_STR := null; предположив, что родительских хватит.

Т.е. добавил только в проверку (после вызова базовой):

Код:
&BASE$SETVARS;
&BASE$VALIDATE;
&BASE$GETVARS;

...
if (..) then
  [CSMD].MessageBox(V_DEST_STR,'Внимание!','Сообщение');
end if;
...

Переменных не добавлял. Оригинальную операцию не трогал.
Все работает!
Побочных эффектов не замечено. (Пока).

БОЛЬШУЩЕЕ Вам спасибо за помощь!
vtar
Эксперт


Вступление в Клуб: 20.03.2009
СообщениеПн Фев 20, 2017 13:13    Ответить с цитатой
Полезность: Нет оценки
KhrushchevAV пишет:

Ну, как мы все понимаем, это надо будет не забыть делать каждый раз при накате патча. И если когда-нибудь, я это сделать забуду, то вкладчики в далеком сибирском филиале,


Нет. Делается 1 раз и забывается. Патч может сломать расширение в очень редких случаях, таких как изменение параметров в вызываемой в расширении процедуре. Клиент-скрипт сломать в расширении накатом патча я вообще не представляю как ...
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Справочник PL/PLUS: Функции, примеры, приёмы Часовой пояс: GMT + 3
На страницу 1, 2  След.
Страница 1 из 2

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Рейтинг@Mail.ru