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

Повторный вызов CSMD.ShowMsgDlg

 
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих
Предыдущая тема :: Следующая тема  
Автор Сообщение
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 ...
Показать сообщения:   
Ответить на тему    Клуб специалистов ЦФТ-Банк (IBSO) -> Уроки ЦФТ-Банк для начинающих Часовой пояс: GMT + 3
Страница 1 из 1

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