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

Access Discussion :

[AC-2010] Problème mise en forme export .txt depuis requête


Sujet :

Access

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 40
    Points : 37
    Points
    37
    Par défaut [AC-2010] Problème mise en forme export .txt depuis requête
    Bonjour à tous,

    Je galère pas mal depuis plus de 24h à chercher une solution à mon problème sans réponse malheureusement.
    J'ai un problème d'export d'un fichier .txt depuis une requête dans Access.

    Je souhaiterai obtenir dans le fichier .txt final ça :
    PHA|STUP201712070918154|BC|1|20171207092710|07/12/2017|154|9208417|00000009,000|NON||
    (vous l'aurez compris c'est un fichier plat).

    Je suis passé par un modèle d'exportation enregistré qui fonctionne bien mais lorsque je publie ma base access (.accde puis fractionnement de la base en frontale/dorsale), l'export ne fonctionne plus, j'ai un message d'erreur comme si Access ne retrouvait plus le modèle enregistré d'export avec mise en forme.

    Du coup j'ai modifié mon code vba de la sorte :
    DoCmd.TransferText acExportDelim, , "Nom Requete", "CHEMIN\test.txt", True

    Mon fichier schema.ini est défini par :
    [test.txt]
    ColNameHeader=False
    CharacterSet=1252
    Format=Delimited(|)
    Col1=Expr1 Char Width 255
    Col2=Expr2 Char Width 255
    Col3=Expr5 Char Width 255
    Col4=Expr6 Char Width 255
    Col5=Expr8 Char Width 255
    Col6=Service Integer
    Col7=UCDs Integer
    Col8=Expr14 Char Width 255
    Col9=Expr12 Char Width 255

    Le résultat de ce code est le suivant :
    "PHA"|"STUP201712070930154"|"BC|1"|"2017120709419"|"07/12/2017"|154|9208400|"00000003,000"|"NON||"
    Mes champs sont tous entourés par ", ce que je ne veux pas bien sur.

    Comment faire pour supprimer les " ?
    A noter que la plupart de mes champs qui sortent de la requête sont une concaténation de plusieurs informations donc dans la requête je n'ai pas trop le choix que de mettre une valeur de champ de type Expr1: "PHA"
    Seuls les champs 154 et 9208400 viennent directement d'un champ d'une table et ne sont pas entourés de ".

    Je ne sais plus quoi faire, j'ai essayé de modifié le caractère Format=Delimited de mon fichier ini sans succès.

    Avez vous des idées?

    Je vous remercie vivement par avance

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    D'après les posts que j'ai vu on semble avoir peu de contrôle sur les exports via shcema.ini.

    Lassé de me battre avec Access pour des exports aussi simples, j'en suis venu à les programmer moi-même.

    Ici un exemple simple d'export de fichier texte basé sur le type des champs.

    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
    Private Sub ExporteTexte()
        Dim numFic As Long: numFic = FreeFile()
        Dim nomFic As String: nomFic = "X:\UnChemin\TonFichier.txt"
        Const SEPARATEUR_CHAMP As String = "|"
        Dim enr As String
        Open nomFic For Output As #numFic 'ouvre le fichier résultat
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim r As DAO.Recordset: Set r = db.OpenRecordset("NomTaSource", dbOpenSnapshot)
        Dim c As DAO.Field
        dim v as string
     
        Do While Not r.EOF
     
            enr = ""
     
            For Each c In r.Fields
     
                If enr <> "" Then
                    enr = enr & SEPARATEUR_CHAMP
                End If
     
                Select Case c.Type
                    Case dbText
                        enr = enr & c
     
                    Case dbDouble
                        v=Format(c, "0.0000")
                        v=replace(v, ".", ",") 'Au cas où on est sur une machine qui utilise le point comme virgule.
                        enr = enr & v
     
                    Case dbDate
                        enr = enr & Format(c, "yyyy\-mm\-dd")
     
                    Case Else
                        Call Err.Raise(5, , Error$(5) & " - Type non géré.")
     
                End Select
     
            Next c
     
            Print #numFic, enr
            r.MoveNext
        Loop
     
        r.Close: Set r = Nothing
        db.Close: Set db = Nothing
     
        Close #numFic 'Ferme le fichier résulat
    End Sub
    Comme c'est du code tu es libre de traiter chaque champ ou type de champ comme tu l'entends et tu es sur du résultat que tu vas avoir quelque soit les paramétrages de la machine.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Merci pour l'astuce+++

    C'est un bon moyen d'arriver à ses fins en effet.
    Le resultat est très bon dans l'ensemble mais j'ai perdu les deux champs qui provenaient directement d'une table sans retouche (et qui étaient appelés dans la requête) à savoir :


    PHA|STUP201712070918154|BC|1|20171207092710|07/12/2017|||00000009,000|NON||

    Pour rappel le resultat final doit etre :
    PHA|STUP201712070918154|BC|1|20171207092710|07/12/2017|154|9208417|00000009,000|NON||

    J'ai analysé le code et je ne vois pas ce qui cloche puisque j'ai bien appeler la requete en question dans la partie db.OpenRecordset("NomTaSource", dbOpenSnapshot)
    et le déroulement suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enr = ""
     
            For Each c In r.Fields
     
                If enr <> "" Then
                    enr = enr & SEPARATEUR_CHAMP
                End If

    doit bien intégrer les deux champs en question.
    J'ai loupé quelque chose?

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    À priori oui, puisque la collection Fields contient la liste de tous les champs de la source et si tu as des zones "vides" c'est qu'ils ont bien été vus.
    L'explication la plus logique est que Access les voient nuls ou que la conversion en chaîne de caractère ne s'est pas fait.

    Comme tu as peu de champs, exécute le code en mode pas à pas (en appuyant sur [f8]) et vois ce qui se passe pour ces champs en particulier.
    Tu peux voir le contenu du champ en pointant avec la souris sur la variable c.
    Tu peux voir la progression en ajoutant debug.print c.name sur la ligne juste après le for each c.
    Cela va afficher les noms dans la fenêtre d'exécution immédiate ([ctrl][g] si elle n'est pas affichée).
    Penser à le mettre l'instruction en commentaire pour la prod.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    Bonsoir marot_r,
    les types dbByte , dbInteger, dbLong, dbCurrency et dbSingle ne sont pas gérés dans tes Case c'est peut-être l'explication ...
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour tee_grandbois

    Si, ils sont gérés. Ils génèrent une erreur explicite :-).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Case Else
                        Call Err.Raise(5, , Error$(5) & " - Type non géré.")
    Donc à moins que cette portion de code ait été enlevée le problème ne vient pas de là.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 637
    Points : 14 611
    Points
    14 611
    Par défaut
    Si, ils sont gérés. Ils génèrent une erreur explicite :-).
    je voulais dire : ils ne sont pas gérés de manière à alimenter le fichier texte ... et les 2 champs manquants sont de type Integer
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...
    ah non ? donc devant l'écran c'est la connectique ?

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 40
    Points : 37
    Points
    37
    Par défaut
    Bonjour,

    en effet ca provient de cette partie de code :
    Case Else
    Call err.Raise(5, , Error$(5) & " - Type non géré.")
    Lorsque je teste ma procédure et qu'elle arrive à mon 1er champ à problème j'ai un message d'erreur de type :
    Erreur d’exécution '5' : Argument ou appel de procédure incorrect - Type non géré.

    J'ai regardé le type de format pour mes champs.. entier long

    J'ai donc rajouté une lien pour gérer ces deux champs numérique : dbLong
    Et ça fonctionne !!

    Merci pour l'astuce et pour la rectification du type de champ.
    Vous m'enlevez un gros poids et pour de futurs exports txt je pense que ce bout de code va en aider plus d'un, MERCI

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

Discussions similaires

  1. Probléme mise en forme du texte
    Par Rifton007 dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 21/09/2008, 10h02
  2. Mise en forme - Export en fichier txt
    Par Rikou31 dans le forum IHM
    Réponses: 3
    Dernier message: 20/08/2008, 12h21
  3. Problème Mise en forme conditionnelle
    Par GEOPIXEL dans le forum IHM
    Réponses: 1
    Dernier message: 17/04/2008, 15h15
  4. [Mail] problème : mise en forme html d'un mail
    Par minie dans le forum Langage
    Réponses: 2
    Dernier message: 13/06/2007, 15h45
  5. problème mise en forme de balises ul li dans IE 6
    Par gaboo_bl dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 12/01/2007, 10h38

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