[..] Autoit - SQL : Problème sur une requête

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
StormQT
Niveau 1
Niveau 1
Messages : 3
Enregistré le : mar. 28 juil. 2015 11:40
Status : Hors ligne

[..] Autoit - SQL : Problème sur une requête

#1

Message par StormQT »

Bonjour,

Je m'explique; mon .exe créé avec Autoit permet de mettre à jour des données dans une base Acces via des requêtes SQL, en fonction des entrées définies par l'utilisateur.

L'une de mes requêtes ne passe pas, je bloque dessus depuis un petit bout de temps, ce pourquoi je viens vers vous.

Voici une partie du code en question, la partie qui nous intéresse se trouve dans les 5 premières lignes : définition et exécution de la requête "$query_pad" sur la table "pad" ou ma connexion est déjà établie, censée remplacer les valeurs du champs "noeud" correspondant à une certaine condition.

J'ai également insérée la requête qui se déroule juste après, qui est parfaitement fonctionnelle.

Code : Tout sélectionner

            ;MAJ table pad 
            $query_pad = "UPDATE pad SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"
            $AdoRs333 = ObjCreate("ADODB.Recordset")
            $AdoRs333.ActiveConnection = $AdoCon
            $AdoRs333.Open($query_pad)

            ; Pause de 1 seconde.
            Sleep(1000)
            ProgressSet(36, "MAJ table dessin en cours")

            ;MAJ table dessin
            $query_dessin = "UPDATE dessin SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"
            $AdoRs4 = ObjCreate("ADODB.Recordset")
            $AdoRs4.ActiveConnection = $AdoCon
            $AdoRs4.Open($query_dessin)


Il se trouve que $AncienNode et $NouveauNode sont des variables entrées par l'utilisateur. Celles-ci sont strictement d'une longueur de 3 caractères numériques ou vides.

Pour les personnes désireuses de faire un test de mon application, voici les données :

Voici ma base acces : http://sendbox.fr/pro/wwu2bkf9xg86/Secteur.mdb.html

Mon code complet :

[spoiler]

Code : Tout sélectionner

[spoiler=]; ----------------------------------------------------

; -------------------- Section I --------------------

; ----------------------------------------------------

; Version AutoIt :

; Langue     :        Francais

; Plateforme :        Seven

; Auteur    :        Bastien M********I

;

; Fonction du script:

;

;

;

; Version 1.0 : 24/06/2015

;           - Première Version.

;

 

; Déclarations

; ----------------------------------------------------

; -------------------- Section III --------------------

; ----------------------------------------------------

#include <GuiConstants.au3>

#NoTrayIcon

Global $Largeur = 400, $Hauteur = 600, $Titre = "Changement d'un numéro de node Corolle", $titre1 = "aa"

Local $Ver = "V1.0"

 

; Définition de la fenètre principale

; ----------------------------------------------------

; -------------------- Section IV --------------------

; ----------------------------------------------------

#Region ### START Koda GUI section ###

 

; Fenetre principale.

$Form1 = GUICreate($Titre & $Ver, $Largeur, $Hauteur, -1, -1)

 

; Bouton OK.

$Button1a = GUICtrlCreateButton("1a) Choix base Secteur", 0, 0, 120, 50)

$Button1b = GUICtrlCreateButton("1b) Copie de la base", 120, 0, 120, 50)

GUICtrlSetState($Button1b, $GUI_DISABLE)

$Button2 = GUICtrlCreateButton("2) Connection", 0, 100, 100, 50)

GUICtrlSetState($Button2, $GUI_DISABLE)

$Label1 = GUICtrlCreateLabel("Le chemin de votre base est :", 5, 60)

$Label3 = GUICtrlCreateLabel("Etat connection", 5, 160)

 

;$Input1a = guictrlcreateinput(" ", 5, 270, 20, 20)

   ;GUICtrlSetLimit ($input1a, 1, 1)

$Input1b = guictrlcreateinput(" ", 25, 270, 20, 20)

   GUICtrlSetLimit ($input1b, 1, 1)

   GUICtrlSetState($Input1b, $GUI_DISABLE)

$Input1c = guictrlcreateinput(" ", 45, 270, 20, 20)

   GUICtrlSetLimit ($input1c, 1, 1)

   GUICtrlSetState($Input1c, $GUI_DISABLE)

$Input1d = guictrlcreateinput(" ", 65, 270, 20, 20)

   GUICtrlSetLimit ($input1d, 1, 1)

   GUICtrlSetState($Input1d, $GUI_DISABLE)

$LabelOldNode = GUICtrlCreateLabel("Ancien node", 90, 273)

 

;$Input2a = guictrlcreateinput(" ", 5, 320, 20, 20)

   ;GUICtrlSetLimit ($input1a, 1, 1)

$Input2b = guictrlcreateinput(" ", 25, 320, 20, 20)

   GUICtrlSetLimit ($input2b, 1, 1)

   GUICtrlSetState($Input2b, $GUI_DISABLE)

$Input2c = guictrlcreateinput(" ", 45, 320, 20, 20)

   GUICtrlSetLimit ($input2c, 1, 1)

   GUICtrlSetState($Input2c, $GUI_DISABLE)

$Input2d = guictrlcreateinput(" ", 65, 320, 20, 20)

   GUICtrlSetLimit ($input2d, 1, 1)

   GUICtrlSetState($Input2d, $GUI_DISABLE)

$LabelNewNode = GUICtrlCreateLabel("Nouveau node", 90, 323)

 

$Button3 = GUICtrlCreateButton("3) Num nodes", 0, 200, 100, 50)

GUICtrlSetState($Button3, $GUI_DISABLE)

$Button4 = GUICtrlCreateButton("4) Verif Num", 0, 360, 100, 50)

GUICtrlSetState($Button4, $GUI_DISABLE)

 

$Button5 = GUICtrlCreateButton("5) Remplacement Num", 0, 450, 150, 50)

GUICtrlSetState($Button5, $GUI_DISABLE)

 

GUISetState(@SW_SHOW)

 

#EndRegion ### END Koda GUI section ###

 

; Action des bouttons

; ----------------------------------------------------

; -------------------- Section V --------------------

; ----------------------------------------------------

While 1

    $nMsg = GUIGetMsg()

    Switch $nMsg

 

        Case $GUI_EVENT_CLOSE

            Fin()

 

        Case $Button1a ;choix de la base

            MsgBox(64, "Info", "Veuillez choisir la base secteur.mdb, celle dont vous voulez modifier un numéro de node !")

$Dbname = FileOpenDialog("", @DocumentsCommonDir & "\", "Secteur Corolle coax (*.mdb)", 1 + 4 )

$Label2 = GUICtrlCreateLabel($Dbname, 5, 80)

if $Dbname <> "" Then

GUICtrlSetState($Button1a, $GUI_DISABLE)

endif

if $Dbname <> "" Then

GUICtrlSetState($Button1b, $GUI_ENABLE)

endif

 

 

   Case $Button1b ;copie de la base pour securiser

            MsgBox(64, "Info", "Sauvegarde votre base de donnée datée sous C:\@-@Savebase\")

$TIME = @MDAY &"-"& @MON &"-"& @YEAR &" - "& @HOUR &"H"& @MIN &" "& @SEC &" sec"

$dest = "C:\@-@Savebase\" & $TIME & "\"

FileCopy($dbname, $dest, 8)

GUICtrlSetState($Button1b, $GUI_DISABLE)

GUICtrlSetState($Button2, $GUI_ENABLE)

 

   Case $Button2 ;connection au secteur défini

 

 $AdoCon = ObjCreate("ADODB.Connection")

$AdoCon.Open("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & $Dbname)

if @error Then

MsgBox(0, "NumNO", "Erreur lors de la connexion")

Exit

Else

MsgBox(0, "NumNO", "Connecté avec succès.")

GUICtrlSetState($Button2, $GUI_DISABLE)

GUICtrlSetState($Button3, $GUI_ENABLE)

Endif

 

   Case $Button3 ;averti l'utilisateur pour les numeros de node

MsgBox(0, "NumNO", "Veuillez remplir les deux champs suivants, par exemple pour le node 67, laissez les deux premières cases vides, mettez 6 dans la 3eme case puis 7 dans la 4eme case. Il est nécessaire de conserver l'espace dans les cases dites vides.")

GUICtrlSetState($Button3, $GUI_DISABLE)

GUICtrlSetState($Input1b, $GUI_ENABLE)

GUICtrlSetState($Input1c, $GUI_ENABLE)

GUICtrlSetState($Input1d, $GUI_ENABLE)

 

GUICtrlSetState($Input2b, $GUI_ENABLE)

GUICtrlSetState($Input2c, $GUI_ENABLE)

GUICtrlSetState($Input2d, $GUI_ENABLE)

 

GUICtrlSetState($Button4, $GUI_ENABLE)

 

   Case $Button4 ;Teste les numéros que l'utilisateur a donné

GUICtrlSetState($Input1b, $GUI_DISABLE)

GUICtrlSetState($Input1c, $GUI_DISABLE)

GUICtrlSetState($Input1d, $GUI_DISABLE)

 

GUICtrlSetState($Input2b, $GUI_DISABLE)

GUICtrlSetState($Input2c, $GUI_DISABLE)

GUICtrlSetState($Input2d, $GUI_DISABLE)

  $AncienNode = GUICtrlRead($Input1b) & GUICtrlRead($Input1c) & GUICtrlRead($Input1d)

  $NouveauNode = GUICtrlRead($Input2b) & GUICtrlRead($Input2c) & GUICtrlRead($Input2d)

 

msgbox(64, "NumNO", "Teste si le numéro |" & $AncienNode & "| est présent dans la base selectionnée.")

$query_AncienNode= "SELECT noeud FROM noeuds WHERE noeud = '" & $AncienNode & "' AND REF_MAT = '1918'"

$query_NouveauNode= "SELECT noeud FROM noeuds WHERE noeud = '" & $NouveauNode & "'"

;msgbox(64, "a", $query_AncienNode)

 

$AdoRs0 = ObjCreate("ADODB.Recordset")

$AdoRs0.ActiveConnection = $AdoCon

$AdoRs0.Open($query_AncienNode)

 

$AdoRs1 = ObjCreate("ADODB.Recordset")

$AdoRs1.ActiveConnection = $AdoCon

$AdoRs1.Open($query_NouveauNode)

$RS0 = $AdoRs0.getstring()

$RS1 = $AdoRs1.getstring()

 

;teste si l'ancien numéro de node est bien dans la base

if $RS0 <> "" then

msgbox(64, "NumNO", "Le noeud est bien existant dans la base.")

Else

GUICtrlSetState($Input1b, $GUI_ENABLE)

GUICtrlSetState($Input1c, $GUI_ENABLE)

GUICtrlSetState($Input1d, $GUI_ENABLE)

msgbox(64, "NumNO", "Il est impossible de retrouver le node dans la base. Erreur de numéro saisi?")

Endif

 

;teste si le nouveau numéro de node est disponible

if $RS0 <> "" then

msgbox(64, "NumNO", "Teste si le numéro |" & $NouveauNode & "| est libre dans la base selectionnée.")

Endif

 

if $RS1 = "" Then

msgbox(64, "NumNO", "Le numéro de noeud est bien disponible.")

Else

GUICtrlSetState($Input2b, $GUI_ENABLE)

GUICtrlSetState($Input2c, $GUI_ENABLE)

GUICtrlSetState($Input2d, $GUI_ENABLE)

msgbox(64, "NumNO", "Le numéro de noeud est déjà utilisé, action veuillez choisir un autre ou bien le rendre disponible.")

EndIf

 

if $RS0 <> "" And $RS1 = "" Then

GUICtrlSetState($Button4, $GUI_DISABLE)

GUICtrlSetState($Button5, $GUI_ENABLE)

 

 

 

;$Label5a = GUICtrlCreateLabel("Tables impactées :", 200, 450)

 ;$Label5b = GUICtrlCreateLabel("- noeuds", 200, 465)

;$Label5c = GUICtrlCreateLabel("- pad", 200, 480)

;$Label5d = GUICtrlCreateLabel("- dessin", 200, 495)

;$Label5e = GUICtrlCreateLabel("- ampli", 200, 510)

;$Label5f = GUICtrlCreateLabel("- c_n", 200, 525)

;$Label5g = GUICtrlCreateLabel("- calcniv", 200, 540)

;$Label5h = GUICtrlCreateLabel("- im2", 200, 555)

;$Label5i = GUICtrlCreateLabel("- im3", 200, 570)

;$Label5j = GUICtrlCreateLabel("- infra", 200, 585)

 

EndIf

 

 

Case $Button5 ;requetes, MAJ du numéro de noeud dans les différentes tables

GUICtrlSetState($Button5, $GUI_DISABLE)

ProgressOn("Patientez", "Merci de patienter, mise à jour.", "MAJ SQL en cours...")

 

;MAJ table noeuds noeud

$query_noeuds = "UPDATE noeuds SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs2 = ObjCreate("ADODB.Recordset")

$AdoRs2.ActiveConnection = $AdoCon

$AdoRs2.Open($query_noeuds)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(8, "MAJ table noeuds 1/3 en cours")

 

;maj noeud amont

$query_noeudsAmont = "UPDATE noeuds SET n_amont = '" & $NouveauNode & "' WHERE n_amont = '" & $AncienNode & "'"

$AdoRs20 = ObjCreate("ADODB.Recordset")

$AdoRs20.ActiveConnection = $AdoCon

$AdoRs20.Open($query_noeudsAmont)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(15, "MAJ table noeuds 2/3 en cours")

 

  ;lecture etiquette longue

  $query_noeudsL = "SELECT noeud_bis from noeuds WHERE noeud = '" & $NouveauNode & "'"

  $AdoRs21 = ObjCreate("ADODB.Recordset")

  $AdoRs21.ActiveConnection = $AdoCon

  $AdoRs21.Open($query_noeudsL)

  $noeudsL = $AdoRs21.getstring()

  ;msgbox(64, "a", $noeudsL)

  Local $noeudsL2 = StringReplace($noeudsL, $AncienNode, $Nouveaunode)

  Local $noeudsL22 = StringReplace($noeudsL2, " ", "")

  ;msgbox(64, "a", $noeudsL22)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(22, "MAJ table noeuds 3/3 en cours")

 

 ;MAJ etiquette longue (opt)

 $query_no2 = "UPDATE noeuds SET noeuds.NOEUD_BIS = '"& $noeudsL22 &"' WHERE noeud = '" & $NouveauNode & "'"

 ;msgbox(64, "a", $query_no2)

 $AdoRs11 = ObjCreate("ADODB.Recordset")

 $AdoRs11.ActiveConnection = $AdoCon

 $AdoRs11.Open($query_no2)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(30, "MAJ table pad en cours")

 

;MAJ table pad

$query_pad = "UPDATE pad SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs333 = ObjCreate("ADODB.Recordset")

$AdoRs333.ActiveConnection = $AdoCon

$AdoRs333.Open($query_pad)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(36, "MAJ table dessin en cours")

 

;MAJ table dessin

$query_dessin = "UPDATE dessin SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs4 = ObjCreate("ADODB.Recordset")

$AdoRs4.ActiveConnection = $AdoCon

$AdoRs4.Open($query_dessin)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(42, "MAJ table ampli 1/2 en cours")

 

;MAJ table ampli

$query_ampli = "UPDATE ampli SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs5 = ObjCreate("ADODB.Recordset")

$AdoRs5.ActiveConnection = $AdoCon

$AdoRs5.Open($query_ampli)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(50, "MAJ table ampli 2/2 en cours")

 

 ;MAJ table ampli

$query_ampliINJ = "UPDATE ampli SET INJECT_A = '" & $NouveauNode & "' WHERE INJECT_A = '" & $AncienNode & "'"

$AdoRs50 = ObjCreate("ADODB.Recordset")

$AdoRs50.ActiveConnection = $AdoCon

$AdoRs50.Open($query_ampliINJ)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(59, "MAJ table c_n en cours")

 

;MAJ table c_n

$query_c_n = "UPDATE c_n SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs6 = ObjCreate("ADODB.Recordset")

$AdoRs6.ActiveConnection = $AdoCon

$AdoRs6.Open($query_c_n)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(67, "MAJ table calcniv en cours")

 

;MAJ table calcniv

$query_calcniv = "UPDATE calcniv SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs7 = ObjCreate("ADODB.Recordset")

$AdoRs7.ActiveConnection = $AdoCon

$AdoRs7.Open($query_calcniv)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(75, "MAJ table im2 en cours")

 

;MAJ table im2

$query_im2 = "UPDATE im2 SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs8 = ObjCreate("ADODB.Recordset")

$AdoRs8.ActiveConnection = $AdoCon

$AdoRs8.Open($query_im2)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(86, "MAJ table im3 en cours")

 

;MAJ table im3

$query_im3 = "UPDATE im3 SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs9 = ObjCreate("ADODB.Recordset")

$AdoRs9.ActiveConnection = $AdoCon

$AdoRs9.Open($query_im3)

 

; Pause de 1 seconde.

Sleep(1000)

ProgressSet(95, "MAJ table dessin en cours")

 

;MAJ table infra

$query_infra = "UPDATE infra SET noeud = '" & $NouveauNode & "' WHERE noeud = '" & $AncienNode & "'"

$AdoRs10 = ObjCreate("ADODB.Recordset")

$AdoRs10.ActiveConnection = $AdoCon

$AdoRs10.Open($query_infra)

 

ProgressSet(100, "Mise à jour terminée!")

Sleep(1000)

ProgressOff()

 

    EndSwitch

 

 

 

WEnd

 

; Fermeture du programme avec un spalsh

; ----------------------------------------------------

; -------------------- Section VI --------------------

; ----------------------------------------------------

#Region ################### Fonctions ###################

Func Fin()

    ; Lancement du splash screen.

    SplashTextOn("", "Fermeture du programme en cours,  Veuillez patienter ...", 450, 70, -1, -1, 0 + 1 + 16 + 32, "Times New Roman", 12, 800)

 

    ; Pause de 1.5 secondes.

    Sleep(1500)

 

    ; Fermeture du splash.

    SplashOff()

 

    Exit

EndFunc   ;==>Fin

#EndRegion ################### Fonctions ###################[/spoiler]
:
[/spoiler]

Ouvrez la base jointe avec ce code, essayez de rentre "277" en ancien node, et "808" en nouveau node.

Ensuite, regardez comment les tables "pad" et "dessin " se sont comportées.

PS : j'ai retiré les tables inutiles pour que vous testiez.



Merci par avance.
Avatar du membre
TopXm
Niveau 6
Niveau 6
Messages : 260
Enregistré le : mer. 25 mai 2011 16:37
Localisation : Usa
Status : Hors ligne

Re: [..] Autoit - SQL : Problème sur une requête

#2

Message par TopXm »

Salut,

Tu n'aurais pas des index sur tes champs ?
StormQT
Niveau 1
Niveau 1
Messages : 3
Enregistré le : mar. 28 juil. 2015 11:40
Status : Hors ligne

Re: [..] Autoit - SQL : Problème sur une requête

#3

Message par StormQT »

Bonjour,

Merci pour la réponse. Voici ce que j'ai sur les index de ma table "pad"; voir pièce jointe.
Ma connaissance sur Acces reste assez limité, après recherches sur ces fameux index, rien ne me choque..

La structure n'a pas l'air de beaucoup différer des autres tables, ou les requêtes passent correctement.
Fichiers joints
Capture-DB.PNG
Répondre