Текущее время: Ср, июл 23 2025, 06:03

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Конвертация расчетных листков в PDF и рассылка на указанные e-mail в ИТ 0105
СообщениеДобавлено: Пт, мар 25 2016, 12:46 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, мар 25 2016, 12:34
Сообщения: 56
Здравствуйте уважаемые коллеги!

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

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.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB