Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/04/2011, 11h08   #1
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Par défaut Requête OK en SQL Access mais KO en SQL VBA

Bonjour,
J'ai une requête qui s’exécute sans problème avec le DoCmd.OpenQuerry quand je la crée avec l'assistant d'access, mais met plus de 11h et n'aboutit pas quand je passe par VBA en DoCmd.RunSql.

C'est une requête INSERT dans une table ayant une clef. La table contient déjà 3,5 millions d'enregistrements.

Quelqu'un à une idée ? Merci.
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h29   #2
Membre régulier
 
Inscription : juin 2010
Messages : 77
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 77
Points : 76
Points : 76
Bonjour,

Quel type de données ajoutez-vous à votre table?? Il y a beaucoup de champ?

La requête elle ressemble à quoi (en vb)??

merci pour ces quelques précisions...
Lagnio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h40   #3
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Bonjour et merci de ta rapidité

Alors, les types de champs : numériques, texte, date heures
nombre de champ : une quarantaine

la requête :
Code :
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
    Sql = "INSERT INTO EnCours_Segment (OT_Code_OT, Centre, Centre_Destination, OP_Date_Expediabilite, Fournisseur_Centre," & _
          " Fournisseur_Transport, Transit_Demande, Blocage_ALE, Expedition_Manquee, LT_Expedition, Retard_Expedition, LT_ALE_Sur_Centre," & _
          " Delai_RTV_Transit, Delai_Contractuel_Transit, Retard_Sur_Centre, LT_Transport, Delai_Contractuel_Transport, Delai_RTV_Transport," & _
          " Retard_En_Transport, Semaine, Vin, CLE, DcDcz, Compte, Pays, PDC_Reel, Flag_Fin, Semaine_Mesure_Vin, Transport_Demande," & _
          " Fournisseur_OK, Retard_Prestation_ALE, Mode, Semaine_Sortie_Centre, LT_Hors_ALE, Alea, Type_Segment)" & _
          " SELECT OT.OT_Code_OT," & _
          " OP.OP_Centre," & _
          " OT.OT_Centre_Arrivee," & _
          " OP.OP_Date_Expediabilite," & _
          " OP.Fournisseur," & _
          " OT.Fournisseur," & _
          " IIf(OP.Rang_Demande>0,1,0)," & _
          " OP.Blocage_ALE," & _
          " OP.Expediabilite_Manquee_Totale," & _
          " OP.Duree_Prestation,"
    Sql = Sql & " IIf(Retard_Prestation>0,Retard_Prestation,0)," & _
          " OP.LT_ALE," & _
          " OP.OP_Delai_OP," & _
          " OP.OP_Delai_Fournisseur," & _
          " OP.Retard_ALE_Global_Transit," & _
          " OT.LT_Transp," & _
          " OT.OT_Delai_Fournisseur," & _
          " OT.OT_Delai_OT," & _
          " IIf(LT_Transp-OT_Delai_OT>0,LT_Transp-OT_Delai_OT,0)," & _
          " OT.Semaine," & _
          " C.OL_No_Chassis," & _
          " C.OL_Position_CLE," & _
          " C.DcDcz,"
    Sql = Sql & " C.Compte_Dest," & _
          " C.Pays_Dest," & _
          " C.PDC_Reel," & _
          " C.Flag_Fin," & _
          " C.Semaine," & _
          " IIf(OT.Rang_Demande>0,1,0)," & _
          " IIf(OP.Duree_Prestation+OT.LT_Transp-OP.OP_Delai_Fournisseur-OT.OT_Delai_Fournisseur>0,0,IIf(OP.Expediabilite_Manquee_Totale>0,0,1))," & _
          " IIf(OP.LT_Autre_Prestation_ALE-OP.LT_Autre_Prestation_ALE_Cont>0,OP.LT_Autre_Prestation_ALE-OP.LT_Autre_Prestation_ALE_Cont,0)," & _
          " OT.OT_Mode," & _
          " OP.Semaine," & _
          " Tmp_Delai.Delai-OP.LT_ALE," & _
          " IIf(OP_Date_Expediabilite=OP_Date_DEP_Reelle,0,1)," & _
          " IIf(Flag_vers_TD_ZG=1,'PDC',IIf(OT_Rang_Effectif=2,'CLE','CI'))" & _
          " FROM EnCours_Chassis AS C, EnCours_OP AS OP, EnCours_OT AS OT, Tmp_Delai" & _
          " WHERE C.OL_No_Chassis=OP.OL_No_Chassis" & _
          "   AND OP.OL_No_Chassis=OT.OL_No_Chassis" & _
          "   AND OP.OP_Centre = OT.OT_Centre_Depart" & _
          "   AND OP.Mesurabilite='OK'" & _
          "   AND OT.Mesurabilite='OK'" & _
          "   AND OP.Flag_New+OT.Flag_New>0" & _
          "   AND OP.OP_Prestation='TRA'" & _
          "   AND OP.OP_Rang_Primaire_Effectif=OT_Rang_Effectif-1" & _
          "   AND OP.OP_Date_DEP_Reelle=Tmp_Delai.Date_Debut" & _
          "   AND OP.OP_Date_FIP_Reelle=Tmp_Delai.Date_Fin"
merci
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 11h50   #4
Expert Confirmé Sénior
 
Avatar de f-leb
 
Homme Fabien
Enseignant
Inscription : janvier 2009
Messages : 2 410
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 41
Localisation : France, Sarthe (Pays de la Loire)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2009
Messages : 2 410
Points : 4 439
Points : 4 439
bonjour,

Citation:
Envoyé par chahine92 Voir le message
B... mais met plus de 11h et n'aboutit pas quand je passe par VBA en DoCmd.RunSql.

C'est une requête INSERT dans une table ayant une clef. La table contient déjà 3,5 millions d'enregistrements.
peut-être en utilisant plutôt la méthode Execute de l'objet QueryDef:
QueryDef.Execute Method
f-leb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 13h50   #5
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Bonjour,
ça ne change rien avec la méthode execute
Code :
1
2
    Set qdfInsert = CurrentDb.CreateQueryDef("", Sql)
    qdfInsert.Execute
par contre la machine chauffe énormément et le bruit du ventilo fait peur
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/04/2011, 16h31   #6
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Bon, je me suis résolu à faire la requête en deux temps :
1 - comme c'est une insertion des données d'une table A déjà volumineuse dans une autre table B très volumineuse, ayant toutes les deux une clé primaire (donc possibilité de bcp de doublons), j'insère d'abord les enregistrements de A dans une table intermédiaire C, donc forcément cette table est bcp plus légère.
2 - j'exécute ma requête en se basant sur la table C.

C'est une solution de dépannage qui ne répond pas à ma question initiale : pourquoi une requête conséquente passe bien avec l'assistant et non en VBA ?
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 08h46   #7
Membre régulier
 
Inscription : juin 2010
Messages : 77
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 77
Points : 76
Points : 76
Bonjour,

Par simple curiosité votre table "EnCours_Segment" est régit sous les règles de conception du relationnel ou de l'objet???

Sinon, la seule erreur que j'ai repéré dans votre requête est l'absence du terme "VALUES" (mais qui peut avoir été tronqué lors du copier/coller)

Rappel syntaxe Insertion SQL
Code :
1
2
INSERT INTO [Nom_table] ([liste_champ])
  VALUES ([valeur1, valeur2.........,valeur_n])
cela peut être une cause possible de la non exécution de la requête, à creuser...
Lagnio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 10h57   #8
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Bonjour,
Je ne comprends pas "régit sous les règles de conception du relationnel ou de l'objet", mais c'est une simple table dans une bdd (c'est la seule table de ma bdd et n'est liée à aucune autre table). En fait comme mes tables sont volumineuses, elle sont splittées une à une dans des bases différentes, et j'ai un applicatif (bdd acces) dont les tables pointent sur toutes les tables des autres bdd bdd (tables liées).
Autrement pas d'erreur dans le SQL, le VALUES est facultatif (du moins pour acces).
Merci, et dans l'attente d'autres proposition si t'en a
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 15h55   #9
Membre régulier
 
Inscription : juin 2010
Messages : 77
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juin 2010
Messages : 77
Points : 76
Points : 76
Re-

Ok, pour le "régit" en fait tu utilises access que pour l'archivage de données.

Bref, pour le "Values", tu as certainement raison, il n'est pas obligatoire dans access, mais il doit l'être pour le code que tu passes après "RunSQL" puisque là tu fais appel à la syntaxe standard du SQL non plus au dialect access (du moins je crois...)

Sinon, j'ai déjà eu un problème du même style. Cela provenait des données que j'essayais d'insérer, il y avait soit des champs contenant la valeur "NULL" (et null interdit dans la table destination) et aussi des champs contenant des caractères utilisé par le SQL (style le caractère apostrophe non protégé...) pour y remédier, je vérifais la cohérence de mes données avant de les insérer...

Sinon, il n'y a pas une petite boucle de cacher quelques part dans ton programme appelant??

Voilà en espérant que ces 2 petites pistes pourront t'aider!

Bon courage
Lagnio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 16h40   #10
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Rebonjour Lagnio et merci pour ton intérêt,

la syntaxe :
Code :
1
2
3
 INSERT INTO table1 (champ1, champ2)
            SELECT champ3, champ4
            FROM table2
passe bien en VBA : testé.

la piste que tu proposes me parait intéressante, mais je ne crois pas que ça vient de là, puisque quand je passe par une table intermédiaire dans laquelle je mets seulement les enregistrements pouvant être ajoutés à ma table finale (j'élimine les Id déja existants dans ma table finale), la requête aboutit.

Perso, je penche plus vers un truc qui faciliterait l'exécution des requêtes sur des tables volumineuses (ici en l’occurrence je fais intervenir 4 tables dont l'une de 3,5 millions d'enregistrements (1GO) et les 3 autres plus d'un millions (500 mg en moy par tables)).

Peut être les limites d'access sont proches ...! ça serait dommage. Si c'est le cas je suis preneur d'idées pour éviter les limites d'access et faciliter le travail avec de grosses tables de données.

Merci encore
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 19h58   #11
Rédacteur
 
Avatar de LedZeppII
 
Homme
Maintenance données produits
Inscription : décembre 2005
Messages : 3 939
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 : 3 939
Points : 6 278
Points : 6 278
Bonsoir,

Peut-être que ça irait mieux avec des jointures entre les tables.

A la place de ...
Code :
1
2
3
4
5
6
7
8
9
10
11
          " FROM EnCours_Chassis AS C, EnCours_OP AS OP, EnCours_OT AS OT, Tmp_Delai" & _
          " WHERE C.OL_No_Chassis=OP.OL_No_Chassis" & _
          "   AND OP.OL_No_Chassis=OT.OL_No_Chassis" & _
          "   AND OP.OP_Centre = OT.OT_Centre_Depart" & _
          "   AND OP.Mesurabilite='OK'" & _
          "   AND OT.Mesurabilite='OK'" & _
          "   AND OP.Flag_New+OT.Flag_New>0" & _
          "   AND OP.OP_Prestation='TRA'" & _
          "   AND OP.OP_Rang_Primaire_Effectif=OT_Rang_Effectif-1" & _
          "   AND OP.OP_Date_DEP_Reelle=Tmp_Delai.Date_Debut" & _
          "   AND OP.OP_Date_FIP_Reelle=Tmp_Delai.Date_Fin"
quelque chose comme :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
          " FROM EnCours_Chassis AS C INNER JOIN " & _
          "      (EnCours_OP AS OP INNER JOIN EnCours_OT AS OT " & _
          "          ON OP.OL_No_Chassis = OT.OL_No_Chassis " & _
          "             And OP.OP_Centre = OT.OT_Centre_Depart) " & _
          "      ON C.OL_No_Chassis=OP.OL_No_Chassis, Tmp_Delai" & _
          " WHERE OP.Mesurabilite='OK'" & _
          "   AND OT.Mesurabilite='OK'" & _
          "   AND OP.Flag_New+OT.Flag_New>0" & _
          "   AND OP.OP_Prestation='TRA'" & _
          "   AND OP.OP_Rang_Primaire_Effectif=OT_Rang_Effectif-1" & _
          "   AND OP.OP_Date_DEP_Reelle=Tmp_Delai.Date_Debut" & _
          "   AND OP.OP_Date_FIP_Reelle=Tmp_Delai.Date_Fin"
Ensuite, avoir des index (ça inclut les clés) facilite la réalisation des jointures par le moteur de base de données,
et peut éviter que le fichier temporaire du moteur dépasse les 2Go, ce qui empêche la requête d'aller à son terme.
EnCours_Chassis (OL_No_Chassis)
EnCours_OP (OL_No_Chassis, OP_Centre)
EnCours_OT (OL_No_Chassis, OT_Centre_Depart)

A+
LedZeppII est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 12h49   #12
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Bonjour,
A la base j'avais des jointures, que j'ai cassé car c'était long. J'ai réessayé donc en mettant comme tu proposes et les index aussi, mais c'est pire qu'avant, la requête n'avance que d'un trait au lieu de 4 avant, et reste bloquée.
Merci pour l'idée des index, j'avais pas ça en tête ça va certainement m'aider par la suite.
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 13h27   #13
Rédacteur

 
Avatar de Maxence HUBICHE
 
Homme Maxence HUBICHE
Formateur et Développeur - Conseil en Informatique
Inscription : juin 2002
Messages : 3 687
Détails du profil
Informations personnelles :
Nom : Homme Maxence HUBICHE
Âge : 42
Localisation : France, Val d'Oise (Île de France)

Informations professionnelles :
Activité : Formateur et Développeur - Conseil en Informatique

Informations forums :
Inscription : juin 2002
Messages : 3 687
Points : 6 516
Points : 6 516
Envoyer un message via MSN à Maxence HUBICHE Envoyer un message via Skype™ à Maxence HUBICHE
Citation:
Envoyé par chahine92 Voir le message
Peut être les limites d'access sont proches ...! ça serait dommage. Si c'est le cas je suis preneur d'idées pour éviter les limites d'access et faciliter le travail avec de grosses tables de données.
ben... avec de tels volumes... j'espère que tu travailles en local, avec le fichier installé sur ton poste, et sans accès aux serveurs

Solution
Un fichier adp (disponible depuis Access 2000) basé (donc) sur un server SQLServer (y compris SQLExpress) et là, ca devrait booster un peu tout ça...
__________________
1formaxion, une formation de qualité, des formateurs compétents
Mes tutoriels et vidéos :
Tableaux croisés dynamiques, Access les Bases, et les autres !
Maxence HUBICHE est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 16h47   #14
Invité de passage
 
Inscription : mai 2008
Messages : 13
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 13
Points : 3
Points : 3
Bonjour,
Je confirme que c'est en local
Merci pour l'idée d'ADP, encore faut il que je m'y autoforme, je vais regarder cette piste (je ne suis pas sur d'avoir toutes les billes, serveurs, et même la possibilité d'utiliser SQL SERVER.
A bientot
chahine92 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h09.


 
 
 
 
Partenaires

Hébergement Web