28 апреля 2011 г.

Заполнение списка предлагаемых значений Listbox-а

На примере списка кредиторов
  types:
begin of vrm_value,
key(40) type c,
text(80) type c,
end of vrm_value,
VRM_VALUES TYPE VRM_VALUE OCCURS 0.
 
data: lifnr_values TYPE VRM_VALUES with header line.
FREE lifnr_values. " обязательно
data: lfa1_tb TYPE WSTN_LFA1_TAB, lfa1_ln TYPE LFA1.
" заполнить где-то lfa1_tb поставщиками
LOOP AT lfa1_tb into lfa1_ln.
lifnr_values-key = lfa1_ln-lifnr.
CONCATENATE lfa1_ln-NAME1 lfa1_ln-NAME2 lfa1_ln-NAME3 lfa1_ln-NAME4
into lifnr_values-text.
APPEND lifnr_values.
ENDLOOP.
call function 'VRM_SET_VALUES'
EXPORTING
id = 'LIFNR' " имя элемента
values = lifnr_values[]
EXCEPTIONS
others = 1.

Sap Scripting

Проблема: необходимо автоматически запустить sap logon и выполнить какие-то действия автоматически.
1. Необходимо активировать у инстанции возможность Sap scripting-а
http://searchsap.techtarget.com/feature/Step-2-Activating-SAPGUI-scripting
2. Как генерировать скориптинг
Настройка локального формата .Запись и воспроизведение скрипта. Дальше там понятно что делать.
3. Пример скрипта:

Подробнее...

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

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


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

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

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. Подробнее...

27 апреля 2011 г.

ABAP: добавление своей кнопки в TOOLBAR ALV GRID

Для этого надо создать класс обработчик для обработки событий toolbar и user_command для ALV GRID.

Пример:

CLASS cl_trans_g_event_receiver DEFINITION.
  PUBLIC SECTION.
  METHODS:
    handle_toolbar
      FOR EVENT toolbar OF cl_gui_alv_grid
        IMPORTING e_object e_interactive,
    handle_user_command
      FOR EVENT user_command OF cl_gui_alv_grid
        IMPORTING e_ucomm.
ENDCLASS.
Подробнее...

ABAP: стили ячеек в ALV GRID.

Список возможных значений стилей можно или даже нужно брать из инклуда <CL_ALV_CONTROL>.

Вариант 1:
Стиль для столбца можно указать в филд-каталоге (LVC_T_FCAT) в полях:
    STYLE
    STYLE2
    STYLE3
    STYLE4

Пример:
  ls_fcat-style = ALV_STYLE_COLOR_INT_BACKGROUND + ALV_STYLE_ALIGN_CENTER_CENTER.

Вариант 2:
Если необходимо чтобы разные стили были у разных произвольных ячеек, то в стуктуру вашей внутренней таблицы для ALV придется ввести поле типа LVC_T_STYL. В нем будет заполняться таблица стилей для каждой ячейки выбранной строки.
Подробнее...

ABAP: FM для вычисления даты +/- определенное кол-во дней

ФМ – DATE_IN_FUTURE, во входных параметрах дата должна быть в формате “ddmmyyyy”

Пример:

lv_datum+0 = sy-datum+6(2).
lv_datum+2 = sy-datum+4(2).
lv_datum+4 = sy-datum(4).


CALL FUNCTION 'DATE_IN_FUTURE'
  EXPORTING
    ANZAHL_TAGE             = -10
    IMPORT_DATUM            = lv_datum
  IMPORTING
*   EXPORT_DATUM_EXT_FORMAT =
    EXPORT_DATUM_INT_FORMAT = lv_fdmdt.

А то все время забываю как он называется.