Пару слов о формулярах CRM. Недавно столкнулся с формулярами в Solution Manager. Для меня это впервые, сохраню напоминалку, может быть кому-то еще пригодится.
Настройка ведется в транзакции SPRO:
SPRO->SAP Solution Manager: руководство по внедрению->Управление отношениями с клиентами->Маркетинг->Маркетинговое планирование и управление кампаниями->Персонализированный мейл->Обработать контексты признаков для формуляров мейла
Тут мы можем создать пользовательский контекст
Метка: example
Добавить файл в архив
Не часто в abap возникает задача поместить сгенерированный программой файл в архив. Мне такое пригодилось только один раз, когда понадобилось обойти ограничение почтового сервера на пересылку файлов определенного типа.
Для работы с архивом можно использовать класс cl_abap_zip
Пример кода:
Читать далее «Добавить файл в архив»
ABAP Daemon Framework
Демоны abap - это фоновые сеансы с неограниченным сроком жизни. Время выполнения которых, зависит только от работы сервера. В случае ошибок, возникших во время работы, демон перезапускается.
Попробуем создать простой демон для примера. Он будет следить за входом пользователя в указанную транзакцию. По большому, счету это повторение демо-примера от SAP. Можно сразу смотреть там.
Для остальных ниже:
Читать далее «ABAP Daemon Framework»
boolc и xsdbool ABAP
В abap 7.40 появились новые логические функции boolc() и xsdbool() они определяют истинность логического выражения в аргументе boolc( логическое выражение )/ xsdbool ( логическое выражение ).
Отличаются тем, что boolc( ) имеет тип данных "С" в качестве возвращаемого параметра, а xsdbool() возвращает тип abap_bool.
Пример:
1 2 3 4 5 6 7 8 9 |
" method example. ...... if sy-subrc = 0 and lv_a = lv_b. rv_result = abap_true. endif. endmethod. |
Тоже самое с использованием xsdbool():
1 2 3 4 5 6 7 8 |
" method example_xsdbool. ...... rv_result = xsdbool( sy-subrc = 0 and lv_a = lv_b ). endmethod. |
Еще удобно можно передавать результат на вход метода.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
report zhr_pau_test. class lcl_example definition. public section. methods example importing iv_bool_par type abap_bool. endclass. class lcl_example implementation. method example. ".....text module endmethod. endclass. start-of-selection. data(go_obj_example) = new lcl_example( ). go_obj_example->example( iv_bool_par = xsdbool( sy-subrc = 0 ) ). |
ABAP сохранение файла в папку на сервере
Небольшой пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
"""""""" это только кусочек кода private section. types: begin of gty_s_text_tab, line(1024) type c, end of gty_s_text_tab. types: gty_t_text_tab type table of gty_s_text_tab. data gt_text_tab type gty_t_text_tab. """"""""""""""""""""""""""""""""""""" methods: open_dataset importing iv_filename type string. """""реализация метода method open_dataset. try. open dataset iv_filename for output in text mode encoding utf-8 . loop at gt_text_tab assigning field-symbol(<ls_text>). transfer <ls_text> to iv_filename. endloop. close dataset iv_filename. catch cx_root. message 'Доступ к файлу не разрешен'(010) type 'I'. endtry. endmethod. |
Чтение длинных текстов из ИТ
Возьмем для примера ИТ 0298, он может содержать несколько длинных текстов в разных источников.
Первый - в разделе Стандартные тексты. Данные тексты хранятся в таблицах
STXH / STXL и их можно посмотреть в транзакции SO10
Второй - по кнопке F9. Данные тексты хранятся в кластере PCL3
cl_reca_gui_f4_popup – класс для создания справки
cl_reca_gui_f4_popup - класс обертка позволяющая быстро выводить средство поиска. Можно использовать как один из вариантов для f4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
" "Example: DATA lo_f4 TYPE REF TO cl_reca_gui_f4_popup. SELECT mara~matnr, mara~meins, makt~maktx, mara~ergew, mara~ervol, mara~ergei, mara~ervoe FROM mara INNER JOIN makt ON mara~matnr = makt~matnr INTO CORRESPONDING FIELDS OF TABLE @DATA(lt_mara) WHERE mtart = 'ZZZZ' AND ( ergei = 'KG' ) AND spras = @sy-langu AND lvorm <> @abap_true. DATA lt_res_tab LIKE lt_mara. IF lo_f4 IS NOT BOUND. lo_f4 = cl_reca_gui_f4_popup=>factory_grid( id_title = 'Заголовок' " Заголовок окна if_multi = abap_false " Единичный выбор it_f4value = lt_mara " Вн. таблица с данными ). ENDIF. lo_f4->display( IMPORTING et_result = lt_res_tab ef_cancelled = DATA(lv_cancelled) ). IF lv_cancelled = abap_true. RETURN. ENDIF. IF line_exists( lt_res_tab[ 1 ] ). ... ENDIF. |
ABAP радиокнопки. Скрыть отобразить поля по нажатию. Пример.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
" " TABLES: mara, mard, mspr, eban, aufk, afpo, afih. DATA: gv_ucomm TYPE sy-ucomm. SELECT-OPTIONS: s_mtart FOR mara-mtart. SELECT-OPTIONS: s_matnr FOR mara-matnr. SELECT-OPTIONS: s_mfrpn FOR mara-mfrpn. PARAMETERS: p_alg_1 TYPE c RADIOBUTTON GROUP gr1 USER-COMMAND com1 DEFAULT 'X'. PARAMETERS: p_alg_2 TYPE c RADIOBUTTON GROUP gr1 . PARAMETERS: p_alg_3 TYPE c RADIOBUTTON GROUP gr1. PARAMETERS: p_alg_4 TYPE c RADIOBUTTON GROUP gr1. PARAMETERS: p_alg_5 TYPE c RADIOBUTTON GROUP gr1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002 . SELECT-OPTIONS: s_werks2 FOR mard-werks MODIF ID sc2, s_lgort2 FOR mard-lgort MODIF ID sc2, s_sobkz2 FOR mspr-sobkz MODIF ID sc2, s_pspnr2 FOR mspr-pspnr MODIF ID sc2. SELECTION-SCREEN END OF BLOCK b2. SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003 . SELECT-OPTIONS: s_ekgrp3 FOR eban-ekgrp MODIF ID sc3, s_matkl3 FOR eban-matkl MODIF ID sc3, s_bsart3 FOR eban-bsart MODIF ID sc3, s_banfn3 FOR eban-banfn MODIF ID sc3, s_bnfpo3 FOR eban-bnfpo MODIF ID sc3. SELECTION-SCREEN END OF BLOCK b3. SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-004 . SELECT-OPTIONS: s_auart4 FOR aufk-auart MODIF ID sc4, s_aufnr4 FOR afpo-aufnr MODIF ID sc4, s_projn4 FOR afpo-projn MODIF ID sc4, s_equnr4 FOR afih-equnr MODIF ID sc4. SELECTION-SCREEN END OF BLOCK b4. SELECTION-SCREEN BEGIN OF BLOCK b5 WITH FRAME TITLE text-005 . PARAMETERS: p_req_T TYPE text20 MODIF ID sc5. PARAMETERS: p_req TYPE text20 MODIF ID sc5. SELECTION-SCREEN END OF BLOCK b5. AT SELECTION-SCREEN. " событие срабатывает, когда нажимаем кнопку gv_ucomm = sy-ucomm. AT SELECTION-SCREEN OUTPUT. " Данное событие срабатывает после AT SELECTION-SCREEN " но sy-ucomm очищается, поэтому используем ранее сохраненное значение CHECK gv_ucomm = 'COM1'. lcl_get_data=>user_comand_1( EXPORTING iv_alg_1 = p_alg_1 iv_alg_2 = p_alg_2 iv_alg_3 = p_alg_3 iv_alg_4 = p_alg_4 iv_alg_5 = p_alg_5 ). "Опишем класс CLASS lcl_get_data DEFINITION. PUBLIC SECTION. user_comand_1 IMPORTING iv_alg_1 TYPE abap_bool iv_alg_2 TYPE abap_bool iv_alg_3 TYPE abap_bool iv_alg_4 TYPE abap_bool iv_alg_5 TYPE abap_bool. PRIVATE SECTION. visible_on_off IMPORTING iv_modif TYPE char3 iv_visible TYPE abap_bool. ENDCLASS. CLASS lcl_get_data IMPLEMENTATION. METHOD user_comand_1. visible_on_off( EXPORTING iv_modif = 'SC1' iv_visible = iv_alg_1 ). visible_on_off( EXPORTING iv_modif = 'SC2' iv_visible = iv_alg_2 ). visible_on_off( EXPORTING iv_modif = 'SC3' iv_visible = iv_alg_3 ). visible_on_off( EXPORTING iv_modif = 'SC4' iv_visible = iv_alg_4 ). visible_on_off( EXPORTING iv_modif = 'SC5' iv_visible = iv_alg_5 ). ENDMETHOD. METHOD visible_on_off. DATA lv_invisible TYPE c. DATA lv_active TYPE c. DATA lv_output TYPE c. DATA lv_input TYPE c. IF iv_visible = abap_true. lv_invisible = 0. lv_active = 1. lv_output = 1. lv_input = 1. ELSE. lv_invisible = 1. lv_active = 0. lv_output = 0. lv_input = 0. ENDIF. LOOP AT SCREEN. IF screen-group1 = iv_modif. screen-invisible = lv_invisible. screen-active = lv_active. screen-output = lv_output. screen-input = lv_input. MODIFY SCREEN. ENDIF. ENDLOOP. ENDMETHOD. ENDCLASS. |