| 
 
  
	| Повторный вызов 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 ...
 
 | 
 |  |  
		|  |  
		|  |  
  
	| 
 
 | Вы не можете начинать темы Вы не можете отвечать на сообщения
 Вы не можете редактировать свои сообщения
 Вы не можете удалять свои сообщения
 Вы не можете голосовать в опросах
 
 |  |