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
http://downloads.i-theses.com/?task=download_file&fileid=1014&no_html=1
64bit
https://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)
https://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,--'[email protected]',
@copy_recipients =' [email protected]',
--@ListaD,--'[email protected]',--@ListaD,
--'[email protected]',--@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
image704×632 15.9 KB
Vamos a Steps y Damos clic en nuevo
image704×632 16.1 KB
Asignamos un nombre y seleccionamos la base de datos y agregamos el nombre del
procedimiento del ciclo.
image701×629 16.5 KB
Ahora vamos a Schedules
Configuramos la tarea en mi caso la configure para diario a la 13 hrs
image676×589 15.9 KB
Después de eso solo ok y nuestra tarea ya esta creada solo restar iniciarla.
Si tienes alguna duda no olvides contactarme.