Primero creamos en la transacción SE37 la función ZHR_CONVERTIDOR:



Los parámetros son los siguientes:






Copiamos en el código fuente:


FUNCTION zhr_convertidor.

*"----------------------------------------------------------------------

*"*"Interfase local

*" IMPORTING

*" VALUE(SUBJECT) TYPE SO_OBJ_DES

*" VALUE(SENDER) TYPE ADR6-SMTP_ADDR

*" VALUE(FLAG_COMMIT) TYPE CHAR1 DEFAULT 'X'

*" VALUE(FLAG_SEND_IMMEDIATELY) TYPE CHAR1 DEFAULT 'X'

*" VALUE(ATTACH) TYPE CHAR1 OPTIONAL

*" VALUE(L_LEN) TYPE I OPTIONAL

*" VALUE(L_HEAD) TYPE SOLI OPTIONAL

*" VALUE(LT_BIN) TYPE SOLIX_TAB OPTIONAL

*" VALUE(LT_HEAD) TYPE SOLI_TAB OPTIONAL

*" TABLES

*" EMAIL_TEXT STRUCTURE SOLI

*" RECEIVERS STRUCTURE SOOS1

*" EXCEPTIONS

*" FAILED

*"----------------------------------------------------------------------


DATA l_rcl_send_req TYPE REF TO cl_bcs.

DATA l_text TYPE bcsy_text.

DATA l_rcl_doc TYPE REF TO cl_document_bcs.

DATA l_rcl_sender TYPE REF TO cl_cam_address_bcs.

DATA l_rcl_recipient TYPE REF TO if_recipient_bcs.

DATA l_rcx_bcs TYPE REF TO cx_bcs.

DATA l_rcx_addr TYPE REF TO cx_address_bcs.

DATA: recipient TYPE adr6-smtp_addr.

DATA: wi_receivers TYPE soos1.


DATA l_smtp_addr TYPE adr6-smtp_addr.

DATA l_subject TYPE so_obj_des.

DATA l_tab_soli TYPE soli_tab.

DATA l_soli TYPE soli.


**************************************************

DATA: l_olen TYPE so_obj_len.

DATA: l_otype TYPE so_obj_tp.

DATA: l_subj TYPE so_obj_des.


**************************************************


TRY.


l_rcl_send_req = cl_bcs=>create_persistent( ).


TRY.

l_smtp_addr = sender.


CALL METHOD cl_cam_address_bcs=>create_internet_address

EXPORTING

i_address_string = l_smtp_addr

i_address_name = l_smtp_addr

RECEIVING

result = l_rcl_sender.


CATCH cx_address_bcs INTO l_rcx_addr.

RAISE failed.


ENDTRY.


CALL METHOD l_rcl_send_req->set_sender

EXPORTING

i_sender = l_rcl_sender.


*********************************************************

** new - 28-01-10


LOOP AT receivers INTO wi_receivers.


* Create recipient with E-Mail address

l_smtp_addr = wi_receivers-adr_name.

l_rcl_recipient = cl_cam_address_bcs=>create_internet_address(

l_smtp_addr ).


* Add recipient with its respective attributes to send request

CALL METHOD l_rcl_send_req->add_recipient

EXPORTING

i_recipient = l_rcl_recipient

i_copy = wi_receivers-sndcp. "copia


ENDLOOP.

*******************************************************


* Prepare the E-Mail document

APPEND LINES OF email_text TO l_tab_soli.

l_subject = subject.


l_rcl_doc = cl_document_bcs=>create_document(

i_type = 'RAW'

i_text = l_tab_soli

i_length = '10000'

i_subject = l_subject ).


**********************************************************


CALL METHOD l_rcl_doc->set_importance

EXPORTING

i_importance = wi_receivers-sndpri.


CALL METHOD l_rcl_doc->set_sensitivity

EXPORTING

i_sensitivity = wi_receivers-sndex.

**********************************************************************************


IF attach = 'X'.


l_olen = l_len.


l_len = STRLEN( l_head ) - 4.

IF l_len GT 0 AND l_head+l_len(1) EQ '.'.

l_subj = l_head(l_len).

l_len = l_len + 1.

l_otype = l_head+l_len(3).

TRANSLATE l_otype TO UPPER CASE. "#EC TRANSLANG

ELSE.

l_subj = l_head.

ENDIF.


CALL METHOD l_rcl_doc->add_attachment(

i_attachment_type = l_otype

i_attachment_subject = l_subj

i_attachment_size = l_olen

i_att_content_hex = lt_bin

i_attachment_header = lt_head ).


ENDIF.

***********************************************************************************

* Add document to send request

CALL METHOD l_rcl_send_req->set_document( l_rcl_doc ).


IF NOT flag_send_immediately IS INITIAL.

l_rcl_send_req->set_send_immediately( 'X' ).

ENDIF.


l_rcl_send_req->set_status_attributes( 'A' ).


l_rcl_send_req->send( ).


IF NOT flag_commit IS INITIAL.

TRY.

COMMIT WORK.

CATCH cx_root.

ENDTRY.

ENDIF.


CATCH cx_bcs INTO l_rcx_bcs.

RAISE failed.


CATCH cx_root.


ENDTRY.


ENDFUNCTION.


** como necesitamos una estructura excel, la creamos:


hasta el campo99 type char255.


Además creamos su tipo tabla. ztyexcel y el ZTYDD03L, tipo tabla de DD03L.


** Luego, nos disponemos a crear una clase que le vamos a llamar zcl_excel.

** Ya que la idea es enviar un mail, pero en este caso, también le vamos agregar un archivo en excel.




Luego copiamos en Impl -> Sección Pública:


class ZCL_EXCEL definition

public

final

create public .


*"* public components of class ZCL_EXCEL

*"* do not include other source files here!!!

public section.


class-methods FILL_CAB_FILE_EXCEL

importing

!PW_NOMBRE_ESTRUCTURA type TABNAME

!PT_TABLA type STANDARD TABLE

exporting

!TI_XLS type ZTYEXCEL .

class-methods FILL_FILE_EXCEL

importing

!PW_NOMBRE_ESTRUCTURA type TABNAME

!PT_TABLA type STANDARD TABLE

exporting

!TI_XLS type ZTYEXCEL .

class-methods GET_TABLE_FIELDS

importing

!PS_TABNAME type TABNAME

!NO_EXCLUDE_INCLUDES type FLAG default SPACE

exporting

!PT_TABLE_FIELDS type ZTYDD03L .

class-methods GET_FIELD_TEXT

importing

!PS_TABNAME type TABNAME

!PS_FIELDNAME type FIELDNAME

exporting

!PS_TEXT type STRING

exceptions

NOT_FOUND .

class-methods BEFORE_CONVERSION2

exporting

!L_LEN type I

!L_HEAD type SOLI

!LT_BIN type SOLIX_TAB

!LT_HEAD type SOLI_TAB .



Luego creamos los métodos:


METHOD fill_cab_file_excel.


DATA: numero TYPE numc2.

DATA: xetiq TYPE string.

DATA: lt_campos_tabla TYPE TABLE OF dd03l,

lt_campos_tabla2 TYPE TABLE OF dd04t,

ls_resultado TYPE string,

ls_valor TYPE string.


DATA: wi_lt_campos_tabla TYPE dd03l.

DATA: wi_lt_campos_tabla2 TYPE dd04t.

DATA: ind TYPE i.

FIELD-SYMBOLS: LIKE LINE OF lt_campos_tabla.

FIELD-SYMBOLS: LIKE LINE OF lt_campos_tabla2.


FIELD-SYMBOLS: TYPE ANY.


FIELD-SYMBOLS: TYPE ANY.

FIELD-SYMBOLS TYPE ANY.

FIELD-SYMBOLS TYPE ANY.


*dynamic structure

DATA: w_estructura TYPE REF TO data.

CREATE DATA w_estructura TYPE (pw_nombre_estructura).

ASSIGN w_estructura->* TO .

DATA: etiq1 TYPE string.

DATA: wi_xls TYPE zwexcel.

DATA: texto TYPE string.

***************************************************

REFRESH lt_campos_tabla.

REFRESH lt_campos_tabla2.


CALL METHOD zcl_excel=>get_table_fields

EXPORTING

ps_tabname = pw_nombre_estructura

IMPORTING

pt_table_fields = lt_campos_tabla.


LOOP AT lt_campos_tabla INTO wi_lt_campos_tabla.

CLEAR texto.


CALL METHOD zcl_excel=>get_field_text

EXPORTING

ps_tabname = pw_nombre_estructura

ps_fieldname = wi_lt_campos_tabla-fieldname

IMPORTING

ps_text = texto

EXCEPTIONS

not_found = 1

OTHERS = 2.


wi_lt_campos_tabla2-ddtext = texto.

APPEND wi_lt_campos_tabla2 TO lt_campos_tabla2.

ENDLOOP.


CLEAR wi_xls.


READ TABLE pt_tabla INDEX 1 ASSIGNING .

IF sy-subrc <= 2.

numero = 0.

ind = 0.

DO 99 TIMES.

ind = ind + 1.

READ TABLE lt_campos_tabla2 INDEX ind ASSIGNING .

IF sy-subrc <= 2.

numero = numero + 1.

CONCATENATE 'WI_XLS-CAMPO' numero INTO xetiq.

ASSIGN (xetiq) TO .

= -ddtext.

ENDIF.

ENDDO.


APPEND wi_xls TO ti_xls.

ENDIF.


ENDMETHOD.


METHOD fill_file_excel.


DATA: numero TYPE numc2.

DATA: xetiq TYPE string.

DATA: lt_campos_tabla TYPE TABLE OF dd03l,

ls_resultado TYPE string,

ls_valor TYPE string.

DATA: ind TYPE i.

FIELD-SYMBOLS: LIKE LINE OF lt_campos_tabla.

FIELD-SYMBOLS: TYPE ANY.


FIELD-SYMBOLS: TYPE ANY.

FIELD-SYMBOLS TYPE ANY.

FIELD-SYMBOLS TYPE ANY.


*dynamic structure

DATA: w_estructura TYPE REF TO data.

CREATE DATA w_estructura TYPE (pw_nombre_estructura).

ASSIGN w_estructura->* TO .

DATA: etiq1 TYPE string.

DATA: wi_xls TYPE zwexcel.


***************************************************


CALL METHOD zcl_excel=>get_table_fields

EXPORTING

ps_tabname = pw_nombre_estructura

IMPORTING

pt_table_fields = lt_campos_tabla.


CLEAR wi_xls.


LOOP AT pt_tabla ASSIGNING .

numero = 0.

ind = 0.

DO 99 TIMES.

ind = ind + 1.

READ TABLE lt_campos_tabla INDEX ind ASSIGNING .

IF sy-subrc <= 2.

CONCATENATE '-' -fieldname INTO etiq1.

ASSIGN (etiq1) TO .


numero = numero + 1.

CONCATENATE 'WI_XLS-CAMPO' numero INTO xetiq.

ASSIGN (xetiq) TO .

= .

ENDIF.

ENDDO.


APPEND wi_xls TO ti_xls.


ENDLOOP.


ENDMETHOD.


METHOD get_table_fields.


SELECT *

INTO CORRESPONDING FIELDS OF TABLE pt_table_fields

FROM dd03l

WHERE tabname = ps_tabname

AND as4local = 'A'.


IF no_exclude_includes = space.

DELETE pt_table_fields WHERE fieldname = '.INCLUDE '.

ENDIF.


SORT pt_table_fields BY position ASCENDING.


ENDMETHOD.


METHOD get_field_text.


DATA: lw_dd03l TYPE dd03l.


SELECT SINGLE *

INTO CORRESPONDING FIELDS OF lw_dd03l

FROM dd03l

WHERE tabname = ps_tabname

AND as4local = 'A'

AND fieldname = ps_fieldname

AND as4vers = '0'.


IF sy-subrc NE 0.

RAISE not_found.

ENDIF.


DATA: lw_dd04t TYPE dd04t.

DATA: lw_dd40t TYPE dd40t.


CASE lw_dd03l-comptype.

WHEN 'E'.

SELECT SINGLE *

INTO CORRESPONDING FIELDS OF lw_dd04t

FROM dd04t

WHERE rollname = lw_dd03l-rollname

AND ddlanguage = sy-langu

AND as4local = 'A'

AND as4vers = '0'.

IF sy-subrc NE 0.

RAISE not_found.

ENDIF.


ps_text = lw_dd04t-ddtext.


WHEN 'L'.

SELECT SINGLE *

INTO CORRESPONDING FIELDS OF lw_dd40t

FROM dd40t

WHERE typename = lw_dd03l-rollname

AND ddlanguage = sy-langu

AND as4local = 'A'.

IF sy-subrc NE 0.

RAISE not_found.

ENDIF.


ps_text = lw_dd40t-ddtext.



ENDCASE.


ENDMETHOD.


method BEFORE_CONVERSION2.


DATA:

l_file TYPE file_table,

l_rc TYPE i,

l_act TYPE i,

l_sfile TYPE string.


CHECK l_act = cl_gui_frontend_services=>action_ok.


CALL FUNCTION 'GUI_UPLOAD'

EXPORTING

filename = 'C:\ARCHIV.XLS'

filetype = 'BIN'

* HAS_FIELD_SEPARATOR = ' '

* HEADER_LENGTH = 0

IMPORTING

filelength = l_len

* HEADER =

TABLES

data_tab = lt_bin

EXCEPTIONS

file_open_error = 1

file_read_error = 2

no_batch = 3

gui_refuse_filetransfer = 4

invalid_type = 5

no_authority = 6

unknown_error = 7

bad_data_format = 8

header_not_allowed = 9

separator_not_allowed = 10

header_too_long = 11

unknown_dp_error = 12

access_denied = 13

dp_out_of_memory = 14

disk_full = 15

dp_timeout = 16

OTHERS = 17

.


IF sy-subrc <> 0.


MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.


ELSE.


CLEAR lt_head.


CALL FUNCTION 'SO_SPLIT_FILE_AND_PATH'

EXPORTING

full_name = 'C:\ARCHIV.XLS'

IMPORTING

stripped_name = l_head

* FILE_PATH =

EXCEPTIONS

x_error = 1

OTHERS = 2

.

IF sy-subrc <> 0.

MESSAGE ID sy-msgid TYPE 'I' NUMBER sy-msgno

WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

EXIT.

ENDIF.


APPEND l_head TO lt_head.


ENDIF.


endmethod.


*****************************************************************************************************


" AHORA DESDE AQUI INVOCAMOS LA FUNCIÓN: (EN ESTE CASO DESDE UN PROGRAMA TENEMOS ESTE CODIGO)"

*****************************************************************************************************


DATA: pw_email_subject TYPE so_obj_des.

DATA: pw_email_body_line TYPE so_text255.

DATA: pt_email_body TYPE soli_tab.

DATA: pt_receivers TYPE zty_soos1.

DATA: wi_receivers TYPE soos1.

DATA: pw_return TYPE bapiret2.

DATA: ti_xls TYPE ztyexcel.

DATA: ti_xls_cab TYPE ztyexcel.

DATA: ti_xls_inicio TYPE ztyexcel.

DATA: wi_xls_inicio TYPE zwexcel.

DATA: ti_xls_res TYPE ztyexcel.

DATA: wi_xls TYPE zwexcel.


CLEAR pw_email_body_line.

REFRESH pt_email_body.

REFRESH pt_receivers.


*********************************************************************************

** Descripción del mail

pw_email_subject = 'EL EMPLEADO 18122 FUE DADO DE BAJA'.

pw_email_body_line =

'DESCRIPCION : El aviso de baja fue dado después del proceso de asignación. Revise el archivo adjunto'.

APPEND pw_email_body_line TO pt_email_body.



** En el ejemplo vamos a enviarle un mail a un remitente. Se pueden agregar n remitentes


CLEAR wi_receivers.

wi_receivers-adr_name = 'cynthia_sol@segnav.com'. "Mail

wi_receivers-sndcp = 'X'. "Si es como Copia ó no

wi_receivers-sndpri = 1. "Prioridad desde 1 hasta 5 (1 la mas alta)



En este caso, le colocamos 'F'.

wi_receivers-sndex = 'F'.


APPEND wi_receivers TO pt_receivers.


REFRESH ti_xls.

REFRESH ti_xls_cab.

REFRESH ti_xls_res.

REFRESH ti_xls_inicio.


CALL METHOD zcl_excel=>fill_cab_file_excel

EXPORTING

pw_nombre_estructura = 'ZWHRASIG' "nombre de la estructura de la tabla interna

pt_tabla = ti_zthrasign "nuestra tabla interna de datos previamente llenadas

IMPORTING

ti_xls = ti_xls_cab.


CALL METHOD zcl_excel=>fill_file_excel

EXPORTING

pw_nombre_estructura = 'ZWHRASIG'

pt_tabla = ti_zthrasign

IMPORTING

ti_xls = ti_xls.



** aqui le voy a colocar unas lineas antes de que salga todas las filas en el excel

** mas una linea en blanco.

** esto es opcional


wi_xls_inicio-campo09 = pw_email_subject.

APPEND wi_xls_inicio TO ti_xls_inicio.

CLEAR wi_xls_inicio-campo09.

CONCATENATE 'Fecha : ' sy-datum INTO wi_xls_inicio-campo09 .

APPEND wi_xls_inicio TO ti_xls_inicio.

wi_xls_inicio-campo09 = '------------------------------------------------------------------------'.

APPEND wi_xls_inicio TO ti_xls_inicio.

wi_xls_inicio-campo09 = space.

APPEND wi_xls_inicio TO ti_xls_inicio.


*******************************

INSERT LINES OF ti_xls_inicio INTO TABLE ti_xls_res.

INSERT LINES OF ti_xls_cab INTO TABLE ti_xls_res.

INSERT LINES OF ti_xls INTO TABLE ti_xls_res.


** como deseo bajarme desde la novena columna hacia adelante, aplico la máscara

CALL METHOD cl_gui_frontend_services=>gui_download

EXPORTING

filename = 'C:\ARCHIV.XLS'

filetype = 'DAT'

col_select = 'X'

col_select_mask = ' XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

CHANGING

data_tab = ti_xls_res

EXCEPTIONS

file_write_error = 1

no_batch = 2

gui_refuse_filetransfer = 3

invalid_type = 4

no_authority = 5

unknown_error = 6

header_not_allowed = 7

separator_not_allowed = 8

filesize_not_allowed = 9

header_too_long = 10

dp_error_create = 11

dp_error_send = 12

dp_error_write = 13

unknown_dp_error = 14

access_denied = 15

dp_out_of_memory = 16

disk_full = 17

dp_timeout = 18

file_not_found = 19

dataprovider_exception = 20

control_flush_error = 21

not_supported_by_gui = 22

error_no_gui = 23

OTHERS = 24.


DATA: l_len TYPE i.

DATA: l_head TYPE soli.

DATA: lt_bin TYPE solix_tab.

DATA: lt_head TYPE soli_tab.

DATA: tdatafile TYPE STANDARD TABLE OF char2048.


CALL METHOD zcl_excel=>before_conversion2

IMPORTING

l_len = l_len

l_head = l_head

lt_bin = lt_bin

lt_head = lt_head.


CALL FUNCTION 'ZHR_CONVERTIDOR'

EXPORTING

subject = pw_email_subject

sender = 'raulsol@segnav.com' "se pone la dirección del que envía

* recipient = ''

* FLAG_COMMIT = 'X'

* FLAG_SEND_IMMEDIATELY = 'X'

attach = 'X'

l_len = l_len

l_head = l_head

lt_bin = lt_bin

lt_head = lt_head

TABLES

email_text = pt_email_body

receivers = pt_receivers

EXCEPTIONS

failed = 1

OTHERS = 2.


ENDIF.


ENDIF.


*************************************************************************************************************

EL CASO QUE VIMOS NO APLICA, SI EL PROCESO ES A TRAVES DE UN JOB.


jueves, 9 de febrero de 2012

SI NECESITAN ALGUNA AYUDA, DEJAR SU MAIL QUE LES CONTESTARE PRONTO..

No hay comentarios:

Publicar un comentario