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

Requêtes et SQL. Discussion :

Requete Sql sur une table temporaire pour dispatcher les informations dans les tables correspondantes [AC-2007]


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut Requete Sql sur une table temporaire pour dispatcher les informations dans les tables correspondantes
    Bonjour,

    Je cherche à effectuer des requetes sur une table temporaire qui contiendrait l import d'un fichier csv et qui en fonction de ce qu elle trouve dans le champ 1 envoie la ligne complete dans une table définie. Ce code serai englobé dans du vba.

    Voici un bout de mon code

    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
    Sub TransfertAllCsvInDir()
     On Error GoTo Erreur
     Dim Fic As String
     Dim Nom_Tbl As String 
     
     Dossier = "C:\Documents and Settings\"
     Fic = Dir(Dossier & "*.CSV", vbNormal)
     
     
     
     Do While (Fic = "")
     
            'j'importe le fichier csv
             DoCmd.TransferText acLinkDelim, "spec import" , Tabledest , Dossier & Fic, True
     
             'j' ajoute les données dans la table temporaire
             DoCmd.RunSQL "INSERT INTO Tabledest ( Champ1, Champ2, Champ3,Champ4 )SELECT Champ1 AS Expr1, Champ2 AS Expr2, Champ3 AS Expr3, Champ4 AS Expr4 FROM [" & Nom_Tbl1 & "];"
     
            'je libère le fichier
            DoCmd.DeleteObect acTable, Nom_Tbl
     
         Fic = Dir
     Loop
     
    Exit Sub
    Erreur:
     
     End Sub
    Est ce que quelqu'un aurait une idée?
    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 286
    Points : 383
    Points
    383
    Par défaut
    J'ai pas vraiment testé, mais cela pourrait t'inspirer
    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
    Sub test()
        Dim Fic As String
        Dim Dossier As String
        Dim TableDest As String
        Dim StrSql As String
        Dim rs As Recordset
     
        Dossier = "C:\Documents and Settings\"
        Fic = "Monfichier.CSV"
        TableDest = "Export"
     
        'Import du Fichier CSV dans la table Import
        DoCmd.TransferText acLinkDelim, "spec import", "Import", Dossier & Fic, True
     
        'Lecture de chaque ligne de la table import
        Set rs = New ADODB.Recordset
        StrSql = "SELECT Champ1, Champ2, Champ3, Champ4 FROM Import"
        rs.Open StrSql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        If Not rs.EOF AND Not rs.BOF Then 'il existe au moins un enregistrement
            With rs
                Do While Not .EOF AND Not .BOF
                    If !Champ1 = "TOTO" Then 'Là il faut placer la condition permettant
                        'l'insertion
                        StrSql = "INSERT INTO Tabledest ( Champ1, Champ2, Champ3, Champ4 )"
                        StrSql = StrSql & " SELECT " & !Champ1 & "," & !champ2 & "," & !Champ3 & "," & !Champ4
                        StrSql = StrSql & " FROM [Import]"
                        DoCmd.RunSQL StrSql, 0
                    End If
                    .MoveNext
                Loop
            End With
        End If
        rs.Close
        Set rs = Nothing
    End Sub
    Michel

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci de ta réponse!

    J'ai adapté le code et testé mais j'ai une erreur au niveau de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set rs = New ADODB.Recordset
    L'erreur c'est : type defini par l'utilisateur non definie

    J'ai rajouté ADODB à la definition du recordset car tu ne l avais pas mis, mais ca ne marche pas! Je ne sais pas si j'ai bien fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim rs As ADODB.Recordset
    Mon code en intégralite :

    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
    Sub SearchReadImportCSV()
     
        Dim Fic As String
        Dim Dossier As String
        Dim TableDest As String
        Dim StrSql As String
        Dim rs As ADODB.Recordset
        Dim Nom_Tbl, Nom_Tbl1, Nom_Tbl2, Nom_Tbl3, Nom_Tbl4 As String
     
    'obtient le premier fichier ou répertoire qui est dans "C:\"
     Dossier = "C:\Documents and Settings\"
     Fic = Dir(Dossier & "*.CSV", vbNormal)
     TableDest = "Import"
     
     On Error GoTo Erreur
     Do While (Fic = "")
    'Import du Fichier CSV dans la table Import
        DoCmd.TransferText acLinkDelim, "spec", "Import", Dossier & Fic, True
     
        'Lecture de chaque ligne de la table import
        Set rs = New ADODB.Recordset
        StrSql = "SELECT Champ1, Champ2, Champ3, Champ4 FROM Import"
        rs.Open StrSql, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
        If Not rs.EOF And Not rs.BOF Then 'il existe au moins un enregistrement
            With rs
                Do While Not .EOF And Not .BOF
                    If !Champ1 = "ALPHA" Then 'Là il faut placer la condition permettant
                        'l'insertion
                        StrSql = "INSERT INTO Tabledest ( Champ1, Champ2, Champ3, Champ4 )"
                        StrSql = StrSql & " SELECT " & !Champ1 & "," & !champ2 & "," & !Champ3 & "," & !Champ4
                        StrSql = StrSql & " FROM [Nom_Tbl1]"
                        DoCmd.RunSQL StrSql, 0
                    End If
                    ElseIf !Champ1 = "BETA" Then 'Là il faut placer la condition permettant
                        'l'insertion
                        StrSql = "INSERT INTO Tabledest ( Champ1, Champ2, Champ3, Champ4 )"
                        StrSql = StrSql & " SELECT " & !Champ1 & "," & !champ2 & "," & !Champ3 & "," & !Champ4
                        StrSql = StrSql & " FROM [Nom_Tbl2]"
                        DoCmd.RunSQL StrSql, 0
                    End If
                    ElseIf !Champ1 = "GAMMA" Then 'Là il faut placer la condition permettant
                        'l'insertion
                        StrSql = "INSERT INTO Tabledest ( Champ1, Champ2, Champ3, Champ4 )"
                        StrSql = StrSql & " SELECT " & !Champ1 & "," & !champ2 & "," & !Champ3 & "," & !Champ4
                        StrSql = StrSql & " FROM [Nom_Tbl3]"
                        DoCmd.RunSQL StrSql, 0
                    End If
                    If !Champ1 = "DELTA" And !Champ5 = "DZETA" Then  'Là il faut placer la condition permettant
                        'l'insertion
                        StrSql = "INSERT INTO Tabledest ( Champ1, Champ2, Champ3, Champ4 )"
                        StrSql = StrSql & " SELECT " & !Champ1 & "," & !champ2 & "," & !Champ3 & "," & !Champ4
                        StrSql = StrSql & " FROM [Nom_Tbl4]"
                        DoCmd.RunSQL StrSql, 0
                    End If
                    .MoveNext
                Loop
            End With
        End If
        rs.Close
        Set rs = Nothing
     
        .MoveNext
        Loop
    Exit Sub
    Erreur:
     
    End Sub

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2008
    Messages : 286
    Points : 383
    Points
    383
    Par défaut
    Je n'ai pas ce type de problème
    Je crois (sans en être totalement sûr), qu'il te faut référencer "active data object x.x Library"
    (Menu outils/références quand tu affiche le code VB)

    Michel

  5. #5
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Pourrai-tu préciser exactement ce que tu cherches à faire ?

    Ce que je comprends :
    Tu importes un fichier csv dans une table nommée Import.
    Tu dispatches les enregistrements de la table Import dans 4 tables, à l'aide requêtes ajouts, en fonction de ce que contient le premier champ (Champ1).

    Pour moi, ça peut se faire avec 4 requêtes ayant chacune une clause WHERE adéquate.

    Par exemple si les Champ1='ALPHA' vont dans Nom_Tbl1 et
    les Champ1='BETA' vont dans Nom_Tbl2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        ' Insertion de tous les ALPHA de Import dans la table dont le nom est contenu dans Nom_Tbl1
        StrSql = "INSERT INTO [" & Nom_Tbl1 & "] ( Champ1, Champ2, Champ3, Champ4 )"
        StrSql = StrSql & " SELECT Champ1, Champ2, Champ3, Champ4"
        StrSql = StrSql & " FROM  Import"
        StrSql = StrSql & " WHERE Import.Champ1='ALPHA'"
        DoCmd.RunSQL StrSql, 0
     
        ' Insertion de tous les BETA de Import dans la table dont le nom est contenu dans Nom_Tbl2
        StrSql = "INSERT INTO [" & Nom_Tbl2 & "] ( Champ1, Champ2, Champ3, Champ4 )"
        StrSql = StrSql & " SELECT Champ1, Champ2, Champ3, Champ4"
        StrSql = StrSql & " FROM  Import"
        StrSql = StrSql & " WHERE Import.Champ1='BETA'"
        DoCmd.RunSQL StrSql, 0
    On peut même envisager de sauver les requêtes et de les lancer avec DoCmd.OpenQuery, si les tables de destinantion sont toujours les mêmes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DoCmd.OpenQuery "Q_Import_Alpha_Ds_TblDest1"
    DoCmd.OpenQuery "Q_Import_Beta_Ds_TblDest2"
    A+

  6. #6
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour votre aide !

    Effectivement j'avais oublié de rajouter la réference ( je l ai confondue avec la DAO )

    LedZep, tu as bien compris ce que je cherche à faire, à la seule nuance que je voudrais qu'une serie de fichier csv d'un répertoire fixe soit importer dans une table temporaire un a un, puis dispatcher dans les 4 tables fixes ( elles ne bougeront pas)

    Voici mon code pour le moment:

    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
    Sub ImportEtTraitementFichierCSV()
     
    Dim Fic As String
    Dim Dossier As String
    Dim Tabledest As String
    Dim StrSql As String
    Dim Nom_Tbl1, Nom_Tbl2, Nom_Tbl3, Nom_Tbl4 As String
     
    Dossier = "D:\Documents and Settings\"
    Fic = Dir(Dossier & ".CSV", vbNormal)
     
    Tabledest = "Import"
    Nom_Tbl1 = "Alpha"
    Nom_Tbl2 = "Beta"
    Nom_Tbl3 = "Gamma"
    Nom_Tbl4 = "Delta"
     
    On Error GoTo Erreur
    Do While (Fic = "")
     
        'Importation du fichier csv selectionnÈ
        DoCmd.TransferText acLinkDelim, "spec", "Tabledest", Dossier & Fic, True
     
        'Insertion de toutes les informations concernant les Alpha
        StrSql = "INSERT INTO [ " & Nom_Tbl1 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Alpha'"
        DoCmd.RunSQL StrSql, 0
     
        'Insertion de toutes les informations concernant les Beta
        StrSql = "INSERT INTO [ " & Nom_Tbl2 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Beta'"
        DoCmd.RunSQL StrSql, 0
     
        'Insertion de toutes les informations concernant les Gamma
        StrSql = "INSERT INTO [ " & Nom_Tbl3 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Gamma'"
        DoCmd.RunSQL StrSql, 0
     
        'Insertion de toutes les informations concernant les Delta
        StrSql = "INSERT INTO [ " & Nom_Tbl4 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Gamma' AND Import.Champ5='Dzeta'"
        DoCmd.RunSQL StrSql, 0
     
     Loop
     
    Exit Sub
    Erreur:
     
    End Sub
    Le début de mon code ne fonctionne plus, la variable 'Fic' ne prend plus de fichier csv et je n'arrive pas à comprendre pourquoi, ça me rend folle car ça marchait auparavant!
    J'aimerai bien sauver les requêtes avec la commande DoCmd.OpenQuery mais je ne sais pas comment l'integrer dans mon code!

  7. #7
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Cette déclaration n'est pas 100% correcte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Nom_Tbl1, Nom_Tbl2, Nom_Tbl3, Nom_Tbl4 As String
    Il faudrait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Nom_Tbl1 As String, Nom_Tbl2 As String, Nom_Tbl3 As String, Nom_Tbl4 As String
    pour typer les quatre variables et non pas seulement la quatrième.


    Il faudrait remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fic = Dir(Dossier & ".CSV", vbNormal)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fic = Dir(Dossier & "*.CSV", vbNormal)
    Ensuite je verrai plutôt une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Do While (Fic <> "")
     
    ' ... traitements
     
        ' Continuer de lister les fichier
        ' -> fichier suivant 
        Fic = Dir()
    Loop
    Avant d'importer le fichier CSV dans la table Import, je pense qu'il est utile de la vider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        'Vider table Import
        DoCmd.RunSQL "DELETE FROM Import"
        'Importation du fichier csv selectionné
        DoCmd.TransferText acLinkDelim, "spec", "Import", Dossier & Fic, True
    Attention : dans ton code tu importes dans une table nommée Tabledest.

    A+

  8. #8
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    mince j'ai toujours un probleme au niveau de la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Fic = Dir(Dossier & "*.CSV", vbNormal)
    J'ai le message d'erreur : " Nom ou numéro de fichier incorrect"

  9. #9
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Es-tu sûre de ce que contient ta variable Dossier ?

    Au début de la discussion c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dossier = "C:\Documents and Settings\"
    et plus tard c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Dossier = "D:\Documents and Settings\"
    Si tu n'as pas de disque D: ... ... ça marche beaucoup moins bien.

    A+

  10. #10
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Je suis un
    J'ai cherché comme une idiote alors que c'était sous mes yeux!

    Du coup pour mon autre souci j'ai bien cherché avant de poster mais impossible de debogger la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DoCmd.TransferText acLinkDelim, "spec", "Import", Dossier & Fic, True
    Ma specification d'importation que j'ai appellée "spec" n'est pas trouvée par Access, pire lorsque j'essaie d'en recréer une j'ai un message d'erreur me disant que je n'ai plus d'assistant...
    En plus la variable Fic ne marche toujours pas car lorsque je passe la souris dessus elle m'affiche Fic=""
    Et lorsque je ne lance pas le mode deboggage j'ai un message d'erreur 3027 "Mise a jour impossible. La base de données ou l'objet est en lecture seule"...
    Est ce que je dois ouvrir ma base avec un mode spéciale car elle n est pas en lecture seule.
    Est ce que le problème de récupération des fichiers vient de la différence entre vbNormal et vbDirectory?

    Merci
    Bonne soirée

  11. #11
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Ma specification d'importation que j'ai appellée "spec" n'est pas trouvée par Access, pire lorsque j'essaie d'en recréer une j'ai un message d'erreur me disant que je n'ai plus d'assistant...
    Je ne sais pas si c'était le cas, mais lorsque le code VBA est en mode pas à pas ou qu'il est arrêté suite à une erreur,
    généralement on ne pas utiliser d'assistant Access.

    Et lorsque je ne lance pas le mode deboggage j'ai un message d'erreur 3027 "Mise a jour impossible. La base de données ou l'objet est en lecture seule"...
    Est ce que je dois ouvrir ma base avec un mode spéciale car elle n est pas en lecture seule.
    Non, pas à ma connaissance.

    Est ce que le problème de récupération des fichiers vient de la différence entre vbNormal et vbDirectory?
    Non. J'ai fait un test rapide, vbNormal c'est très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub TestDir()
    Dim Fic As String
    Dim Dossier As String
     
    Dossier = "C:\Documents and Settings\MonNom\My Documents\"
    Fic = Dir(Dossier & "*.mdb", vbNormal)
     
    Do While Fic <> ""
     
       MsgBox Dossier & vbCrLf & Fic
     
       Fic = Dir()
    Loop
    End Sub
    Par contre, ton dossier (C:\Documents and Settings\) il n'est pas un peu court ?

    A+

  12. #12
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Milles merci pour les explications!!!
    La recuperation des fichiers fonctionne tres bien.

    Il me reste des questions sur la partie requete sql:

    Le code passe directement en END SUB à la fin de mon premier bloc de requete, en plus il zappe completement la boucle "do while"
    Je n'arrive pas à comprendre pourquoi il ne passe pas à la suite.

    De plus la commande Delete du contenu de la table Import fonctionne très bien mais ensuite il m'importe mon fichier csv dans une table nommé Import.1 et je n'arrive pas à forcer le remplissage de la table Import.

    voici un extrait de mon code
    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
    Sub ImportEtTraitementFichierCSV()
     
    Dim Fic As String
    Dim Dossier As String
    Dim Nom_Tbl As String
    Dim StrSql As String
    Dim Nom_Tbl1 As String, Nom_Tbl2 As String, Nom_Tbl3 As String, Nom_Tbl4 As String
     
     
    Dossier = "C:\Documents and Settings\chemin\"
    Fic = Dir(Dossier & "*.csv", vbNormal)
     
     
    Nom_Tbl = "Import"
    Nom_Tbl1 = "Alpha"
    Nom_Tbl2 = "Beta"
    Nom_Tbl3 = "Gamma"
    Nom_Tbl4 = "Delta"
     
    On Error GoTo Erreur
    Do While Fic <> ""
     
        'Vider table Import
        DoCmd.RunSQL "DELETE FROM Import"
     
        'Importation du fichier csv selectionné
        DoCmd.TransferText acLinkDelim, "spec", "Import", Dossier & Fic, True
     
        'Insertion de toutes les informations concernant les FS
        StrSql = "INSERT INTO [ " & Nom_Tbl1 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Alpha'"
        DoCmd.RunSQL StrSql, 0
     
        'Insertion de toutes les informations concernant les VG
        StrSql = "INSERT INTO [ " & Nom_Tbl2 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Beta'"
        DoCmd.RunSQL StrSql, 0
     
        'Insertion de toutes les informations concernant les PV
        StrSql = "INSERT INTO [ " & Nom_Tbl3 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Gamma'"
        DoCmd.RunSQL StrSql, 0
     
        'Insertion de toutes les informations concernant les Details San
        StrSql = "INSERT INTO [ " & Nom_Tbl4 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ1='Delta' AND Import.Champ5='Dzeta'"
        DoCmd.RunSQL StrSql, 0
     
     Loop
     
    Exit Sub
    Erreur:
     
    End Sub

  13. #13
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Le code passe directement en END SUB à la fin de mon premier bloc de requete, en plus il zappe completement la boucle "do while"
    Je n'arrive pas à comprendre pourquoi il ne passe pas à la suite.
    Mets temporairement en commentaire la ligne On Error GoTo Erreur :
    De cette manière l'erreur s'affichera et le code s'arrêtera sur la ligne fautive.


    Attention, il manque une ligne pour passer au fichier suivant avant Loop.
    Si tu ne fais pas ça ... boucle infinie.


    De plus la commande Delete du contenu de la table Import fonctionne très bien mais ensuite il m'importe mon fichier csv dans une table nommé Import.1 et je n'arrive pas à forcer le remplissage de la table Import.
    Ha oui. Je croyai que tu importais (acImportDelim), mais en fait tu crée une table liée (acLinkDelim).
    Dans ce cas, il faut détruire la table avant de la recréer (lier) avec TransferText.
    Sinon on a des Import, Import1, Import2, Import3 ...
    Remplacer ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        'Vider table Import
        DoCmd.RunSQL "DELETE FROM Import"
    par ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        ' Supprimer tabe liée "Import"
        If DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import'") > 0 Then
           DoCmd.DeleteObject acTable, "Import"
        End If
    A+

  14. #14
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci pour la suppression de la table import c est exactement ce que je recherchais.

    Par contre le reste du code n est tojours pas executé :

    * Les insertions ne marchent pas, le premier bloc de requete d'insertion est parcouru mais non exécuté...

    * La boucle n est pas reprise et pourtant j'ai bien rajouté le Fic= Dir()

    Du coup je suis coincée!

  15. #15
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,

    Est-ce que tu pourrai poster une copie de ta base et des fichiers csv (au moins un par catégorie alpha, beta, gama, delta),
    le tout dans un fichier zip ?

    A+

  16. #16
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Je n'arrive pas à ajouter des pièces jointes! A chauqe fois le site plante!

  17. #17
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    bon j'ai essayé de rajouter une boucle if pour la prise en compte des requetes sur la table d'iimport mais comme au debut la boucle s arrete a l import, elle ne passe pas au fichier suivant, de plus aucunes de mes requetes n'est exéuté mis à part la première qui consiste supprimer la table d'import temporaire
    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
    Sub ImportEtTraitementFichierCSV()
     
    Dim Fic As String
    Dim Dossier As String
    Dim Nom_Tbl As String
    Dim StrSql As String
    Dim Nom_Tbl1 As String, Nom_Tbl2 As String, Nom_Tbl3 As String, Nom_Tbl4 As String
     
     
    Dossier = "C:\Documents and Settings\MyDocuments\"
    Fic = Dir(Dossier & "*.csv", vbNormal)
    Import = "Import"
    FileSystem = "Alpha"
    VolumGroup = "Beta"
    PhysicalVolum = "Gamma"
    DetailsSan = "Delta"
     
    On Error GoTo Erreur
    Do While Fic <> ""
     
       MsgBox Dossier & vbCrLf & Fic
     
        ' Supprimer tabe liée "Import"
        If DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import'") > 0 Then
           DoCmd.DeleteObject acTable, "Import"
        End If
     
        'Importation du fichier csv selectionné
        DoCmd.TransferText acLinkDelim, "spec", "Import", Dossier & Fic, True
     
        If DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import', And [Champ]='Alpha'") = True Then
     
        'Insertion de toutes les informations concernant les Alpha
        StrSql = "INSERT INTO [ " & Nom_Tbl1 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ4='Alpha'"
        DoCmd.RunSQL StrSql
     
        ElseIf DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import', And [Champ]='Beta'") = True Then
        'Insertion de toutes les informations concernant les Beta
        StrSql = "INSERT INTO [ " & Nom_Tbl2 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ4='Beta'"
        DoCmd.RunSQL StrSql
     
     
        ElseIf DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import', And [Champ]='Gamma'") = True Then
        'Insertion de toutes les informations concernant les Gamma
        StrSql = "INSERT INTO [ " & Nom_Tbl3 & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ4='Gamma'"
        DoCmd.RunSQL StrSql
     
     
        ElseIf DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import', And [Champ]='Delta'") = True Then
        'Insertion de toutes les informations concernant les Delta
        StrSql = "INSERT INTO [ " & DetailsSan & " ] (Champ1, Champ2, Champ3, Champ4, Champ5)"
        StrSql = StrSql & " SELECT champ1, Champ2, Champ3, Champ4, Champ5 "
        StrSql = StrSql & " FROM Import"
        StrSql = StrSql & " WHERE Import.Champ4='Delta' AND Import.Champ5='IS NOT NULL'"
        DoCmd.RunSQL StrSql
        End If
     
        Fic = Dir()
     
     Loop
     
     
     
    Exit Sub
    Erreur:

  18. #18
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonsoir,

    Je ne sais pas si tu as vu l'email que je t'ai envoyé.

    Les fichiers csv sont en fait des fichiers Excel xlxs.
    On ne peut pas les lier avec DoCmd.TransferText sans générer une erreur.

    En admettant que les fichiers soient réellement des csv, il faut que la spécification d'importation "spec" existe.
    Sinon, erreur.

    Il faut avant tout régler ce problème de type de fichier.
    csv ou xlxs ?

    Ce test ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        If DCount("*", "MSysObjects", "[Type] In (1,6) And [Name]='Import', And [Champ]='Alpha'") = True Then
    ...
    est inutile, et incorrect à cause de la partie critères qui est syntaxiquement incorrecte.
    La table MSysObjects n'a pas de champ nommé Champ.

    Si on en revient à la création de la table liée Import, es-tu capable de la créer à la main ?
    Si tu n'y arrive pas, il y a peu de chance qu'on puisse le faire en VBA.
    De toutes façons, je pense que la priorité est de déterminer la nature réelle des fichiers (csv ou xlxs).

    A+

  19. #19
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 20
    Points : 6
    Points
    6
    Par défaut
    Merci pour toutes tes explications et ta patience, j'ai resolu mon problème grâce à ton aide!

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

Discussions similaires

  1. 2 Requete sql sur une Table
    Par melongourmand dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 15/03/2013, 15h25
  2. Script Bash pour exécuter requete SQL sur une base Oracle
    Par Flipmode dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 28/11/2008, 18h18
  3. Réponses: 2
    Dernier message: 06/03/2008, 15h26
  4. Requete SQL sur une table dont le nom est dans une autre table
    Par orangepresse dans le forum Langage SQL
    Réponses: 3
    Dernier message: 29/09/2007, 14h32
  5. Réponses: 4
    Dernier message: 11/09/2006, 17h55

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