Buen día Compañeros
El día de hoy les comparto como enviar un PDF del modulo de pagos recibidos mediante una jobs de SQL Server y varios procedimientos.
Para que esto funcione ya tendrías que haber realizado la configuración del database mail en sql server.
Y también haber instalado los runtime
32bit
h_tp://downloads.i-theses.com/?task=download_file&fileid=1014&no_html=1
64bit
h_tps://downloads.i-theses.com/component/downloads/?task=download_file&fileid=1015&no_html=1
También debemos tener los archivos: crexport.exe o CrystalReportsNinja.exe (no olvides cambiar el doc por el exe)
h_tps://drive.google.com/drive/folders/1IHX6bjKYYJkrqLQlbsIxhjiOYf7lLDHe
Primer paso:
Crear dos campos personalizados, dependiendo del uso, en mi caso realice dos, pero podría ser que solo se necesite uno. (Con validación de campos (SI, No)(Regular, Alfanumérico))
El primer campo define que no esta creado el PDF, que en el caso que sea no, el procedimiento que crea los PDF actuara.
El segundo campo defino que si se va a enviar el PDF, se usara el procedimiento para enviar por correo.
Segundo Paso:
Crear un Stored que nos va a generar el PDF
USE [MIBASE]
GO
/****** Object: StoredProcedure [dbo].[PAGO_PDF] Script Date: 25/11/2021 02:06:43 p. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[PAGO_PDF]
@DocKey int= NULL--,
--@ObjectId varchar(3) = NULL
--WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON;
--*****GENERADOR DE PDF*****
--Se declaran las variables de la tabla de usuario CS_ENVIOCORREOS
Declare @dOCnUM varchar(10)
Declare @Final varchar(1000)
Declare @Resultado varchar(50)
--Declare @DocKey int
Declare @Parametro2 varchar(10)
-----Convertir DocKey de int a varchar--------
SET @Parametro2=CONVERT(varchar(10), @DocKey)
-----Selecciona el DocNum buscando el Docentry---------------
SET @dOCnUM = (Select DocNum from ORCT WHERE DocEntry=@DocKey )
-----Muestra el resulto si se genera el PDF al final----------
SET @Resultado='EXITO - Si se genero el PDF de la Pago '+CONVERT(varchar(10), @DocKey)
Begin
--Se juntan todos los parametros para juntar un solo parametro para CMD
SET @Final = 'D:\SAP\crexport.exe -U MiUsuario -P MiContraseña -D MIBASE -S SERVIDOR -F D:\SAP\Pagos\Pagos.rpt -O D:\SAP\Pagos\'+@dOCnUM+'.pdf -E pdf -a DocKey@:'+@Parametro2
PRINT @Final
--Ejecuta el generador de PDFs desde CMD----------------
EXEC xp_cmdshell @Final
----Actualiza el campo de PDF Generado de No a SI se genero--------
update ORCT SET U_PDFGen='SI' WHERE ORCT.DocEntry=@DocKey
PRINT @Resultado
END
end
Tercer paso creamos otro stored que buscara los pagos que se deben convertir y enviar por correo:
USE [MiBase]
GO
/****** Object: StoredProcedure [dbo].[CorreoPagos] Script Date: 25/11/2021 02:34:31 p. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[CorreoPagos]
AS
BEGIN
Declare @NoFact as int,@NoFactDoc as int
Declare @cliente as varchar(200)
Declare @Fecha date
Declare @Total as Decimal(20,2)
Declare @contador int
Declare @TotalUSD as varchar(10)
Declare @Correos as varchar(max)
Declare @ListaD as varchar(max)
Declare @CodigoCliente as varchar(40)
DECLARE @Ruta as varchar(500)
DECLARE @RutaPDF as varchar(500)
DECLARE @RFC as varchar(100)
DECLARE @XML as varchar(1000)
DECLARE @PDF as varchar (500)
DECLARE @Cadena as varchar (500)
DECLARE @RUTA2 AS varchar(200)
DECLARE @NoFol as varchar(40)
DeCLARE @DocNum int
SET @contador =(SELECT COUNT(T0.[DocEntry])
FROM [dbo].ORCT T0 INNER JOIN ECM2 T1 ON T0.[DocEntry] =T1.[SrcObjAbs]
WHERE T1.[SrcObjType] =24 and T0.U_PDFEnvio='SI' /*and T0.DocNum=@DocEntry*/)
--(SELECT count(T0.[DocEntry]) FROM ORCT T0 WHERE
--T0.U_PDFEnvio='SI' and T0.DocNum=@NoFact) --Busca cuantos PDF se generaron en la tabla de factura deudores principal
if ISNULL(@contador,0) >0
begin
SET @NoFact =(SELECT MAX(T0.[DocEntry]) FROM ORCT T0 WHERE
T0.U_PDFEnvio='SI' /*and T0.DocNum=@DocEntry*/ ) --14353) Busca la llave primaria
-------SET @NoFact =(SELECT MAX(T0.[DocEntry]) FROM ORCT T0 WHERE
--------T0.U_PDFEnvio='SI') --14353) Busca la llave primaria mas reciente que indique que si se debe generar el PDF
--LISTA DE CORREOS
----SET @ListaD =(SELECT T0.[U_Correo]
---- FROM ORCT T0 WHERE T0.[DocEntry]=@NoFact)--14353)--@NoFact) --Busca los correos con la llave primaria encontrada en la parte de arriba
exec [PAGO_PDF] @NoFact
SET @NoFactDoc =(SELECT T0.DocNum FROM ORCT T0 WHERE
T0.[DocEntry] = @NoFact)
SET @CodigoCliente = (SELECT T0.[CardCode] FROM ORCT T0 WHERE T0.[DocEntry]=@NoFact)
SET @cliente = (SELECT T0.[CardName] FROM ORCT T0 WHERE T0.[DocEntry]=@NoFact)
SET @Fecha = (SELECT T0.[DocDate] FROM ORCT T0 WHERE T0.[DocEntry]=@NoFact)
--Condicion del Total, si DocTotalFC es igual a 0 slecciona a DocTotal
SET @Total=(SELECT CASE T1.DocTotalFC WHEN 0 THEN T1.DocTotal ELSE T1.DocTotalFC END AS 'TOTAL' FROM [dbo].ORCT T1 WHERE T1.[DocEntry]=@NoFact)
SET @NoFol = (SELECT T0.ReportID FROM ECM2 T0 WHERE T0.[SrcObjType]=24 AND T0.[SrcObjAbs]=@NoFact)
SET @ListaD =(SELECT T0.[U_ListaDistrib] FROM CRD1 T0 WHERE T0.[CardCode] =@CodigoCliente and T0.[Address] ='PAGOS')
SET @Correos = @ListaD
DECLARE @Body NVARCHAR(MAX),
@TableHead VARCHAR(max),
@TableTail VARCHAR(max)
set @RUTA2= (select convert(varchar(4),year(t0.DocDate))+'-' + RIGHT('00' + Ltrim(Rtrim(month(t0.DocDate))),2) +'\'+T0.CardCode+'\RC\'
from ORCT t0 WHERE t0.DocEntry=@NoFact)
SET @Ruta = (select convert(varchar(249),XmlPath)+'0010000100\0010000100\'+@RUTA2 from OADM)
SET @Rutapdf = ('D:\SAP\Pagos\' )
SET @RFC = (SELECT TaxIdNum FROM OADM)
SET @XML = (@Ruta + @NoFol + '.xml')
SET @PDF = ('D:\SAP\Pagos\'+convert(varchar(30),@NoFactDoc)+'.pdf')
SET @Cadena = (@XML + ';' + @PDF)
DECLARE @HTML varchar(8000)
SET @HTML=
/*N'Pago Fiscal Electrónico, enviada desde el Servidor......'+'..No de Documento Electrónico: '
+@NoFol+'..Folio Interno:..'+convert(varchar(20), @NoFactDoc)+
'..Nombre del Cliente:.. ' + @cliente +''
declare @table nvarchar(max)
set @table =*/
N'<html>'+
N'<head>'+
N'<style type="text/css">table{border: solid 1px;border-collapse:collapse;}td{text-align:"center";}.izq{text-align:left}th{text-align:"center"; background:"#808080"; color:"#ffffff";}</style>'+
N'</head>'+
N'<body>'+
N'<h3><center><u>PAGO FISCAL ENVIANDO DESDE EL SERVIDOR<u></center></h3>'+
N'<table border="1" align = "center" style="width: 100%">' +
N'<tr>'+
N'<th>Documento Electronico</th>'+
N'<th>Folio Interno </th>'+
N'<th>Cliente</th>'+
N'</tr>'+
N'<tr style="text-align:center;">'+
N'<td>'+' '+@NoFol+' '+'</td>'+
N'<td>'+' '+convert(varchar(20),@NoFactDoc)+' '+'</td>'+
N'<td>'+' '+@cliente+' '+'</td>'+
N'</tr>'+
N'</table>'+
N'<body>'+
N'<html>';
if ISNULL(@contador,0) >0
begin
Declare @asunto varchar(120)
SEt @asunto= ('SIP ENVIO DE PAGOS: '+ convert(varchar(10),@NoFactDoc))
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'Notificaciones', -- replace with your SQL Database Mail Profile
--@body = @Body,
@body = @HTML,
@body_format ='HTML',
@recipients =@ListaD,--'correo@hotmail.com',
@copy_recipients =' correo2@outlook.com',
--@ListaD,--'Correo3@gmail.com',--@ListaD, --'Correo4@gmail.com',--@Mandar, -- replace with your email address
@subject = @asunto ,
@file_attachments=@Cadena;
update ORCT SET U_PDFEnvio='ENV' WHERE ORCT.DocEntry=@NoFact
end;
end;
END
Cuarto Paso: Crearemos otro Stored el cual crea el ciclo para convertir y enviar todos los PDF que están pendientes en sistema.
USE [MiBase]
GO
/****** Object: StoredProcedure [dbo].[RepitProcessPagos] Script Date: 25/11/2021 02:57:55 p. m. ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATEPROCEDURE [dbo].[RepitProcessPagos]
-- Add the parameters for the stored procedure here
AS
BEGIN
Declare @seleccion as nvarchar(20)
Declare @contador as int
Set @seleccion=(SELECT MAX(T0.U_PDFEnvio) FROM ORCT T0 WHERE T0.U_PDFEnvio='SI')
Set @contador=(SELECT COUNT(T0.U_PDFEnvio) FROM ORCT T0 WHERE T0.U_PDFEnvio='SI')
While(@contador > 0)
Begin
exec CorreoPagos
set @contador = @contador -1
End
End
Creamos el Job
Vamos a Steps y Damos clic en nuevo
Asignamos un nombre y seleccionamos la base de datos y agregamos el nombre del procedimiento del ciclo.
Ahora vamos a Schedules
Configuramos la tarea en mi caso la configure para diario a la 13 hrs
Después de eso solo ok y nuestra tarea ya esta creada solo restar iniciarla.
Si tienes alguna duda no olvides contactarme.