Sapforum.Biz

Инструменты => ABAP - Инструментальные средства => Тема начата: Sergey86 от Март 25, 2016, 02:09:10 pm

Название: Конвертация расчетных листков в PDF и рассылка на указанные e-mail в ИТ 0105
Отправлено: Sergey86 от Март 25, 2016, 02:09:10 pm
Здравствуйте уважаемые коллеги!

Буду рад, если сможете мне помочь. Изначально пытался решить задачу самостоятельно, но не получилось. В ABAP не программирую, но появилась задача, которую нужно реализовать с его помощью. Задача звучит следующим образом - конвертировать расчетные листки по зп сотрудников в формате PDF и сделать рассылку на электронные ящики, которые указаны в 0105 инфо-типе. В интернете нашел программу, которая берет формуляр и в текстовом виде вставляет его в тело письма, но в этом случае отображение некорректное, все почтовые серверы обрабатывают на свой лад. Поэтому требуется сделать приложение к письму в виде pdf-файла. Я попытался объединить различные программы, которые нашел в Интернете и которые по отдельности решают данные задачи. Пока ничего не вышло. На текущий момент у нас открывается форма, где пользователь указывает табельный номер и тип формуляра. После выполнения программы на почту пользователя отправляется письмо с "кривым" формуляром в текстовом виде в письме. Нужно еще учесть, чтобы была возможность рассылки сразу по нескольким ТН. Далее предлагаю код, но следует учесть, что так как я объединял множество программ, то возможно некоторые куски будут лишние. Сейчас программа ошибка не выдает, запускается, но ничего не выполняет. То есть нужно сконвертировать расчетный листок в пдф и сделать его же отправку на электронный адрес, указанный в 0105 инфо-типе. Буду рад, если поможете и поправите код. Также на всякий случай указываю свой почтовый ящик - [email protected]

REPORT ZTEST01.

PARAMETERS : P_PERNR LIKE PA0000-PERNR MATCHCODE OBJECT PREM
DEFAULT '2030',
P_TO(30).

*&---------------------------------------------------------------------*
*& Report ZHR_SEND_PAYSLIP
*& Программа отправки расчетных листов на email сотрудников
*&---------------------------------------------------------------------*
*--------------------------------------------*

tables: pernr, t514v.

infotypes: 0000, 0002, 0105.

include: PULOGRU0.

***********************
* Selection screen
***********************
SELECTION-SCREEN BEGIN OF LINE. "VKIK009593
SELECTION-SCREEN COMMENT 1(25) text-t01 FOR FIELD formular. "VKIK019923
SELECTION-SCREEN POSITION pos_low.
PARAMETERS:
formular LIKE rpcedtx0-prt_form.
SELECTION-SCREEN COMMENT 40(38) form_txt FOR FIELD formular.
SELECTION-SCREEN END OF LINE.

***********************
* Data declaration
***********************

data:
RETCD LIKE BAPIRETURN1,
PAYLIST LIKE BAPI7004_RL OCCURS 0 WITH HEADER LINE,
ADVICE LIKE PC408 OCCURS 0 WITH HEADER LINE,
P_INFO LIKE PC407,
fld_input TYPE boolean, "field for input open? "VKIK045853
fld_name LIKE screen-name, "field name F4-Help "VKIK045853
l_payslip type table of ABAPLIST,
lt_payslip type table of char255,
sender_email type string,
recipient_email type string,
LEN TYPE I,
OBJTXT LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
POS TYPE I,
TAB_LINES LIKE SY-TABIX,
PDF_TABLE LIKE TLINE OCCURS 0 WITH HEADER LINE,
subject type string,
DOC_CHNG LIKE SODOCCHGI1,
OBJPACK LIKE SOPCKLSTI1 OCCURS 0 WITH HEADER LINE,
OBJHEAD LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
OBJBIN LIKE SOLISTI1 OCCURS 0 WITH HEADER LINE,
RECLIST LIKE SOMLRECI1 OCCURS 0 WITH HEADER LINE,
STUFF(65000),
PDF_LINE(134),
period type string.

CONSTANTS: YES(1) VALUE 'X'.

** log nodes
data: begin of lt_log_pernr,
node_key type hrpad_pal_node_key,
pernr type p_pernr,
end of lt_log_pernr.
data: gt_log_pernr like standard table of lt_log_pernr with key node_key.

***********************
* Events
***********************

INITIALIZATION.
formular = 'ZPL1'.
PNPXABKR = '11'.
PERFORM RE514V USING SY-LANGU '33' FORMULAR FORM_TXT. "VKIK009593

perform init_log using space.

CALL FUNCTION 'EFG_GEN_GET_USER_EMAIL'
EXPORTING
I_UNAME = sy-uname
IMPORTING
E_EMAIL_ADDRESS = sender_email
* EXCEPTIONS
* NOT_QUALIFIED = 1
* USER_NOT_FOUND = 2
* ADDRESS_NOT_FOUND = 3
* OTHERS = 4
.
IF sender_email is initial.
MESSAGE e016(rp) with 'В параметрах пользователя не указан email. Тр. su3'.
Exit.
ENDIF.


AT SELECTION-SCREEN OUTPUT. "VKIK009593
PERFORM RE514V USING SY-LANGU '33' FORMULAR FORM_TXT. "VKIK009593

AT SELECTION-SCREEN ON VALUE-REQUEST FOR FORMULAR. "VKIK009593
CALL FUNCTION 'F4_POPUP_FORML'
EXPORTING
MOLGA = '33'
FCLASS = 'CEDT_CE'
IMPORTING
FORML = FORMULAR
EXCEPTIONS
OTHERS = 1.

**********************************************************************
START-OF-SELECTION.

****************************
* Main proccessing
****************************

get pernr.

data: ls_log_pernr like line of gt_log_pernr.
data: isError type c.
data: oref TYPE REF TO cx_root.

clear recipient_email.
clear isError.

** Check for email
provide * from p0105 between pn-begda and pn-endda.
if p0105-subty = '0010'.
recipient_email = p0105-usrid_long.
endif.
endprovide.

if recipient_email is initial.
call method g_log->add_message_to_log_and_table
EXPORTING
im_pernr = pernr
im_msg_id = 'RP'
im_msg_type = 'I'
im_msg_number = '016'
im_msg_msgv1 = 'Для сотрудника не указан email в ИТ0105/0010'.
reject.
endif.

** don't send payslip for fired
provide stat2 from p0000 between pn-begda and pn-endda.
if not p0000-stat2 eq 3.
call method g_log->add_message_to_log_and_table
EXPORTING
im_pernr = pernr
im_msg_id = 'RP'
im_msg_type = 'I'
im_msg_number = '016'
im_msg_msgv1 = 'Сотрудник уволен'.

isError = 'X'.
endif.
endprovide.

CALL FUNCTION 'LIST_FREE_MEMORY'.

SUBMIT HRUCEDT0_CE
WITH FORMULAR eq FORMULAR
WITH PNPABKRS eq PNPXABKR
WITH PNPPERNR eq PERNR-PERNR
WITH PNPXABKR eq PNPXABKR
WITH RUECKR eq 'A'
WITH PNPTIMR9 eq PNPTIMR9
WITH PNPTIMRA eq PNPTIMRA
WITH PNPPABRP eq PNPPABRP
WITH PNPPABRJ eq PNPPABRJ
WITH PRT_PROT eq ' '
EXPORTING LIST TO MEMORY
AND RETURN.

* if sy-subrc <> 0.
* call method g_log->add_message_to_log_and_table
* EXPORTING
* im_pernr = pernr
* im_msg_id = 'RP'
* im_msg_type = 'E'
* im_msg_number = '016'
* im_msg_msgv1 = 'Не удалось сформировать расчетный лист'.
*
* isError = 'X'.
* endif.

clear l_payslip.
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
LISTOBJECT = l_payslip
EXCEPTIONS
NOT_FOUND = 1
OTHERS = 2.

IF SY-SUBRC <> 0.
call method g_log->add_message_to_log_and_table
EXPORTING
im_pernr = pernr
im_msg_id = 'RP'
im_msg_type = 'E'
im_msg_number = '016'
im_msg_msgv1 = 'Не удалось получить сформированный расчетный лист'.

isError = 'X'.
ENDIF.

* clear lt_payslip.
* CALL FUNCTION 'LIST_TO_TXT'
* TABLES
* LISTTXT = lt_payslip
* LISTOBJECT = l_payslip
* EXCEPTIONS
* EMPTY_LIST = 1
* LIST_INDEX_INVALID = 2
* OTHERS = 3.

CALL FUNCTION 'BAPI_GET_PAYROLL_RESULT_LIST'
EXPORTING
EMPLOYEENUMBER = P_PERNR
FROMDATE = '18000101'
TODATE = '99991231'
IMPORTING
RETURN = RETCD
TABLES
RESULTS = PAYLIST.

SORT PAYLIST BY SEQUENCENUMBER DESCENDING.
READ TABLE PAYLIST INDEX 1.

CALL FUNCTION 'GET_PAYSLIP'
EXPORTING
EMPLOYEE_NUMBER = P_PERNR
SEQUENCE_NUMBER = PAYLIST-SEQUENCENUMBER
PAYSLIP_VARIANT = 'ESS'
IMPORTING
RETURN = RETCD
P_INFO = P_INFO
TABLES
P_FORM = ADVICE.

DOC_CHNG-OBJ_NAME = 'Crap'.
DOC_CHNG-OBJ_DESCR = 'Renumeration Statement'.
OBJTXT = 'TEST'.
APPEND OBJTXT.
DESCRIBE TABLE OBJTXT LINES TAB_LINES.
READ TABLE OBJTXT INDEX TAB_LINES.
DOC_CHNG-DOC_SIZE = ( TAB_LINES - 1 ) * 255 + STRLEN( OBJTXT ).

CLEAR OBJPACK-TRANSF_BIN.
OBJPACK-HEAD_START = 1.
OBJPACK-HEAD_NUM = 0.
OBJPACK-BODY_START = 1.
OBJPACK-BODY_NUM = TAB_LINES.
OBJPACK-DOC_TYPE = 'RAW'.
APPEND OBJPACK.

OBJPACK-DOC_TYPE = 'PDF'.
* PERFORM CONVERT_USING_SPOOL.
LOOP AT PDF_TABLE INTO PDF_LINE.
STUFF+POS(134) = PDF_LINE.
ADD 134 TO POS.
ENDLOOP.

POS = 0.
LEN = STRLEN( STUFF ).
WHILE LEN > 0.
SUBTRACT 255 FROM LEN.
OBJBIN = STUFF+POS(255).
APPEND OBJBIN.
ADD 255 TO POS.
ENDWHILE.
DESCRIBE TABLE OBJBIN LINES TAB_LINES.
OBJHEAD = 'advice'.
APPEND OBJHEAD.

OBJPACK-TRANSF_BIN = YES.
OBJPACK-HEAD_START = 1.
OBJPACK-HEAD_NUM = 1.
OBJPACK-BODY_START = 1.
OBJPACK-BODY_NUM = TAB_LINES.
OBJPACK-OBJ_NAME = 'Crapola'.
OBJPACK-OBJ_DESCR = 'Advice'.
OBJPACK-DOC_SIZE = TAB_LINES * 255.
APPEND OBJPACK.

RECLIST-RECEIVER = recipient_email.
RECLIST-REC_TYPE = 'U'.
APPEND RECLIST.



IF SY-SUBRC <> 0.
call method g_log->add_message_to_log_and_table
EXPORTING
im_pernr = pernr
im_msg_id = 'RP'
im_msg_type = 'E'
im_msg_number = '016'
im_msg_msgv1 = 'Не удалось преобразовать расчетный лист'.

isError = 'X'.
ENDIF.

data: l_begda(10) type c,
l_endda(10) type c.

write PNPDISBD to l_begda dd/mm/yyyy.
write PNPDISED to l_endda dd/mm/yyyy.

concatenate 'Расчетный лист за ' l_begda '-' l_endda INTO subject separated by space.

if isError = ''.

CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
EXPORTING
DOCUMENT_DATA = DOC_CHNG
commit_work = 'X'
TABLES
PACKING_LIST = OBJPACK
OBJECT_HEADER = OBJHEAD
CONTENTS_BIN = OBJBIN
CONTENTS_TXT = OBJTXT
RECEIVERS = RECLIST
EXCEPTIONS
OTHERS = 99.

* CALL FUNCTION 'HR_FBN_GENERATE_SEND_EMAIL'
* EXPORTING
* SUBJECT = subject
* SENDER = sender_email
* RECIPIENT = recipient_email
* TABLES
* EMAIL_TEXT = lt_payslip
* EXCEPTIONS
* FAILED = 1
* OTHERS = 2.

IF SY-SUBRC <> 0.
call method g_log->add_message_to_log_and_table
EXPORTING
im_pernr = pernr
im_msg_id = 'RP'
im_msg_type = 'E'
im_msg_number = '016'
im_msg_msgv1 = 'Не удалось отправить расчетный лист'.
ENDIF.

endif.

call method g_log->add_employee_node
EXPORTING
im_pernr = pernr
im_add_messages = 'X'
IMPORTING
ev_node_key = ls_log_pernr-node_key.


end-of-selection.

call method g_log->display_log2.


***********************
* Other routines
***********************
FORM RE514V USING VALUE($SPRSL) "VKIK009593
VALUE($MOLGA)
VALUE($FORML)
FORM_TXT.
IF T514V-SPRSL NE $SPRSL
OR T514V-MOLGA NE $MOLGA
OR T514V-FORML NE $FORML.
SELECT SINGLE * FROM T514V WHERE SPRSL EQ $SPRSL
AND MOLGA EQ $MOLGA
AND FORML EQ $FORML.
IF SY-SUBRC NE 0.
CLEAR T514V.
ENDIF.
ENDIF.
FORM_TXT = T514V-FTEXT.
ENDFORM.
Название: Re: Конвертация расчетных листков в PDF и рассылка на указанные e-mail в ИТ 0105
Отправлено: Uukrul от Март 28, 2016, 10:54:11 am
Если честно то разбираться в чужой программе как-то особого интереса мало. Так что попробуйте например вот такой модуль:

BAPI_GET_PAYSLIP_PDF - Вроде как выдает расчетные листки в формате PDF