Автор Тема: Вывод диалогового окна  (Прочитано 14652 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Вывод диалогового окна
« : Октябрь 02, 2012, 02:44:44 pm »
Цитата: jacknk88
Здравствуйте. я прочитал Вашу статью и использую ф-ию 'POPUP_TO_CONFIRM' для вывода запроса на подтверждение. однако у меня есть 1 проблема:
у меня стоит кнопка в Тулбаре и при нажатии на нее идет вызов CALL FUNCTION 'POPUP_TO_CONFIRM'.
Если "Да" - идет пакетный ввод в инфотип (кстати...индикатор 'SAPGUI_PROGRESS_INDICATOR' тоже тупит...но это др.тема)))
Если "Нет" - вылетаем.
Количество записей примерно 1000-2000...
Проблема в том, что после нажатия на "да" окно так и весит до конца пакетника.
Можно ли как нибудь закрыть окно после нажатия?
пробовал  leave to screen 0. - вылетает на экран ввода параметров, а надо чтобы ALV показывал.

спасибо за внимание!

You are not allowed to view links. Register or Login
Окно закрыть не выйдет, так как ALV-у вас наверное REUSE_ALV* а он перехватывает после этого на себя полностью управление. Я немного не понял что вы хотите вывести, т.е. вы нажали закачать данные, у вас висит окно с кнопками, а после загрузки типа вы выдаете ALV-таблицу с результатами обработки? Да? И вы хотите чтобы после нажатия "ДА", у вас появилась ALV-таблица, в которую по ходу будут выводится результаты обработки данных?

программа работает (должна по краней мере) так:
1) вводятся данные с экрана + считывается файл
2) выполняется обработка данных и формируется и выводится таблица ALV

Код: You are not allowed to view links. Register or Login
TRY.
      cl_salv_table=>factory(
         IMPORTING
           r_salv_table = go_alv
         CHANGING
           t_table = gt_all[] ).
    CATCH cx_salv_msg .
      MESSAGE 'Ошибка при создании ALV' TYPE 'E'.
  ENDTRY.


 go_alv->set_screen_status( EXPORTING
                              report = sy-repid
                              pfstatus = 'SALV_STANDARD'
                              set_functions = CL_SALV_MODEL_BASE=>C_FUNCTIONS_ALL ).

3) при нажатии на кнопку выводится сообщение с помощью 'POPUP_TO_CONFIRM'
           - если "Да" - загрузка в инфотип
           - если "Нет" - вылетаем

Код: You are not allowed to view links. Register or Login
DATA:
  go_progress TYPE REF TO CL_AKB_PROGRESS_INDICATOR.
IF go_progress IS NOT BOUND.
    go_progress = CL_AKB_PROGRESS_INDICATOR=>get_instance( ).
  ENDIF.

""""""""""""""""""""
PERFORM CONFIRM_MES using w_answer. " вывод сообщения ф-ей 'POPUP_TO_CONFIRM'     

    If w_answer = '1'. " если ДА
              result = max / 10.   " max - число записей
              loop at lt_rows into l_row. " lt_rows - внутренняя таблица
                     rec = rec + 1. " счетсчик записей
                     PROGRESS = PROGRESS + 1.  " счетсчик записей для индикатора
                     if PROGRESS = 1 or PROGRESS >= result. " ограниченный вывод индикатора
                                                                                 " то, что Вы говорили
                        " ресуем индикатор
                         go_progress->display(
                              EXPORTING
                                total = max
                                processed = PROGRESS
                                message = 'Выполняется..' ).
                     endif.
                     PERFORM PACKET_INPUT using l_row rec. " подпрjграмма пакетного ввода
               endloop.

               CONCATENATE 'Записано ' rec into mes SEPARATED BY space.
               MESSAGE mes type 'S'.
               go_alv->refresh( ). " там идет перересовка ALV - меняются поля в 1 столбце -                                                   " это работает

     else. exit. " если НЕТ - выходим
     ENDIF.

Код: You are not allowed to view links. Register or Login
" ф-ия вывода сообщения
CALL FUNCTION 'POPUP_TO_CONFIRM'
  EXPORTING
   TITLEBAR                    = 'Предупреждение.'
*   DIAGNOSE_OBJECT             = ' '
    TEXT_QUESTION               = str  " текст  сообщения
*   TEXT_BUTTON_1               = 'Ja'(001)
*   ICON_BUTTON_1               = ' '
*   TEXT_BUTTON_2               = 'Nein'(002)
*   ICON_BUTTON_2               = ' '
*   DEFAULT_BUTTON              = '1'
*   DISPLAY_CANCEL_BUTTON       = 'X'
*   USERDEFINED_F1_HELP         = ' '
*   START_COLUMN                = 25
*   START_ROW                   = 6
*   POPUP_TYPE                  =
*   IV_QUICKINFO_BUTTON_1       = ' '
*   IV_QUICKINFO_BUTTON_2       = ' '
 IMPORTING
   ANSWER                      = w_answer
* TABLES
*   PARAMETER                   =
 EXCEPTIONS
   TEXT_NOT_FOUND              = 1
   OTHERS                      = 2

в результате:
-- сообщение весит - не закрывается.
-- индикатор не работает походу из-за этого же сообщения...Проверил..так и есть
« Последнее редактирование: Октябрь 02, 2012, 02:51:44 pm от jacknk88 »

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #1 : Октябрь 02, 2012, 03:03:59 pm »
забыл вставить после первого кода:
Код: You are not allowed to view links. Register or Login
go_alv->display( ). " вызов экрана

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #2 : Октябрь 02, 2012, 03:47:01 pm »
добавлю...все это срабатывает при нажатии на кнопку:

Код: You are not allowed to view links. Register or Login
class lcl_handle_events definition deferred.

class lcl_handle_events definition.
  public section.
    methods:
      on_user_command for event added_function of cl_salv_events
        importing e_salv_function.
endclass.

class lcl_handle_events implementation.

  method on_user_command.
     CASE e_salv_function.
        WHEN 'MYBUTTON'.  " кнопка "загрузить в инфотип"
            PERFORM button.
      " это для журнала ошибок - там все нормально
        WHEN 'MSG_TAB'.     " кнопка "Журнал ошибок"
            perform clear_msg. " очищает журнал ошибок
            PERFORM load_log.  " загпускает журнал ошибок
     ENDCASE.
  endmethod.

ENDCLASS.

в PERFORM button как раз и прописан 2-й код из пункта (3)

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Вывод диалогового окна
« Ответ #3 : Октябрь 02, 2012, 03:48:36 pm »
Код: You are not allowed to view links. Register or Login
if PROGRESS = 1 or PROGRESS >= result. " ограниченный вывод индикатора
                                                                                 " то, что Вы говорили
Не я говорил не это я говорил что выводить надо через каждый например 20% записей, а вы выводите для первой записи и потом result = max / 10 т.е. имеем 2000 записей, тогда в result = 200, а далее у вас что получается? А получается, что после 200-той записи вы выводите индикатор процесса для каждой записи, что не правильно. Надо чуть по другому делать, например выводить через каждые 10%,  тогда пишем где-то так:
Код: You are not allowed to view links. Register or Login
REPORT  ytsh_test_gui_indicator.

DATA: index TYPE i,
      max TYPE i,
      ten_prc TYPE i,
      result TYPE i,
      go_progress TYPE REF TO cl_akb_progress_indicator.

IF go_progress IS NOT BOUND. go_progress = cl_akb_progress_indicator=>get_instance( ). ENDIF.

* Всего записей, для примера
max = 225.

* Определить сколько записей входят в 10% (тут точность не важна)
ten_prc = max / 10.
BREAK-POINT.
DO max TIMES.
* Счетчик по обрабатываемым записям
  result = result + 1.

* Показываем в первый раз и далее через каждый 10%
  index = result MOD ten_prc.
  IF index = 1.
    go_progress->display( EXPORTING total = max
                                    processed = result
                                    message = 'Выполняется..' ).
*   Задержка 3 секунды а то 225 раз, ну очень быстро выполняются :-)
    WAIT UP TO 2 SECONDS.
  ENDIF.
ENDDO.

* Ну и типа 100% все прошло
go_progress->display( EXPORTING total = max
                                processed = max
                                message = 'Завершено..' ).
* Задержка 3 секунды а то 225 раз, ну очень быстро выполняются :-)
WAIT UP TO 10 SECONDS.

Что касается окна, то оно будет висеть так как после нажатия "Да", GUI отдает управление серверу приложения, который и выполняет весь код который вы написали и только после его завершения сервер приложения ответит GIU что типа можно работать дальше. Так что окно будет висеть до этого времени. Чтобы оно не висело, надо перепланировать логику приложения по другому.

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #4 : Октябрь 02, 2012, 03:54:15 pm »
спасибо огромное ... отдыхать надо больше)) чтобы таких глупых ошибок не было)))...
по поводу
Цитировать
надо перепланировать логику приложения по другому.
будем думать...совсем как-то не то ..пользователи ругаются)))...придется думать..
спасибо еще раз!

PS: если найду ВЫХОД обязательно напишу.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Вывод диалогового окна
« Ответ #5 : Октябрь 02, 2012, 04:06:49 pm »
You are not allowed to view links. Register or Login
PS: если найду ВЫХОД обязательно напишу.
Да какой там выход, ну разве что показать окно, потом сделать свой экран, на него вывести ALV-таблицу и после показа вопроса, перейти на этот созданный экран. Но опять же, в модуле PBO если сделать обработку то экран с диалоговым окном пропадет, но останется просто пустой экран с прогресс баром внизу. Вообще я бы дурью не маялся, ну так вот трехзвенная архитектура работает когда задачи запускаются в синхронном режиме, ну или надо переходить на асинхронный работу в двух сессиях, тогда первая сессия не будет блокироваться пока во второй идет собственно само обновление данных, но это уже усложняет программу и тут ситуация выходит, что нужны больше шашечки чем ехать.

PS: ABAP - это все таки не Delphi c С#, так что тут такой же диалог с пользователем построить вряд ли выйдет

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #6 : Октябрь 03, 2012, 07:28:20 am »
Вы много знаете...так что пусть так и будет...спаисбо за совет

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #7 : Октябрь 03, 2012, 07:34:29 am »
я так и хотел сделать
You are not allowed to view links. Register or Login
ну разве что показать окно, потом сделать свой экран, на него вывести ALV-таблицу и после показа вопроса, перейти на этот созданный экран.
но это того не стоит
You are not allowed to view links. Register or Login
но это уже усложняет программу и тут ситуация выходит, что нужны больше шашечки чем ехать.
Вы много знаете...так что пусть так и будет...спасибо за совет

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #8 : Октябрь 05, 2012, 07:43:22 am »
1) можно ли вывести информационное сообщение, так чтобы пользователю не надо было нажимать на кнопку ОК или Дальше, а она сома через скажем 5 сек. исчезнет?

что-то вроде следующего:
Код: You are not allowed to view links. Register or Login
MESSAGE 'Загрузка данных может занять некоторое время. Пожалуйста, подождите.' type 'I'.с типом 'S' не получается...

2) Кстати, нельзя ли предыдущий мой вопрос с незакрывающимся окном зделать следующим образом:
 - написать короткую программу с выводом этого сообщения
 - вызвать эту программу из существующей
 - если нажали "Да" продолжить действие и покинуть программу с сообщением
 - если "нет", то просто закрыть прогу с сообщением

только для этого придется как -то результат ответа передать(((

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #9 : Октябрь 05, 2012, 08:34:53 am »
1) вы не знаете как идет определение что кнопка OK нажата?
там вызывается вот этот метод вроде:
Код: You are not allowed to view links. Register or Login
method DYNP_SREQ_GET_LINK by kernel module dyAbapSReqGetLink fail.
endmethod.
в котором описано вот что:
Код: You are not allowed to view links. Register or Login
method GET_LINK .
*---------------------------------------------------------------------
*  Daten fќr Link ermitteln
*
*  Rc = Returncode
*       0 = Message is registered
*       1 = es ist kein Service-Request registriert

*---------------------------------------------------------------------

  data : Text_String type string value ''.

  try.
    Dynp_SReq_Get_Link( exporting
                        Message_Id     = Message_Id
                        Message_Number = Message_Number
                        importing
                        Text           = Text_String
                        Rc             = Rc ).

  catch CX_SY_DYN_CALL_ILLEGAL_METHOD.
    Rc = 1.
  endtry.

  Text = Text_String.

endmethod.

но перед этим идет небольшая обработка
Код: You are not allowed to view links. Register or Login
METHOD set_msg_vars_for_clike .
  DATA offset TYPE i.
  DATA c200(200) TYPE c.
  CLEAR message_object.
  MOVE '00'  TO sy-msgid.
  MOVE '001' TO sy-msgno.
  MOVE text TO c200.

  MOVE c200(50) TO sy-msgv1.
  IF sy-msgv1+49(1) IS INITIAL.
    offset = 49.
  ELSE.
    offset = 50.
  ENDIF.

  MOVE c200+offset(50) TO sy-msgv2.
  IF sy-msgv2+49(1) IS INITIAL.
    offset = offset + 49.
  ELSE.
    offset = offset + 50.
  ENDIF.

  MOVE c200+offset(50) TO sy-msgv3.
  IF sy-msgv3+49(1) IS INITIAL.
    offset = offset + 49.
  ELSE.
    offset = offset + 50.
  ENDIF.

  MOVE c200+offset(50) TO sy-msgv4.
ENDMETHOD.
в c200 само сообщение забрасывается и делится на 3 вроде части: sy-msgv1, sy-msgv2 и sy-msgv3.
а уж потом только идет method GET_LINK, который в свою очередь вызывает Dynp_SReq_Get_Link - это метод класса CL_DYNP_SERVICE_REQUEST. его я нашел след. образом  You are not allowed to view links. Register or Login

после всех вызовов идет возврат к исходному коду проги и вывод сообщения...нажимаем кнопку и все...где идет обработка нажатия не пойму(((...в help-e написано следующее
Цитировать
Syntax Diagram



Syntax
MESSAGE { msg | txt } [message_options].



Effect
This statement interrupts the program flow and either displays the short text of a message specified in msg in the logon language of the current user, or any text from txt as a message. The exact behavior of the MESSAGE statement - that is, how the text is displayed and how the program flow is continued after the MESSAGE statement - is context-dependent and is determined by a message type specified in msg or txt. This behavior can be changed using the message_options additions and the placeholders can be replaced in messages.



System fields/>

Name Relevance
sy-msgid Contains the message-class after sending a message, and the value "00" after sending any text.
sy-msgno Contains the message number after sending a message, and the value "001" after sending any text.
sy-msgty Contains the identifier of the message type with which the message resp. the text was sent.
sy-msgv1 to sy-msgv4 Contain the content of the data objects specified after the addition WITH after sending a message. After sending any text, they contain the first 200 characters of the data object text.
 


Notes
Messages are one way of interacting with a user. Except for messages of the type "X", the MESSAGE statement should be use exclusively in the presentation logic layer and never in the application logic layer.


Setting the text environment by means of the SET LOCALE statement has no effect on the language in which the message is displayed.



Exceptions
Non-Catchable Exceptions



Cause: Message type unknown
Runtime Error: MESSAGE_TYPE_UNKNOWN

Cause: Deliberate raising of a termination with short dump
Runtime Error: MESSAGE_TYPE_X
Runtime Error: MESSAGE_TYPE_X_TEXT

Cause: It is not possible to catch messages of the type 'A' with the term CALL FUNCTION ... EXCEPTIONS ERROR_MESSAGE during ON-COMMIT processing.
Runtime Error: MESSAGE_ROLLBACK_ON_COMMIT

Cause: It is impossible to catch messages of the type 'A' with the term CALL FUNCTION ... EXCEPTIONS ERROR_MESSAGE during an update.
Runtime error MESSAGE_ROLLBACK_IN_POSTING


может результат регистрируется в одном из них
sy-msgid
sy-msgno
sy-msgty

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Вывод диалогового окна
« Ответ #10 : Октябрь 05, 2012, 08:39:12 am »
You are not allowed to view links. Register or Login
1) можно ли вывести информационное сообщение, так чтобы пользователю не надо было нажимать на кнопку ОК или Дальше, а она сома через скажем 5 сек. исчезнет?
Нельзя, так как ваша программа она вообще-то работает не на клиенте на сервере приложения, так что технологически такую работу организовать не получится

You are not allowed to view links. Register or Login
- написать короткую программу с выводом этого сообщения
 - вызвать эту программу из существующей
 - если нажали "Да" продолжить действие и покинуть программу с сообщением
 - если "нет", то просто закрыть прогу с сообщением

только для этого придется как -то результат ответа передать(((
А вот это можно. Параметры, ну передайте и получите их через EXPORT/IMPORT и всех делов и очень просто. Ну или как я уже говорил используйте параллельные процессы, там есть возможность организовать вызов следующим образом, что вызываемая программа по завершению вызовет подпрограмму которая написана в основной программе и через нее можно организовать передачу параметров.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 809
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
Re: Вывод диалогового окна
« Ответ #11 : Октябрь 05, 2012, 08:41:56 am »
You are not allowed to view links. Register or Login
1) вы не знаете как идет определение что кнопка OK нажата?
Да забейте вы на эту кнопку и на знания по организации диалога с пользователем из других языков, это как там говорят SAP однако. Тут своя идеология что, как, кому и когда показывать  :-\

Оффлайн jacknk88

  • Newbie
  • *
  • Сообщений: 120
  • Репутация: +4/-0
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
Re: Вывод диалогового окна
« Ответ #12 : Октябрь 05, 2012, 08:58:33 am »
Цитировать
Да забейте вы на эту кнопку и на знания по организации диалога с пользователем из других языков, это как там говорят SAP однако. Тут своя идеология что, как, кому и когда показывать   
спасибо Uukrul...так и сделаю..просто пока не попробуешь не узнаешь что можно сделать, а что нет и как архитектура у этого ABAP-а....даа..это все-таки не Delphi...спасибо за советы

Sapforum.Biz

Re: Вывод диалогового окна
« Ответ #12 : Октябрь 05, 2012, 08:58:33 am »