СБИС Сапёр - Вызов из программ печати
Содержание
Общая концепция
Алгоритм формирования электронного документа следующий:
- 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.