Question Intégration données SQL

Plus d'informations
il y a 1 mois 3 semaines #34304 par Dead
Intégration données SQL a été créé par Dead
Bonjour à tous, 

J'ai besoin de votre aide pour solutionner deux soucis. J'ai fait un script qui récupère des fichiers, les transcodent et doit ajouter des données prises dans une base Oracle SQL.
Voici le script en question (j'ai modifié certains champs pour ne pas divulguer d'informations confidentielles, évidemment ;) ).

Le voici:




# Spécifier le chemin du répertoire contenant les fichiers XML
$repertoire = @(
    "E:\Conteneur\Biens_22\",
    "E:\Conteneur\Biens_29\",
    "E:\Conteneur\Biens_35\",
    "E:\Conteneur\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 "Balise supprimée : $($node.OuterXml)"
            }
        }
    } else {
        Write-Host "Aucune balise à supprimer trouvée dans : $($fichier.FullName)"
    }
    # Initialiser une variable pour savoir si le fichier nécessite un e-mail
    $sendEmail = $false

    # Parcourir chaque élément <bien> dans le fichier XML
    foreach ($bien in $xmlContent.SelectNodes('//biens/bien')) {
        # Etape 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

        # Etape 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

        # Etape 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

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

        # Vérifier si le nœud 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 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.') {
                $adresseMailLogNode.InnerText = 'Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.'
            }
        }


        # Si nous sommes ici, c'est qu'il y a au moins un bien à transcoder
        $sendEmail = $true
    }
        # Enregistrez le nouveau fichier XML dans le dossier de destination
        $destinationFolder = switch -wildcard ($bienDpt) {
        22 { "E:\DepartFichiers\22" }
        29 { "E:\DepartFichiers\29" }
        35 { "E:\DepartFichiers\35" }
        56 { "E:\DepartFichiers\56" }
        default { "E:\Autre" }
    }

    $destinationPath = Join-Path -Path $destinationFolder -ChildPath ($fichier.BaseName + "_modifie.xml")
    $xmlContent.Save($destinationPath)




    # 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 = "Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser."
        $subject = "Transcodage - Fichiers"
        $body = "Le fichier XML $($fichier.Name) a été transcodé avec succès et enregistré dans le dossier $destinationFolder."

        # Adresses e-mail pour l'envoi de l'e-mail
        $smtpTo = "Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser.", "Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser."

        # Nom d'utilisateur et mot de passe pour l'authentification SMTP
        $smtpUsername = "Cette adresse e-mail est protégée contre les robots spammeurs. Vous devez activer le JavaScript pour la visualiser."
        $smtpPassword = ConvertTo-SecureString -String "passW0rd!*" -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 -BodyEncoding ([System.Text.Encoding]::UTF8)
    }
}

    

# Débloquer la DLL
Unblock-File -Path "C:\oracle\product\19.0.0\client_1\ODP.NET\managed\common\Oracle.ManagedDataAccess.dll"

# 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 : $_"
}

# Spécifier les informations de connexion à la base de données Oracle
$oracleHost = "srvsql"
$oraclePort = "1521"
$oracleSID = "SID"
$oracleUser = "USER"
$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)

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

    # Étape 1 : Enrichir le fichier de bien avec des données récupérées dans la base Ulis
    # 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()

    if ($dataReader.Read()) {
        $typeConvention = $dataReader["type_convention"]
        $DT_MLO = $dataReader["DT_MLO"]

        # Charger le fichier XML (supposons que $xmlContent contient déjà le contenu XML)
   $xmlContent = [xml](Get-Content -Path $fichier.FullName -Raw)

        # Ajouter les données dans le fichier XML
        $bienConventionNode = $xmlContent.CreateElement("bien-convention")
        $bienConventionNode.InnerText = $typeConvention
        $xmlContent.SelectSingleNode('//bien-finan-actuel').AppendChild($bienConventionNode)

        if ($DT_MLO -ne [System.DBNull]::Value) {
            $bienDatMesNode = $xmlContent.CreateElement("bien-datmes")
            $bienDatMesNode.InnerText = $DT_MLO
            $xmlContent.SelectSingleNode('//bien-date-premloc').AppendChild($bienDatMesNode)
        }
    }
    $dataReader.Close()
} 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()
    }
}

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




Ma problématique: dans le fichier modifié, les balises qui doivent être supprimées ne le sont pas ( # 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')

De plus, les données sql ne sont pas ajoutées au fichier modifié.

Auriez vous une idée comment ajuster ce script pour résoudre ces soucis? 

Je vous remercie!

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

Plus d'informations
il y a 1 mois 3 semaines #34306 par Fabien
Réponse de Fabien sur le sujet Intégration données SQL
Bonjour Dead,

Pour ta problématique, il faut enregistrer au fur et à mesure tes modifications des fichiers XML.
Dans ta première boucle Foreach pour supprimer des noeuds, rajoute ceci :
# 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
                $destinationPath = Join-Path -Path "E:\Nouveau dossier" -ChildPath ($fichier.BaseName + "_modifie.xml")
                $xmlContent.Save($destinationPath)
                Write-Host "Balise supprimée : $($node.OuterXml)"
            }
        }
    } else {
        Write-Host "Aucune balise à supprimer trouvée dans : $($fichier.FullName)"
    }

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

  • ericlm128
  • Visiteur
  • Visiteur
il y a 1 mois 3 semaines #34307 par ericlm128
Réponse de ericlm128 sur le sujet Intégration données SQL

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

Plus d'informations
il y a 1 mois 3 semaines #34311 par Dead
Réponse de Dead sur le sujet Intégration données SQL
Bonjour ericlm128,

Oui, j'ai mis dans ce post la configuration qui m'a permit de corriger.

Concernant ce post-ci, c'est ok pour les balises.

Reste à voir comment importer les données de la requête dans le fichier modifié par le script. Pour que le type convention match bien avec le code du bien. Je ne vois pas comment faire.

Je vous remercie

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

Plus d'informations
il y a 1 mois 3 semaines #34314 par Fabien
Réponse de Fabien sur le sujet Intégration données SQL
Bonjour Dead,

La problématique reste la même, tu n'enregistres pas ton fichier XML sur le disque dans la partie BDD.
Cependant, je ne comprends pas trop dans quel(s) fichier(s) XML tu veux ajouter les données SQL ?

Fabien

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

Plus d'informations
il y a 1 mois 3 semaines #34315 par Dead
Réponse de Dead sur le sujet Intégration données SQL
Bonjour Fabien,

Alors, pour expliquer tout le projet:

Nous recevons des fichiers sur notre serveur via sftp de la part d'un prestataire.
Ces fichiers xml sont dans une certaine convention de nommage. Pour les rendre acceptables par notre logiciel, nous devons transcoder. J'ai donc fait ce script. Le script prend le fichier source, le transcode, et enregistre le tout sous forme fichier_modifié.xml

Cependant, dans ce script, je souhaite donc récupérer des données dans une table SQL, et que cette donnée soit ajoutée dans le fichier_modifié.xml
Les données doivent matcher avec le code du bien.

Je vous remercie pour votre aide!

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

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