Page 1 sur 1
[R] Export d'une base Access puis transfert
Posté : mar. 04 mai 2010 14:40
par Sim254
Bonjour à tous,
Bon je suis totalement débutant avec Autoit (je suis webmaster, je maîtrise d'autres langages comme le Php, java, javascript, sql ...). J'aimerais automatiser une tâche, voila les explications:
J'aimerais en fait que tous les soirs, un petit .exe lancé avec le planificateur de tâches ouvre Microsoft Access 97 (oui je sais ça date

) puis qu'il aille chercher un fichier .mdb sur le disque et qu'il fasse un export de ce fichier .mdb en .txt
J'aimerais ensuite que ce fichier .txt soit envoyé sur un serveur FTP par Filezilla pour être exploité (récupération des infos en php et transfert dans la base MySQL). Etant sur un serveur gratuit free.fr, je ne peux pas utiliser d'ODBC pour lier mes bases d'où cette solution d'automatisation.
Bon donc j'ai commencé mon petit script et je rencontre quelques soucis. Je veux faire deux tabulations à un moment mais cette étape ne veut pas être prise en compte ... (je ne peux pas utiliser les control ID, car ils sont tout simplement inexistants)
Voici mon code:
Code : Tout sélectionner
; DEBUT SCRIPT
; Lien vers Access
Run("C:/Program Files/Microsoft Office/Office/MSACCESS.EXE")
;Attente d'ouverture de la première fenêtre
WinWaitActive("Microsoft Access", "Créer une base de données avec")
;Ouvrir un fichier
Send("{ENTER}")
WinWaitActive("Ouvrir", "Regarder dans", 2)
;On attend la barre déroulante
$i = 1
While $i <= 9
Send("{TAB}")
$i = $i + 1
WEnd
;On va dans le disque dur C:// et on cherche le fichier .mdb
Send("{DOWN}")
Send("Disque local")
Send("{ENTER}")
Sleep(1000)
Send("{TAB}")
Send("Utilisateurs")
Send("{ENTER}")
Sleep(1000)
Send("françoise")
Send("{ENTER}")
Sleep(1000)
Send("Documents")
Send("{ENTER}")
Sleep(1000)
Send("Web")
Send("{ENTER}")
Sleep(1000)
Send("SiteWeb")
Sleep(1000)
Send("{ENTER}")
Sleep(1000)
Send("test.mdb")
Send("{ENTER}")
;On attend que la base soit chargée
WinWaitActive("Microsoft Access", "test", 2)
;On va cliquer sur Exporter
Send("{ALT}+f")
$i = 1
While $i <= 5
Send("{DOWN}")
$i = $i + 1
WEnd
Send("{ENTER}")
WinWaitActive("Enregistrer sous...", "V&ers un fichier ou une base de données externe", 2)
Send("{ENTER}")
;On dit qu'on veut exporter en .txt
WinWaitActive("Enregistrer Table 'sejours' dans...", "", 2)
Send("sejours")
Send("{TAB}")
Send("Fichiers texte")
Send("{TAB}")
Send("{ENTER}")
WinWaitActive("Microsoft Access", "Voulez-vous le remplacer?", 3)
Send("{TAB}")
Send("{ENTER}")
Sleep(2000)
Send("{ALT}+s")
Sleep(2000)
;ça bloque ici
$i = 1
While $i <= 2
Send("{TAB}")
$i = $i + 1
WEnd
;Pour changer la valeur dans la case délimiteur de texte
Send("{{}")
Send("{ALT}+s")
Sleep(1000)
Send("{ALT}+t")
Sleep(1000)
Send("{ENTER}")
et un screenshot de la fenêtre où sa bug:
Merci d'avance pour votre aide
Re: [..] Export d'une base Access puis transfert
Posté : mar. 04 mai 2010 20:59
par Adenadels
Pour lire une mdb et la transformer en txt, j'utilise l'UDF access.au3
Idem pour l'envoi via FTP, j'utilise un UDF.
Ainsi, inutile de lancer des logiciels et simuler l'envoi de touches.
En pièce jointe, les UDF que j'utilise et qui fonctionnent très bien (il en existe certainement d'autres, mais chez moi au boulot ça fonctionne bien sur des système allant de NT4 à Windows server 2003)
Re: [..] Export d'une base Access puis transfert
Posté : mar. 04 mai 2010 23:57
par Sim254
Merci pour ta réponse
Des UDF ? ça fonctionne comment ?
J'avoue ne pas comprendre grand chose au fichier access.au3 ...
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 05:59
par Adenadels
Un UDF, User Define Function, permet d'ajouter des fonctions a autoit.
Si dans ton programme tu ajoutes la ligne
#include <access.au3>, tu peux utiliser toutes les fonctions décrites dans ce dernier.
Si l'UDF n'est pas une partie de autoit, ce dernier doit être dans le même répertoire que ton programme lors de la compilation.
Exemple d'utilisation d'access.au3
Code : Tout sélectionner
#include <Access.au3>
#Include <Array.au3>
; lecture des donnees de fichier.mdb, table servers dont le champ IP contient un "."
$Liste = _accessQueryLike("c:\temp\fichier.mdb","servers","IP",".",1)
$j = $Liste[0]
_ArraySort($liste, 0, 1)
For $i = 1 to $j
; suppression des retour à la ligne
$Liste[$i] = StringReplace($Liste[$i], @CRLF, "/")
; découpage par champ
$Splitter = StringSplit($Liste[$i], Chr(28))
$Domain[$i] = $Splitter[2]
$Serveur[$i] = $Splitter[3]
$IP[$i] = $Splitter[4]
$Type[$i] = $Splitter[6]
; Ecriture du fichier srv.txt
FileWriteLine($file_srv, $Serveur[$i] & " " & $IP[$i])
; Ecriture du fichier hosts
$ligne = $IP[$i] & @TAB & $Serveur[$i] & @TAB & "#DOM:" & $Typ & @TAB & "#PRE"
FileWriteLine($file_Hosts, $ligne)
Tu trouveras dans le fichier <acces.au3> la description de la fonction _accessQueryLike (et de toutes les autres présentes dans l'UDF).
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 11:04
par Sim254
Merci
A quoi correspond le fichier Array.au3 dans ton exemple ?
et où est enregistré le fichier texte une fois ce script effectué ?
(je ne vois même pas où est donné le nom du fichier .txt)
PS: Bon bonne nouvelle, le script pour l'envoi sur le FTP fonctionne

Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 11:53
par Sim254
Bon j'ai vraiment du mal pour le script d'export avec l'udp que tu m'as donné.
Je voudrais au final mon fichier texte sous cette forme:
(sans guillemets autour du texte)
J'ai donc un fichier sejours.txt que je viens modifier avec les fonctions FileOpen() et FileWriteLine() mais je n'arrive à sortir les données du fichier .mdb avec cette fonction _accessQueryLike() (je voudrais sortir toute une table sans faire de WHERE)...
(j'ai modifié la fonction dans access.au3 pour qu'elle ne prenne en compte que 3 paramètres: source, table et addfull:
Code : Tout sélectionner
$oRec.Open ("SELECT * FROM "& $adTable &"", $oADO, $adOpenStatic, $adLockOptimistic)
)
voila mon code pour le moment:
Code : Tout sélectionner
#include <Access.au3>
#include <Array.au3>
; lecture des donnees de fichier.mdb, table servers dont le champ IP contient un "."
$Liste = _accessQueryLike("C:\Users\françoise\Documents\Web\SiteWeb\test.mdb","sejour",1)
$j = $Liste[0]
_ArraySort($liste, 0, 1)
For $i = 1 to $j
; suppression des retour à la ligne
;$Liste[$i] = StringReplace($Liste[$i], @CRLF, "/")
; découpage par champ
$Splitter = StringSplit($Liste[$i], Chr(28))
$id[$i] = $Splitter[1]
$nom_sejour[$i] = $Splitter[2]
$places_restantes[$i] = $Splitter[3]
; Ecriture du fichier sejours.txt
$fichier_txt = "C:\Users\françoise\Documents\Web\SiteWeb\sejours.txt"
FileOpen($fichier_txt, 2)
FileWriteLine($fichier_txt, $id[$i] & ";" & $nom_sejour[$i] & ";" & $places_restantes[$i])
Next
; Ecriture du fichier hosts
;$ligne = $IP[$i] & @TAB & $Serveur[$i] & @TAB & "#DOM:" & $Typ & @TAB & "#PRE"
;FileWriteLine($file_Hosts, $ligne)
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 14:03
par GaRydelaMer
Bonjour
essaie un code comme celui la:
Code : Tout sélectionner
Local $Out = ""
; Pour le nom des champs sur la 1ere ligne
For $Field In $oRs.Fields
$Out &= $Field.Name & ";"
Next
$Out = StringTrimRight($Out, 1) & @CRLF
ConsoleWrite($Out)
; Pour les Datas
While Not $oRS.EOF
$Out = ""
For $Field In $oRs.Fields
$Out &= $Field.Value & ";"
Next
$Out = StringTrimRight($Out, 1) & @CRLF
ConsoleWrite($Out)
$oRS.MoveNext
WEnd
$oRs.Close
teste le dans Scite, si ca marche remplace le ConsoleWrite par FileWrite
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 14:23
par Sim254
Bonjour,
Alors j'ai essayé le code, mais j'ai un soucis dans la requête on dirait ...
Voila l'erreur qu'il m'affiche:
Et voila la requête en question qui pose problème dans le fichier Access.au3 contenant toutes les fonctions:
Code : Tout sélectionner
$oRec.Open ("SELECT * FROM "& $adTable & " WHERE " & $adCol & " Like '%" & $Find & "%'", $oADO, $adOpenStatic, $adLockOptimistic)
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 14:40
par GaRydelaMer
J'utilise pas l'UDF _Access, je l'aime pas.
Par contre je fais tout avec ADO directement.
Code : Tout sélectionner
Local $SQL = "SELECT * FROM TA_TABLE WHERE"; fais ta requête sous access et copie ici le SQL
Local $oRs = ObjCreate("ADODB.Recordset")
$oRs.Open($SQL, $oConn, $adOpenDynamic, $adLockOptimistic, $adCmdText)
Sinon ca aussi marche bien
$oRs.Open("TA_TABLE", $oConn, $adOpenDynamic, $adLockOptimistic, $adCmdTable)
$oRs.Filter = "le where ici de la chaine SQL de ACCESS"
$oRs.Filter = "SEJOUR = 'Paris' AND ANNEE = 2010"
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 15:17
par Sim254
On donc je laisse tombé l'UDF ...
Donc dans mon code j'ai ça maintenant:
Code : Tout sélectionner
Local $SQL = "SELECT * FROM sejours"; fais ta requête sous access et copie ici le SQL
Local $oRs = ObjCreate("ADODB.Recordset")
$oRs.Open($SQL, $oConn, $adOpenDynamic, $adLockOptimistic, $adCmdText)
Local $Out = ""
; Pour le nom des champs sur la 1ere ligne
For $Field In $oRs.Fields
$Out &= $Field.Name & ";"
Next
$Out = StringTrimRight($Out, 1) & @CRLF
ConsoleWrite($Out)
; Pour les Datas
While Not $oRS.EOF
$Out = ""
For $Field In $oRs.Fields
$Out &= $Field.Value & ";"
Next
$Out = StringTrimRight($Out, 1) & @CRLF
ConsoleWrite($Out)
$oRS.MoveNext
WEnd
$oRs.Close
A quoi correspondent les variables $oConn, $adOpenDynamic, $adLockOptimistic, $adCmdText de la fonction Open() (je ne sais même pas c'est quoi, c'est de l'asp cette fonction ? )
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 15:30
par GaRydelaMer
Alors oui c'est pareil en ASP, normal on utilise les mêmes Objet ADO.
$oConn, c'est ton objet connection ADO. Dans ton ex Code: $ADO je crois.
les 3 autres $ad.... ce sont les constantes de ADO, tu les a dèja dans l'UDF Access.
Sinon elle sont dans la parie Tuto du dans le forum, j'en ai fais 1 sur ADO et les base de données.
http://www.autoitscript.fr/forum/viewto ... =11&t=2835
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 16:14
par Sim254
Merci pour ton tuto
... mais je dois avoir un peu de mal ... Ou est-ce que je donne mon lien vers ma base .mdb ? moi je l'aurai mis dans la variable $SQL mais à ce moment là je place où ma requête ?
Peut-tu me faire un script propre qui me permettrais d'ouvrir ma base .mdb se trouvant ici:
C:\Users\françoise\Documents\Web\SiteWeb\test.mdb
et modifiant un fichier sejour.txt ce trouvant dans le même répertoire.
Le fichier sejour.txt doit se présenter sous cette forme:
Pour que je puisse l'exploiter en PHP.
Pour le moment j'ai une erreur a chaque fois que j'essaye de faire le $oRs.Open, il me dit : The requested action with object has failed.
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 16:54
par GaRydelaMer
Voila
Code : Tout sélectionner
;; Variables
Local $BasePath = "C:\Users\françoise\Documents\Web\SiteWeb\test.mdb"
Local $FilePath = "C:\Users\françoise\Documents\Web\SiteWeb\sejours.txt"
Local $Line = ""
;; ADO Connection
Local $oConn = ObjCreate("ADODB.Connection")
With $oConn
.Provider = "Microsoft.Jet.OLEDB.4.0"
.CursorLocation = 3 ;$adUseClient
.Open($BasePath)
EndWith
;; ADO RecordSet
Local $SQL = "SELECT * FROM sejours"
Local $oRs = ObjCreate("ADODB.Recordset")
;$oRs.Open($SQL, $oConn, $adOpenDynamic, $adLockOptimistic, $adCmdText)
;~ $oRs.Open($SQL, $oConn, 2, 3, 1)
$oRs.Open($SQL, $oConn, 2, 3)
If FileExists($FilePath) Then FileDelete($FilePath)
Local $hFilePath = FileOpen($FilePath, 1)
; Pour le nom des champs sur la 1ere ligne
;~ For $Field In $oRs.Fields
;~ $Line &= $Field.Name & ";"
;~ Next
;~ FileWriteLine($hFilePath, StringTrimRight($Line, 1)
; Pour les Datas
Local $iCur = 1, $iCount = $oRs.RecordCount
While Not $oRS.EOF
$Line = ""
For $Field In $oRs.Fields
Local $Value = $Field.Value
;; Ici tu peux ajouter des test sur la valeur des champs
;; Genre enlever les ';' si il est dans la valeurs, pour pas perdre les infos
;; Tu peux aussi avoir le type du champ avec $oRs.Type
;; Genre Char, Integer, ....
$Line &= $Value & ";"
Next
FileWriteLine($hFilePath, StringTrimRight($Line, 1))
;; Pour faire joli fais dans une GUI avec barre de progression par exemple
ConsoleWrite("ligne " & $iCur & " / " & $iCount & " -> " & $Line & @LF)
$iCur += 1
$oRS.MoveNext
WEnd
$oRs.Close
$oConn.Close
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 17:35
par Sim254
Bon ben ...
Merci beaucouuuuuuuuupppp
Sa marche impeccable, je vais étudier ton script et je te redirais si j'ai des questions
Merci encore
Re: [..] Export d'une base Access puis transfert
Posté : mer. 05 mai 2010 21:37
par Tlem
N'oubliez pas la balise [R] dans le titre de votre premier message si votre sujet est résolu.
Re: [R] Export d'une base Access puis transfert
Posté : jeu. 06 mai 2010 14:49
par Sim254
C'est bon j'ai ajouté le [R]
Merci encore
