Generar PDF a partir de un formulario
***------------------------------------------------------------------***
* Report zkpi0023 - Interfase de Envíos de facturas de Obra Nueva a *
* las delegaciones. Busca las facturas que estén en el spool y las *
* graba en un archivo para controlar su impresión. A continuación las *
* muestra para que el usuario seleccione aquellas que quiere pasar a *
* pdf.
* Crea un archivo txt llamado ENVIAR.TXT con las facturas creadas *
***------------------------------------------------------------------***
* MÓDULO AL QUE PERTENECE: SD *
* AUTOR: Gastón Frete Fontaine EMPRESA: Alameda soft
*----------------------------------------------------------------------
* CONTROL DE MODIFICACIONES
* AUTOR FECHA MOTIVO
*
*----------------------------------------------------------------------
REPORT ZKPI0023.
***
TABLES: ZENVIOFACTU, "Control de envío de facturas en PDF a delega
USR01. "Maestro de usuarios
*
INCLUDE <LIST>.
*
DATA: DELEGACION_W LIKE ZENVIOFACTU-DELEGACION,
W_NROFACTURA LIKE ZENVIOFACTU-NROFACTURA,
CORRECTO(1) VALUE 'S',
W_DESTINO(128),
TITULO(7) VALUE 'FAC_ON_',
HAY_FACTURAS(1),
BOX,
LINES TYPE I,
FREE TYPE I,
D_LINEAS LIKE SY-TABIX,
I_PDF LIKE TLINE,
PBYTE TYPE I,
I_SPOOLREQ LIKE RSPORQ,
SPOOL_ID LIKE TSP01-RQIDENT,
RESPUESTA LIKE SY-TABIX,
I_OTF,
FECHA_W(16),
W_NOMBRETXT(128),
INDICE LIKE SY-TABIX,
DATC LIKE RSPORQ-RQCRETIME.
* Tablas Internas
* archivo ENVIAR.TXT
DATA: BEGIN OF I_ENVIAR OCCURS 10,
TEXTO(128).
DATA: END OF I_ENVIAR.
*
DATA: T_PDF LIKE TLINE OCCURS 0,
TSPOOLREQ LIKE RSPORQ OCCURS 0.
*
DATA: BEGIN OF I_ZENVIOFACTU OCCURS 20.
INCLUDE structure ZENVIOFACTU.
DATA: END OF I_ZENVIOFACTU.
***-------------------------------------------------------------------**
** PANTALLA DE SELECCION
***-------------------------------------------------------------------**
SELECTION-SCREEN SKIP.
SELECTION-SCREEN BEGIN OF BLOCK DATOS WITH FRAME TITLE TEXT-000.
PARAMETERS::
P_FICH LIKE RLGRAP-FILENAME OBLIGATORY
DEFAULT '\\Aries\Gestdel\Envios\FacturasON\',
USERNAM LIKE SY-UNAME DEFAULT SY-UNAME,
DISP LIKE RSPOTYPE-DEVICE OBLIGATORY,
DATUM LIKE SY-DATUM DEFAULT SY-DATUM OBLIGATORY.
SELECTION-SCREEN END OF BLOCK DATOS.
*
INITIALIZATION.
PERFORM RECUPERAR_IMPRESORA.
***------------------------------------------------------------------***
START-OF-SELECTION.
PERFORM CREAR_SUBDIRECTORIO.
PERFORM BUSCAR_DATOS_SELECCION.
PERFORM LEER_ZENVIOFACTU.
IF HAY_FACTURAS = 'N'.
MESSAGE ID 'Z1' TYPE 'E' NUMBER 000 WITH TEXT-001.
ELSE.
PERFORM IMPRIMIR_CABECERAS.
PERFORM MOSTRAR_PANTALLA.
ENDIF.
END-OF-SELECTION.
SET PF-STATUS '0001'.
AT USER-COMMAND.
IF SY-UCOMM = 'LIST'.
SET PF-STATUS '0002'.
ENDIF.
DO.
CLEAR BOX.
READ LINE SY-INDEX FIELD VALUE BOX.
IF SY-SUBRC NE 0.
EXIT.
ENDIF.
IF BOX <> SPACE.
PERFORM ARMAR_NOMBRE.
PERFORM CREAR_PDFS.
ENDIF.
ENDDO.
PERFORM BAJAR_TXT.
LEAVE.
EXIT.
*---------------------------------------------------------------------*
* Form BUSCAR_DATOS_SELECCION
*---------------------------------------------------------------------*
FORM BUSCAR_DATOS_SELECCION.
CONCATENATE SY-DATUM '00000000' INTO FECHA_W.
CALL FUNCTION 'RSPO_FIND_SPOOL_REQUESTS' " Leemos los spools
EXPORTING
ALLCLIENTS = ' '
AUTHORITY = 'X'
DATATYPE = '*'
HAS_OUTPUT_REQUESTS = '*'
RQ0NAME = '*'
RQ1NAME = '*'
RQ2NAME = '*'
RQDEST = DISP
RQIDENT = 0
RQOWNER = USERNAM
RQCRETIME = FECHA_W
TABLES
SPOOLREQUESTS = TSPOOLREQ
EXCEPTIONS
NO_PERMISSION = 1
OTHERS = 2.
PERFORM GUARDAR_SPOOL.
ENDFORM. " BUSCAR_DATOS_SELECCION
*---------------------------------------------------------------------*
* Form TRATAMIENTO_PDF
*---------------------------------------------------------------------*
FORM TRATAMIENTO_PDF.
SPOOL_ID = I_ZENVIOFACTU-RQIDENT.
* Miramos qué tipo de spool tenemos
CALL FUNCTION 'RSPO_GET_TYPE_SPOOLJOB'
EXPORTING
RQIDENT = SPOOL_ID
IMPORTING
IS_OTF = I_OTF
EXCEPTIONS
CAN_NOT_ACCESS = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
MESSAGE ID 'Z1' TYPE 'E' NUMBER 000
WITH TEXT-002.
ELSEIF I_OTF EQ 'X'.
* Generar PDF de OTF
CALL FUNCTION 'CONVERT_OTFSPOOLJOB_2_PDF'
EXPORTING
SRC_SPOOLID = SPOOL_ID
IMPORTING
PDF_BYTECOUNT = PBYTE
TABLES
PDF = T_PDF
EXCEPTIONS
ERR_NO_OTF_SPOOLJOB = 1
ERR_NO_SPOOLJOB = 2
ERR_NO_PERMISSION = 3
ERR_CONV_NOT_POSSIBLE = 4
ERR_BAD_DSTDEVICE = 5
USER_CANCELLED = 6
ERR_SPOOLERROR = 7
ERR_TEMSEERROR = 8
ERR_BTCJOB_OPEN_FAILED = 9
ERR_BTCJOB_SUBMIT_FAILED = 10
ERR_BTCJOB_CLOSE_FAILED = 11
OTHERS = 12.
ELSE. " Generar PDF de Abap
CALL FUNCTION 'CONVERT_ABAPSPOOLJOB_2_PDF'
EXPORTING
SRC_SPOOLID = SPOOL_ID
IMPORTING
PDF_BYTECOUNT = PBYTE
TABLES
PDF = T_PDF
EXCEPTIONS
ERR_NO_ABAP_SPOOLJOB = 1
ERR_NO_SPOOLJOB = 2
ERR_NO_PERMISSION = 3
ERR_CONV_NOT_POSSIBLE = 4
ERR_BAD_DESTDEVICE = 5
USER_CANCELLED = 6
ERR_SPOOLERROR = 7
ERR_TEMSEERROR = 8
ERR_BTCJOB_OPEN_FAILED = 9
ERR_BTCJOB_SUBMIT_FAILED = 10
ERR_BTCJOB_CLOSE_FAILED = 11
OTHERS = 12.
IF SY-SUBRC EQ 0.
* Iniciamos la traducción por error en la funcion de conversion ABAP-PDF
LOOP AT T_PDF INTO I_PDF.
TRANSLATE I_PDF USING ',.'.
MODIFY T_PDF FROM I_PDF.
ENDLOOP.
ENDIF.
ENDIF. "De if sy-subrc
ENDFORM. " TRATAMIENTO_PDF
*---------------------------------------------------------------------*
* Form BAJAR_ARCHIVO
*---------------------------------------------------------------------*
FORM BAJAR_ARCHIVO.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
BIN_FILESIZE = PBYTE
FILENAME = W_DESTINO
FILETYPE = 'BIN'
TABLES
DATA_TAB = T_PDF
EXCEPTIONS
INVALID_FILESIZE = 1
INVALID_TABLE_WIDTH = 2
INVALID_TYPE = 3
NO_BATCH = 4
UNKNOWN_ERROR = 5
GUI_REFUSE_FILETRANSFER = 6.
IF SY-SUBRC <> 0.
CORRECTO = 'N'.
MESSAGE ID 'Z1' TYPE 'E' NUMBER '000' WITH TEXT-003.
ENDIF.
ENDFORM. " BAJAR_ARCHIVO
*---------------------------------------------------------------------*
* Form RECUPERAR_IMPRESORA
*---------------------------------------------------------------------*
FORM RECUPERAR_IMPRESORA.
SELECT SINGLE SPLD FROM USR01
INTO CORRESPONDING FIELDS OF USR01
WHERE BNAME = SY-UNAME.
IF SY-SUBRC = 0.
DISP = USR01-SPLD.
ENDIF.
ENDFORM. " RECUPERAR_IMPRESORA
*---------------------------------------------------------------------*
* Form GUARDAR-SPOOL.
* Primero controla si corresponde la fecha y busca las facturas dentro
* de los spooles.
* Se guardan los spooles nuevos en una tabla para controlar los que
* ya han sido enviados.
*---------------------------------------------------------------------*
FORM GUARDAR_SPOOL.
LOOP AT TSPOOLREQ INTO I_SPOOLREQ.
IF I_SPOOLREQ-RQCRETIME+0(8) = DATUM
AND I_SPOOLREQ-RQTITLE+0(7) = 'Factura'
AND I_SPOOLREQ-RQTITLE+32(5) <> '10000'.
PERFORM GRABAR_TABLAS.
ELSE.
DELETE TSPOOLREQ.
ENDIF.
ENDLOOP.
ENDFORM. " ELEGIR-SPOOL
*---------------------------------------------------------------------*
* Form GRABAR_TABLAS
* Se controla si ya ha sido creado y enviado. *
* Se graba en la tabla ZENVIOFACTU
*----------------------------------------------------------------------*
FORM GRABAR_TABLAS.
CLEAR ZENVIOFACTU.
MOVE I_SPOOLREQ-RQIDENT TO ZENVIOFACTU-RQIDENT.
MOVE I_SPOOLREQ-RQTITLE TO ZENVIOFACTU-RQTITLE.
MOVE I_SPOOLREQ-RQ0NAME TO ZENVIOFACTU-RQ0NAME.
MOVE I_SPOOLREQ-RQCRETIME TO ZENVIOFACTU-RQCRETIME.
MOVE I_SPOOLREQ-RQTITLE+21(4) TO ZENVIOFACTU-DELEGACION.
MOVE I_SPOOLREQ-RQTITLE+32(10) TO ZENVIOFACTU-NROFACTURA.
MOVE 'N' TO ZENVIOFACTU-ENVIADO.
MOVE SY-DATUM TO ZENVIOFACTU-FECHA_CREACION.
INSERT ZENVIOFACTU.
ENDFORM. " GRABAR_TABLAS
*---------------------------------------------------------------------*
* Form LEER_ZENVIOFACTU
*---------------------------------------------------------------------*
FORM LEER_ZENVIOFACTU.
SELECT * FROM ZENVIOFACTU
INTO TABLE I_ZENVIOFACTU
WHERE ENVIADO = 'N'.
IF SY-DBCNT <> 0.
HAY_FACTURAS = 'S'.
ELSE.
HAY_FACTURAS = 'N'.
ENDIF.
ENDFORM. " LEER_ZENVIOFACTU
*---------------------------------------------------------------------*
* Form CREAR_PDFS
*---------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM CREAR_PDFS.
PERFORM TRATAMIENTO_PDF.
DESCRIBE TABLE T_PDF LINES D_LINEAS.
IF D_LINEAS NE 0. "solo hago el download si tengo datos
PERFORM BAJAR_ARCHIVO.
IF CORRECTO = 'S'.
PERFORM MARCAR_ENVIADO.
PERFORM GRABAR_TXT.
ELSE.
MOVE 'S' TO CORRECTO.
ENDIF.
ENDIF.
ENDFORM. " CREAR_PDFS
*---------------------------------------------------------------------*
* Form IMPRIMIR_CABECERAS
*---------------------------------------------------------------------*
FORM IMPRIMIR_CABECERAS.
ULINE AT 7(98).
WRITE: /7 SY-VLINE,
'Del.' COLOR COL_HEADING NO-GAP,
13 SY-VLINE,
'Factura' COLOR COL_HEADING NO-GAP,
23 SY-VLINE,
'Datos de la Factura' COLOR COL_HEADING NO-GAP,
94 SY-VLINE,
95 'Nro.Spool' COLOR COL_HEADING NO-GAP,
104 SY-VLINE,
/10 SY-VLINE.
ULINE AT 7(98).
ENDFORM. " IMPRIMIR_CABECERAS
*---------------------------------------------------------------------*
* Form MOSTRAR_PANTALLA
*----------------------------------------------------------------------*
FORM MOSTRAR_PANTALLA.
SORT I_ZENVIOFACTU BY DELEGACION NROFACTURA.
LOOP AT I_ZENVIOFACTU.
SPOOL_ID = I_ZENVIOFACTU-RQIDENT.
ULINE AT 7(97).
WRITE: /4 BOX AS CHECKBOX,
7 SY-VLINE.
IF I_ZENVIOFACTU-DELEGACION <> DELEGACION_W.
MOVE I_ZENVIOFACTU-DELEGACION TO DELEGACION_W.
WRITE 9 I_ZENVIOFACTU-DELEGACION+2(2) COLOR COL_NORMAL.
ENDIF.
WRITE: 13 SY-VLINE,
14 I_ZENVIOFACTU-NROFACTURA COLOR COL_NORMAL,
23 SY-VLINE,
I_ZENVIOFACTU-RQTITLE,
94 SY-VLINE,
95 SPOOL_ID,
104 SY-VLINE,
/10 SY-VLINE.
ULINE AT 7(98).
HIDE: I_ZENVIOFACTU-RQIDENT,
I_ZENVIOFACTU-RQTITLE.
ENDLOOP.
ENDFORM. " MOSTRAR_PANTALLA
*----------------------------------------------------------------------*
* Form MARCAR_ENVIADO
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM MARCAR_ENVIADO.
UPDATE ZENVIOFACTU
SET ENVIADO = 'S'
WHERE RQIDENT = I_ZENVIOFACTU-RQIDENT.
ENDFORM. " MARCAR_ENVIADO
*----------------------------------------------------------------------*
* Form ARMAR_NOMBRE
* Primero intenta crear el subdirectorio:
* Path: \\Aries\Gestdel\Envios\FacturaON\sy-datum
* "FAC_ON_1234567890_XXXXXXXXXXXXXXXX(DD).pdf"
* Tamaño total: 42 ====> 1234567890 Número de factura (10 carac). *
* xxxxxxxxxx Nombre del cliente(16 carac) *
* (DD) delegación
* p_fich = default '\\Aries\Gestdel\Envios\FacturaON\'
* titulo = value 'FAC_ON_',
*----------------------------------------------------------------------*
FORM ARMAR_NOMBRE.
MOVE SY-LISEL+7(10) TO W_NROFACTURA.
READ TABLE I_ZENVIOFACTU WITH KEY
NROFACTURA = W_NROFACTURA.
CONCATENATE P_FICH '\' TITULO I_ZENVIOFACTU-NROFACTURA
'_'
I_ZENVIOFACTU-RQTITLE+52(16)
'('
I_ZENVIOFACTU-RQTITLE+23(2) "Delegación
')'
'.pdf' INTO W_DESTINO.
ENDFORM. " ARMAR_NOMBRE
*----------------------------------------------------------------------*
* Form CREAR_SUBDIRECTORIO
*----------------------------------------------------------------------*
* Intenta crear el subdirectorio. Si existe, continua
*----------------------------------------------------------------------*
FORM CREAR_SUBDIRECTORIO.
DATA: SUBDIR LIKE RLGRAP-FILENAME.
CONCATENATE P_FICH DATUM INTO P_FICH.
SUBDIR = P_FICH.
CALL FUNCTION 'TMP_GUI_CREATE_DIRECTORY'
EXPORTING
DIRNAME = SUBDIR
EXCEPTIONS
FAILED = 1
OTHERS = 2.
ENDFORM. " CREAR_SUBDIRECTORIO
*----------------------------------------------------------------------*
* Form GRABAR_TXT *
*----------------------------------------------------------------------*
FORM GRABAR_TXT.
CONCATENATE I_ZENVIOFACTU-RQTITLE+23(2) "Delegación
'-'
TITULO I_ZENVIOFACTU-NROFACTURA '_'
I_ZENVIOFACTU-RQTITLE+52(16)
'('
I_ZENVIOFACTU-RQTITLE+23(2)
')'
'.pdf'
INTO I_ENVIAR-TEXTO.
APPEND I_ENVIAR.
ENDFORM. " GRABAR_TXT
*---------------------------------------------------------------------*
* Form BAJAR_TXT
*---------------------------------------------------------------------*
FORM BAJAR_TXT.
CONCATENATE P_FICH '\' 'enviar.txt' INTO W_NOMBRETXT.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
FILENAME = W_NOMBRETXT
FILETYPE = 'DAT'
MODE = 'A' "append
TABLES
DATA_TAB = I_ENVIAR.
ENDFORM. " BAJAR_TXT
|