HPSMexportSQL.ps1 : Différence entre versions
(Page créée avec « ''Le script ci-dessous permet d'injecter les données exportées par HPSM dans un fichier texte (.csv) de la RAMQ, dans une BD (PostgreSQL), une table est créée si elle... ») |
|||
(2 révisions intermédiaires par le même utilisateur non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
''Le script ci-dessous permet d'injecter les données exportées par HPSM dans un fichier texte (.csv) de la RAMQ, dans une BD (PostgreSQL), une table est créée si elle n'existe pas. COPIER et COLLER ce script dans un fichier HPSMexportSQL.ps1''<br> | ''Le script ci-dessous permet d'injecter les données exportées par HPSM dans un fichier texte (.csv) de la RAMQ, dans une BD (PostgreSQL), une table est créée si elle n'existe pas. COPIER et COLLER ce script dans un fichier HPSMexportSQL.ps1''<br> | ||
− | + | #RAMQ REQUETE SQL (PostgreSQL) **** Déversement de HPSM à partir d'un fichier **** | |
− | + | #Projet Windows 10 | |
− | + | #Concepteur: Frédéric Côté (fcote@outlook.fr) | |
− | + | #Réréfence PostgreSQL: http://blog.briankmarsh.com/postgresql-powershell-part-1/ | |
− | + | ||
− | + | #Variables | |
− | + | #Dépot de l'exécution LOG | |
− | $log="C:\temp\HPSMexport.log" | + | $log="C:\temp\HPSMexport.log" |
− | $temps=(date).DateTime | + | $temps=(date).DateTime |
− | + | ||
− | + | #Fonction pour générer le log | |
− | Function LogWrite | + | Function LogWrite |
− | { | + | { |
− | + | Param ([string]$logstring) | |
− | + | ||
− | + | Add-content $Log -value $logstring | |
− | } | + | } |
− | + | #Les Fonctions SQL | |
− | + | #Requêtes pour PostgreSQL 'obtenir les infos' | |
− | + | Function Get-ODBCData{ | |
− | + | param( | |
[string]$query, | [string]$query, | ||
[string]$dbServer = "localhost", # Serveur BD (IP ou hostname) | [string]$dbServer = "localhost", # Serveur BD (IP ou hostname) | ||
Ligne 26 : | Ligne 26 : | ||
[string]$dbUser = "invposte", # Utisateur défini dans la BD | [string]$dbUser = "invposte", # Utisateur défini dans la BD | ||
[string]$dbPass = "invposte" # Mot de Passe pour l'utilisateur de $dbUser | [string]$dbPass = "invposte" # Mot de Passe pour l'utilisateur de $dbUser | ||
− | + | ) | |
− | + | ||
$conn = New-Object System.Data.Odbc.OdbcConnection | $conn = New-Object System.Data.Odbc.OdbcConnection | ||
$conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" | $conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" | ||
Ligne 36 : | Ligne 36 : | ||
$conn.close() | $conn.close() | ||
$ds.Tables[0] | $ds.Tables[0] | ||
− | } | + | } |
− | + | # Requêtes pour PostgreSQL 'définir les infos' | |
− | + | Function Set-ODBCData{ | |
− | + | param( | |
[string]$query, | [string]$query, | ||
[string]$dbServer = "localhost", # Serveur BD (IP ou hostname) | [string]$dbServer = "localhost", # Serveur BD (IP ou hostname) | ||
Ligne 46 : | Ligne 46 : | ||
[string]$dbPass = "invposte" # Mot de Passe pour l'utilisateur de $dbUser | [string]$dbPass = "invposte" # Mot de Passe pour l'utilisateur de $dbUser | ||
) | ) | ||
− | + | ||
$conn = New-Object System.Data.Odbc.OdbcConnection | $conn = New-Object System.Data.Odbc.OdbcConnection | ||
$conn.ConnectionString= "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" | $conn.ConnectionString= "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" | ||
Ligne 61 : | Ligne 61 : | ||
} | } | ||
$conn.close() | $conn.close() | ||
− | } | + | } |
− | + | ||
− | + | #------------------------------------------------------------------------------------------ | |
− | + | ##Création de la Table 'xxx' | |
− | $NomTable = 'HPSM' | + | $NomTable = 'HPSM' |
− | $CreationTableSCCM=@" | + | $CreationTableSCCM=@" |
− | CREATE TABLE "HPSM" ( | + | CREATE TABLE "HPSM" ( |
− | + | "PosteID" TEXT, | |
− | + | "UtilisateurID" TEXT, | |
− | + | "Materieltype" TEXT, | |
− | + | "Modele" TEXT, | |
− | + | "Lieu" TEXT, | |
− | + | "Emplacement" TEXT, | |
− | + | "CentredeCout" TEXT, | |
− | + | "Statut" TEXT, | |
− | + | "Commentaire" TEXT, | |
− | + | "Etat" TEXT | |
− | ) | + | ) |
− | ; | + | ; |
− | "@ | + | "@ |
− | if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'")) | + | if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'")) |
− | { | + | { |
# Création de la nouvelle table | # Création de la nouvelle table | ||
try | try | ||
Ligne 92 : | Ligne 92 : | ||
Write-Host -ForegroundColor Red "ERROR! $($_.Exception)" | Write-Host -ForegroundColor Red "ERROR! $($_.Exception)" | ||
} | } | ||
− | } | + | } |
− | + | ##### ALIMENTATION DE LA BD ##### | |
− | + | ||
− | + | # Requête pour obtenir les colonnes de la table | |
− | $query = "SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '$NomTable';" | + | $query = "SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '$NomTable';" |
− | $columns = Get-ODBCData -query $query | + | $columns = Get-ODBCData -query $query |
− | + | # Déversement des noms de colonnes dans un tableau | |
− | $props = $columns.column_name | + | $props = $columns.column_name |
− | + | ||
− | + | #CHECK ET ALIMENTE | |
− | + | #----------Source des données----------- | |
− | + | #La Capture (importation des données Excel) | |
− | + | #Emplacement du dépot de fichier | |
− | $Depot="\\adprod\donnees\DepoTransfert\FrédéricCôté" #"C:\Users\U0793\Documents\Projets\W10\Pilote_Profil\2018-03-28" #Cible: "\\adprod\donnees\DepoTransfert\FrédéricCôté" | + | $Depot="\\adprod\donnees\DepoTransfert\FrédéricCôté" #"C:\Users\U0793\Documents\Projets\W10\Pilote_Profil\2018-03-28" #Cible: "\\adprod\donnees\DepoTransfert\FrédéricCôté" |
− | $InvHPSM=(Get-ChildItem $Depot\Inventaire*.csv).FullName | sort LastWriteTime | select -last 1 | + | $InvHPSM=(Get-ChildItem $Depot\Inventaire*.csv).FullName | sort LastWriteTime | select -last 1 |
− | + | #"Numéro de code barre","Nom réseau","Type de composante","Lieu","Centre de coût","Emplacement physique","Commentaires","Modèle","État","Client","Système d'exploitation" | |
− | + | ||
− | + | #----------Traitement des données-------- | |
− | $LesW = Import-Csv -Path $InvHPSM -Delimiter "`t" -Header "PosteID","Nom réseau","Materieltype","Lieu","CentredeCout","Emplacement","Commentaire","Modele","Statut","UtilisateurID","OS" | select "PosteID","UtilisateurID","Materieltype","Modele","Lieu","Emplacement","CentredeCout","Statut","Commentaire" | + | $LesW = Import-Csv -Path $InvHPSM -Delimiter "`t" -Header "PosteID","Nom réseau","Materieltype","Lieu","CentredeCout","Emplacement","Commentaire","Modele","Statut","UtilisateurID","OS" | select |
− | + | "PosteID","UtilisateurID","Materieltype","Modele","Lieu","Emplacement","CentredeCout","Statut","Commentaire" | |
− | Foreach ($item in $LesW) | + | |
− | { | + | Foreach ($item in $LesW) |
+ | { | ||
$dbQuery = $Null | $dbQuery = $Null | ||
− | + | ||
# Vérification si la valeure n'existe pas déjà | # Vérification si la valeure n'existe pas déjà | ||
$exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"PosteID`" LIKE '$($item.PosteID)' AND `"UtilisateurID`" LIKE '$($item.UtilisateurID)';" | $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"PosteID`" LIKE '$($item.PosteID)' AND `"UtilisateurID`" LIKE '$($item.UtilisateurID)';" | ||
Ligne 134 : | Ligne 135 : | ||
} | } | ||
} | } | ||
− | + | ||
# Si les valeurs ne sont pas identiques, on doit mettre à jour | # Si les valeurs ne sont pas identiques, on doit mettre à jour | ||
If (!$identical) | If (!$identical) | ||
{ | { | ||
#Update ces valeurs | #Update ces valeurs | ||
− | Write-Host -ForegroundColor Magenta "[$temps] Cet item existe déjà, cependant les propriétés sont différentes. On doit mettre à jour ces valeurs pour la table $NomTable à la ligne contenant le Poste: $($item.PosteID) La différence est au niveau: $diffProps" | + | Write-Host -ForegroundColor Magenta "[$temps] Cet item existe déjà, cependant les propriétés sont différentes. On doit mettre à jour ces valeurs pour la table $NomTable à la ligne contenant le Poste: |
+ | $($item.PosteID) La différence est au niveau: $diffProps" | ||
$dbQuery = "UPDATE `"$NomTable`" SET " | $dbQuery = "UPDATE `"$NomTable`" SET " | ||
Foreach ($diffProp in $diffProps) | Foreach ($diffProp in $diffProps) | ||
Ligne 165 : | Ligne 167 : | ||
Else | Else | ||
{ | { | ||
− | + | ||
# Préparation de la requête de démarrage pour insérer les valeurs dans la table avec les bonnes propriétés/colonnes | # Préparation de la requête de démarrage pour insérer les valeurs dans la table avec les bonnes propriétés/colonnes | ||
$dbQuery = "INSERT INTO public.`"$NomTable`" (`"$($props -join '", "')`") VALUES ('" | $dbQuery = "INSERT INTO public.`"$NomTable`" (`"$($props -join '", "')`") VALUES ('" | ||
− | + | ||
# Passe à travers chacune des propriétés et ajoute la valeur correspondante | # Passe à travers chacune des propriétés et ajoute la valeur correspondante | ||
Foreach ($property in $props) | Foreach ($property in $props) | ||
Ligne 188 : | Ligne 190 : | ||
} | } | ||
} | } | ||
− | + | ||
− | + | ||
− | + | ||
# Finalisation de la requête | # Finalisation de la requête | ||
$dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 3) | $dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 3) | ||
$dbQuery = $dbQuery + ");" | $dbQuery = $dbQuery + ");" | ||
} | } | ||
− | + | ||
#Exécution de la requête | #Exécution de la requête | ||
If ($dbQuery) | If ($dbQuery) | ||
Ligne 201 : | Ligne 203 : | ||
$output = Set-ODBCData -query $dbQuery | $output = Set-ODBCData -query $dbQuery | ||
} | } | ||
− | } | + | } |
Version actuelle datée du 20 décembre 2022 à 20:16
Le script ci-dessous permet d'injecter les données exportées par HPSM dans un fichier texte (.csv) de la RAMQ, dans une BD (PostgreSQL), une table est créée si elle n'existe pas. COPIER et COLLER ce script dans un fichier HPSMexportSQL.ps1
#RAMQ REQUETE SQL (PostgreSQL) **** Déversement de HPSM à partir d'un fichier **** #Projet Windows 10 #Concepteur: Frédéric Côté (fcote@outlook.fr) #Réréfence PostgreSQL: http://blog.briankmarsh.com/postgresql-powershell-part-1/ #Variables #Dépot de l'exécution LOG $log="C:\temp\HPSMexport.log" $temps=(date).DateTime #Fonction pour générer le log Function LogWrite { Param ([string]$logstring) Add-content $Log -value $logstring } #Les Fonctions SQL #Requêtes pour PostgreSQL 'obtenir les infos' Function Get-ODBCData{ param( [string]$query, [string]$dbServer = "localhost", # Serveur BD (IP ou hostname) [string]$dbName = "invposte", # Nom de la BD [string]$dbUser = "invposte", # Utisateur défini dans la BD [string]$dbPass = "invposte" # Mot de Passe pour l'utilisateur de $dbUser ) $conn = New-Object System.Data.Odbc.OdbcConnection $conn.ConnectionString = "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" $conn.open() $cmd = New-object System.Data.Odbc.OdbcCommand($query,$conn) $ds = New-Object system.Data.DataSet (New-Object system.Data.odbc.odbcDataAdapter($cmd)).fill($ds) | out-null $conn.close() $ds.Tables[0] } # Requêtes pour PostgreSQL 'définir les infos' Function Set-ODBCData{ param( [string]$query, [string]$dbServer = "localhost", # Serveur BD (IP ou hostname) [string]$dbName = "invposte", # Nom de la BD [string]$dbUser = "invposte", # Utisateur défini dans la BD [string]$dbPass = "invposte" # Mot de Passe pour l'utilisateur de $dbUser ) $conn = New-Object System.Data.Odbc.OdbcConnection $conn.ConnectionString= "Driver={PostgreSQL Unicode(x64)};Server=$dbServer;Port=5432;Database=$dbName;Uid=$dbUser;Pwd=$dbPass;" $cmd = new-object System.Data.Odbc.OdbcCommand($query,$conn) $conn.open() Try { $cmd.ExecuteNonQuery() } Catch { Throw "REQUÊTE ERRONÉE: $query" Write-Host "REQUÊTE ERRONÉE: $query" } $conn.close() } #------------------------------------------------------------------------------------------ ##Création de la Table 'xxx' $NomTable = 'HPSM' $CreationTableSCCM=@" CREATE TABLE "HPSM" ( "PosteID" TEXT, "UtilisateurID" TEXT, "Materieltype" TEXT, "Modele" TEXT, "Lieu" TEXT, "Emplacement" TEXT, "CentredeCout" TEXT, "Statut" TEXT, "Commentaire" TEXT, "Etat" TEXT ) ; "@ if (!(Get-ODBCData -query "SELECT relname FROM pg_class WHERE relname='$NomTable'")) { # Création de la nouvelle table try { $output = Set-ODBCData -query $CreationTableSCCM } catch { Write-Host -ForegroundColor Red "ERROR! $($_.Exception)" } } ##### ALIMENTATION DE LA BD ##### # Requête pour obtenir les colonnes de la table $query = "SELECT * FROM information_schema.columns WHERE table_schema = 'public' AND table_name = '$NomTable';" $columns = Get-ODBCData -query $query # Déversement des noms de colonnes dans un tableau $props = $columns.column_name #CHECK ET ALIMENTE #----------Source des données----------- #La Capture (importation des données Excel) #Emplacement du dépot de fichier $Depot="\\adprod\donnees\DepoTransfert\FrédéricCôté" #"C:\Users\U0793\Documents\Projets\W10\Pilote_Profil\2018-03-28" #Cible: "\\adprod\donnees\DepoTransfert\FrédéricCôté" $InvHPSM=(Get-ChildItem $Depot\Inventaire*.csv).FullName | sort LastWriteTime | select -last 1 #"Numéro de code barre","Nom réseau","Type de composante","Lieu","Centre de coût","Emplacement physique","Commentaires","Modèle","État","Client","Système d'exploitation" #----------Traitement des données-------- $LesW = Import-Csv -Path $InvHPSM -Delimiter "`t" -Header "PosteID","Nom réseau","Materieltype","Lieu","CentredeCout","Emplacement","Commentaire","Modele","Statut","UtilisateurID","OS" | select "PosteID","UtilisateurID","Materieltype","Modele","Lieu","Emplacement","CentredeCout","Statut","Commentaire" Foreach ($item in $LesW) { $dbQuery = $Null # Vérification si la valeure n'existe pas déjà $exists = Get-ODBCData -query "SELECT * from `"$NomTable`" WHERE `"PosteID`" LIKE '$($item.PosteID)' AND `"UtilisateurID`" LIKE '$($item.UtilisateurID)';" If ($exists) { # Si c'est identique $identical = $true $diffProps = @() # Va à l'intérieur de chaque valeur des propriétés et les compare Foreach ($prop in $($exists |gm -MemberType Properties |select -ExpandProperty Name)) { # Si cet item et l'entrée existante ne sont pas identiques If (($item.$prop | Select -First 1) -notlike $exists.$prop) { $identical = $false $diffProps += $prop } } # Si les valeurs ne sont pas identiques, on doit mettre à jour If (!$identical) { #Update ces valeurs Write-Host -ForegroundColor Magenta "[$temps] Cet item existe déjà, cependant les propriétés sont différentes. On doit mettre à jour ces valeurs pour la table $NomTable à la ligne contenant le Poste: $($item.PosteID) La différence est au niveau: $diffProps" $dbQuery = "UPDATE `"$NomTable`" SET " Foreach ($diffProp in $diffProps) { If ($item.$diffProp -match "'") { Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un `"'`" : $($item.$diffProp)" $dbQuery += "`"$diffProp`" = '"+$($item.$diffProp).Replace("'","°")+"'," } ElseIf ($item.$diffProp -like "") { Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un champs vide du compte : $($item.PosteID) sur la propriété: $diffProp)" $dbQuery += "`"$diffProp`" = NULL," } Else { $dbQuery += "`"$diffProp`" = '$($item.$diffProp)'," } } #$dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1) + " WHERE `"Poste`" LIKE '$($item.Poste)' AND `"Logiciel`" LIKE '$($item.Logiciel)';" $dbQuery = $dbQuery + "`"Etat`" = 'MAJ' WHERE `"PosteID`" LIKE '$($item.PosteID)' AND `"UtilisateurID`" LIKE '$($item.UtilisateurID)';" } } # Si les valeurs n'existe pas dans la base de données, alors on l'ajoute... Else { # Préparation de la requête de démarrage pour insérer les valeurs dans la table avec les bonnes propriétés/colonnes $dbQuery = "INSERT INTO public.`"$NomTable`" (`"$($props -join '", "')`") VALUES ('" # Passe à travers chacune des propriétés et ajoute la valeur correspondante Foreach ($property in $props) { If ($item.$property -match "'") { Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un `"'`" : $($item.$property)" $dbQuery += $($item.$property).Replace("'","°")+"', '" } ElseIf ($item.$property -like "") { Write-Host -ForegroundColor Green "[$temps] Ooops, on retrouve un champs vide du compte : $($item.PosteID) sur la propriété: $property" $dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 1) $dbQuery += "NULL, '" } Else { $dbQuery += [string]$($item.$property)+"', '" } } # Finalisation de la requête $dbQuery = $dbQuery.Substring(0,$dbQuery.Length - 3) $dbQuery = $dbQuery + ");" } #Exécution de la requête If ($dbQuery) { $output = Set-ODBCData -query $dbQuery } }