28 апреля 2011 г.

Вызов PBO из событий ALV

Проблема: в событии ALV изменились какие-либо значения, отображаемые экраном DynPro, но так как события PBO не было - пользователь видит старые значения.
Подобрал два варианта:
1. Имитировать событие PBO.

CALL FUNCTION 'SAPGUI_SET_FUNCTIONCODE'EXPORTINGFUNCTIONCODE           = '='EXCEPTIONSFUNCTION_NOT_SUPPORTED = 1OTHERS                 = 2.

Работает, но медленно. Возможно если использовать другой FUNCTIONCODE, будет лучше. знак равенства предлагался как значение по умолчанию.

2. Обновить значение самостоятельно.

Пробовал использовать функции DYNP_VALUES_READ и DYNP_VALUES_UPDATE, но не получилось. зато получилось с

DATA: dynpfields_tb  TYPE TABLE OF dynpread,
dynpfields_ln  TYPE dynpread. 
DEFINE AddField.
dynpfields_ln-fieldname  = '&1'.
dynpfields_ln-fieldvalue = &1.
APPEND dynpfields_ln to dynpfields_tb.
END-OF-DEFINITION.
AddField MAT_INFO_STR-MATNR.
AddField MAT_INFO_STR-MATERIAL_NAME.
CALL FUNCTION 'DYNP_UPDATE_FIELDS'
EXPORTING
DYNAME               = sy-repid
DYNUMB               = '1210'
TABLES
DYNPFIELDS           = dynpfields_tb
EXCEPTIONS
INVALID_ABAPWORKAREA = 1
INVALID_DYNPROFIELD  = 2
INVALID_DYNPRONAME   = 3
INVALID_DYNPRONUMMER = 4
INVALID_REQUEST      = 5
NO_FIELDDESCRIPTION  = 6
UNDEFIND_ERROR       = 7
OTHERS               = 8.

Работает, быстро, но есть казусы (возможно имеют решения, но я пока их не знаю):
- иногда теряются часть текста после переключения закладок с этими данными.
- не получилось использовать для чисел - пришлось менять тип на текстовый, что не всегда допустимо.
- пришлось отказаться от программ преобразования - вызываю их сам в коде, что тоже не всегда удобно.

3. У конструктора ALV GRID-а есть параметр i_appl_events. если его взвести - при нажатии вызывается PAI, а после PBO. Но тоже медленно всё работает. Возможно у других объектов есть такой же способ.

4. cl_gui_cfw=>set_new_ok_code. Тоже медленно.
CALL METHOD cl_gui_cfw=>set_new_ok_code
EXPORTING
new_code = 'DUMMY'.
CL_GUI_CFW=>FLUSH.

1 комментарий:

  1. вот этот способ работает.

    data lt_dynpfields TYPE TABLE OF dynpread WITH HEADER LINE.
    lt_dynpfields-fieldname = 'ZAGENTS_DOCS-VKORG'. append lt_dynpfields.
    lt_dynpfields-fieldname = 'ZAGENTS_DOCS-VTWEG'. append lt_dynpfields.
    lt_dynpfields-fieldname = 'ZAGENTS_DOCS-SPART'. append lt_dynpfields.
    call function 'DYNP_VALUES_READ'
    EXPORTING dyname = sy-repid dynumb = sy-dynnr
    TABLES dynpfields = lt_dynpfields[].

    read table lt_dynpfields WITH KEY fieldname = 'ZAGENTS_DOCS-VKORG'.
    ZAGENTS_DOCS-VKORG = lt_dynpfields-fieldvalue.
    read table lt_dynpfields WITH KEY fieldname = 'ZAGENTS_DOCS-VTWEG'.
    ZAGENTS_DOCS-VTWEG = lt_dynpfields-fieldvalue.
    read table lt_dynpfields WITH KEY fieldname = 'ZAGENTS_DOCS-SPART'.
    ZAGENTS_DOCS-SPART = lt_dynpfields-fieldvalue.

    ОтветитьУдалить