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