[R] Export d'une base Access puis transfert

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

[R] Export d'une base Access puis transfert

#1

Message 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 :D ) 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:
Image

Merci d'avance pour votre aide
Modifié en dernier par Sim254 le mer. 05 mai 2010 23:25, modifié 1 fois.
Adenadels
Niveau 2
Niveau 2
Messages : 15
Enregistré le : dim. 24 mai 2009 11:22
Localisation : Strasbourg
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#2

Message 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)
Fichiers joints
access_ftp.7z
(9.1 Kio) Téléchargé 203 fois
Salutations
Jean-Luc
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#3

Message par Sim254 »

Merci pour ta réponse :)

Des UDF ? ça fonctionne comment ?

J'avoue ne pas comprendre grand chose au fichier access.au3 ...
Adenadels
Niveau 2
Niveau 2
Messages : 15
Enregistré le : dim. 24 mai 2009 11:22
Localisation : Strasbourg
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#4

Message 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).
Salutations
Jean-Luc
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#5

Message 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 :D
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#6

Message 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:

Code : Tout sélectionner

1;Paris;10
2;Lyon;6
3;Marseille;12
4;Bastia;26
7;Nice;8
 
(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)
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#7

Message 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
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#8

Message 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:

Image

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)
 
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#9

Message 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"
 
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#10

Message 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 ? )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#11

Message 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
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#12

Message 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:

Code : Tout sélectionner

1;Paris;10
2;Lyon;6
3;Marseille;12
4;Lupcourt;26
7;Nice;8
 
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.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#13

Message 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
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#14

Message par Sim254 »

Bon ben ...


Merci beaucouuuuuuuuupppp :D

Sa marche impeccable, je vais étudier ton script et je te redirais si j'ai des questions :)

Merci encore
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Export d'une base Access puis transfert

#15

Message par Tlem »

N'oubliez pas la balise [R] dans le titre de votre premier message si votre sujet est résolu.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Sim254
Niveau 1
Niveau 1
Messages : 9
Enregistré le : mar. 04 mai 2010 09:47
Status : Hors ligne

Re: [R] Export d'une base Access puis transfert

#16

Message par Sim254 »

C'est bon j'ai ajouté le [R]


Merci encore :)
Répondre