Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: jacknk88 от Октябрь 02, 2012, 02:44:44 pm
-
Здравствуйте. я прочитал Вашу статью и использую ф-ию 'POPUP_TO_CONFIRM' для вывода запроса на подтверждение. однако у меня есть 1 проблема:
у меня стоит кнопка в Тулбаре и при нажатии на нее идет вызов CALL FUNCTION 'POPUP_TO_CONFIRM'.
Если "Да" - идет пакетный ввод в инфотип (кстати...индикатор 'SAPGUI_PROGRESS_INDICATOR' тоже тупит...но это др.тема)))
Если "Нет" - вылетаем.
Количество записей примерно 1000-2000...
Проблема в том, что после нажатия на "да" окно так и весит до конца пакетника.
Можно ли как нибудь закрыть окно после нажатия?
пробовал leave to screen 0. - вылетает на экран ввода параметров, а надо чтобы ALV показывал.
спасибо за внимание!
Окно закрыть не выйдет, так как ALV-у вас наверное REUSE_ALV* а он перехватывает после этого на себя полностью управление. Я немного не понял что вы хотите вывести, т.е. вы нажали закачать данные, у вас висит окно с кнопками, а после загрузки типа вы выдаете ALV-таблицу с результатами обработки? Да? И вы хотите чтобы после нажатия "ДА", у вас появилась ALV-таблица, в которую по ходу будут выводится результаты обработки данных?
программа работает (должна по краней мере) так:
1) вводятся данные с экрана + считывается файл
2) выполняется обработка данных и формируется и выводится таблица ALV
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'
- если "Да" - загрузка в инфотип
- если "Нет" - вылетаем
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.
" ф-ия вывода сообщения
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
в результате:
-- сообщение весит - не закрывается.
-- индикатор не работает походу из-за этого же сообщения...Проверил..так и есть
-
забыл вставить после первого кода:
go_alv->display( ). " вызов экрана
-
добавлю...все это срабатывает при нажатии на кнопку:
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)
-
if PROGRESS = 1 or PROGRESS >= result. " ограниченный вывод индикатора
" то, что Вы говорили
Не я говорил не это я говорил что выводить надо через каждый например 20% записей, а вы выводите для первой записи и потом result = max / 10 т.е. имеем 2000 записей, тогда в result = 200, а далее у вас что получается? А получается, что после 200-той записи вы выводите индикатор процесса для каждой записи, что не правильно. Надо чуть по другому делать, например выводить через каждые 10%, тогда пишем где-то так:
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 что типа можно работать дальше. Так что окно будет висеть до этого времени. Чтобы оно не висело, надо перепланировать логику приложения по другому.
-
спасибо огромное ... отдыхать надо больше)) чтобы таких глупых ошибок не было)))...
по поводу надо перепланировать логику приложения по другому.
будем думать...совсем как-то не то ..пользователи ругаются)))...придется думать..
спасибо еще раз!
PS: если найду ВЫХОД обязательно напишу.
-
PS: если найду ВЫХОД обязательно напишу.
Да какой там выход, ну разве что показать окно, потом сделать свой экран, на него вывести ALV-таблицу и после показа вопроса, перейти на этот созданный экран. Но опять же, в модуле PBO если сделать обработку то экран с диалоговым окном пропадет, но останется просто пустой экран с прогресс баром внизу. Вообще я бы дурью не маялся, ну так вот трехзвенная архитектура работает когда задачи запускаются в синхронном режиме, ну или надо переходить на асинхронный работу в двух сессиях, тогда первая сессия не будет блокироваться пока во второй идет собственно само обновление данных, но это уже усложняет программу и тут ситуация выходит, что нужны больше шашечки чем ехать.
PS: ABAP - это все таки не Delphi c С#, так что тут такой же диалог с пользователем построить вряд ли выйдет
-
Вы много знаете...так что пусть так и будет...спаисбо за совет
-
я так и хотел сделать
ну разве что показать окно, потом сделать свой экран, на него вывести ALV-таблицу и после показа вопроса, перейти на этот созданный экран.
но это того не стоит
но это уже усложняет программу и тут ситуация выходит, что нужны больше шашечки чем ехать.
Вы много знаете...так что пусть так и будет...спасибо за совет
-
1) можно ли вывести информационное сообщение, так чтобы пользователю не надо было нажимать на кнопку ОК или Дальше, а она сома через скажем 5 сек. исчезнет?
что-то вроде следующего:
MESSAGE 'Загрузка данных может занять некоторое время. Пожалуйста, подождите.' type 'I'.
с типом 'S' не получается...
2) Кстати, нельзя ли предыдущий мой вопрос с незакрывающимся окном зделать следующим образом:
- написать короткую программу с выводом этого сообщения
- вызвать эту программу из существующей
- если нажали "Да" продолжить действие и покинуть программу с сообщением
- если "нет", то просто закрыть прогу с сообщением
только для этого придется как -то результат ответа передать(((
-
1) вы не знаете как идет определение что кнопка OK нажата?
там вызывается вот этот метод вроде:
method DYNP_SREQ_GET_LINK by kernel module dyAbapSReqGetLink fail.
endmethod.
в котором описано вот что:
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.
но перед этим идет небольшая обработка
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. его я нашел след. образом http://abap-blog.ru/abap/abap-objects/poisk-metodov-v-klassaxinterfejsax/
после всех вызовов идет возврат к исходному коду проги и вывод сообщения...нажимаем кнопку и все...где идет обработка нажатия не пойму(((...в 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
-
1) можно ли вывести информационное сообщение, так чтобы пользователю не надо было нажимать на кнопку ОК или Дальше, а она сома через скажем 5 сек. исчезнет?
Нельзя, так как ваша программа она вообще-то работает не на клиенте на сервере приложения, так что технологически такую работу организовать не получится
- написать короткую программу с выводом этого сообщения
- вызвать эту программу из существующей
- если нажали "Да" продолжить действие и покинуть программу с сообщением
- если "нет", то просто закрыть прогу с сообщением
только для этого придется как -то результат ответа передать(((
А вот это можно. Параметры, ну передайте и получите их через EXPORT/IMPORT и всех делов и очень просто. Ну или как я уже говорил используйте параллельные процессы, там есть возможность организовать вызов следующим образом, что вызываемая программа по завершению вызовет подпрограмму которая написана в основной программе и через нее можно организовать передачу параметров.
-
1) вы не знаете как идет определение что кнопка OK нажата?
Да забейте вы на эту кнопку и на знания по организации диалога с пользователем из других языков, это как там говорят SAP однако. Тут своя идеология что, как, кому и когда показывать :-\
-
Да забейте вы на эту кнопку и на знания по организации диалога с пользователем из других языков, это как там говорят SAP однако. Тут своя идеология что, как, кому и когда показывать
спасибо Uukrul...так и сделаю..просто пока не попробуешь не узнаешь что можно сделать, а что нет и как архитектура у этого ABAP-а....даа..это все-таки не Delphi...спасибо за советы