IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Lire et intégrer le contenu de fichiers dans des tables Access


Sujet :

VBA Access

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut Lire et intégrer le contenu de fichiers dans des tables Access
    Bonjour,
    je suis nouveau sur le forum et avec tres peu de notions de programmation VBA..

    Ma question est la suivante ;
    Je reçois des fichiers CSV via Filezilla (1 fichier pour chaque commande, 1 fichier pour chaque expédition au client, 1 fichier « référence » (téléphone avec le descriptif…Etc)

    Je voudrais intégrer tous ces fichier dans des tables access (Par ex tous les fichiers « commande » dans une table « commande » sous access, pareil pour les fichiers « expédition ») de façon automatique (idéal)

    Je suppose que l’idée est de concaténer les fichiers au fur et a mesure et de les intégrer dans une table ou bien une fois le format créé (CSV) d'en automatiser l’opération au travers de VBA..

    Est ce que quelqu'un pourrait m'orienter dans la programmation de cette opération ?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    khaibet,

    bonjour

    idéalement je verrai la chose de la manière suivante :

    un événement sur minuterie permettant d'aller rechercher sur ton FTP tous les fichiers souhaités à intervalles réguliers : un coup d'oeil sur ce fil de discussion devrait t'éclairer :

    http://www.developpez.net/forums/d90...s-serveur-ftp/


    (http://access.developpez.com/sources...hiers#EnvoiFTP)

    Lorsque le fichier sera récupéré de ton serveur FTP il sera nécessaire de le supprimer :

    http://www.developpez.net/forums/d49...r-fichier-ftp/

    ensuite traitement et lecture de tes fichiers afin d'alimenter tes différentes tables ! (un code vba du type http://access.developpez.com/sources...s#FichierTexte

    et pour l'injection regardes du côté de insert : http://msdn.microsoft.com/fr-fr/libr...ffice.15).aspx

    Voilà un peu de lecture qui te donne la trame des opérations à utiliser, je te laisse jeter un coup d'oeil à tout çà

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour tout ça Jimbolion, je m'y colle de suite.. ça devrait aller, j’espère ; )

    Khaibet

  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    khaibet,

    N'hésites pas à revenir vers nous si nécessaire, après quelques lectures ton projet ne nécessite aucun problème particulier.

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Ok, merci encore Jimbolion. Aujourd'hui je monte tout ça et je vois si ça marche et je te dis ; ) ...

    Khaibet

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour a nouveau Jimbolion

    j'ai bien compris l'idée et j'ai essaye de regrouper les éléments que tu m'as envoyé création événement + récupération fichier + effacement fichier + traitement et injection fichier) mais malheureusement mes limites en VBA ne me permettent pas d'avancer..

    Pourrais tu m'aider avec ne serais que la partie (récupération des fichiers txt envoyés par ftp sur access) ?

    Encore merci..

  7. #7
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    khaibet,

    je te prépares un exemple dans la journée !

    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Sincerement Merci beaucoup Jimbolion ! de mon coté je continue sur ce que tu m'a envoyé

    Merci

    Khaibet

  9. #9
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    khaibet,

    Désolé pour le retard mais j'ai pas pu finir mon explication pour différentes causes professionnelles.

    Je te fais un retour ce WE

    jm
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Merci Jimbolion, il ne manquerai plus que je me plaigne ; ))

    J'attends de tes nouvelles et je m'y recolle de suite

    Khaibet

  11. #11
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    khaibet bonjour,

    Comme promis la grande explication sur ta problématique. Dans la rédaction de ce post je te propose de partir sur un exemple précis. Nous récupérerons sur un compte FTP dans un dossier spécifique et intégrerons dans une table Access t_orders les lignes ainsi récupérées.

    La cinématique d'échange s'élaborera sur le principe suivant :

    1. Test de la connexion internet,
    2. lecture des fichiers sur le répertoire distant,
    3. copie du fichier sur le répertoire local (itératif jusqu'à épuisé la liste des fichiers présents),
    4. traitement du fichier en local (récupération des lignes de commandes, lecture des champs, insertion dans la table Access T_Orders),
    5. Suppression du fichier sur le répertoire FTP,
    6. suppression du fichier en local.

    I) Préparation des éléments :

    Nous allons donc utiliser un compte FTP illustré de la manière suivante :

    Nom : FileZilla.JPG
Affichages : 730
Taille : 66,4 Ko

    a) Le Ftp

    Tu noteras la présence de deux répertoires send (envoi) et receive(réception) placés sous le répertoire orders (commandes). De notre côté nous ne ferons que de la lecture, et utiliserons à cet effet le répertoire receive. Dans ce répertoire j'y ai glissé trois fichiers contenant pour chacun d'eux une liste de commandes. Le contenu de ces fichiers reste somme toute assez sommaire mais suffisamment explicite pour continuer notre analyse. En ouvrant le fichier Order_1.txt voilà ce que nous pourrions par exemple y trouver :

    10000;Commande 10000
    10001;Commande 10001
    10002;Commande 10002

    Donc 3 lignes de commandes contenant 2 champs (1 numéro de commande, l'objet de la commande).

    Nous avons donc défini la structure de notre format de commande, nous allons maintenant intégrer une table T_orders servant de réceptacle à la lecture de ces différentes commandes.

    b) La table T_Orders

    La conceptualisation de notre table pourrait ainsi ressembler à çà :

    Nom : TableCommandes.JPG
Affichages : 684
Taille : 105,9 Ko

    nous verrons plus tard comment exploiter cette table. Celle-ci contient 4 champs servant à intégrer le numéro de la commande, l'objet, la date d'intégration ainsi que le nom du fichier récupéré. Bien évidemment il ne s'agit que d'un exemple que tu devras adapter à ton cas.

    c) Le formulaire

    Afin d'illustrer tout cela nous intégrerons un formulaire permet de spécifier les paramètres nécessaires à l'élaboration de notre exemple. Ces paramètres concernent :

    • Nom du Serveur
    • Identifiant
    • Mot de Passe
    • Répertoire de stockage


    Un formulaire rapidement bâti (F_RecupereCommandes) pourrait ressembler à cela (je te laisserai composer quelque chose de bien plus agréable à utiliser) :

    Nom : Formulaire.JPG
Affichages : 717
Taille : 23,1 Ko

    Sur ce formulaire un bouton dont l’événement associé est celui-ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Private Sub recupere_Commandes_Click()
        ' appel de la fonction de récupéréation
        DoCmd.Hourglass True        ' sablier
        '
        ' Appel de la fonction de traitement
        '
        Keep_Orders Me.Server_name, Me.Login, Me.Password, Me.ordersDirectory
        '
        DoCmd.Hourglass False       ' fin sablier
        '
        MsgBox "c'est fini"
     
    End Sub
    Ce code permet d'appeler la fonction de traitement concernant la récupération de nos fichiers.

    d) Sources d'inspiration

    Afin de répondre à ta sollicitation je me suis basé sur le fil de discussion suivant :

    http://www.developpez.net/forums/d12...connexion-ftp/

    et sur deux tutoriels que je te conseille de lire :

    http://warin.developpez.com/access/fichiers/#LI

    et

    http://arkham46.developpez.com/artic...b/?page=page_7

    pour les collections : (en anglais sorry)

    http://www.databaseadvisors.com/news...t%20access.asp

    II) Décomposition des fonctions

    Un module nommé M_ConnexionFTP contient toutes les déclarations et fonctions nécessaires à l'élaboration de ton projet (ni plus ni moins). Nous en détaillerons le contenu ici :

    La partie déclarative nécessite de répertorier les fonctions appelés au sein de l'API wininet.dll. Le #If Win64 Then ... permet de gérer indépendamment les architectures 32 ou 64 bits (http://msdn.microsoft.com/fr-fr/libr...ffice.14).aspx).

    a) Déclaration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    Option Compare Database
     
    Option Explicit
     
    '-------------------
    'Déclaration des API
    '-------------------
    #If Win64 Then
    Private Declare PtrSafe Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
    Private Declare PtrSafe Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
    Private Declare PtrSafe Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
    Private Declare PtrSafe Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
    Private Declare PtrSafe Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hConnect As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Long, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByRef dwContext As Long) As Boolean
    Private Declare PtrSafe Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hConnect As Long, ByVal lpszLocalFile As String, ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
    Private Declare PtrSafe Function FtpFindFirstFile Lib "wininet" Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
    Private Declare PtrSafe Function InternetFindNextFile Lib "wininet" Alias "InternetFindNextFileA" (ByVal hFtpSession As Long, lpFindFileData As WIN32_FIND_DATA) As Boolean
    Private Declare PtrSafe Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean
    Private Declare PtrSafe Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
    Declare PtrSafe Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (ByRef lpdwError As Long, ByVal lpszErrorBuffer As String, ByRef lpdwErrorBufferLength As Long) As Boolean
    #Else
    Private Declare Function InternetCloseHandle Lib "wininet.dll" (ByVal hInet As Long) As Integer
    Private Declare Function InternetConnect Lib "wininet.dll" Alias "InternetConnectA" (ByVal hInternetSession As Long, ByVal sServerName As String, ByVal nServerPort As Integer, ByVal sUserName As String, ByVal sPassword As String, ByVal lService As Long, ByVal lFlags As Long, ByVal lContext As Long) As Long
    Private Declare Function InternetOpen Lib "wininet.dll" Alias "InternetOpenA" (ByVal sAgent As String, ByVal lAccessType As Long, ByVal sProxyName As String, ByVal sProxyBypass As String, ByVal lFlags As Long) As Long
    Private Declare Function FtpSetCurrentDirectory Lib "wininet.dll" Alias "FtpSetCurrentDirectoryA" (ByVal hFtpSession As Long, ByVal lpszDirectory As String) As Boolean
    Private Declare Function FtpGetFile Lib "wininet.dll" Alias "FtpGetFileA" (ByVal hConnect As Long, ByVal lpszRemoteFile As String, ByVal lpszNewFile As String, ByVal fFailIfExists As Long, ByVal dwFlagsAndAttributes As Long, ByVal dwFlags As Long, ByRef dwContext As Long) As Boolean
    Private Declare Function FtpPutFile Lib "wininet.dll" Alias "FtpPutFileA" (ByVal hConnect As Long, ByVal lpszLocalFile As String, ByVal lpszNewRemoteFile As String, ByVal dwFlags As Long, ByVal dwContext As Long) As Boolean
    Private Declare Function FtpFindFirstFile Lib "wininet" Alias "FtpFindFirstFileA" (ByVal hFtpSession As Long, ByVal lpszSearchFile As String, lpFindFileData As WIN32_FIND_DATA, ByVal dwFlags As Long, ByVal dwContext As Long) As Long
    Private Declare Function InternetFindNextFile Lib "wininet" Alias "InternetFindNextFileA" (ByVal hFtpSession As Long, lpFindFileData As WIN32_FIND_DATA) As Boolean
    Private Declare Function FtpDeleteFile Lib "wininet.dll" Alias "FtpDeleteFileA" (ByVal hFtpSession As Long, ByVal lpszFileName As String) As Boolean
    Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Long) As Long
    Declare Function InternetGetLastResponseInfo Lib "wininet.dll" Alias "InternetGetLastResponseInfoA" (ByRef lpdwError As Long, ByVal lpszErrorBuffer As String, ByRef lpdwErrorBufferLength As Long) As Boolean
    #End If
    '
    Private Const FORMAT_MESSAGE_FROM_SYSTEM = &H1000
    Private Const INTERNET_DEFAULT_FTP_PORT = 21
    Private Const INTERNET_SERVICE_FTP = 1
     
    Private Const FTP_TRANSFER_TYPE_ASCII = &H1
    Private Const FTP_TRANSFER_TYPE_BINARY = &H2
    Private Const FTP_TRANSFER_TYPE_UNKNOWN = &H0
    Private Const MAX_PATH = 260
    Type FILETIME
            dwLowDateTime As Long
            dwHighDateTime As Long
    End Type
     
    Private Type WIN32_FIND_DATA
            dwFileAttributes As Long
            ftCreationTime As FILETIME
            ftLastAccessTime As FILETIME
            ftLastWriteTime As FILETIME
            nFileSizeHigh As Long
            nFileSizeLow As Long
            dwReserved0 As Long
            dwReserved1 As Long
            cFileName As String * MAX_PATH
            cAlternate As String * 14
    End Type
    b) La fonction de récupération des fichiers:

    La fonction Keep_Orders va donc traiter notre problème en invoquant procédures et fonctions au gré des traitements à effectuer. J'ai de fait placé des lignes de commentaires dans le code afin de faciliter la tâche de lecture et de compréhension. Cette fonction reçoit en argument les paramètres issus de notre événement bouton placé sur le formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    Function Keep_Orders(ServerName As String, Login As String, Password As String, repdistant As String)
    '
    Dim FileName_FTP As String
    Dim FileName_Local As String
    '
    Dim pFichiers As Collection
    Dim reponse As Boolean
    Dim HwndConnect As Long
    Dim HwndOpen As Long
    Dim Lec_File As Integer
    Dim Aorders As Boolean
    '
    ' Test de connexion internet
    '
     
    HwndOpen = InternetOpen(ServerName, 0, vbNullString, vbNullString, 0)
     If HwndOpen = 0 Then
        MsgBox "connection internet impossible"
        Exit Function
    End If
    '
    Set pFichiers = ListeFichiers(ServerName, Login, Password, repdistant, "*.*") ', "*.xml")
    '
     'Connection au site ftp
     HwndConnect = InternetConnect(HwndOpen, ServerName, 21, Login, Password, 1, &H8000000, 0)  ' 134217728 ou 0 pour contourner les pb de parefeu
     '&H8000000  '(&H8000000 mode passif, 0 mode actif)
     ' port 21 ftp / 23 ftps
     '
     If HwndConnect = 0 Then
        MsgBox "connection  impossible"
        Exit Function
     End If
     '
     ' positionnement du curseur dans le répertoire
     '
     FtpSetCurrentDirectory HwndConnect, repdistant
     If FtpSetCurrentDirectory(HwndConnect, repdistant) = 0 Then
        MsgBox "impossible de trouver le répertoire distant " & repdistant
        Exit Function
    End If
    '
    For Lec_File = 1 To pFichiers.Count     ' nombre d'objets de la collection pfichiers
        '
        '
        '
        If Right(pFichiers(Lec_File), 4) = ";128" Then             ' ";128" pour les fihiers ";16" pour les directory
            ' chargement  du fichier
            FileName_FTP = Replace(pFichiers(Lec_File), ";128", "") 'autres versions
            FileName_Local = Application.CurrentProject.Path & "\" & FileName_FTP
            ' test si fichier déjà sur le disque dur du PC pour ne pas le retélécharger une nouvelle fois
            If Len(Dir(FileName_Local)) = 0 Then ' download du fichier si celui ci n'existe pas déjà
                '
                ' Récupération du fichier
                '
                reponse = FtpGetFile(HwndConnect, FileName_FTP, FileName_Local, False, 0, &H0, 0)
                '
                If reponse = False Then
                    MsgBox "Une erreur s'est produite à la lecture du fichier " & FileName_FTP
                Else
                    Aorders = Add_OrdersLines(FileName_Local, FileName_FTP) ' lecture du fichier
                    '
                    ' suppression du fichier sur le ftp
                    '
                    If Aorders = True Then
                        reponse = FtpDeleteFile(HwndConnect, FileName_FTP)
                        If reponse = False Then
                            MsgBox "Une erreur s'est produite à la suppression du fichier " & FileName_FTP
                        Else
                            ' on supprime également le fichier sur le répertoire local
                            delete_File FileName_Local
                        End If
                    End If
     
                End If
     
            End If
        Else
         ' c'est un répertoire
        End If
    Next
    '
    'fermer les pointeurs
    InternetCloseHandle HwndConnect
    InternetCloseHandle HwndOpen
    '
    End Function
    c) La récupération des fichiers sur le FTP:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Function ListeFichiers(serveur As String, Utilisateur As String, MotDePasse As String, Dossier As String, Fichiers As String) As Collection
      ' Liste les fichiers et dossiers du dossier FTP passé en paramètres
      Dim pData As WIN32_FIND_DATA
      Dim hInternet As Long, hFTP As Long, hPremier As Long, hSuivant As Long
      Dim pFichiers As New Collection
      Dim NomFichier As String
     
      pData.cFileName = String(MAX_PATH, 0)
     
      hInternet = InternetOpen("", 1, vbNullString, vbNullString, 0)
      If hInternet <> 0 Then
        hFTP = InternetConnect(hInternet, serveur, 21, Utilisateur, MotDePasse, 1, &H8000000, 0) '&H8000000 134217728
        If hFTP <> 0 Then
          If FtpSetCurrentDirectory(hFTP, Dossier) Then
            hPremier = FtpFindFirstFile(hFTP, Fichiers, pData, 0, 0)
            If hPremier <> 0 Then
              NomFichier = Left(pData.cFileName, _
                InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
              pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
              hSuivant = 1
              Do While hSuivant <> 0
                pData.cFileName = String(MAX_PATH, 0)
                hSuivant = InternetFindNextFile(hPremier, pData)
                If hSuivant <> 0 Then
                  NomFichier = Left(pData.cFileName, _
                    InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
                  pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
     
                End If
              Loop
            End If
          End If
        End If
      End If
      Set ListeFichiers = pFichiers
     
      InternetCloseHandle hSuivant
      InternetCloseHandle hPremier
      InternetCloseHandle hFTP
      InternetCloseHandle hInternet
    End Function
    Cette fonction te permettra de lister la liste des fichiers dans le dossier de stockage. La liste de ces fichiers est contenue dans une collection.

    d) La lecture d'un fichier commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    Function Add_OrdersLines(FileName_Local As String, FileName_FTP As String)
    '
    ' Function permettant de récupérer les différentes lignes de commande dans le fichier FileName_Local
    ' récupéré dans l'argument
    '
    On Error GoTo err_Add_Orderslines
    Dim oFSO As Scripting.FileSystemObject
    Dim oFl As Scripting.File
    Dim oTxt As Scripting.TextStream
    Dim fOK As Boolean
    Dim RecordLine As String
    'Instanciation du FSO
    Set oFSO = New Scripting.FileSystemObject
    Set oFl = oFSO.GetFile(FileName_Local)
    Set oTxt = oFl.OpenAsTextStream(ForReading)
    With oTxt
        While Not .AtEndOfStream
            'MsgBox .ReadLine
            RecordLine = .ReadLine                              ' lecture de la ligne
            fOK = Write_record(RecordLine, FileName_FTP)        ' envoie de la ligne dans la table access
            If fOK = False Then
                '
                ' si un probleme lors de l'enregistrement alors false
                '
                Add_OrdersLines = False
                oTxt.Close
                Set oTxt = Nothing
                Set oFl = Nothing
                Set oFSO = Nothing
                Exit Function
            End If
        Wend
    End With
    '
    oTxt.Close
    Set oTxt = Nothing
    Set oFl = Nothing
    Set oFSO = Nothing
    Add_OrdersLines = True
    Exit Function
    err_Add_Orderslines:
        MsgBox "une erreur " & Error(err): Add_OrdersLines = False
     
    End Function
    Cette fonction récupère les lignes de commande contenue dans un fichier en utilisant la librairie Microsoft Scripting Runtime. Chaque ligne ainsi récupérée permet de récupérer les informations numéro de commande et objet puis d'insérer les données dans notre table T_Orders grâce à la fonction Write_record.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Function Write_record(RecordLine As String, FileName_FTP As String)
    '
    ' Recoit la ligne de commande et le nom du fichier récupéré du Serveur FTP
    '
    ' Utilisation de la fonction split pour décomposition de la ligne de commande
    ' ou le séparateur est ;
    ' cette fonction permet ainsi d'adapter n'importe quel type de séparateur
    '
    On Error GoTo err_Write_record
    '
    Dim decoupe() As String
    Dim Ssql As String
    Dim NumberOrder As Long
    Dim ObjectOrder As String
    Dim db As Database
    '
    decoupe = Split(RecordLine, ";")
    '
    NumberOrder = decoupe(0)
    ObjectOrder = decoupe(1)
    '
    Set db = CurrentDb
    '
    ' Ecriture dans la table
    '
    Ssql = "INSERT INTO T_Orders ( NumeroCommande, ObjetCommande, DateLecture, NomFichier )"
    Ssql = Ssql & "SELECT " & NumberOrder & " AS OrderNo, '" & ObjectOrder & "' AS [Object], Date() AS Dt, '" & FileName_FTP & "' AS NFName;"
    '
    db.Execute Ssql
    '
    db.Close
    Set db = Nothing
    Write_record = True
    '
    Exit Function
    err_Write_record:
        MsgBox "une erreur " & Error(err): Write_record = False
    End Function
    La fonction Split assure le découpage de la ligne d'enregistrement en champs. Cette fonction adaptable te permettra de spécifier le séparateur utilisé si ton fichier est ainsi constitué : http://msdn.microsoft.com/fr-fr/libr...(v=vs.90).aspx

    Si tu devais utiliser des formats de type XML, la fonction de lecture serait évidemment à ré-étudier mais là n'est pas l'objet de notre exemple basé sur des formats simplifiés.

    d) La suppression physique du fichier local:

    En utilisant la même librairie Microsoft Scripting Runtime, la fonction de suppression permettra d'effacer physiquement le fichier du répertoire lorsque le déroulement de la phase d'écriture et d'insertion s'est correctement passé (la fonction retournera false si une erreur a été levée par la fonction).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    Function delete_File(FileName_Local As String)
    '
    ' fonction permettant de supprimer un fichier physique sur le disque local
    '
    On Error GoTo err_delete_File
    Dim oFSO As Scripting.FileSystemObject
    Dim oFl As Scripting.File
     
    'Instanciation du FSO
    Set oFSO = New Scripting.FileSystemObject
    'Instanciation de l'objet File
    If oFSO.FileExists(FileName_Local) Then
        oFSO.DeleteFile FileName_Local, False
    End If
     
    fin:
        Exit Function
     
    err_delete_File:
            Select Case err.Number
                Case 53: MsgBox "Le fichier est introuvable"
                Case Else: MsgBox "Erreur inconnue"
            End Select
     
        Resume fin
    End Function
    III) Résultat

    A L'issue du traitement, un message attestant de la fin de l'opération s"affichera. Le contenu de notre table pourrait ressembler à çà :

    Nom : Resultat.JPG
Affichages : 690
Taille : 49,0 Ko

    et le contenu de notre FTP vidé :

    Nom : FileZillfafin.JPG
Affichages : 692
Taille : 62,6 Ko

    IV) Recommandations

    Chaque fonction utilisée doit permettre de valider le traitement suivant. En effet une erreur de traitement et d'injection dans la table locale doit interdire la suppression du fichier sur le serveur FTP, imagines la conséquence si tu devais perdre des commandes. Dans ces cas tu peux procéder à l'injection des informations dans une table d'erreurs afin de traiter ultérieurement ton problème et passer au fichier suivant.
    Regardes bien chaque ligne de code et le retour des fonctions (Add_OrdersLines = true ou false, Write_record = true ou false et idem pour les retour de fonctions de l'API en fonction de la réussite ou de l'échec du traitement).
    Essaies d'anticiper tes contrôles en imaginant tous les cas de situations possibles (absence d'informations dans la commande, format de date erronées, doublons, nombre de champs incohérents :un champ peut contenir le séparateur...). Toute la robustesse d'une application tient aux contrôles que l'on se doit d'effectuer.

    V) Conclusion

    Avec les éléments fournis et les différents liens tu devrais être maintenant capable d'adapter ton projet avec tes contraintes personnelles. N'hésites pas à revenir vers nous pour des explications supplémentaires et pour chaque sujet précis à ouvrir un nouveau fil de discussion.
    Tout les codes fournis ont été validés à partir d'un exemple personnel et fonctionnel.

    De nombreuses alternatives peuvent être étudiées, nous pourrions par exemple spécifier dans le répertoire send l'expédition des commandes une fois traité ou mettre à disposition l'intégration des fichiers dans ton système d'informations afin d'établir un tracking (avancement de la commande). Dans ce cas nous devrions traiter la fonction FtpPutFile de l'API :
    http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx.
    Pour avancer sereinement dans la mise en place de tout ce que je viens de décrire, je te conseille de créer un serveur FTP spécifique (voir avec ton administrateur) et d'effectuer les essais nécessaires avant la mise en place en production.

    VI) L'exemple

    La base de données est disponible ici : (format 2013)
    En ouvrant le formulaire, mettre le nom du serveur FTP, login, mot de passe et répertoire de stockage (ne pas oublier d'y glisser des fichiers pour tes tests)

    http://jimbolion.developpez.com/arti...tp/Khaibet.zip

    Bonne lecture et bon courage

    JimboLion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  12. #12
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonsoir Jimbolion,

    je viens de rentrer de déplacement et de voir ton courrier. Encore un grand merci pour ton aide ! Des demain je m'y recolle et je te dis dès que ça marche ; ))

    Passe une très bonne soirée

    Khaibet

  13. #13
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    khaibet bonjour,

    La lecture de ce document demande effectivement de se poser quelques instants mais je suis sûr que tu sauras adapter tout çà !

    n'hésites pas à me faire part de tes blocages, nous saurons les résoudre ensemble

    il sera temps ensuite d'automatiser le processus par des événements sur minuterie

    jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  14. #14
    Nouveau Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Octobre 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Webdesigner

    Informations forums :
    Inscription : Octobre 2014
    Messages : 8
    Points : 1
    Points
    1
    Par défaut
    Bonjour Jimbolion,

    Parfait, je te tiens informé.

    Merci

    Khaibet

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Décembre 2012
    Messages : 129
    Points : 149
    Points
    149
    Par défaut
    Bonjour à tous,

    J'ai lu le poste de Jimbolion (du 18/10/2014, 19h20) avec attention et j'utilise notamment cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    Function ListeFichiers(serveur As String, Utilisateur As String, MotDePasse As String, Dossier As String, Fichiers As String) As Collection
      ' Liste les fichiers et dossiers du dossier FTP passé en paramètres
      Dim pData As WIN32_FIND_DATA
      Dim hInternet As Long, hFTP As Long, hPremier As Long, hSuivant As Long
      Dim pFichiers As New Collection
      Dim NomFichier As String
     
      pData.cFileName = String(MAX_PATH, 0)
     
      hInternet = InternetOpen("", 1, vbNullString, vbNullString, 0)
      If hInternet <> 0 Then
        hFTP = InternetConnect(hInternet, serveur, 21, Utilisateur, MotDePasse, 1, &H8000000, 0) '&H8000000 134217728
        If hFTP <> 0 Then
          If FtpSetCurrentDirectory(hFTP, Dossier) Then
            hPremier = FtpFindFirstFile(hFTP, Fichiers, pData, 0, 0)
            If hPremier <> 0 Then
              NomFichier = Left(pData.cFileName, _
                InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
    msgbox NomFichier
              pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
              hSuivant = 1
              Do While hSuivant <> 0
                pData.cFileName = String(MAX_PATH, 0)
                hSuivant = InternetFindNextFile(hPremier, pData)
                If hSuivant <> 0 Then
                  NomFichier = Left(pData.cFileName, _
                    InStr(1, pData.cFileName, String(1, 0), vbBinaryCompare) - 1)
                  pFichiers.Add NomFichier & ";" & pData.dwFileAttributes
     
                End If
              Loop
            End If
          End If
        End If
      End If
      Set ListeFichiers = pFichiers
     
      InternetCloseHandle hSuivant
      InternetCloseHandle hPremier
      InternetCloseHandle hFTP
      InternetCloseHandle hInternet
    End Function
    Cette dernière fonctionne très bien mais :
    Vous remarquerez que j'ai ajouté un petit msgbox ligne 20. Ce dernier systématiquement me renvoi le nom du fichier tronqué de ces 4 premiers caractères.

    Exemple "le_test.txt" me renvoi "est.txt", "nomDuFichier.txt" renvoi "uFichier.txt" etc...

    Quelqu'un aurait-il une piste vers laquelle je pourrais me tourner ?

    Mathspountz

Discussions similaires

  1. [XL-2003] recherche un fichier dans des sous répertoire et recopier son contenu
    Par hallscar dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 01/12/2011, 20h30
  2. Réponses: 8
    Dernier message: 26/10/2010, 16h05
  3. d'un fichier xml à des tables Access : ajout d'une colonne calculée
    Par scribreiz dans le forum Développement de jobs
    Réponses: 5
    Dernier message: 16/10/2009, 11h48
  4. Intégrer les données de plusieurs fichiers dans une table
    Par soad029 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/11/2007, 03h57
  5. Récupérer contenu de fichier dans une variable
    Par peppena dans le forum Linux
    Réponses: 4
    Dernier message: 15/06/2005, 12h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo