Расширение с исполнением клиент-скрипта
На страницу 1, 2 След.
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
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  Расширение и клиент скрипт |
|
Полезность: Нет оценки
|
Похожая задача. Может подскажите, пока не забылась проблема .
Надо сделать дополнительную проверку, и предупредить пользователя.
Делаем расширение. Пишем в секции "проверка":
Код: | 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 строк в принципе допустимо ).
Вывод.
Какая-то хитрость именно с расширением.
Задача вроде относительно стандартная. Так что, кто-то наверняка сталкивался. Поделитесь, плз. |
|
 |
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).
Отдельную переменную, Карл  |
|
 |
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   |
|
Полезность: Нет оценки
|
Цитата: | и в чем проблема - не охота лишний раз двинуть мышкой ? |
Ну...
Я конечно ленивый парень. Ну один раз бы шевельнул мышкой
Ну, как мы все понимаем, это надо будет не забыть делать каждый раз при накате патча. И если когда-нибудь, я это сделать забуду, то вкладчики в далеком сибирском филиале, поднимут бунт, еще до того, как я на работу приду. И я буду во всем виноват. Что неприятно...
Да, строго говоря, а зачем вообще расширение делать, если можно if прямо в дистрибутивную операцию вписать.
Хотелось бы все же не ломая оригинал...
Но что-то тут действительно какие-то непонятки.
Спасибо, IXaNI, перенес свою проверку после вызова базовой и заработал клиент скрипт.
В чем тут магия? В том кто чистит эту самую V_DEST_STR видимо?
Похоже, при этом перестали работать кусочки оригинальной операции использующие [CSMD]
Классический случай "оба хуже".
Однако, большое спасибо за помощь, коллеги! |
|
 |
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 раз и забывается. Патч может сломать расширение в очень редких случаях, таких как изменение параметров в вызываемой в расширении процедуре. Клиент-скрипт сломать в расширении накатом патча я вообще не представляю как ... |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|