Повторный вызов CSMD.ShowMsgDlg
|
Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
tycoonban Участник
Вступление в Клуб: 03.03.2011
|
Ср Дек 04, 2013 15:12  Повторный вызов CSMD.ShowMsgDlg |
|
Полезность: Нет оценки
|
Помогите разобраться в чем глюк.
Операция сохраняет сводные данные в таблицу. Сначала проверяем, если там уже есть данные, то спрашиваем "перезаписать?". Если данных нету, то просто задаём повторный вопрос "вы уверены?". Но я хочу чтобы повторный вопрос спрашивался и после вопроса перезаписать. Но программа так не работает. Диалоговое окно с кнопками да/нет появляется лишь 1 раз, и валидация на клиенте второй раз не происходит.
Проверка:
Код: | begin
if p_message = 'DEFAULT' then
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
elsif P_MESSAGE = 'VALIDATE' then
if p_info = 'OK' then
if check_pap=0 then
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
CSMD.ShowMsgDlg(V_TXT,'Form1','Продолжить?','Все перечни сверены? Вы действительно хотите сформировать папку?','MAKE_PAPKA_','CANCEL');
else
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
CSMD.ShowMsgDlg(V_TXT,'Form1','Заменить?','Папка уже сформирована. Хотите обновить данные?','REMAKE_PAPKA','CANCEL');
end if;
elsif p_info = 'REMAKE_PAPKA' then
for (select x(x%id :C_ID) in ::[SVERKA_PAP] where x.[OPERDATE]=V_DATE and x.[PAPKA]=V_PAPKA) loop
xx:=x.C_ID;
xx.[DELETE#AUTO];
end loop;
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
CSMD.ShowMsgDlg(V_TXT,'Form1','Продолжить?','Все перечни сверены? Вы действительно хотите сформировать папку?','MAKE_PAPKA_','CANCEL');
elsif p_info = 'MAKE_PAPKA_' then
make_pap;
end if;
end if;
end; |
клиент-скрипт:
Код: |
Public Function Main(LastControl)
Execute v_txt.TEXT
Main = true
End Function |
check_pap и make_pap - локальные процедуры.
Цикл for отрабатывает, второй вопрос нет. Хотя V_TXT заполняется скриптом на выполнение.
В свойствах стоит проверка "Сервер,Клиент" |
|
 |
Alkov Профи
Вступление в Клуб: 23.09.2010
|
Чт Дек 05, 2013 03:32   |
|
Полезность: Нет оценки
|
А чего бы она проходила второй раз, если ты её не вызываешь второй раз?
Цитата: | CSMD.ShowMsgDlg(V_TXT,'Form1','Продолжить?','Все перечни сверены? Вы действительно хотите сформировать папку?','MAKE_PAPKA_','CANCEL'); |
после этого нужен второй вызов валидатора , например
[CSMD].Command(V_EXEC, 'Call Form1.ScriptServerValidate(OK,"OK")'); |
|
 |
tycoonban Участник
Вступление в Клуб: 03.03.2011
|
Чт Дек 05, 2013 10:07   |
|
Полезность: Нет оценки
|
не работает.
На сколько я понимаю ScriptServerValidate вызывает событие в серверной проверке, а тут нужно запустить клиентскую проверку.
И первый раз же показывается окно с вопросом, хотя явно нигде не указывается вызов клиентского валидатора.
Если, к примеру, пользоваться командами CSMD.Show(V_TXT,Button1), CSMD.Hide(V_TXT,Button1), то клиентский скрипт будет выполнятся много раз и кнопка будет то появляться, то исчезать.
Почему так? Появление дополнительного окна не возвращает фокус на Form1? |
|
 |
vtar Эксперт
Вступление в Клуб: 20.03.2009
|
Чт Дек 05, 2013 12:45   |
|
Полезность: Нет оценки
|
В общем, как то сталкивался с похожей проблемой.
Решил примерно так - клал на форму переменную V_DATA. В проверке писал нужные значения туда. В клиент скрипте после EXECUTE смотрел в V_DATA.text и если = 'спросим юзверя' то
If MsgBox("Все хорошо ?", vbYesNo, "Тайтл") = vbYes Then
то можно установить в V_DATA.text = "юзверь ответил нах"
а потом в проверке еще раз смотрим V_DATA
может быть еще дергал валидатор из скрипта, не помню.
пример msgbox отсюда
http://www.cftclub.ru/viewtopic.php?t=2498&highlight=msgbox |
|
 |
Alexsey Эксперт
Вступление в Клуб: 06.09.2007
|
Пн Дек 09, 2013 08:45   |
|
Полезность: Нет оценки
|
Вся беда в том, что после отработки секции проверка, выполняется клиент-скрипт, т.о весь VBS подлежащий выполнению уже сформирован.
Вам, в данном случае, необходимо прописать вопрос в Клиент-скрипте, т.к. он выполняется построчно и если необходимо, то выполнит серверную валидацию, а затем продолжит со следующей строки. _________________ всегда есть как минимум 2 выхода |
|
 |
Random Эксперт
Вступление в Клуб: 27.06.2011
|
Пн Дек 09, 2013 12:15  Re: Повторный вызов CSMD.ShowMsgDlg |
|
Полезность: Нет оценки
|
tycoonban пишет: | Помогите разобраться в чем глюк.
Операция сохраняет сводные данные в таблицу. Сначала проверяем, если там уже есть данные, то спрашиваем "перезаписать?". Если данных нету, то просто задаём повторный вопрос "вы уверены?". Но я хочу чтобы повторный вопрос спрашивался и после вопроса перезаписать. Но программа так не работает. Диалоговое окно с кнопками да/нет появляется лишь 1 раз, и валидация на клиенте второй раз не происходит.
Проверка:
Код: | begin
if p_message = 'DEFAULT' then
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
elsif P_MESSAGE = 'VALIDATE' then
if p_info = 'OK' then
if check_pap=0 then
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
CSMD.ShowMsgDlg(V_TXT,'Form1','Продолжить?','Все перечни сверены? Вы действительно хотите сформировать папку?','MAKE_PAPKA_','CANCEL');
else
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
CSMD.ShowMsgDlg(V_TXT,'Form1','Заменить?','Папка уже сформирована. Хотите обновить данные?','REMAKE_PAPKA','CANCEL');
end if;
elsif p_info = 'REMAKE_PAPKA' then
for (select x(x%id :C_ID) in ::[SVERKA_PAP] where x.[OPERDATE]=V_DATE and x.[PAPKA]=V_PAPKA) loop
xx:=x.C_ID;
xx.[DELETE#AUTO];
end loop;
[CSMD].init_form(V_TXT, &METHOD$CLASS, &METHOD$SNAME);
CSMD.ShowMsgDlg(V_TXT,'Form1','Продолжить?','Все перечни сверены? Вы действительно хотите сформировать папку?','MAKE_PAPKA_','CANCEL');
elsif p_info = 'MAKE_PAPKA_' then
make_pap;
end if;
end if;
end; |
клиент-скрипт:
Код: |
Public Function Main(LastControl)
Execute v_txt.TEXT
Main = true
End Function |
check_pap и make_pap - локальные процедуры.
Цикл for отрабатывает, второй вопрос нет. Хотя V_TXT заполняется скриптом на выполнение.
В свойствах стоит проверка "Сервер,Клиент" |
Я думаю, что беда у вас в том, что вы пытаетесь сформировать управляющий блок на стороне сервера, когда логичнее оформить его на стороне клиента.
Вот, например, как оформлена обработка документов в 402 форме (это текст процедуры в клиент-скрипте):
Код: |
do while true
Call Runtime.ServerValidate(Nothing, "Следующий документ")
if v_call_str = "" then 'Документы кончились, больше делать ничего не нужно
exit do
end if
'Запуск операции, выполняющей добавление документа, с выводом ЭФ и подтверждением пользователя
if 0 = runtime.playex(v_call_str) then
'Нажали "Отмена" на форме добавления документа
answer = MsgBox("Перейти к следующему документу ?", vbQuestion & vbYesNo, "Подтверждение")
if answer <> vbYes then
Call Runtime.ServerValidate(Nothing, "SET_CANCEL")
exit do
end if
end if
loop
|
Этот же подход можно применить и у вас.
В цикле из VB вызвать валидацию с определённым p_info на сервере, которая проверит, существуют ли ещё данные, которые стоит обрабатывать. Если существуют, спросить - хочет ли пользователь выйти. Если не хочет, обработать очередные данные путём вызова из VB валидатора с определённым p_info. И перейти к следующей итерации цикла.
А вот кусок секции валидации:
Код: |
elsif P_INFO = 'Следующий документ' then
V_CALL_STR := GetVBStringForProcessingNextDocument;
elsif p_info = 'SET_CANCEL' then
...
elsif ...
|
|
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|