[SQL Server] Lancer l'impression automatique d'un rapport SSRS
-- =============================================
-- Author: Zouhaier KHARROUBI
-- Create date: 01 Août 2017
-- Description: Lancer l'impression automatique d'un rapport SSRS
-- =============================================
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
IF EXISTS(SELECT * FROM tempdb..sysobjects WHERE id = object_id(N'[tempdb]..[#Liste_Commandes]'))
BEGIN
DROP TABLE #Liste_Commandes
END
CREATE TABLE #Liste_Commandes
(
Num_Lig int identity(1,1)
,Num_Commande VARCHAR(8)
)
CREATE TABLE #Fichiers
(
NomFichier VARCHAR(250)
)
CREATE NONCLUSTERED INDEX [IDX_NomFichier_#Fichiers] ON #Fichiers
(
NomFichier ASC
)
DECLARE @CommandeShell NVARCHAR(2500)
,@Num_Lig INT
,@Nbre_Lig INT
,@Num_Commande VARCHAR(8)
,@CMD NVARCHAR(4000)
,@FichierBat NVARCHAR(4000)
,@ReturnCode INT
INSERT INTO #Liste_Commandes(Num_Commande)
SELECT Num_Commande FROM COMMANDES
WHERE STATUT_COMMANDE='A_IMPRIMER'
SELECT @Nbre_Lig = COUNT(*) FROM #Liste_Commandes
SELECT @Num_Lig = 1
WHILE @Num_Lig<=@Nbre_Lig
BEGIN
SELECT @Num_Commande = Num_Commande FROM #Liste_Commandes WHERE Num_Lig=@Num_Lig
SELECT @CMD = N'DIR C:\Commandes_Imprimees\' + @Num_Commande + '*.pdf /B'
TRUNCATE TABLE #Fichiers
--Trouver toutes les commandes qui ont été imprimées
INSERT INTO #Fichiers
EXEC Master..xp_cmdshell@CMD
--LA commande n'a pas été imprimée
IF NOT EXISTS(SELECT NomFichier FROM #Fichiers WHERE NomFichier LIKE '%' + @Num_Commande + '%')
BEGIN
SELECT @CMD = 'powershell -ExecutionPolicy unrestricted -Command "C:\mes_scripts\ImprimerRapport.ps1 "' + @Num_Commande + '""'
SELECT @FichierBat = 'F:\SCRIPTS\' + @Num_Commande + '.bat'
--Créer et lancer le fichier bat qui permet de créer le fichier pdf
SELECT @CMD ='ECHO ' + @CMD + ' > ' + @FichierBat
EXEC @ReturnCode = xp_cmdshell@CMD
EXEC @ReturnCode = xp_cmdshell@FichierBat
--Supprimer le fichier bat
SELECT @CMD ='DEL ' + @FichierBat
EXEC @ReturnCode = xp_cmdshell@CMD
END
SELECT @Num_Lig = @Num_Lig + 1
SELECT @Num_Lig
END
DROP TABLE #Liste_Commandes
DROP TABLE #Fichiers
END
#Le code du script PowerShell ImprimerRapport.ps1
#Declarer les paramètres à passer au script powershell ImprimerRapport.ps1
Param (
[string] $Num_Commande
)
#Place adobe in your path
$env:Path = $env:Path + ";C:\Program Files (x86)\Adobe\Reader 9.0\Reader"
#Spécifier l'URL du rapport SSRS. Concaténer les paramètres si nécéssaire
$url = "http://Mon_Serveur_SSRS/ReportServer/Pages/ReportViewer.aspx?%2fMesRapports%2fListeCommandes&Num_Commande=" + $Num_Commande +"&rs:Format=PDF"
#Use alternative credentials as needed to access report server
$webclient = New-Object System.Net.WebClient
$webclient.UseDefaultCredentials = $TRUE
$file = "C:\Commandes_Imprimees\" + $Num_Commande + ".pdf"
#Télécharger
$webclient.DownloadFile($url,$file)
#Specifier le nom de l'imprimante \\server\name
$printer = "\\MonServeurImpression\Imprimante_1"
#$printer = "109.110.111.112"
#LAncer l'impression avec Acrobate
# Ne pas oublier de déclarer dans les variables d'environnement le chemin de AcroRd32.exe
#Dans notre cas le chemin est C:\Program Files (x86)\Adobe\Reader 9.0\Reader\
$application = "AcroRd32.exe"
$Arguments = "/N /T " + $file + " " + $printer
Start-Process $application -ArgumentList $Arguments
#Lancer l'impression sur l'imprimante par défaud
#Start-Process –FilePath $file –Verb Print $printer -PassThru | %{sleep 5;$_} | kill
#Lancer l'impression sur une imprimante spécifique
#Start-Process –FilePath $file –Verb Print | out-printer -name $printer | %{sleep 5;$_} | kill
# faire une pause de 5 secondes avant de supprimer le process AcroRd32
# sans cette pause l'impression risque d'être annulée suite à l'instruction suivante qui supprime le process
Start-Sleep -s 5
Get-Process AcroRd32 | kill