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 :

Changer le format d'Export d'un fichier txt suite à un programme VBA [AC-2010]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 96
    Par défaut Changer le format d'Export d'un fichier txt suite à un programme VBA
    Bonjour à tous,
    Ce message fait suite à une problématique précédente qui avait été brillamment résolue par PAIDGE à l'époque.
    Le programme consistait à identifier des utilisateurs qui répondaient favorablement à plusieurs conditions avec une relation complexe (l'utilisateur doit avoir cette condition ET cette condition OU cette condition).
    Le programme fonctionne parfaitement. Il délivre un fichier txt sous la forme:
    ---
    "USER1";"Condition1:Valeur de condition1;Condition2:Val2;C3:Val3"
    "USER2";"C2:Val2;C3:Val3"
    ------
    Le programme est le suivant :
    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
    Public Function BProcessEligibles(pUNAME As String) As Variant
        ' Ceci est la fonction qui renvoit la liste des zones éligibles pour un client
        ' La valeur retournée est de cette forme : "SUD:01;NORD:03"
        Dim strSQL As String, strBProcess As String
        Dim rstBProcessProbables As DAO.Recordset
     
        ' On récupère les zones susceptibles d'être éligibles
        strSQL = "SELECT DISTINCT BP, Transaction " & _
                 "FROM AGR_1251_Y_MERGE_finale_star_TMP_2 INNER JOIN FUNCTOBJ_GRC " & _
                 "ON (AGR_1251_Y_MERGE_finale_star_TMP_2.LOW = FUNCTOBJ_GRC.Value) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.FIELD = FUNCTOBJ_GRC.Field) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.OBJECT = FUNCTOBJ_GRC.Object) " & _
                 "WHERE UNAME='" & pUNAME & "';"
        Set rstBProcessProbables = CurrentDb.OpenRecordset(strSQL)
     
        ' Pour chacune de ces zones,
        While Not rstBProcessProbables.EOF
            ' On réunit les champs Secteur et éligibilité séparés par ":"
            strBProcess = rstBProcessProbables(0) & ":" & rstBProcessProbables(1)
            ' On vérifie si le client est éligible. Si c'est le cas, on concatène les zones séparées par des point-virgules
            If transaction_elue(pUNAME, strBProcess) Then
                BProcessEligibles = BProcessEligibles & ";" & strBProcess
            End If
            rstBProcessProbables.MoveNext
        Wend
     
        ' On retire le premier point-virgule
        If Len(BProcessEligibles) <> 0 Then BProcessEligibles = Right(BProcessEligibles, Len(BProcessEligibles) - 1)
    End Function
    ----

    Néanmoins, j'ai besoin de faire un lourd travaille de refonte de ce fichier car je dois l'incorporer dans une nouvelle table. Le travail devient vite infernal lorsque que je dépasse la 50aine d'utilisateurs . Idéalement, j'aurai besoin que le fichier d'export txt ressemble à ceci:

    "USER1";"Condition1:Valeur de condition1"
    "USER1";"Condition2:Val2"
    "USER1";"C3:Val3"
    "USER2";"C2:Val2"
    "USER2";"C3:Val3"

    ---

    Pensez-vous qu'il est possible d'influencer le code du programme pour avoir cette restitution ?
    Merci pour votre aide et votre contribution.

    dagada75

  2. #2
    Membre émérite Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 599
    Par défaut
    bonjour,

    Je verrais une solution dans ce genre :

    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
    Public Function BProcessEligibles(pUNAME As String) As Variant
        ' Ceci est la fonction qui renvoit la liste des zones éligibles pour un client
        ' La valeur retournée est de cette forme : "SUD:01;NORD:03"
        Dim strSQL As String, strBProcess As String
        Dim rstBProcessProbables As DAO.Recordset
     
        ' On récupère les zones susceptibles d'être éligibles
        strSQL = "SELECT DISTINCT UNAME,BP, Transaction " & _
                 "FROM AGR_1251_Y_MERGE_finale_star_TMP_2 INNER JOIN FUNCTOBJ_GRC " & _
                 "ON (AGR_1251_Y_MERGE_finale_star_TMP_2.LOW = FUNCTOBJ_GRC.Value) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.FIELD = FUNCTOBJ_GRC.Field) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.OBJECT = FUNCTOBJ_GRC.Object); "
        Set rstBProcessProbables = CurrentDb.OpenRecordset(strSQL)
     
        ' Pour chacune de ces zones,
        While Not rstBProcessProbables.EOF
            If transaction_elue(pUNAME, strBProcess) Then
     ' On concatene  le uname , ";" champs Secteur ,":" et éligibilité
            strBProcess = rstBProcessProbables(0) & ";" & rstBProcessProbables(1)& ":" & rstBProcessProbables(1) _
    		& ch(13) & chr(10) 'on rajoute un CRLF pour changer de ligne
            ' On vérifie si le client est éligible. Si c'est le cas, on concatène les zones séparées par des point-virgules
            End If
            rstBProcessProbables.MoveNext
        Wend
     
        BProcessEligibles = strBProcess
    End Function
    Il faut après mettre le retour de la fonction dans un fichier

    Sinon, tu peut adapter et transformer la fonction en procédure, et directement dans un fichier texte

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 96
    Par défaut
    Merci pour ton soutien dumas.blr.

    j'ai répliqué ton code. Malheureusement une erreur survient ave le message suivant "Erreur de compilation: Sub ou Function non définie".
    Le correcteur pointe automatiquement ton rajout sur la valeur "rstBProcessProbables (1) _"

    Est-ce lié au fait que je n'ai pas indiqué l'intégralité du programme ?

    Dagada75

  4. #4
    Membre émérite Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 599
    Par défaut
    Oui, je n'ai pas testé le source que j'ai écrit
    il y a une erreur dna s le code source : il fallait écrire chr(13) au lieu de ch(13)
    Voici le code "corrigé" (mais toujours pas testé )

    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
    Public Function BProcessEligibles(pUNAME As String) As Variant
        ' Ceci est la fonction qui renvoit la liste des zones éligibles pour un client
        ' La valeur retournée est de cette forme : "SUD:01;NORD:03"
        Dim strSQL As String, strBProcess As String
        Dim rstBProcessProbables As DAO.Recordset
     
        ' On récupère les zones susceptibles d'être éligibles
        strSQL = "SELECT DISTINCT UNAME,BP, Transaction " & _
                 "FROM AGR_1251_Y_MERGE_finale_star_TMP_2 INNER JOIN FUNCTOBJ_GRC " & _
                 "ON (AGR_1251_Y_MERGE_finale_star_TMP_2.LOW = FUNCTOBJ_GRC.Value) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.FIELD = FUNCTOBJ_GRC.Field) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.OBJECT = FUNCTOBJ_GRC.Object); "
        Set rstBProcessProbables = CurrentDb.OpenRecordset(strSQL)
     strBProcess = ""
        ' Pour chacune de ces zones,
        While Not rstBProcessProbables.EOF
            If transaction_elue(pUNAME, strBProcess) Then
     ' On concatene  le uname , ";" champs Secteur ,":" et éligibilité
            strBProcess = strBProcess & rstBProcessProbables(0) & ";" & rstBProcessProbables(1) & ":" & rstBProcessProbables(2) _
    		& chr(13) & chr(10) 'on rajoute un CRLF pour changer de ligne
            ' On vérifie si le client est éligible. Si c'est le cas, on concatène les zones séparées par des point-virgules
            End If
            rstBProcessProbables.MoveNext
        Wend
     
        BProcessEligibles = strBProcess
    End Function
    Mais il me semble plus pertinent d'écrire directement dans un fichier texte. tu n'aurais pas de problème de taille

    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
    Public sub BProcessEligibles
        ' Ceci est la fonction qui renvoit la liste des zones éligibles pour un client
        ' La valeur retournée est de cette forme : "SUD:01;NORD:03"
        Dim strSQL As String, strBProcess As String
        Dim rstBProcessProbables As DAO.Recordset
        Dim numfictexte as integer
     
        Numfictexte = freefile  ' Lit le numéro de fichier inutilisé.
    ' Crée le nom du fichier.
     
        Open <chemin complet du fichier texte en sortie> For Output As #Numfictexte
     
     
        ' On récupère les zones susceptibles d'être éligibles
        strSQL = "SELECT DISTINCT UNAME,BP, Transaction " & _
                 "FROM AGR_1251_Y_MERGE_finale_star_TMP_2 INNER JOIN FUNCTOBJ_GRC " & _
                 "ON (AGR_1251_Y_MERGE_finale_star_TMP_2.LOW = FUNCTOBJ_GRC.Value) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.FIELD = FUNCTOBJ_GRC.Field) " & _
                    "AND (AGR_1251_Y_MERGE_finale_star_TMP_2.OBJECT = FUNCTOBJ_GRC.Object); "
        Set rstBProcessProbables = CurrentDb.OpenRecordset(strSQL)
     
        ' Pour chacune de ces zones,
        While Not rstBProcessProbables.EOF
            If transaction_elue(pUNAME, strBProcess) Then
     ' On concatene  le uname , ";" champs Secteur ,":" et éligibilité
            strBProcess = rstBProcessProbables(0) & ";" & rstBProcessProbables(1) & ":" & rstBProcessProbables(2) _
    		write #Numfictexte, strBProcess ' Écrit le texte
            ' On vérifie si le client est éligible. Si c'est le cas, on concatène les zones séparées par des point-virgules
            End If
            rstBProcessProbables.MoveNext
        Wend
     
        close #Numfictexte ' Ferme le fichier.
    End sub

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    96
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2012
    Messages : 96
    Par défaut
    Merci dumas.blr !

    J'ai appliqué tes corrections ... mais cela entraîne une réaction en chaîne sur le reste du programme

    Je crois que le plus simple pour toi (j'aurai du le faire dès le début!) est de joindre un exemple concret avec une base access.

    L'idée d'un export direct en fichier txt me tente bien en effet ( ta solution numéro 2).

    Quelques instructions sur la base:
    - il faut exécuter la requête "FINAL_results" pour obtenir le résultat escompté

    Le reste tu connais.

    ps: oui c'est assez long (5min.) car je contrôle beaucoup d'information

    Merci encore si tu peux y jeter un petit coup d'oeil

    David
    Fichiers attachés Fichiers attachés

  6. #6
    Membre émérite Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 599
    Par défaut
    Bonjour David,

    J'ai ouvert ta base. J'ai déjà constaté quelque chose

    oui c'est assez long (5min.) car je contrôle beaucoup d'information
    Tu peux déjà réduire sensiblement les temps de traitement en mettant des index sur les champs de jointure.

    Je regarde la suite quand j'aurai un peu de temps

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. exporter table vers fichier txt
    Par joe370 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/05/2009, 12h08
  2. format "JMA" colonne d'un fichier TXT
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/12/2007, 14h43
  3. Exportation d'1 fichier txt par une procédure stockée
    Par loutsky dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 15/06/2006, 18h25
  4. Réponses: 10
    Dernier message: 08/06/2006, 08h57
  5. Réponses: 41
    Dernier message: 02/05/2006, 14h17

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