СБИС Сапёр - Вызов из программ печати — различия между версиями
(→Стандартные программы печати) |
|||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
==Общая концепция== | ==Общая концепция== | ||
Алгоритм формирования электронного документа следующий: | Алгоритм формирования электронного документа следующий: | ||
+ | # SBIS SAPPER для каждого отправляемого документа SAP для формирования электронного документа вызывает программу печати указанную в настройках | ||
# программа печати рассчитывает данные необходимые для печати. | # программа печати рассчитывает данные необходимые для печати. | ||
# перед вызовом формуляра управление передается в SBIS SAPPER. SAPPER проверяет кто инициатор вызова программы печати. | # перед вызовом формуляра управление передается в SBIS SAPPER. SAPPER проверяет кто инициатор вызова программы печати. | ||
##Если это не SAPPER, то он возвращает управление программе печати (все как обычно). | ##Если это не SAPPER, то он возвращает управление программе печати (все как обычно). | ||
− | ##Если это SAPPER, то он | + | ##Если это SAPPER, то он из подготовленных программой печати данных, выбирает нужные (по настройкам выгрузки) и формирует XML документ. По окончании возвращает флаг, сигнализирующий о необходимости прервать программу печати. |
==Стандартные программы печати== | ==Стандартные программы печати== | ||
Строка 91: | Строка 92: | ||
==Вызов из BADI== | ==Вызов из BADI== | ||
− | <source> | + | |
+ | Пример кода для вызова из BADI для программы печати накладной ТОРГ-12. В зависимости от флага gv_not_print мы либо печатаем, либо выходим из BADI и из программы печати. | ||
+ | |||
+ | <source lang="abap"> | ||
METHOD j_3r_torg12_badi_interface~doc_details. | METHOD j_3r_torg12_badi_interface~doc_details. | ||
Строка 175: | Строка 179: | ||
lv_error_msg_ext = cx_core->lv_error_msg_ext | lv_error_msg_ext = cx_core->lv_error_msg_ext | ||
lv_error_msg_detail = cx_core->lv_error_msg_detail | lv_error_msg_detail = cx_core->lv_error_msg_detail | ||
− | + | && ` <= ` && lv_cur_prog && `->` && lv_cur_form. | |
ENDTRY. | ENDTRY. | ||
ENDMETHOD. | ENDMETHOD. | ||
</source> | </source> | ||
− | |||
==Вызов из формуляра SMARTFORM== | ==Вызов из формуляра SMARTFORM== | ||
Строка 311: | Строка 314: | ||
ENDIF. | ENDIF. | ||
</source> | </source> | ||
+ | |||
+ | ==Акты сверки дебиторов\кредиторов== | ||
+ | В стандартном SAP для построения актов сверки дебиторов\кредиторов используются программы J_3RF_ASD\J_3RF_ASK. Логика работы программ не позволяет встроить в текущий процесс обработки прерывание и получить необходимые данные, поэтому необходимо в случае использования стандартной программы скопировать её в Z* программу и внести изменения: | ||
+ | # В параметры добавить <source lang=ABAP>p_sbis LIKE rfpdo2-f140immd DEFAULT ' '</source> | ||
+ | # Добавить перед формированием ALV-списка прерывание: <source lang=ABAP> | ||
+ | IF p_sbis = abap_true. "SBIS | ||
+ | DATA: lv_timestamp(30) TYPE c, | ||
+ | lv_docum_id(60) TYPE c, | ||
+ | lv_detail_id(60) TYPE c. | ||
+ | |||
+ | IMPORT lv_timestamp TO lv_timestamp FROM MEMORY ID 'ZSBIS_AKT_SVERKI_D'. | ||
+ | |||
+ | CONCATENATE 'ZSBIS_J_3RF_ASD_DOCUM_' lv_timestamp INTO lv_docum_id. | ||
+ | CONCATENATE 'ZSBIS_J_3RF_ASD_DETAIL_' lv_timestamp INTO lv_detail_id. | ||
+ | |||
+ | EXPORT t_docum TO MEMORY ID lv_docum_id. | ||
+ | EXPORT gt_detail TO MEMORY ID lv_detail_id. | ||
+ | LEAVE PROGRAM. | ||
+ | ENDIF. | ||
+ | </source> | ||
+ | |||
+ | [[Файл:акты_сверки_прерывание.png|Акты сверки. Прерывание перед формированием списка]] | ||
+ | |||
+ | Для собственной Z* программы следует внести вышеописанные изменения. | ||
+ | |||
+ | После внесения изменений требуется создать транзакцию для программы и создать программу вызова, пример ниже: | ||
+ | <source lang=ABAP> | ||
+ | REPORT zprc_zsbis_act_sverki. | ||
+ | |||
+ | *проверить типы данных используемых структур | ||
+ | |||
+ | TYPES: BEGIN OF ty_doc, | ||
+ | * box TYPE c, | ||
+ | lineno TYPE i, | ||
+ | kunnr LIKE bsid-kunnr, | ||
+ | bukrs LIKE bsid-bukrs, | ||
+ | gjahr LIKE bsid-gjahr, | ||
+ | monat LIKE bsid-monat, | ||
+ | bukad LIKE bsid-bukrs, | ||
+ | bstat(2), | ||
+ | belnr LIKE bsid-belnr, | ||
+ | budat LIKE bsid-budat, | ||
+ | bldat LIKE bsik-bldat, | ||
+ | bktxt LIKE bkpf-bktxt, | ||
+ | buzei LIKE bsid-buzei, | ||
+ | gsber LIKE bsid-gsber, | ||
+ | rebzg LIKE bsid-rebzg, | ||
+ | rebzj LIKE bsid-rebzj, | ||
+ | rebzz LIKE bsid-rebzz, | ||
+ | augbl LIKE bsid-augbl, | ||
+ | augdt LIKE bsid-augdt, | ||
+ | xblnr LIKE bsid-xblnr, "Mutual calm stat.,orig.number | ||
+ | vbeln LIKE bsid-vbeln, "SD-Invoice | ||
+ | xref3 LIKE bsid-xref3, | ||
+ | vertn LIKE bsid-vertn, | ||
+ | koart LIKE bseg-koart, | ||
+ | zuonr LIKE bsid-zuonr, | ||
+ | xzahl LIKE bsid-xzahl, | ||
+ | shkzg LIKE bsid-shkzg, | ||
+ | bschl LIKE bsid-bschl, | ||
+ | blart LIKE bsid-blart, | ||
+ | umskz LIKE bsid-umskz, | ||
+ | dmbtr LIKE bsid-dmbtr, | ||
+ | d_dmbtr LIKE bsid-dmbtr, | ||
+ | c_dmbtr LIKE bsid-dmbtr, | ||
+ | bwaer LIKE bsid-waers, | ||
+ | bisoc LIKE tcurc-isocd, | ||
+ | kursf LIKE bkpf-kursf, | ||
+ | wrbtr LIKE bsid-wrbtr, | ||
+ | d_wrbtr LIKE bsid-wrbtr, | ||
+ | c_wrbtr LIKE bsid-wrbtr, | ||
+ | waers LIKE bsid-waers, | ||
+ | isocd LIKE tcurc-isocd, | ||
+ | dweks LIKE bsid-dmbtr, | ||
+ | d_dweks LIKE bsid-dmbtr, | ||
+ | c_dweks LIKE bsid-dmbtr, | ||
+ | wweks LIKE bsid-wrbtr, | ||
+ | d_wweks LIKE bsid-wrbtr, | ||
+ | c_wweks LIKE bsid-wrbtr, | ||
+ | wwaer LIKE bsid-waers, | ||
+ | wpay LIKE bseg-wrbtr, | ||
+ | dpay LIKE bseg-dmbtr, | ||
+ | rebzt LIKE bsid-rebzt, | ||
+ | stneg LIKE t041c-xnegp, | ||
+ | intcnum TYPE j_3rfcnt-intcnum, | ||
+ | extcnum TYPE j_3rfcnt-extcnum, | ||
+ | cntdate TYPE j_3rfcnt-cntdate, | ||
+ | END OF ty_doc, | ||
+ | |||
+ | BEGIN OF ty_detail, | ||
+ | box TYPE c, | ||
+ | lineno TYPE i, | ||
+ | kunnr LIKE bsid-kunnr, | ||
+ | bukrs LIKE bsid-bukrs, | ||
+ | intcnum TYPE j_3rfcnt-intcnum, | ||
+ | extcnum TYPE j_3rfcnt-extcnum, | ||
+ | cntdate TYPE j_3rfcnt-cntdate, | ||
+ | waers LIKE bsik-waers, | ||
+ | gjahr LIKE bsid-gjahr, | ||
+ | monat LIKE bsid-monat, | ||
+ | insal LIKE glt0-tsl01, | ||
+ | debet LIKE glt0-tsl01, | ||
+ | kredt LIKE glt0-tsl01, | ||
+ | ousal LIKE glt0-tsl01, | ||
+ | END OF ty_detail, | ||
+ | |||
+ | BEGIN OF ty_items, | ||
+ | line_type TYPE char255, | ||
+ | number TYPE char255, | ||
+ | name TYPE char255, | ||
+ | text TYPE char255, | ||
+ | section TYPE char255, | ||
+ | type TYPE char255, | ||
+ | date TYPE budat, | ||
+ | kredit TYPE sumha, | ||
+ | debet TYPE sumha, | ||
+ | link_number TYPE char255, | ||
+ | link_name TYPE char255, | ||
+ | link_date TYPE budat, | ||
+ | link_type TYPE char255, | ||
+ | link_kredit TYPE sumha, | ||
+ | link_debet TYPE sumha, | ||
+ | END OF ty_items. | ||
+ | |||
+ | DATA: lt_docum TYPE STANDARD TABLE OF ty_doc WITH KEY kunnr bukrs gjahr belnr WITH HEADER LINE, "документы | ||
+ | ls_docum LIKE LINE OF lt_docum, | ||
+ | |||
+ | lt_detail TYPE STANDARD TABLE OF ty_detail, "сальдо, оборотка | ||
+ | ls_detail LIKE LINE OF lt_detail, | ||
+ | |||
+ | gt_items2 TYPE STANDARD TABLE OF ty_items, | ||
+ | gs_items2 LIKE LINE OF gt_items2, | ||
+ | |||
+ | ls_api2_attachment TYPE /sbis/s_api2_attachment, | ||
+ | |||
+ | lt_bukrs_re TYPE /sbis/t_rng_bukrs, | ||
+ | lt_bldat_re TYPE /sbis/t_rng_bldat, | ||
+ | |||
+ | lv_mode TYPE c VALUE 'P', | ||
+ | lv_program TYPE sy-repid, | ||
+ | lv_number TYPE string, | ||
+ | lv_bukrs_low TYPE bukrs, | ||
+ | lv_bukrs_high TYPE bukrs, | ||
+ | lv_kunnr_low TYPE kunnr, | ||
+ | lv_kunnr_high TYPE kunnr, | ||
+ | lv_first_date TYPE sy-datum, | ||
+ | lv_last_date TYPE sy-datum, | ||
+ | lv_tmstp TYPE timestampl, | ||
+ | lv_timestamp(30) TYPE c, | ||
+ | lv_docum_id(60) TYPE c, | ||
+ | lv_detail_id(60) TYPE c. | ||
+ | |||
+ | DATA: bdc_tab TYPE STANDARD TABLE OF bdcdata, | ||
+ | bdc_line LIKE LINE OF bdc_tab, | ||
+ | message_tab TYPE STANDARD TABLE OF bapiret2. | ||
+ | |||
+ | FIELD-SYMBOLS: <fs_bdc_line> LIKE LINE OF bdc_tab, | ||
+ | <fs_docum> LIKE LINE OF lt_docum, | ||
+ | <fs_detail> LIKE LINE OF lt_detail, | ||
+ | <fs_items> LIKE LINE OF gt_items2, | ||
+ | |||
+ | <fs_bldat_re>, | ||
+ | <fs_kunnr_re>, | ||
+ | <fs_bukrs_re>, | ||
+ | |||
+ | <fs_bldat_re_s> TYPE /sbis/s_rng_bldat, | ||
+ | <fs_kunnr_re_s> TYPE /sbis/s_rng_kunnr2, | ||
+ | <fs_bukrs_re_s> TYPE /sbis/s_rng_bukrs2. | ||
+ | |||
+ | FORM entry USING is_api2_attachment return_code us_screen. | ||
+ | CLEAR: lv_program, lv_bukrs_low, lv_bukrs_high, lv_kunnr_low, lv_kunnr_high, lv_first_date, lv_last_date, lv_tmstp, lv_timestamp, lv_docum_id, lv_detail_id, lv_number, ls_api2_attachment. | ||
+ | REFRESH: lt_docum, lt_detail, gt_items2, bdc_tab, lt_bukrs_re, lt_bldat_re. | ||
+ | |||
+ | ls_api2_attachment = is_api2_attachment. | ||
+ | |||
+ | ASSIGN ('(/SBIS/SAPPER)CL_TREE_ACCORDION->GS_CONTENT_FILTER-BLDAT_RE[]') TO <fs_bldat_re>. | ||
+ | ASSIGN ('(/SBIS/SAPPER)CL_TREE_ACCORDION->GS_CONTENT_FILTER-BUKRS_RE[]') TO <fs_bukrs_re>. | ||
+ | |||
+ | CHECK <fs_bldat_re> IS ASSIGNED. | ||
+ | CHECK <fs_bukrs_re> IS ASSIGNED. | ||
+ | |||
+ | IF <fs_bldat_re> IS INITIAL. | ||
+ | return_code = 0. | ||
+ | MESSAGE 'Введите даты в фильтре, чтобы отобразить корректный акт сверки!' TYPE 'I' DISPLAY LIKE 'E'. | ||
+ | EXIT. | ||
+ | ELSE. | ||
+ | lt_bldat_re = <fs_bldat_re>. | ||
+ | ENDIF. | ||
+ | IF <fs_bukrs_re> IS INITIAL. | ||
+ | return_code = 0. | ||
+ | MESSAGE 'Введите организационный юнит в фильтре, чтобы отобразить корректный акт сверки!' TYPE 'I' DISPLAY LIKE 'E'. | ||
+ | EXIT. | ||
+ | ELSE. | ||
+ | lt_bukrs_re = <fs_bukrs_re>. | ||
+ | ENDIF. | ||
+ | |||
+ | ***********************************************************************get user settings************************************************************************ | ||
+ | lv_kunnr_low = ls_api2_attachment-belnr. "KUNNR | ||
+ | |||
+ | READ TABLE lt_bukrs_re ASSIGNING <fs_bukrs_re_s> INDEX 1. | ||
+ | IF sy-subrc = 0. | ||
+ | lv_bukrs_high = <fs_bukrs_re_s>-high. | ||
+ | ENDIF. | ||
+ | |||
+ | READ TABLE lt_bukrs_re ASSIGNING <fs_bukrs_re_s> INDEX 1. | ||
+ | IF sy-subrc = 0. | ||
+ | lv_bukrs_low = <fs_bukrs_re_s>-low. | ||
+ | ENDIF. | ||
+ | |||
+ | READ TABLE lt_bldat_re ASSIGNING <fs_bldat_re_s> INDEX 1. | ||
+ | IF sy-subrc = 0. | ||
+ | CONCATENATE <fs_bldat_re_s>-high+6(2) <fs_bldat_re_s>-high+4(2) <fs_bldat_re_s>-high(4) INTO lv_last_date. | ||
+ | ENDIF. | ||
+ | |||
+ | READ TABLE lt_bldat_re ASSIGNING <fs_bldat_re_s> INDEX 1. | ||
+ | IF sy-subrc = 0. | ||
+ | CONCATENATE <fs_bldat_re_s>-low+6(2) <fs_bldat_re_s>-low+4(2) <fs_bldat_re_s>-low(4) INTO lv_first_date. | ||
+ | ENDIF. | ||
+ | |||
+ | CONCATENATE lv_first_date lv_kunnr_low lv_last_date INTO lv_number. "номер акта сверки дата_начала+вендор+дата_конца | ||
+ | |||
+ | lv_program = 'ZPRC_ZJ_3RF_ASD'. | ||
+ | **************************************************************************************************************************************************************** | ||
+ | |||
+ | ASSIGN bdc_line TO <fs_bdc_line>. | ||
+ | |||
+ | <fs_bdc_line>-program = lv_program. | ||
+ | <fs_bdc_line>-dynpro = '1000'. | ||
+ | <fs_bdc_line>-dynbegin = 'X'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'DD_KUNNR-LOW'. | ||
+ | <fs_bdc_line>-fval = lv_kunnr_low. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'DD_KUNNR-HIGH'. | ||
+ | <fs_bdc_line>-fval = lv_kunnr_high. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'DD_BUKRS-LOW'. | ||
+ | <fs_bdc_line>-fval = lv_bukrs_low. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'DD_BUKRS-HIGH'. | ||
+ | <fs_bdc_line>-fval = lv_bukrs_high. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'D_PERIOD-LOW'. | ||
+ | <fs_bdc_line>-fval = lv_first_date. "дата начала | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'D_PERIOD-HIGH'. | ||
+ | <fs_bdc_line>-fval = lv_last_date. "дата конца | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'PRINTER'. | ||
+ | <fs_bdc_line>-fval = '*'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'P_SBIS'. | ||
+ | <fs_bdc_line>-fval = 'X'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'BDC_OKCODE'. | ||
+ | <fs_bdc_line>-fval = '=ONLI'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-program = 'SAPMSSY0'. | ||
+ | <fs_bdc_line>-dynpro = '0120'. | ||
+ | <fs_bdc_line>-dynbegin = 'X'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'BDC_OKCODE'. | ||
+ | <fs_bdc_line>-fval = '=&ALL'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-program = 'SAPMSSY0'. | ||
+ | <fs_bdc_line>-dynpro = '0120'. | ||
+ | <fs_bdc_line>-dynbegin = 'X'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: <fs_bdc_line>. | ||
+ | <fs_bdc_line>-fnam = 'BDC_OKCODE'. | ||
+ | <fs_bdc_line>-fval = '=&ETA'. | ||
+ | APPEND <fs_bdc_line> TO bdc_tab. | ||
+ | |||
+ | CLEAR: lv_tmstp, lv_timestamp. | ||
+ | GET TIME STAMP FIELD lv_tmstp. | ||
+ | lv_timestamp = lv_tmstp. | ||
+ | REPLACE ALL OCCURENCES OF '.' IN lv_timestamp WITH ''. | ||
+ | CONDENSE lv_timestamp NO-GAPS. | ||
+ | |||
+ | EXPORT lv_timestamp TO MEMORY ID sy-repid. | ||
+ | |||
+ | CALL TRANSACTION 'ZZTRJ_3RF_ASD_SBIS' USING bdc_tab MODE lv_mode MESSAGES INTO message_tab. | ||
+ | |||
+ | CONCATENATE 'ZSBIS_J_3RF_ASD_DOCUM_' lv_timestamp INTO lv_docum_id. | ||
+ | CONCATENATE 'ZSBIS_J_3RF_ASD_DETAIL_' lv_timestamp INTO lv_detail_id. | ||
+ | |||
+ | IMPORT t_docum TO lt_docum FROM MEMORY ID lv_docum_id. | ||
+ | IMPORT gt_detail TO lt_detail FROM MEMORY ID lv_detail_id. | ||
+ | |||
+ | IF lt_docum IS INITIAL AND lt_detail IS INITIAL. | ||
+ | return_code = 0. | ||
+ | MESSAGE 'Актов сверки для выбранного дебитора не найдено!' TYPE 'I' DISPLAY LIKE 'E'. | ||
+ | EXIT. | ||
+ | ENDIF. | ||
+ | |||
+ | ASSIGN ls_detail TO <fs_detail>. | ||
+ | ASSIGN gs_items2 TO <fs_items>. | ||
+ | |||
+ | LOOP AT lt_docum INTO ls_docum. | ||
+ | CASE ls_docum-bstat. | ||
+ | WHEN '3W'. | ||
+ | <fs_items>-link_name = 'Взаимозачеты'. | ||
+ | WHEN '1I'. | ||
+ | <fs_items>-link_name = 'Счета-фактуры полученные'. | ||
+ | WHEN '1O'. | ||
+ | <fs_items>-link_name = 'Счета-фактуры выданные'. | ||
+ | WHEN '2P'. | ||
+ | <fs_items>-link_name = 'Платежи от дебитора'. | ||
+ | WHEN '1A'. | ||
+ | <fs_items>-link_name = 'Снижение задолж-ти дебитора'. | ||
+ | WHEN '5K'. | ||
+ | <fs_items>-link_name = 'КурсРазницы, ПерерасчАвансов'. | ||
+ | WHEN '6*'. | ||
+ | <fs_items>-link_name = 'Прочие'. | ||
+ | WHEN '2R'. | ||
+ | <fs_items>-link_name = 'Платежи дебитору'. | ||
+ | WHEN '1Q'. | ||
+ | <fs_items>-link_name = 'Кредитовое авизо'. | ||
+ | WHEN '2V'. | ||
+ | <fs_items>-link_name = 'Платежи кредитору'. | ||
+ | WHEN '2C'. | ||
+ | <fs_items>-link_name = 'Платежи от кредитора'. | ||
+ | WHEN '3X'. | ||
+ | <fs_items>-link_name = 'Переуступка права требования'. | ||
+ | WHEN '1Z'. | ||
+ | CONCATENATE 'Сторно' 'счетов-фактур' INTO <fs_items>-link_name SEPARATED BY space. | ||
+ | WHEN '2Z'. | ||
+ | CONCATENATE 'Сторно' 'платежей' INTO <fs_items>-link_name SEPARATED BY space. | ||
+ | WHEN '3Z'. | ||
+ | CONCATENATE 'Сторно' 'взаимозачетов' INTO <fs_items>-link_name SEPARATED BY space. | ||
+ | WHEN '4Z'. | ||
+ | CONCATENATE 'Сторно' 'векселей' INTO <fs_items>-link_name SEPARATED BY space. | ||
+ | WHEN '5Z'. | ||
+ | CONCATENATE 'Сторно' 'курсовых разниц, повт. подсчет' INTO <fs_items>-link_name SEPARATED BY space. | ||
+ | WHEN '3Y'. | ||
+ | CONCATENATE 'Сторно' 'переуступки права требования' INTO <fs_items>-link_name SEPARATED BY space. | ||
+ | WHEN OTHERS. | ||
+ | DELETE lt_docum. | ||
+ | CONTINUE. | ||
+ | ENDCASE. | ||
+ | |||
+ | <fs_items>-line_type = 'СтрТабл'. | ||
+ | <fs_items>-number = ls_docum-xblnr. | ||
+ | <fs_items>-name = ls_docum-xblnr. | ||
+ | <fs_items>-text = ls_docum-bktxt. | ||
+ | <fs_items>-section = 'Получатель'. | ||
+ | <fs_items>-date = ls_docum-budat. | ||
+ | <fs_items>-debet = ls_docum-wrbtr. | ||
+ | <fs_items>-link_number = ls_docum-bstat. | ||
+ | <fs_items>-link_date = ls_docum-budat. | ||
+ | <fs_items>-link_type = ls_docum-bstat. | ||
+ | APPEND <fs_items> TO gt_items2. | ||
+ | ENDLOOP. | ||
+ | |||
+ | <fs_items>-line_type = 'ИтогТабл'. | ||
+ | <fs_items>-section = 'Получатель'. | ||
+ | <fs_items>-type = 'Сальдо начальное'. | ||
+ | READ TABLE lt_detail INDEX 1 ASSIGNING <fs_detail>. | ||
+ | <fs_items>-date = lv_first_date. | ||
+ | <fs_items>-debet = <fs_detail>-insal. | ||
+ | |||
+ | APPEND <fs_items> TO gt_items2. | ||
+ | CLEAR <fs_items>. | ||
+ | |||
+ | DATA: lv_lines TYPE i. | ||
+ | CLEAR: lv_lines. | ||
+ | DESCRIBE TABLE lt_detail LINES lv_lines. | ||
+ | <fs_items>-line_type = 'ИтогТабл'. | ||
+ | <fs_items>-section = 'Получатель'. | ||
+ | <fs_items>-type = 'Сальдо конечное'. | ||
+ | READ TABLE lt_detail INDEX lv_lines ASSIGNING <fs_detail>. | ||
+ | <fs_items>-date = lv_last_date. | ||
+ | <fs_items>-debet = <fs_detail>-ousal. | ||
+ | |||
+ | APPEND <fs_items> TO gt_items2. | ||
+ | CLEAR <fs_items>. | ||
+ | |||
+ | <fs_items>-line_type = 'ИтогТабл'. | ||
+ | <fs_items>-section = 'Получатель'. | ||
+ | <fs_items>-type = 'Обороты'. | ||
+ | LOOP AT lt_detail ASSIGNING <fs_detail>. | ||
+ | <fs_items>-kredit = <fs_items>-kredit + <fs_detail>-kredt. | ||
+ | <fs_items>-debet = <fs_items>-debet + <fs_detail>-debet. | ||
+ | <fs_items>-link_debet = <fs_items>-link_debet + <fs_detail>-debet. | ||
+ | <fs_items>-link_kredit = <fs_items>-link_kredit + <fs_detail>-kredt. | ||
+ | ENDLOOP. | ||
+ | |||
+ | APPEND <fs_items> TO gt_items2. | ||
+ | CLEAR <fs_items>. | ||
+ | |||
+ | *************************************************************** | ||
+ | ** TENSOR SBIS EDO * | ||
+ | *************************************************************** | ||
+ | TRY. | ||
+ | DATA: cx_root TYPE REF TO cx_root, | ||
+ | lv_not_print TYPE c VALUE '', | ||
+ | cl_mapping2 TYPE REF TO /sbis/cl_mapping. | ||
+ | |||
+ | CREATE OBJECT cl_mapping2. | ||
+ | |||
+ | CALL METHOD cl_mapping2->calc_doc | ||
+ | EXPORTING | ||
+ | iv_ini_name = ls_api2_attachment-ini_name | ||
+ | IMPORTING | ||
+ | ev_not_print = lv_not_print. | ||
+ | |||
+ | return_code = 0. | ||
+ | |||
+ | CATCH cx_root INTO cx_root. | ||
+ | CLEAR gt_items2. | ||
+ | return_code = 1. | ||
+ | EXIT. | ||
+ | ENDTRY. | ||
+ | *************************************************************** | ||
+ | ** TENSOR SBIS EDO * | ||
+ | *************************************************************** | ||
+ | ENDFORM. | ||
+ | </source> | ||
+ | |||
+ | На что следует обратить внимание: | ||
+ | # Структуры типов данных ty_doc, ty_detail, ty_items должны совпадать в программе вызова и программе формирования актов сверки. | ||
+ | # Метки памяти должны совпадать в программе вызова и программе формирования актов сверки. | ||
+ | # BDC должны содержать правильное имя вызываемой программы формирования актов и транзакции. | ||
+ | # Имя метки памяти ограничено 60 символами. | ||
+ | # В качестве номера акта сверки используется строка полученная конкатенацией даты начала построения списка, номером кредитора\дебитора, даты конца построения списка. Можно использовать отдельную нумерация, для этого требуется создать в транзакции SNUM свой объект нумерации и использовать в программе вызова для получения свободного номера стандартный ФМ NUMBER_GET_NEXT, полученный номер следует присвоить переменной lv_number. | ||
[[Категория:SAP]] | [[Категория:SAP]] | ||
[[Категория:SAPPER]] | [[Категория:SAPPER]] |
Текущая версия на 08:34, 4 декабря 2017
Содержание
Общая концепция
Алгоритм формирования электронного документа следующий:
- SBIS SAPPER для каждого отправляемого документа SAP для формирования электронного документа вызывает программу печати указанную в настройках
- программа печати рассчитывает данные необходимые для печати.
- перед вызовом формуляра управление передается в SBIS SAPPER. SAPPER проверяет кто инициатор вызова программы печати.
- Если это не SAPPER, то он возвращает управление программе печати (все как обычно).
- Если это SAPPER, то он из подготовленных программой печати данных, выбирает нужные (по настройкам выгрузки) и формирует XML документ. По окончании возвращает флаг, сигнализирующий о необходимости прервать программу печати.
Стандартные программы печати
Сначала запускается подпрограмма ENTRY. Это оболочка для подпрограммы PROCESSING, передает код возврата, в ней изменения не понадобятся:
FORM entry USING return_code us_screen. "#EC CALLED
CLEAR retcode.
xscreen = us_screen.
PERFORM processing USING us_screen.
IF retcode NE 0.
return_code = 1.
ELSE.
return_code = 0.
ENDIF.
CLEAR status.
ENDFORM.
Вызов непосредственно печати обычно находится в теле подпрограммы PROCESSING.
FORM processing USING proc_screen.
PERFORM checks.
PERFORM init_data.
PERFORM get_data.
PERFORM print.
ENDFORM.
Поэтому до вызова печати (PRINT) необходимо вставить СБИС-код формирования электронных документов. Пример кода:
DATA gv_not_print TYPE c . " TENSOR SBIS EDO
FORM processing USING proc_screen.
PERFORM checks.
PERFORM init_data.
PERFORM get_data.
PERFORM sbis_edi. " TENSOR SBIS EDO
CHECK gv_not_print IS INITIAL. " TENSOR SBIS EDO
PERFORM print.
ENDFORM.
FORM sbis_edi .
* TENSOR SBIS EDO
TRY.
DATA cx_root TYPE REF TO cx_root.
DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
CREATE OBJECT cl_mapping.
CALL METHOD cl_mapping->calc_doc
EXPORTING
is_nast = nast
IMPORTING
ev_not_print = gv_not_print.
DATA cx_core TYPE REF TO /sbis/cx_core.
CATCH /sbis/cx_core INTO cx_core.
DATA lv_cur_prog TYPE char255.
DATA lv_cur_form TYPE char255.
CALL METHOD /sbis/cl_core=>get_current_progname
IMPORTING
ev_prog_name = lv_cur_prog
ev_form_name = lv_cur_form.
" exception проходит через прогр печати без текста!
FIELD-SYMBOLS: <fs_exc> TYPE /sbis/s_cx_core.
ASSIGN ('(/SBIS/SAPLGF_PRINT_PROG)GS_EXC') TO <fs_exc>.
IF <fs_exc> IS ASSIGNED.
<fs_exc>-error_msg_ext = cx_core->lv_error_msg_ext.
<fs_exc>-error_msg_detail = cx_core->lv_error_msg_detail
&& ` <= ` && lv_cur_prog && `->` && lv_cur_form.
ENDIF.
RAISE EXCEPTION TYPE /sbis/cx_core
EXPORTING
textid = cx_core->textid
lv_error_msg_ext = cx_core->lv_error_msg_ext
lv_error_msg_detail = cx_core->lv_error_msg_detail
&& ` <= ` && lv_cur_prog && `->` && lv_cur_form.
ENDTRY.
ENDFORM.
Т.о. в зависимости от флага gv_not_print мы либо печатаем, либо выходим из программы с правильным кодом возврата.
Вызов из BADI
Пример кода для вызова из BADI для программы печати накладной ТОРГ-12. В зависимости от флага gv_not_print мы либо печатаем, либо выходим из BADI и из программы печати.
METHOD j_3r_torg12_badi_interface~doc_details.
** I_VBDKL TYPE VBDKL
** T_VBDPL TYPE EHS_VBDPL_T
** EDITABLE TYPE XFELD
** HDOC TYPE J_3RV_HT12
** ITEMS TYPE J_3RV_TT12
**************************************************************
* TENSOR SBIS EDO *
**************************************************************
DATA lv_prog_and_field TYPE char255.
TRY.
*" GET NAST
"имя программы берем из инишки сверху
FIELD-SYMBOLS: <lfs_prog_name> TYPE char40.
ASSIGN ('(/SBIS/SAPLGF_PRINT_PROG)GV_PROG_NAME') TO <lfs_prog_name>.
IF <lfs_prog_name> IS ASSIGNED.
lv_prog_and_field = `(` && <lfs_prog_name> && `)` && 'NAST'.
FIELD-SYMBOLS: <lfs_nast> TYPE nast.
* ASSIGN ('(J_3RV_DELIV_PDF)NAST') TO <lfs_nast>.
ASSIGN (lv_prog_and_field) TO <lfs_nast>.
IF <lfs_nast> IS ASSIGNED.
*" MAPPING
DATA cx_root TYPE REF TO cx_root.
DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
CREATE OBJECT cl_mapping.
CALL METHOD cl_mapping->calc_doc
EXPORTING
is_nast = <lfs_nast>
IMPORTING
ev_not_print = gv_not_print.
ELSE.
"нет такой переменной - исключение!
RAISE EXCEPTION TYPE /sbis/cx_core
EXPORTING
textid = /sbis/cx_core=>/sbis/cx_core
lv_error_msg_ext = `Variable not assigned: '`
&& lv_prog_and_field && `'`
lv_error_msg_detail = ''.
ENDIF. " IF <lfs_nast> IS ASSIGNED.
*" EXIT FROM PRINT PROGRAM
IF NOT gv_not_print IS INITIAL.
lv_prog_and_field = `(` && <lfs_prog_name> && `)` && 'VBDKL'.
FIELD-SYMBOLS: <lfs_vbdkl> TYPE vbdkl.
"ASSIGN ('(J_3RV_DELIV_PDF)VBDKL') TO <lfs_vbdkl>.
ASSIGN (lv_prog_and_field) TO <lfs_vbdkl>.
IF <lfs_vbdkl> IS ASSIGNED.
CLEAR <lfs_vbdkl>-vbeln. " хитрый способ выйти из прогр J_3RV_DELIV_PDF
ELSE.
"если в логике программы что-то поменялось - исключение!
RAISE EXCEPTION TYPE /sbis/cx_core
EXPORTING
textid = /sbis/cx_core=>/sbis/cx_core
lv_error_msg_ext = `Variable not assigned: '`
&& lv_prog_and_field && `'`
lv_error_msg_detail = ''.
ENDIF. " IF <lfs_vbdkl> IS ASSIGNED.
ENDIF.
ENDIF. " IF <lfs_prog_name> IS ASSIGNED.
CATCH /sbis/cx_core INTO cx_core.
DATA lv_cur_prog TYPE char255.
DATA lv_cur_form TYPE char255.
CALL METHOD /sbis/cl_core=>get_current_progname
IMPORTING
ev_prog_name = lv_cur_prog
ev_form_name = lv_cur_form.
" exception проходит через прогр печати без текста!
FIELD-SYMBOLS: <fs_exc> TYPE /sbis/s_cx_core.
ASSIGN ('(/SBIS/SAPLGF_PRINT_PROG)GS_EXC') TO <fs_exc>.
IF <fs_exc> IS ASSIGNED.
<fs_exc>-error_msg_ext = cx_core->lv_error_msg_ext.
<fs_exc>-error_msg_detail = cx_core->lv_error_msg_detail
&& ` <= ` && lv_cur_prog && `->` && lv_cur_form.
ENDIF.
RAISE EXCEPTION TYPE /sbis/cx_core
EXPORTING
textid = cx_core->textid
lv_error_msg_ext = cx_core->lv_error_msg_ext
lv_error_msg_detail = cx_core->lv_error_msg_detail
&& ` <= ` && lv_cur_prog && `->` && lv_cur_form.
ENDTRY.
ENDMETHOD.
Вызов из формуляра SMARTFORM
Осуществляется в особенных случаях, когда в системе нет отдельной программы печати (например, в отраслевых решениях), или когда значительная часть логики перенесена в формуляр. Особенности вызова из формуляров - в необходимости прервать работу формуляра и корректно завершить основную программу после выхода из формуляра. Также необходимо чтобы данные формуляра, которые передаются в Сапер, были объявлены глобально. Вставить вызов кода необходимо в элемент смартформы "строки программы", где есть доступ к подготовленным данным печати. Например, в основной цикл по позициям. В инициализацию вставлять не имеет смысла - там нет доступа через assign к глобальным переменным формуляра, а также не обеспечивается корректный выход из формуляра/ФМ с rc=0.
Пример кода:
* TENSOR SBIS EDO
TRY.
DATA cx_root TYPE REF TO cx_root.
DATA lv_not_print TYPE c VALUE ''.
DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
CREATE OBJECT cl_mapping.
CALL METHOD cl_mapping->calc_doc_efg
EXPORTING
iv_ini_name = 'ZSF_INVOICE'
IMPORTING
ev_not_print = lv_not_print.
IF lv_not_print = 'X'.
" надо выйти без печати!
" Set error message
CALL FUNCTION 'SSFRT_WRITE_ERROR'
EXPORTING
i_msgid = '00'
i_msgno = '208'
i_msgv1 = 'SBIS: not print'.
* Raise the excption
user_exception user_canceled.
ENDIF.
CATCH /sbis/cx_core INTO cx_core.
" надо выйти без печати!
" SET error message
CALL FUNCTION 'SSFRT_WRITE_ERROR'
EXPORTING
* I_ERRNUMBER =
i_msgid = '00'
* I_MSGTY = 'E'
i_msgno = '208'
i_msgv1 = 'SBIS: not print'.
* Raise the excption
user_exception user_canceled.
CATCH cx_root INTO cx_root.
" надо выйти без печати!
" SET error message
CALL FUNCTION 'SSFRT_WRITE_ERROR'
EXPORTING
* I_ERRNUMBER =
i_msgid = '00'
* I_MSGTY = 'E'
i_msgno = '208'
i_msgv1 = 'SBIS: not print'.
* Raise the excption
user_exception user_canceled.
ENDTRY.
Как правило, программа печати не требует изменений и сама формирует необходимый код возврата.
Вызов из формуляра PDF
Осуществляется в особенных случаях, когда в системе нет отдельной программы печати (например, в отраслевых решениях), или когда значительная часть логики перенесена в формуляр. Особенности вызова из формуляров - в необходимости прервать работу формуляра и корректно завершить основную программу после выхода из формуляра. Вставить вызов кода необходимо в интерфейсе формуляра в код инициализации или в подпрограмму, где есть доступ к подготовленным данным печати:
Пример кода:
**************************************************************
* TENSOR SBIS EDO *
**************************************************************
TRY.
DATA cx_root TYPE REF TO cx_root.
DATA lv_not_print TYPE c VALUE ''.
DATA cl_mapping TYPE REF TO /sbis/cl_mapping.
CREATE OBJECT cl_mapping.
CALL METHOD cl_mapping->calc_doc
exporting
iv_ini_name = 'DP_TOVTORGPR_1175010' "
IMPORTING
ev_not_print = lv_not_print.
IF lv_not_print = 'X'.
return.
MESSAGE ID 'SU' TYPE '-' NUMBER 000 WITH 'SBIS_COMPLETE'
RAISING usage_error.
ENDIF.
CATCH cx_root INTO cx_root.
ENDTRY.
В программе печати необходимо предусмотреть корректный выход с правильным кодом возврата.
Пример кода:
CALL FUNCTION func_module_name
EXPORTING
/1bcdwb/docparams = fp_docparams
h_item = items
h_header = h_doc
IMPORTING
/1bcdwb/formoutput = ls_formoutput
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3.
**************************************************************
* TENSOR SBIS EDO - BEGIN *
**************************************************************
IF sy-subrc <> 0 AND sy-msgv1 = 'SBIS_COMPLETE'.
sy-subrc = 0.
CALL FUNCTION 'FPCOMP_FORM_END'
EXCEPTIONS
usage_error = 1
system_error = 2
internal_error = 3
OTHERS = 4.
ELSEIF sy-subrc <> 0.
**************************************************************
* TENSOR SBIS EDO - END *
**************************************************************
retcode = sy-subrc.
PERFORM protocol_update.
MESSAGE e073 INTO gv_dummy.
PERFORM protocol_update.
ENDIF.
Акты сверки дебиторов\кредиторов
В стандартном SAP для построения актов сверки дебиторов\кредиторов используются программы J_3RF_ASD\J_3RF_ASK. Логика работы программ не позволяет встроить в текущий процесс обработки прерывание и получить необходимые данные, поэтому необходимо в случае использования стандартной программы скопировать её в Z* программу и внести изменения:
- В параметры добавить
p_sbis LIKE rfpdo2-f140immd DEFAULT ' '
- Добавить перед формированием ALV-списка прерывание:
IF p_sbis = abap_true. "SBIS DATA: lv_timestamp(30) TYPE c, lv_docum_id(60) TYPE c, lv_detail_id(60) TYPE c. IMPORT lv_timestamp TO lv_timestamp FROM MEMORY ID 'ZSBIS_AKT_SVERKI_D'. CONCATENATE 'ZSBIS_J_3RF_ASD_DOCUM_' lv_timestamp INTO lv_docum_id. CONCATENATE 'ZSBIS_J_3RF_ASD_DETAIL_' lv_timestamp INTO lv_detail_id. EXPORT t_docum TO MEMORY ID lv_docum_id. EXPORT gt_detail TO MEMORY ID lv_detail_id. LEAVE PROGRAM. ENDIF.
Для собственной Z* программы следует внести вышеописанные изменения.
После внесения изменений требуется создать транзакцию для программы и создать программу вызова, пример ниже:
REPORT zprc_zsbis_act_sverki.
*проверить типы данных используемых структур
TYPES: BEGIN OF ty_doc,
* box TYPE c,
lineno TYPE i,
kunnr LIKE bsid-kunnr,
bukrs LIKE bsid-bukrs,
gjahr LIKE bsid-gjahr,
monat LIKE bsid-monat,
bukad LIKE bsid-bukrs,
bstat(2),
belnr LIKE bsid-belnr,
budat LIKE bsid-budat,
bldat LIKE bsik-bldat,
bktxt LIKE bkpf-bktxt,
buzei LIKE bsid-buzei,
gsber LIKE bsid-gsber,
rebzg LIKE bsid-rebzg,
rebzj LIKE bsid-rebzj,
rebzz LIKE bsid-rebzz,
augbl LIKE bsid-augbl,
augdt LIKE bsid-augdt,
xblnr LIKE bsid-xblnr, "Mutual calm stat.,orig.number
vbeln LIKE bsid-vbeln, "SD-Invoice
xref3 LIKE bsid-xref3,
vertn LIKE bsid-vertn,
koart LIKE bseg-koart,
zuonr LIKE bsid-zuonr,
xzahl LIKE bsid-xzahl,
shkzg LIKE bsid-shkzg,
bschl LIKE bsid-bschl,
blart LIKE bsid-blart,
umskz LIKE bsid-umskz,
dmbtr LIKE bsid-dmbtr,
d_dmbtr LIKE bsid-dmbtr,
c_dmbtr LIKE bsid-dmbtr,
bwaer LIKE bsid-waers,
bisoc LIKE tcurc-isocd,
kursf LIKE bkpf-kursf,
wrbtr LIKE bsid-wrbtr,
d_wrbtr LIKE bsid-wrbtr,
c_wrbtr LIKE bsid-wrbtr,
waers LIKE bsid-waers,
isocd LIKE tcurc-isocd,
dweks LIKE bsid-dmbtr,
d_dweks LIKE bsid-dmbtr,
c_dweks LIKE bsid-dmbtr,
wweks LIKE bsid-wrbtr,
d_wweks LIKE bsid-wrbtr,
c_wweks LIKE bsid-wrbtr,
wwaer LIKE bsid-waers,
wpay LIKE bseg-wrbtr,
dpay LIKE bseg-dmbtr,
rebzt LIKE bsid-rebzt,
stneg LIKE t041c-xnegp,
intcnum TYPE j_3rfcnt-intcnum,
extcnum TYPE j_3rfcnt-extcnum,
cntdate TYPE j_3rfcnt-cntdate,
END OF ty_doc,
BEGIN OF ty_detail,
box TYPE c,
lineno TYPE i,
kunnr LIKE bsid-kunnr,
bukrs LIKE bsid-bukrs,
intcnum TYPE j_3rfcnt-intcnum,
extcnum TYPE j_3rfcnt-extcnum,
cntdate TYPE j_3rfcnt-cntdate,
waers LIKE bsik-waers,
gjahr LIKE bsid-gjahr,
monat LIKE bsid-monat,
insal LIKE glt0-tsl01,
debet LIKE glt0-tsl01,
kredt LIKE glt0-tsl01,
ousal LIKE glt0-tsl01,
END OF ty_detail,
BEGIN OF ty_items,
line_type TYPE char255,
number TYPE char255,
name TYPE char255,
text TYPE char255,
section TYPE char255,
type TYPE char255,
date TYPE budat,
kredit TYPE sumha,
debet TYPE sumha,
link_number TYPE char255,
link_name TYPE char255,
link_date TYPE budat,
link_type TYPE char255,
link_kredit TYPE sumha,
link_debet TYPE sumha,
END OF ty_items.
DATA: lt_docum TYPE STANDARD TABLE OF ty_doc WITH KEY kunnr bukrs gjahr belnr WITH HEADER LINE, "документы
ls_docum LIKE LINE OF lt_docum,
lt_detail TYPE STANDARD TABLE OF ty_detail, "сальдо, оборотка
ls_detail LIKE LINE OF lt_detail,
gt_items2 TYPE STANDARD TABLE OF ty_items,
gs_items2 LIKE LINE OF gt_items2,
ls_api2_attachment TYPE /sbis/s_api2_attachment,
lt_bukrs_re TYPE /sbis/t_rng_bukrs,
lt_bldat_re TYPE /sbis/t_rng_bldat,
lv_mode TYPE c VALUE 'P',
lv_program TYPE sy-repid,
lv_number TYPE string,
lv_bukrs_low TYPE bukrs,
lv_bukrs_high TYPE bukrs,
lv_kunnr_low TYPE kunnr,
lv_kunnr_high TYPE kunnr,
lv_first_date TYPE sy-datum,
lv_last_date TYPE sy-datum,
lv_tmstp TYPE timestampl,
lv_timestamp(30) TYPE c,
lv_docum_id(60) TYPE c,
lv_detail_id(60) TYPE c.
DATA: bdc_tab TYPE STANDARD TABLE OF bdcdata,
bdc_line LIKE LINE OF bdc_tab,
message_tab TYPE STANDARD TABLE OF bapiret2.
FIELD-SYMBOLS: <fs_bdc_line> LIKE LINE OF bdc_tab,
<fs_docum> LIKE LINE OF lt_docum,
<fs_detail> LIKE LINE OF lt_detail,
<fs_items> LIKE LINE OF gt_items2,
<fs_bldat_re>,
<fs_kunnr_re>,
<fs_bukrs_re>,
<fs_bldat_re_s> TYPE /sbis/s_rng_bldat,
<fs_kunnr_re_s> TYPE /sbis/s_rng_kunnr2,
<fs_bukrs_re_s> TYPE /sbis/s_rng_bukrs2.
FORM entry USING is_api2_attachment return_code us_screen.
CLEAR: lv_program, lv_bukrs_low, lv_bukrs_high, lv_kunnr_low, lv_kunnr_high, lv_first_date, lv_last_date, lv_tmstp, lv_timestamp, lv_docum_id, lv_detail_id, lv_number, ls_api2_attachment.
REFRESH: lt_docum, lt_detail, gt_items2, bdc_tab, lt_bukrs_re, lt_bldat_re.
ls_api2_attachment = is_api2_attachment.
ASSIGN ('(/SBIS/SAPPER)CL_TREE_ACCORDION->GS_CONTENT_FILTER-BLDAT_RE[]') TO <fs_bldat_re>.
ASSIGN ('(/SBIS/SAPPER)CL_TREE_ACCORDION->GS_CONTENT_FILTER-BUKRS_RE[]') TO <fs_bukrs_re>.
CHECK <fs_bldat_re> IS ASSIGNED.
CHECK <fs_bukrs_re> IS ASSIGNED.
IF <fs_bldat_re> IS INITIAL.
return_code = 0.
MESSAGE 'Введите даты в фильтре, чтобы отобразить корректный акт сверки!' TYPE 'I' DISPLAY LIKE 'E'.
EXIT.
ELSE.
lt_bldat_re = <fs_bldat_re>.
ENDIF.
IF <fs_bukrs_re> IS INITIAL.
return_code = 0.
MESSAGE 'Введите организационный юнит в фильтре, чтобы отобразить корректный акт сверки!' TYPE 'I' DISPLAY LIKE 'E'.
EXIT.
ELSE.
lt_bukrs_re = <fs_bukrs_re>.
ENDIF.
***********************************************************************get user settings************************************************************************
lv_kunnr_low = ls_api2_attachment-belnr. "KUNNR
READ TABLE lt_bukrs_re ASSIGNING <fs_bukrs_re_s> INDEX 1.
IF sy-subrc = 0.
lv_bukrs_high = <fs_bukrs_re_s>-high.
ENDIF.
READ TABLE lt_bukrs_re ASSIGNING <fs_bukrs_re_s> INDEX 1.
IF sy-subrc = 0.
lv_bukrs_low = <fs_bukrs_re_s>-low.
ENDIF.
READ TABLE lt_bldat_re ASSIGNING <fs_bldat_re_s> INDEX 1.
IF sy-subrc = 0.
CONCATENATE <fs_bldat_re_s>-high+6(2) <fs_bldat_re_s>-high+4(2) <fs_bldat_re_s>-high(4) INTO lv_last_date.
ENDIF.
READ TABLE lt_bldat_re ASSIGNING <fs_bldat_re_s> INDEX 1.
IF sy-subrc = 0.
CONCATENATE <fs_bldat_re_s>-low+6(2) <fs_bldat_re_s>-low+4(2) <fs_bldat_re_s>-low(4) INTO lv_first_date.
ENDIF.
CONCATENATE lv_first_date lv_kunnr_low lv_last_date INTO lv_number. "номер акта сверки дата_начала+вендор+дата_конца
lv_program = 'ZPRC_ZJ_3RF_ASD'.
****************************************************************************************************************************************************************
ASSIGN bdc_line TO <fs_bdc_line>.
<fs_bdc_line>-program = lv_program.
<fs_bdc_line>-dynpro = '1000'.
<fs_bdc_line>-dynbegin = 'X'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'DD_KUNNR-LOW'.
<fs_bdc_line>-fval = lv_kunnr_low.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'DD_KUNNR-HIGH'.
<fs_bdc_line>-fval = lv_kunnr_high.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'DD_BUKRS-LOW'.
<fs_bdc_line>-fval = lv_bukrs_low.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'DD_BUKRS-HIGH'.
<fs_bdc_line>-fval = lv_bukrs_high.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'D_PERIOD-LOW'.
<fs_bdc_line>-fval = lv_first_date. "дата начала
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'D_PERIOD-HIGH'.
<fs_bdc_line>-fval = lv_last_date. "дата конца
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'PRINTER'.
<fs_bdc_line>-fval = '*'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'P_SBIS'.
<fs_bdc_line>-fval = 'X'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'BDC_OKCODE'.
<fs_bdc_line>-fval = '=ONLI'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-program = 'SAPMSSY0'.
<fs_bdc_line>-dynpro = '0120'.
<fs_bdc_line>-dynbegin = 'X'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'BDC_OKCODE'.
<fs_bdc_line>-fval = '=&ALL'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-program = 'SAPMSSY0'.
<fs_bdc_line>-dynpro = '0120'.
<fs_bdc_line>-dynbegin = 'X'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: <fs_bdc_line>.
<fs_bdc_line>-fnam = 'BDC_OKCODE'.
<fs_bdc_line>-fval = '=&ETA'.
APPEND <fs_bdc_line> TO bdc_tab.
CLEAR: lv_tmstp, lv_timestamp.
GET TIME STAMP FIELD lv_tmstp.
lv_timestamp = lv_tmstp.
REPLACE ALL OCCURENCES OF '.' IN lv_timestamp WITH ''.
CONDENSE lv_timestamp NO-GAPS.
EXPORT lv_timestamp TO MEMORY ID sy-repid.
CALL TRANSACTION 'ZZTRJ_3RF_ASD_SBIS' USING bdc_tab MODE lv_mode MESSAGES INTO message_tab.
CONCATENATE 'ZSBIS_J_3RF_ASD_DOCUM_' lv_timestamp INTO lv_docum_id.
CONCATENATE 'ZSBIS_J_3RF_ASD_DETAIL_' lv_timestamp INTO lv_detail_id.
IMPORT t_docum TO lt_docum FROM MEMORY ID lv_docum_id.
IMPORT gt_detail TO lt_detail FROM MEMORY ID lv_detail_id.
IF lt_docum IS INITIAL AND lt_detail IS INITIAL.
return_code = 0.
MESSAGE 'Актов сверки для выбранного дебитора не найдено!' TYPE 'I' DISPLAY LIKE 'E'.
EXIT.
ENDIF.
ASSIGN ls_detail TO <fs_detail>.
ASSIGN gs_items2 TO <fs_items>.
LOOP AT lt_docum INTO ls_docum.
CASE ls_docum-bstat.
WHEN '3W'.
<fs_items>-link_name = 'Взаимозачеты'.
WHEN '1I'.
<fs_items>-link_name = 'Счета-фактуры полученные'.
WHEN '1O'.
<fs_items>-link_name = 'Счета-фактуры выданные'.
WHEN '2P'.
<fs_items>-link_name = 'Платежи от дебитора'.
WHEN '1A'.
<fs_items>-link_name = 'Снижение задолж-ти дебитора'.
WHEN '5K'.
<fs_items>-link_name = 'КурсРазницы, ПерерасчАвансов'.
WHEN '6*'.
<fs_items>-link_name = 'Прочие'.
WHEN '2R'.
<fs_items>-link_name = 'Платежи дебитору'.
WHEN '1Q'.
<fs_items>-link_name = 'Кредитовое авизо'.
WHEN '2V'.
<fs_items>-link_name = 'Платежи кредитору'.
WHEN '2C'.
<fs_items>-link_name = 'Платежи от кредитора'.
WHEN '3X'.
<fs_items>-link_name = 'Переуступка права требования'.
WHEN '1Z'.
CONCATENATE 'Сторно' 'счетов-фактур' INTO <fs_items>-link_name SEPARATED BY space.
WHEN '2Z'.
CONCATENATE 'Сторно' 'платежей' INTO <fs_items>-link_name SEPARATED BY space.
WHEN '3Z'.
CONCATENATE 'Сторно' 'взаимозачетов' INTO <fs_items>-link_name SEPARATED BY space.
WHEN '4Z'.
CONCATENATE 'Сторно' 'векселей' INTO <fs_items>-link_name SEPARATED BY space.
WHEN '5Z'.
CONCATENATE 'Сторно' 'курсовых разниц, повт. подсчет' INTO <fs_items>-link_name SEPARATED BY space.
WHEN '3Y'.
CONCATENATE 'Сторно' 'переуступки права требования' INTO <fs_items>-link_name SEPARATED BY space.
WHEN OTHERS.
DELETE lt_docum.
CONTINUE.
ENDCASE.
<fs_items>-line_type = 'СтрТабл'.
<fs_items>-number = ls_docum-xblnr.
<fs_items>-name = ls_docum-xblnr.
<fs_items>-text = ls_docum-bktxt.
<fs_items>-section = 'Получатель'.
<fs_items>-date = ls_docum-budat.
<fs_items>-debet = ls_docum-wrbtr.
<fs_items>-link_number = ls_docum-bstat.
<fs_items>-link_date = ls_docum-budat.
<fs_items>-link_type = ls_docum-bstat.
APPEND <fs_items> TO gt_items2.
ENDLOOP.
<fs_items>-line_type = 'ИтогТабл'.
<fs_items>-section = 'Получатель'.
<fs_items>-type = 'Сальдо начальное'.
READ TABLE lt_detail INDEX 1 ASSIGNING <fs_detail>.
<fs_items>-date = lv_first_date.
<fs_items>-debet = <fs_detail>-insal.
APPEND <fs_items> TO gt_items2.
CLEAR <fs_items>.
DATA: lv_lines TYPE i.
CLEAR: lv_lines.
DESCRIBE TABLE lt_detail LINES lv_lines.
<fs_items>-line_type = 'ИтогТабл'.
<fs_items>-section = 'Получатель'.
<fs_items>-type = 'Сальдо конечное'.
READ TABLE lt_detail INDEX lv_lines ASSIGNING <fs_detail>.
<fs_items>-date = lv_last_date.
<fs_items>-debet = <fs_detail>-ousal.
APPEND <fs_items> TO gt_items2.
CLEAR <fs_items>.
<fs_items>-line_type = 'ИтогТабл'.
<fs_items>-section = 'Получатель'.
<fs_items>-type = 'Обороты'.
LOOP AT lt_detail ASSIGNING <fs_detail>.
<fs_items>-kredit = <fs_items>-kredit + <fs_detail>-kredt.
<fs_items>-debet = <fs_items>-debet + <fs_detail>-debet.
<fs_items>-link_debet = <fs_items>-link_debet + <fs_detail>-debet.
<fs_items>-link_kredit = <fs_items>-link_kredit + <fs_detail>-kredt.
ENDLOOP.
APPEND <fs_items> TO gt_items2.
CLEAR <fs_items>.
***************************************************************
** TENSOR SBIS EDO *
***************************************************************
TRY.
DATA: cx_root TYPE REF TO cx_root,
lv_not_print TYPE c VALUE '',
cl_mapping2 TYPE REF TO /sbis/cl_mapping.
CREATE OBJECT cl_mapping2.
CALL METHOD cl_mapping2->calc_doc
EXPORTING
iv_ini_name = ls_api2_attachment-ini_name
IMPORTING
ev_not_print = lv_not_print.
return_code = 0.
CATCH cx_root INTO cx_root.
CLEAR gt_items2.
return_code = 1.
EXIT.
ENDTRY.
***************************************************************
** TENSOR SBIS EDO *
***************************************************************
ENDFORM.
На что следует обратить внимание:
- Структуры типов данных ty_doc, ty_detail, ty_items должны совпадать в программе вызова и программе формирования актов сверки.
- Метки памяти должны совпадать в программе вызова и программе формирования актов сверки.
- BDC должны содержать правильное имя вызываемой программы формирования актов и транзакции.
- Имя метки памяти ограничено 60 символами.
- В качестве номера акта сверки используется строка полученная конкатенацией даты начала построения списка, номером кредитора\дебитора, даты конца построения списка. Можно использовать отдельную нумерация, для этого требуется создать в транзакции SNUM свой объект нумерации и использовать в программе вызова для получения свободного номера стандартный ФМ NUMBER_GET_NEXT, полученный номер следует присвоить переменной lv_number.