[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