Question Intégration données SQL

Plus d'informations
il y a 4 mois 3 jours #34376 par Dead
Réponse de Dead sur le sujet Intégration données SQL
Fabien,

Oui effectivement, il y a plusieurs biens, parfois une centaine, dans chaque fichiers xml. 

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 mois 3 jours #34378 par Dead
Réponse de Dead sur le sujet Intégration données SQL
Je pense qu'un truc du genre pourrait répondre, qu'en pensez vous?

Étape 1 : Enrichir le fichier de bien avec des données récupérées dans la base
# Exécuter la requête SQL pour obtenir les données
$commandText = "SELECT code_ulis, type_convention, DT_MLO FROM salf_vue_patrimoine2 "
$command = New-Object Oracle.ManagedDataAccess.Client.OracleCommand($commandText, $conn)
$dataReader = $command.ExecuteReader()

$dataTable = New-Object System.Data.DataTable
$dataTable.Load($dataReader)

# Parcourir chaque élément <bien> dans le fichier XML
foreach ($bien in $xmlContent.SelectNodes('//biens/bien')) {
$bienCode = $bien.SelectSingleNode('bien-identification/bien-code').InnerText
$programmeCode = $bien.SelectSingleNode('bien-identification/bien-programme').InnerText

# Chercher la ligne correspondante dans le DataTable
$dataRow = $dataTable.Select("code_ulis = '$bienCode' AND programme_code = '$programmeCode'")
if ($dataRow.Count -gt 0) {
$typeConvention = $dataRow[0]["type_convention"]
$DT_MLO = $dataRow[0]["DT_MLO"]

# Ajouter les données dans le fichier XML
if ($typeConvention -ne [System.DBNull]::Value) {
$bienConventionNode = $xmlContent.CreateElement("bien-convention")
$bienConventionNode.InnerText = $typeConvention
$bienFinanOrigineNode = $bien.SelectSingleNode('//bien-finan-origine')
if ($bienFinanOrigineNode -ne $null) {
$bienFinanOrigineNode.ParentNode.InsertAfter($bienConventionNode, $bienFinanOrigineNode)
} else {
$bienFinanActuelNode = $bien.SelectSingleNode('//bien-finan-actuel')
$bienFinanActuelNode.ParentNode.InsertAfter($bienConventionNode, $bienFinanActuelNode)
}
}

if ($DT_MLO -ne [System.DBNull]::Value) {
$bienDatMesNode = $xmlContent.CreateElement("bien-datmes")
$bienDatMesNode.InnerText = $DT_MLO
$bienDatePremlocNode = $bien.SelectSingleNode('//bien-date-premloc')
$bienDatePremlocNode.ParentNode.InsertAfter($bienDatMesNode, $bienDatePremlocNode)
}
}
}

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 mois 2 jours #34379 par Arnaud Petitjean
Réponse de Arnaud Petitjean sur le sujet Intégration données SQL
Bonjour, 

@Dead, lorsque tu postes du code, peux-tu le mettre dans une balise "[code]" pour qu'il soit plus lisible ?

Merci

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 mois 2 jours #34381 par Fabien
Réponse de Fabien sur le sujet Intégration données SQL
Bonjour Dead,

Voici un exemple de code pour rechercher l'emplacement et ajouter un élément après cet emplacement :
# Charger le contenu du fichier XML
$xmlContent = [xml](Get-Content -Path "C:\Temp\Logs.xml")

# Ajouter les données dans le fichier XML
#Création de l'élément
$bienConventionNode = $xmlContent.CreateElement("bien-convention")
#Ajout du texte dans l'élément
$bienConventionNode.InnerText = 'Bla-bla'

#Sélectionner l'emplacement cible pour l'ajout
$cible = $xmlContent.SelectsingleNode("//bien-identification[bien-code='01.00.0001']/..//bien-finan-origine")

#Insertion de l'élément après la cible
$cible.ParentNode.InsertAfter($bienConventionNode,$cible)

#Sauvegarde du fichier
$xmlContent.Save("C:\Users\fdauvergne\Desktop\Test\Nouveau dossier\file.xml")

Il te reste à adapter avec ton environnement 

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 mois 2 jours - il y a 4 mois 2 jours #34382 par Dead
Réponse de Dead sur le sujet Intégration données SQL
Bonjour, 
Je vous remets mon script complet légèrement modifié. 
Tout fonctionne, si ce n'est la partir d'ajout des données SQL. 
Cela n'ajoute pas les balises dans le fichier, et je n'ai donc pas les données. Lorsque je lance le script, j'ai cela:
Aucune ligne trouvée pour le code ULIS : 01.00.0018
Aucune ligne trouvée pour le code ULIS : 01.00.0018
Aucune ligne trouvée pour le code ULIS : 01.00.0019
Aucune ligne trouvée pour le code ULIS : 01.00.0019
Aucune ligne trouvée pour le code ULIS : 01.00.0019
Aucune ligne trouvée pour le code ULIS : 01.00.0020
Aucune ligne trouvée pour le code ULIS : 01.00.0020
Aucune ligne trouvée pour le code ULIS : 01.00.0020
Aucune ligne trouvée pour le code ULIS : 01.00.0021
Aucune ligne trouvée pour le code ULIS : 01.00.0021
Aucune ligne trouvée pour le code ULIS : 01.00.0022
Aucune ligne trouvée pour le code ULIS : 01.00.0023
Aucune ligne trouvée pour le code ULIS : 01.00.0024
Aucune ligne trouvée pour le code ULIS : 01.00.0025
Aucune ligne trouvée pour le code ULIS : 01.00.0026
Aucune ligne trouvée pour le code ULIS : 01.00.0027
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0001
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0002
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0003
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0004
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0005
Aucune ligne trouvée pour le code ULIS : 02.00.0006
Aucune ligne trouvée pour le code ULIS : 02.00.0006
Aucune ligne trouvée pour le code ULIS : 02.00.0006
Aucune ligne trouvée pour le code ULIS : 02.00.0006
Aucune ligne trouvée pour le code ULIS : 02.00.0006
Aucune ligne trouvée pour le code ULIS : 02.00.0006
Aucune ligne trouvée pour le code ULIS : 02.00.0007
Aucune ligne trouvée pour le code ULIS : 02.00.0007
Aucune ligne trouvée pour le code ULIS : 02.00.0007
Aucune ligne trouvée pour le code ULIS : 02.00.0007
Aucune ligne trouvée pour le code ULIS : 02.00.0008
Aucune ligne trouvée pour le code ULIS : 02.00.0008
Aucune ligne trouvée pour le code ULIS : 02.00.0008
Aucune ligne trouvée pour le code ULIS : 02.00.0008
Aucune ligne trouvée pour le code ULIS : 02.00.0009
Aucune ligne trouvée pour le code ULIS : 02.00.0009
Aucune ligne trouvée pour le code ULIS : 02.00.0009
Aucune ligne trouvée pour le code ULIS : 02.00.0009
Aucune ligne trouvée pour le code ULIS : 02.00.0010
Aucune ligne trouvée pour le code ULIS : 02.00.0010
Aucune ligne trouvée pour le code ULIS : 02.00.0010
Aucune ligne trouvée pour le code ULIS : 02.00.0010
Aucune ligne trouvée pour le code ULIS : 02.00.0011
Aucune ligne trouvée pour le code ULIS : 02.00.0011
Aucune ligne trouvée pour le code ULIS : 02.00.0011
Aucune ligne trouvée pour le code ULIS : 02.00.0012
Aucune ligne trouvée pour le code ULIS : 02.00.0012
Aucune ligne trouvée pour le code ULIS : 03.00.0001
Aucune ligne trouvée pour le code ULIS : 03.00.0001
Aucune ligne trouvée pour le code ULIS : 03.00.0001
Aucune ligne trouvée pour le code ULIS : 03.00.0002
Aucune ligne trouvée pour le code ULIS : 03.00.0002
Aucune ligne trouvée pour le code ULIS : 03.00.0002
Aucune ligne trouvée pour le code ULIS : 03.00.0003
Aucune ligne trouvée pour le code ULIS : 03.00.0003
Aucune ligne trouvée pour le code ULIS : 03.00.0003
Aucune ligne trouvée pour le code ULIS : 03.00.0004
Aucune ligne trouvée pour le code ULIS : 03.00.0004
Aucune ligne trouvée pour le code ULIS : 03.00.0004
Aucune ligne trouvée pour le code ULIS : 03.00.0005
Aucune ligne trouvée pour le code ULIS : 03.00.0006
Aucune ligne trouvée pour le code ULIS : 03.00.0007
Aucune ligne trouvée pour le code ULIS : 03.00.0008
Aucune ligne trouvée pour le code ULIS : 04.00.0001
Aucune ligne trouvée pour le code ULIS : 04.00.0002
Aucune ligne trouvée pour le code ULIS : 04.00.0003
Aucune ligne trouvée pour le code ULIS : 04.00.0004

GAC    Version        Location                                                                                               
---    -------        --------                                                                                               
False  v4.0.30319     C:\oracle\product\19.0.0\client_1\ODP.NET\managed\common\Oracle.ManagedDataAccess.dll                  
DLL chargée avec succès.


Pourtant les données sont bien présentes dans la table Oracle. 


# Spécifier le chemin du répertoire contenant les fichiers XML
$repertoire = @(
    "E:\Biens_22\",
    "E:\Biens_29\",
    "E:\Biens_35\",
    "E:\Biens_56\"
)

# Obtenir la liste de tous les fichiers XML dans le répertoire et ses sous-répertoires
$fichiersXML = Get-ChildItem -Path $repertoire -Filter *.xml -Recurse

foreach ($fichier in $fichiersXML) {
    # Charger le contenu du fichier XML
    $xmlContent = [xml](Get-Content -Path $fichier.FullName -Raw)

    # Supprimer les lignes contenant les balises spécifiées
    $nodesToRemove = $xmlContent.SelectNodes('//bien-eau-chaude-charge | //bien-eau-froide-charge | //bien-chauffage-charge | //bien-ascenseur-charge')
    if ($nodesToRemove -ne $null) {
        foreach ($node in $nodesToRemove) {
            $parent = $node.ParentNode
            if ($parent -ne $null) {
                $parent.RemoveChild($node) | Out-Null
                Write-Host "Balises supprimées : $($node.OuterXml)"
            }
        }
    } else {
        Write-Host "Aucune balise à supprimer trouvée dans : $($fichier.FullName)"
    }

    # Spécifier les informations de connexion à la base de données Oracle
    $oracleHost = "srvsql"
    $oraclePort = "1521"
    $oracleSID = "User"
    $oracleUser = "Ouser"
    $oraclePwd = "password"

    # Créer une chaîne de connexion à la base de données Oracle
    $oracleConnectionString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=$oracleHost)(PORT=$oraclePort))(CONNECT_DATA=(SERVICE_NAME=$oracleSID)));User Id=$oracleUser;Password=$oraclePwd;"

    # Créer une nouvelle connexion Oracle
    $conn = New-Object Oracle.ManagedDataAccess.Client.OracleConnection($oracleConnectionString)

    $dataTable = New-Object System.Data.DataTable # Initialiser le DataTable

    try {
        # Ouvrir la connexion
        $conn.Open()
        Write-Output "Connexion réussie"

        # Exécuter la requête SQL pour obtenir les données
        $commandText = "SELECT code_ulis, type_convention, DT_MLO FROM salf_vue_patrimoine2 where code_nature in ('MA','APPT')"
        $command = New-Object Oracle.ManagedDataAccess.Client.OracleCommand($commandText, $conn)
        $dataReader = $command.ExecuteReader()
        
        # Stocker les résultats dans une DataTable pour une recherche facile
        $dataTable.Load($dataReader)
        $dataReader.Close()
        Write-Output "Données récupérées avec succès"
    } catch {
        Write-Output "Erreur lors de la connexion ou de l'exécution de la requête : $_"
    } finally {
        # Fermer la connexion
        if ($conn.State -eq [System.Data.ConnectionState]::Open) {
            $conn.Close()
        }
    }
    
    # Initialiser une variable pour savoir si le fichier nécessite un e-mail
    $sendEmail = $false
    
[color=#d35400]# Parcourir chaque élément <bien> dans le fichier XML
foreach ($bien in $xmlContent.SelectNodes('//biens/bien')) {
    $bienCode = $bien.SelectSingleNode('bien-identification/bien-code').InnerText
    $programmeCode = $bien.SelectSingleNode('bien-identification/bien-programme').InnerText

    # Vérifier que $dataTable n'est pas null avant de l'utiliser
    if ($dataTable -ne $null) {
        # Chercher la ligne correspondante dans le DataTable
        $dataRow = $dataTable.Select("code_ulis = '$bienCode'")

        if ($dataRow.Count -gt 0) {
            $typeConvention = $dataRow[0]["type_convention"]
            $DT_MLO = $dataRow[0]["DT_MLO"]

            # Créer et ajouter la balise <bien-convention> si nécessaire
            if ($typeConvention -eq "AL" -or $typeConvention -eq "APL") {
                $bienConventionNode = $xmlContent.CreateElement("bien-convention")
                $bienConventionNode.InnerText = $typeConvention
                $bien.AppendChild($bienConventionNode)
            }

            # Créer et ajouter la balise <bien-datmes> si la date est renseignée
            if ($DT_MLO -ne [System.DBNull]::Value) {
                $bienDatMesNode = $xmlContent.CreateElement("bien-datmes")
                $bienDatMesNode.InnerText = $DT_MLO
                $bien.AppendChild($bienDatMesNode)
            }
        } else {
            Write-Output "Aucune ligne trouvée pour le code ULIS : $bienCode"
        }
    } else {
        Write-Output "Le DataTable est null"
    }
}[/color]

        # Étape 1 : Transcoder le code du programme
        $bienDpt = $bien.SelectSingleNode('bien-identification/bien-dpt').InnerText
        $programmeCode = $bien.SelectSingleNode('bien-identification/bien-programme').InnerText
        $newProgrammeCode = switch -exact ($bienDpt) {
            22 { "12" + $programmeCode }
            29 { "19" + $programmeCode }
            35 { "13" + $programmeCode }
            56 { "15" + $programmeCode }
            default { $programmeCode }
        }
        $bien.SelectSingleNode('bien-identification/bien-programme').InnerText = $newProgrammeCode

        # Étape 2 : Transcoder le code du bien
        $bienCode = $bien.SelectSingleNode('bien-identification/bien-code').InnerText
        $newBienCode = $bienCode -replace '\..*\.', ''
        $bien.SelectSingleNode('bien-identification/bien-code').InnerText = $newBienCode

        # Étape 3 : Transcoder le code de l'agence de gestion
        $prgUgeCode = $bien.SelectSingleNode('prog-infos/prg-uge-code').InnerText
        $newPrgUgeCode = switch -wildcard ($bienDpt) {
            22 {
                switch ($prgUgeCode) {
                    'AG122' { '1' }
                    default { $prgUgeCode }
                }
            }
            29 {
                switch ($prgUgeCode) {
                    'AG129' { '1' }
                    default { $prgUgeCode }
                }
            }
            35 {
                switch ($prgUgeCode) {
                    'AG135' { '013' }
                    default { $prgUgeCode }
                }
            }
            56 {
                switch ($prgUgeCode) {
                    'AG135' { '001' }
                    default { $prgUgeCode }
                }
            }
            default { $prgUgeCode }
        }
        $bien.SelectSingleNode('prog-infos/prg-uge-code').InnerText = $newPrgUgeCode

        # Étape 4 : Transcoder l'adresse mail de compte rendu
        $adresseMailLogNode = $bien.SelectSingleNode('adr-mail-log')

        # Vérifier si le noeud existe avant de tenter de modifier sa propriété
        if ($adresseMailLogNode -ne $null) {
            $currentAdresseMailLog = $adresseMailLogNode.InnerText

            # Vérifier si le contenu actuel correspond à l'ancienne adresse mail
            if ($currentAdresseMailLog -eq 'user.mail@gmail.com') {
                $adresseMailLogNode.InnerText = 'groupe_mail@gmail.com'
            }
        }

        # Si nous sommes ici, c'est qu'il y a au moins un bien à transcoder
        $sendEmail = $true
    }

    # Enregistrez les modifications après le transcodage
    $destinationPath = Join-Path -Path "E:\Nouveau dossier" -ChildPath ($fichier.BaseName + "_modifie.xml")
    $xmlContent.Save($destinationPath)


    # Charger l'assembly Oracle.ManagedDataAccess.Client avec gestion des exceptions
try {
    [System.Reflection.Assembly]::LoadFrom("C:\oracle\product\19.0.0\client_1\ODP.NET\managed\common\Oracle.ManagedDataAccess.dll")
    Write-Output "DLL chargée avec succès."
} catch {
    Write-Output "Erreur lors du chargement de la DLL : $_"
}

    # Vérifier s'il faut envoyer un e-mail et si le fichier transcodé existe
    if ($sendEmail -and (Test-Path $destinationPath)) {
        # Envoyer un e-mail
        $smtpServer = "smtp.office365.com"
        $smtpPort = 587
        $smtpFrom = "groupe_mail@outlook.com"
        $subject = "Transcodage ULIS"
        $body = "Le fichier XML $($fichier.Name) a été transcodé avec succès et enregistré dans le dossier $destinationPath."

        # Adresses e-mail pour l'envoi de l'e-mail
        $smtpTo = "informatique@gmail.com", "compta@gmail.com"

        # Nom d'utilisateur et mot de passe pour l'authentification SMTP
        $smtpUsername = "groupe_mail@gmail.com"
        $smtpPassword = ConvertTo-SecureString -String "password" -AsPlainText -Force

        # Créer un objet de crédential
        $smtpCredential = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $smtpUsername, $smtpPassword
      
        # Envoi du mail
        Send-MailMessage -SmtpServer $smtpServer -Port $smtpPort -UseSsl -From $smtpFrom -To $smtpTo -Subject $subject -Body $body -Credential $smtpCredential -Encoding utf8
    }

    # Supprimer le fichier source
    Remove-Item -Path $fichier.FullName -Force



Je vous remercie pour votre aide. Là je commence à tourner en rond...

Bonne journée
Dernière édition: il y a 4 mois 2 jours par Dead.

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 4 mois 2 jours - il y a 4 mois 2 jours #34383 par Fabien
Réponse de Fabien sur le sujet Intégration données SQL
Quelles sont les données contenues dans la variable $DataTable ?

Essaye d'afficher la variable $dataRow, je pense qu'elle est vide.
Dernière édition: il y a 4 mois 2 jours par Fabien.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.128 secondes
Propulsé par Kunena