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 :

Sql 'Insert into et Select Max' ,pour une boucle sur une centaine de Tables vers une seule Table [AC-2013]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai Avatar de kikinou61
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Sql 'Insert into et Select Max' ,pour une boucle sur une centaine de Tables vers une seule Table
    Bonjour,
    J’ai créé une requête sur Access 2013 qui extrait d’une table importée d’un fichier txt des valeurs et qui a pour but de les ajouter à une autre Table(Table1).
    J’ai ensuite transformé cette requête au format sql, afin de pouvoir traiter les 100 tables importées tous les jours de fichiers txt ; mais étant débutante sur VBA et après avoir consulté de nombreux forums, je suis bloquée si près du but.
    J’ai réussi à créer le script d’importation automatique de toutes les fichiers txt, également le script d’ajout d’une colonne « id » à chaque table créées après l’importation (grâce à votre aide cet été), et aussi le script de suppression de toutes les tables une fois la requête exécutée(ne fonctionne pas).

    Voici le code qui ne fonctionne pas et me provoque l’erreur suivante : Erreur d'exécution 3067 : la requête doit être construite à partir d'au moins une table ou une requête source.


    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
     
     Public Sub Table1_SQL()
     
     Dim strSQL As String
     Dim db As DAO.Database
     Dim tdf As DAO.TableDef
     Dim Table1 As DAO.TableDef
     Set db = CurrentDb
     
     
     For Each tdf In db.TableDefs
        If tdf.Name Like "G10*" Then
     
            strSQL = "INSERT INTO Table1 ( Ligne, DateJ, Heure, CodPro, Pds_insuf, Pds_Acc )" _
                       & "SELECT Max(IIf([ID]=7,[Champ1])) AS Ligne, Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ," _
                       & "Max(IIf([ID]=9,Right([Champ1],8))) AS Heure, Max(IIf([ID]=15,Right([Champ1],6))) AS CodPro," _
                       & "Max(IIf([ID]=43,Right(Left$([Champ1],30),9))) AS Pds_insuf, Max(IIf([ID]=45,Right(Left$([Champ1],30),9))) AS Pds_Acc" _
                       & "FROM tdf.name;"
     
            DoCmd.RunSQL strSQL
     
        End If
     
     Next
      MsgBox ("terminé")
    End Sub
    Je sens que je ne suis pas loin, il y a certainement un problème de syntaxe ou autre, et je tourne en rond. Merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 661
    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 661
    Points : 14 643
    Points
    14 643
    Par défaut
    bonsoir,
    des espaces sont manquants et tdf.name étant une variable, elle doit être en dehors des apostrophes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            strSQL = "INSERT INTO Table1 ( Ligne, DateJ, Heure, CodPro, Pds_insuf, Pds_Acc )" _
                       & " SELECT Max(IIf([ID]=7,[Champ1])) AS Ligne, Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ," _
                       & " Max(IIf([ID]=9,Right([Champ1],8))) AS Heure, Max(IIf([ID]=15,Right([Champ1],6))) AS CodPro," _
                       & " Max(IIf([ID]=43,Right(Left$([Champ1],30),9))) AS Pds_insuf, Max(IIf([ID]=45,Right(Left$([Champ1],30),9))) AS Pds_Acc" _
                       & " FROM " & tdf.name & ";"
    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 ?

  3. #3
    Membre à l'essai Avatar de kikinou61
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Type de données incompatibles...
    Bonjour tee_grandbois !

    Merci pour la réponse ! Il me reste encore un message mais différent :
    "Type de données incompatibles dans l'expression du critère" et le surlignage jaune se met sur la cmd DoCmd.RunSQL strSQL.

    Je cherche dans le forum au cas où je trouverai la réponse avant votre prochaine connexion.

    Dans l'attente,

  4. #4
    Membre à l'essai Avatar de kikinou61
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Syntaxe du Critère ???
    Re-bonjour !

    Visiblement il y a bien un problème de syntaxe dans la partie du code avec like "G10*",
    je l'ai modifié comme suit, mais maintenant je n'ai plus de message d'erreur mais rien de s'ajoute à ma Table1. Il ne doit pas reconnaître le nom des tables qui se presentent comme ça :Nom : CaptureTables.JPG
Affichages : 308
Taille : 21,5 Ko


    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
    Public Sub Table1_SQL()
     
     Dim strSQL As String
     Dim db As DAO.Database
     Dim tdf As DAO.TableDef
     Dim Table1 As DAO.TableDef
     Set db = CurrentDb
     
     
     
     For Each tdf In db.TableDefs
        If tdf.Name Like " & G10* & " Then
     
          strSQL = "INSERT INTO Table1 ( Ligne, DateJ, Heure, CodPro, Pds_insuf, Pds_Acc )" _
                       & " SELECT Max(IIf([ID]=7,[Champ1])) AS Ligne, Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ," _
                       & " Max(IIf([ID]=9,Right([Champ1],8))) AS Heure, Max(IIf([ID]=15,Right([Champ1],6))) AS CodPro," _
                       & " Max(IIf([ID]=43,Right(Left$([Champ1],30),9))) AS Pds_insuf, Max(IIf([ID]=45,Right(Left$([Champ1],30),9))) AS Pds_Acc" _
                       & " FROM " & tdf.Name & ";"
     
            DoCmd.RunSQL strSQL
     
        End If
     
     Next
      MsgBox ("terminé")
    End Sub

  5. #5
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 661
    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 661
    Points : 14 643
    Points
    14 643
    Par défaut
    bonsoir,
    Visiblement il y a bien un problème de syntaxe dans la partie du code avec like "G10*",
    absolument pas, cette syntaxe est correcte, il ne faut rien changer.
    je l'ai modifié comme suit, mais maintenant je n'ai plus de message d'erreur mais rien de s'ajoute à ma Table1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     If tdf.Name Like " & G10* & " Then
    mauvaise idée, aucune de tes tables ne commençant par " & G10* & ", il ne rentrera jamais dans la boucle et n'ajoutera donc jamais rien dans Table1.
    "Type de données incompatibles dans l'expression du critère" et le surlignage jaune se met sur la cmd DoCmd.RunSQL strSQL.
    c'est un problème de données, en premier lieu, poste le descriptif (impression d'écran des tables en mode création) de Table1 et une des tables commençant par G10. Ensuite, ajoute Debug.Print strSQL avant le DoCmd.RunSQL strSQL dans ton code. Le résultat s'affichera dans la fenêtre d'exécution (Ctrl+G pour la faire apparaitre dans VBA), fait un copier/coller du résultat et poste-le.
    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
    Membre à l'essai Avatar de kikinou61
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Syntaxe champs importés
    Bonjour,

    Voici les structures des deux tablesNom : table1_structure.JPG
Affichages : 339
Taille : 56,3 KoNom : t_G10_donnees.JPG
Affichages : 317
Taille : 68,0 KoNom : t_G10_structure.JPG
Affichages : 326
Taille : 49,4 Ko

    J'ai ajouté une image de la table importée avec un modèle des données qu'elle contient.
    Lorsque j'exécute la requête directement sur Access, cela ne fonctionne pas pour les champs numériques de la Table1, car il y a des points à la place des virgules pour les valeurs visées.

    En ne conservant que les champs Ligne et CodPro (texte court) le script fonctionne. Donc les format Date, Heure , et numérique sont à forcer.
    Je cherche encore pour trouver la syntaxe, mais c'est compliqué.

    Voici le résultat du Debug :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO Table1 ( Ligne, DateJ, Heure, CodPro, Pds_insuf, Pds_Acc ) SELECT Max(IIf([ID]=7,[Champ1])) AS Ligne, Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ, Max(IIf([ID]=9,Right([Champ1],8))) AS Heure, Max(IIf([ID]=15,Right([Champ1],6))) AS CodPro, Max(IIf([ID]=43,Right(Left$([Champ1],30),9))) AS Pds_insuf, Max(IIf([ID]=45,Right(Left$([Champ1],30),9))) AS Pds_Acc FROM G10011217014028_txt;
    Merci encore pour le temps consacré à mon problème.

  7. #7
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 661
    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 661
    Points : 14 643
    Points
    14 643
    Par défaut
    Bonsoir,
    pour les dates et heures, il faut vérifier que les positions de début sont correctes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ, Max(IIf([ID]=9,Right([Champ1],8))) AS Heure
    pour les champs numériques, pour changer le séparateur de décimales, il faut utiliser la fonction Replace() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Max(IIf([ID]=43,Replace(Right(Left$([Champ1],30),9),".",","))) AS Pds_insuf
    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
    Membre à l'essai Avatar de kikinou61
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Syntaxe ok
    Bonjour !

    Ca y est ! j'y suis presque. Le code est bon maintenant, ce sont mes fichiers txt qui ont plein de caractères spéciaux et autres non désirés, ça me permet de mieux interpréter les messages sur VBA.
    Du coup, je me permets une dernière question : Comment puis-je ajouter le nom du fichier txt dans le nouveau champ Nom_Txt dans la Table1 ?

    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
    Public Sub Table2_SQL()
     
     Dim strSQL As String
     Dim db As DAO.Database
     Dim tdf As DAO.TableDef
     Dim Table1 As DAO.TableDef
     Set db = CurrentDb
     
     
     For Each tdf In db.TableDefs
        If tdf.Name Like "G10*" Then
     
          strSQL = "INSERT INTO Table1 ( Ligne, DateJ, Heure, CodPro, Pds_insuf, Pds_Acc, Surpoids)" _
                       & " SELECT Max(IIf([ID]=7,[Champ1])) AS Ligne, Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ," _
                       & " Max(IIf([ID]=9,Right([Champ1],8))) AS Heure, Max(IIf([ID]=15,Right([Champ1],6))) AS CodPro," _
                       & " Max(IIf([ID]=43,Replace(Right(Left$([Champ1],30),9),""."","",""))) AS Pds_insuf, Max(IIf([ID]=45,Replace(Right(Left$([Champ1],30),9),""."","",""))) AS Pds_Acc, Max( IIf( [ID]=51, IIf(IsNull([Champ1]), 0, Replace(Right(Left$([Champ1],30),9),""."","","")))) AS Surpoids" _
                       & " FROM " & tdf.Name & ";"
     
            Debug.Print strSQL
            DoCmd.RunSQL strSQL
    End If
     
     Next
        MsgBox ("terminé")
    End Sub
    Merci beaucoup pour cette aide précieuse ! J'ai fais un grand pas dans mes démarches sur VBA.

  9. #9
    Expert éminent sénior
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 661
    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 661
    Points : 14 643
    Points
    14 643
    Par défaut
    Bonsoir,
    comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          strSQL = "INSERT INTO Table1 ( Ligne, DateJ, Heure, CodPro, Pds_insuf, Pds_Acc, Surpoids, Nom_Txt)" _
                       & " SELECT Max(IIf([ID]=7,[Champ1])) AS Ligne, Max(IIf([ID]=9,Right(Left$([Champ1],17),10))) AS DateJ," _
                       & " Max(IIf([ID]=9,Right([Champ1],8))) AS Heure, Max(IIf([ID]=15,Right([Champ1],6))) AS CodPro," _
                       & " Max(IIf([ID]=43,Replace(Right(Left$([Champ1],30),9),""."","",""))) AS Pds_insuf, Max(IIf([ID]=45,Replace(Right(Left$([Champ1],30),9),""."","",""))) AS Pds_Acc, Max(IIf( [ID]=51, IIf(IsNull([Champ1]), 0, Replace(Right(Left$([Champ1],30),9),""."","","")))) AS Surpoids" _
                       & ", """ & tdf.Name & """ AS Nom_Txt" _
    		   & " FROM " & tdf.Name & ";"
    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 ?

  10. #10
    Membre à l'essai Avatar de kikinou61
    Femme Profil pro
    Technicien maintenance
    Inscrit en
    Février 2016
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 55
    Localisation : France, Orne (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2016
    Messages : 14
    Points : 12
    Points
    12
    Par défaut Excellent !
    Bonjour !

    Merci pour tout et bonnes fêtes de fin d'année !

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/07/2016, 12h52
  2. Exporter une seule table vers une nouvelle table excel
    Par yo.ourti dans le forum ODS et reporting
    Réponses: 1
    Dernier message: 18/04/2014, 11h21
  3. [SQL] Insert into select(s)
    Par tidou95220 dans le forum SAS Base
    Réponses: 3
    Dernier message: 25/03/2013, 12h14
  4. Comment valider une de deux Option dans un Sql (Insert into)
    Par r.mehdi dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/05/2008, 16h20
  5. erreur SQL ...INSERT INTO
    Par naidinp dans le forum ASP
    Réponses: 20
    Dernier message: 18/09/2003, 11h38

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