Page 2 sur 3
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 15:01
par BeCool
Je pense qu'effectivement un tuto bien claire serrait la bienvenue.
Je ne comprend pas. Je n'ai pas la fonction ADO_Open ().
J'ai fais plusieurs test mais qui ne mènent a rien. Impossible de lancer mon script.au3.
Et au passage, ma bdd a une extension en .accdb. Peut être que ca peut changer quelque chose ?
P.S: Dans mon script je n'ai mis que ces 2 lignes :
Code : Tout sélectionner
Global $bdd= "c:\trombidb.accdb"
Global $oConn = ADO_Open($bdd)
Il n'y a pas d'include ou autre a mettre ?
Edit : Après avoir lu votre message, je comprend un tout petit peu mieux comment lire une bdd. Mais vraiment très légèrement.
Je comprend aussi maintenant pourquoi je ne pouvais pas lire ma BDD juste avec les 2 lignes du dessus
En revanche, pour ce qui est de l'extension de ma BDD, ça me dit "Format de base de données ('C:\trombidb.accdb') non reconnu." Avec une petite phrase juste au dessus "We intercepted a COM Error !"
Edit 2 : Je viens de changer l'extension de la BDD en .mdb et ca ne change rien, toujours le même message qui dit que le format de la base de donnée n'est pas reconnu.
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 15:10
par GaRydelaMer
J'ai pas Access 2007. A voir avec si tu peux pas créer la base au format Access 2000/2003 ?
Edit:
La mienne en version 2000:
http://dl.free.fr/jvdTIYLX8
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 15:18
par BeCool
J'ai ouvert la BDD de 1.4 Mo en format access 2007 (.accdb) et je l'ai enregistrer sous un format 2000 (.mdb) C'est tout de suite moins gros (276 Ko) et en plus ça marche ! (Quand je lance le script, il ne m'affiche rien, donc je considère que ca marche vu qu'il n'y a pas d'erreur !
Edit : Je viens de voir votre "Edit" juste après avoir poster ce message ^^
Edit2 : Je viens de regarder votre DB, nous n'avons pas la même. Je le dis juste, histoire qu'il n'y ait pas de confusion

Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 15:24
par GaRydelaMer
Avant de compiler le script teste le dans Scite.
Tous les messages je les affiches dans la console de Scite, Commande Exécuter touche F5.
Avec els petits bout de code j'affiche la liste des tables et des infos sur les champs.
Je file je re dans 1 heure.
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 15:38
par BeCool
Je vois très bien la liste des tables, mais je ne vois pas ou ce trouvent les infos sur les champs
► Afficher le texte
Code : Tout sélectionner
>"C:\Program Files\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.exe" /run /prod /ErrorStdOut /in "C:\Documents and Settings\*******\Bureau\gné.au3" /autoit3dir "C:\Program Files\AutoIt3" /UserParams
+>15:33:51 Starting AutoIt3Wrapper v.1.10.1.13 Environment(Language:040C Keyboard:0000040C OS:WIN_XP/Service Pack 2 CPU:X86 ANSI)
>Running AU3Check (1.54.13.0) from:C:\Program Files\AutoIt3
+>15:33:51 AU3Check ended.rc:0
>Running:(3.2.12.1):C:\Program Files\AutoIt3\autoit3.exe "C:\Documents and Settings\*******\Bureau\gné.au3"
Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;Data Source=C:\trombidb.mdb;Mode=Share Deny None;Extended Properties="";Jet OLEDB:System database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don't Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
TABLE_TYPE
TABLE_GUID
DESCRIPTION
TABLE_PROPID
DATE_CREATED
DATE_MODIFIED
Table name: tb_Fonctions Table type: TABLE
Table name: tb_Personnes Table type: TABLE
Table name: tb_Services Table type: TABLE
+>15:33:52 AutoIT3.exe ended.rc:0
+>15:33:53 AutoIt3Wrapper Finished
>Exit code: 0 Time: 1.889
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 16:43
par GaRydelaMer
Juste 3 posts avant j'ai fai un Edit
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 16:54
par BeCool
Je viens de voir.
Code : Tout sélectionner
For $Field In $oRS.Fields
ConsoleWrite($Field.Name & @LF)
ConsoleWrite(" " & $Field.Type & @LF)
ConsoleWrite(" " & $Field.Value & @LF)
Next
ConsoleWrite sert a écrire, dans mon cas pour faire une recherche, ce ne serrait pas plutôt ConsoleRead qu'il faudrait que je face ?
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 17:01
par GaRydelaMer
Non j'utilise consolewrite() pour avoir une sortie lisible par 1 humain.
pour l'instant je te présente comment accéder aux différents objets contenu dans une base de données.
Une fois les principes d'accès aux données comprise, tu pourras en faire ce que tu veux. Les afficher dans une belle fenêtre, dans 1 fichier etc...
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 17:10
par GaRydelaMer
Bon maintenant on va acceder à la table tb_personnes et lire son contenu.
1 on créer un objet ADODB.RecordSet.
2 on lui donne une requête à exécuter (du SQL la plupart du temps)
3 on va lire et afficher dans la console les données de la table.
Code : Tout sélectionner
Global Const $adOpenStatic = 3
Global Const $adLockOptimistic = 3
Global $SQL = "SELECT * FROM tb_Personnes"
$oRS = ObjCreate("ADODB.Recordset")
$oRS.Open($SQL, $oConn, $adOpenStatic, $adLockOptimistic)
If $oRS.EOF Then
ConsoleWrite("Aucun enregistrement dans la table" & @LF)
Else
ConsoleWrite($oRS.RecordCount & " enregistrement dans la table" & @LF)
For $Field In $oRS.Fields
ConsoleWrite($Field.Name & @TAB)
Next
ConsoleWrite(@LF)
While Not $oRS.EOF
For $Field In $oRS.Fields
ConsoleWrite($Field.Value & @TAB)
Next
ConsoleWrite(@LF)
$oRS.MoveNext
WEnd
EndIf
$oRS.Close
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 17:19
par GaRydelaMer
Comme tu peux le voir on est pas trop renseigner sur la fonction et le service, on a juste l'identifiant des 2 tables.
Alors on va modifier la chaine SQL et utiliser ce qu'on appelle des jointures pour relier les tables entre elle.
Code : Tout sélectionner
Global $SQL = " SELECT Nom, Prenom, Service, Fonction, NumTel1, NumTel2 " & _
"FROM (tb_Personnes INNER JOIN tb_Services ON tb_Personnes.Service_id=tb_Services.Service_id) " & _
"INNER JOIN tb_Fonctions ON tb_Personnes.Fonction_id=tb_Fonctions.Fonction_id"
;à utiliser comme ca:
$oRS.Open($SQL, $oConn, $adOpenStatic, $adLockOptimistic)
le reste du code est le même.
le résultat pour moi
Code : Tout sélectionner
2 enregistrement dans la table
Nom Prenom Service Fonction NumTel1 NumTel2
toto tata Compta Chef 0401020304
titi tutu Compta Secrétaire 0404030201
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : ven. 24 avr. 2009 17:49
par GaRydelaMer
Comme tu le vois en changeant juste le SQL on a 2 résultat identique avec le même code.
Pour effectuer une recherche on va faire de même on va utiliser du SQL
Mais avant tout il faut savoir ce que l'on va chercher et ou se cache cette information et son type.
Donc 1 on chercher une personne par son nom:
Nom = toto
Nom commence par t
Nom contient t
En SQL:
c'est la clause WHERE que l'on va ajouter à la suite.
Code : Tout sélectionner
Global $SQL = " SELECT Nom, Prenom, Service, Fonction, NumTel1, NumTel2 " & _
"FROM (tb_Personnes INNER JOIN tb_Services ON tb_Personnes.Service_id=tb_Services.Service_id) " & _
"INNER JOIN tb_Fonctions ON tb_Personnes.Fonction_id=tb_Fonctions.Fonction_id"
Global $rec = InputBox("Recherche", "Rechercher un nom")
Global $WHERE = " WHERE Nom='" & $rec & "'" ; penser a entouré la chaine chercher avec '
$oRS.Open($SQL & $WHERE, $oConn, $adOpenStatic, $adLockOptimistic)
essaye aussi ceux la:
Code : Tout sélectionner
;; en SQL % et le caractère de remplacement le joker
Global $WHERE = " WHERE Nom like '" & $rec & "%'"; commence par
Global $WHERE = " WHERE Nom like '%" & $rec & "%'"; contient
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : lun. 27 avr. 2009 10:53
par BeCool
Quand je lance le script ci-dessous, il m'affiche une fenêtre qui me demande de chercher un nom, normale jusqu'à maintenant, mais une fois le nom entré, que le nom éxiste dans la BDD ou pas, il me met une erreur.
Voici le code :
► Afficher le texte
Code : Tout sélectionner
#cs ----------------------------------------------------------------------------
AutoIt Version: 3.2.12.1
Author: myName
Script Function:
Template AutoIt script.
#ce ----------------------------------------------------------------------------
; Script Start - Add your code below here
Global Const $adoProvider = 'Microsoft.Jet.OLEDB.4.0'
Global Const $adSchemaTables = 20
Global $o_MyError = ObjEvent("AutoIt.Error", "_MY_AU3_ErrFunc"), $n_MyError = 0
Global $bdd = "C:\trombidb.mdb"
Global $oConn = _ADO_Open($bdd)
ConsoleWrite($oConn.ConnectionString & @LF)
Global $oRS = ObjCreate("ADODB.Recordset")
$oRS = $oConn.OpenSchema($adSchemaTables)
For $i = 0 To $oRS.Fields.Count - 1
ConsoleWrite($oRS.Fields($i).Name & @LF)
Next
While Not $oRS.EOF
If $oRS.Fields("TABLE_TYPE" ).Value = "TABLE" Then
ConsoleWrite("Table name: " & _
$oRS.Fields("TABLE_NAME" ).Value & _
" Table type: " & $oRS.Fields("TABLE_TYPE" ).Value & @LF)
EndIf
$oRS.MoveNext
WEnd
$oRS.Close
$oConn.Close
Func _ADO_Open($base, $driver = "", $serveur = "", $user = "", $pwd = "")
Local $oConn = ObjCreate("ADODB.Connection")
With $oConn
Switch StringLower($driver)
Case "excel"
.ConnectionString = "Driver={Microsoft Excel Driver (*.xls)};Dbq=" & $base
.Open
Case "text"
.ConnectionString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" & $base & ";Extensions=tab;Extended Properties=TEXT"
.Open
Case "mssql"
.ConnectionString = "driver={SQL Server};server=" & $serveur & ";db=" & $base & ";user id=" & $user & ";pwd=" & $pwd & ";option=16386"
.Open
Case Else
.Provider = $adoProvider
.Open($base, $user, $pwd)
EndSwitch
EndWith
Return $oConn
EndFunc ;==>_ADO_Open
Func _MY_AU3_ErrFunc()
Local $Msg
$Msg = MsgBox(0, "AutoItCOM Test", "We intercepted a COM Error !" & @CRLF & @CRLF & _
"err.description is: " & @TAB & $o_MyError.description & @CRLF & _
"err.windescription:" & @TAB & $o_MyError.windescription & @CRLF & _
"err.number is: " & @TAB & Hex($o_MyError.number, 8) & @CRLF & _
"err.lastdllerror is: " & @TAB & $o_MyError.lastdllerror & @CRLF & _
"err.scriptline is: " & @TAB & $o_MyError.scriptline & @CRLF & _
"err.source is: " & @TAB & $o_MyError.source & @CRLF & _
"err.helpfile is: " & @TAB & $o_MyError.helpfile & @CRLF & _
"err.helpcontext is: " & @TAB & $o_MyError.helpcontext _
)
Local $n = $o_MyError.number
If $n = 0 Then $n = -1
$n_MyError = $n ; to check for after this function returns
If $Msg <> 6 Then Exit
EndFunc ;==>_MY_AU3_ErrFunc
;=====================================
Global Const $adOpenStatic = 3
Global Const $adLockOptimistic = 3
Global $rec = InputBox("Recherche", "Rechercher un nom")
Global $WHERE = " WHERE Nom like '" & $rec & "%'"; commence par
Global $SQL = " SELECT Nom, Prenom, Service, Fonction, NumTel1, NumTel2 " & _
"FROM (tb_Personnes INNER JOIN tb_Services ON tb_Personnes.Service_id=tb_Services.Service_id) " & _
"INNER JOIN tb_Fonctions ON tb_Personnes.Fonction_id=tb_Fonctions.Fonction_id"
$oRS = ObjCreate("ADODB.Recordset")
$oRS.Open($SQL & $WHERE, $oConn, $adOpenStatic, $adLockOptimistic)
If $oRS.EOF Then
ConsoleWrite("Aucun enregistrement dans la table" & @LF)
Else
ConsoleWrite($oRS.RecordCount & " enregistrement dans la table" & @LF)
For $Field In $oRS.Fields
ConsoleWrite($Field.Name & @TAB)
Next
ConsoleWrite(@LF)
While Not $oRS.EOF
For $Field In $oRS.Fields
ConsoleWrite($Field.Value & @TAB)
Next
ConsoleWrite(@LF)
$oRS.MoveNext
WEnd
EndIf
$oRS.Close
;à utiliser comme ca:
$oRS.Open($SQL, $oConn, $adOpenStatic, $adLockOptimistic)
et voici l'erreur:

Re: [..] Création de la fonction "Recherche" de mon script.
Posté : lun. 27 avr. 2009 19:48
par GaRydelaMer
Bonjour
message clair la connexion est fermée.
tu as un
$oConn.Close avant d'ouvrir ton dernier
RecordSet.
Fais une fonction quitter que tu appelle dans le
While a la place du
ExitLoop
Code : Tout sélectionner
Func _Quitter()
$oRs.Close
$oConn.Close
GuiDelete($GUI)
Exit
EndFunc
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 09:24
par BeCool
Heu, j'ai peur de ne pas comprendre .
Je ne vois pas de ExitLoop dans le code.
J'ai quand même essayé de faire ce que vous m'avez dit.
J'ai donc supprimer $oRS.Close et $oConn.Close des lignes 35 et 36, et j'ai mis un _Quitter() a la ligne 34.
J'ai ensuite rajouté la fonction _Quitter() a la suite de la fonction _MY_AU3_ErrFunc() mais là, problème. Dans la fonction _Quitter(), vous dites de supprimer la GUI $GUI alors qu'elle n'existe pas. Et si je supprime cette ligne, quand le lance le script, il ne ce passe rien.
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 11:21
par GaRydelaMer
oui pas de Exitloop c'est vrai, je me suis mis dans l'hypothèse ou tu avais une fenêtre afficher avec un while et un exitloop pour quitter le programmme.
Mais ceci dit les principes que l'on a abordé dans le post reste les même.
1 connexion
2 Requête SQL
3 on affiche
4 on est propre on ferme la requête et la connexion.
Tu peux pas faire une requête si la base est pas ouverte !!!
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 11:52
par BeCool
Ok, et c'est normale si il ne se passe rien quand je tape sur la touche "entré" après avoir rentré un nom valide ?
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 13:13
par GaRydelaMer
Oui, c'est normal, mais il me semble qu'il se passe quelque chose, puisque tu as un message d'erreur qui t'indique que la base est fermé.
Réfléchis un peu tu as toutes les infos nécessaires.
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 14:27
par BeCool
Oui mais justement, si je pose cette question, c'est parce que j'ai vu dans le code :
Code : Tout sélectionner
If $oRS.EOF Then
ConsoleWrite("Aucun enregistrement dans la table" & @LF)
Else
ConsoleWrite($oRS.RecordCount & " enregistrement dans la table" & @LF)
Et si je comprend bien, normalement ca m'affiche un message, or, là, il n'y a pas de message qui s'affiche. Voilà pourquoi j'ai posé la question au dessus

Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 14:48
par GaRydelaMer
L'erreur est juste avant quand tu ouvre le recordset, donc ces bout de codes ne sont pas exécuter puisque une erreur est intercepter et te renvoie a la fonction de gestion d'erreur

:p
Re: [..] Création de la fonction "Recherche" de mon script.
Posté : mar. 28 avr. 2009 15:03
par BeCool
Je n'y comprend décidément rien ...
J'ai beau essayé pleins de façons différentes qui me paraissent logique, ça ne change rien ...