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 06/01/2011, 15h31   #1
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Par défaut ajout sans doublon sur date ( même journée)

Bonjour à tous,

J'ai une table temporaire qui est alimentée par une requête ajout dont l'un des champs est la date du jour ( plus précisément maintenant() ). Or je considère comme un doublon un enregistrement identique dont seul diffère le champ date en raison de l'heure de la journée.

Pour cela j'ai défini le champ date de la table temporaire avec une format date abrégé ( 16-juin-07) pensant que cela suffirait à tronquer le contenu du champ de sa partie horaire, mais après avoir fait une requête recherche de doublons dans la table sur ce champ précis cela ne me ramène rien alors qu'il devrait y avoir au moins deux enregistrements.

Alors je sollicite vos avis d'expert:
- j'envisage, pour éviter la partie horaire de la donnée, de modifier la requête ajout en mettant une contrainte de format au champ date =maintenant()...

Qu'en pensez-vous ? avez-vous une solution plus adaptée ?

Pour info, le code de la requête ajout ( sans format):
Code :
1
2
3
4
5
6
7
Dim sqla As String 'Copie des éléments de scolarité après modification
    sqla = "INSERT INTO Temp_journal_even ( id_eleve, id_sco, id_annee_scolaire, id_etab, date_even, id_type_even, id_nature_even )" & _
    "SELECT Table_scolarite.id_eleve, Table_scolarite.id_sco, Table_scolarite.id_annee_scolaire, Table_scolarite.id_etab, Now() AS Expr1, 1 AS Expr2, 1 AS Expr3 " & _
    "FROM Table_scolarite WHERE (((Table_scolarite.id_sco)=" & Form_SForm_sco.num_sco & "));"
 
 DoCmd.SetWarnings True
DoCmd.RunSQL sqla
En vous remerciant pour votre aide.
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 15h46   #2
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 863
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 863
Points : 10 743
Points : 10 743
Envoyer un message via MSN à jpcheck
salut,

2 questions pour ma part avant de pouvoir te proposer la solution la plus adequate :
- tu consideres qu'un doublon c'est sur la meme journee (peu importe l'heure), ou bien a la meme journee + meme horaire ?

- dans le cas ou tu as deja une donnee dans ta table (cas ou tu consideres au'il y aurait doublon apres insertion), tu ecrases les donnees existantes avec les nouvelles ou bien tu n'inseres pas de nouvelles donnees ?
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 15h50   #3
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Salut Jean-Philippe,

Merci pour ton coup de main, voici mes réponses:
- le doublon existe dans une même journée quelque soit l'heure;
- en cas de doublon , l'ajout ne doit pas se faire.
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h34   #4
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 863
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 863
Points : 10 743
Points : 10 743
Envoyer un message via MSN à jpcheck
ok,

mon approche dans ce cas serait :
- inserer dans une table temporaire tous les enregistrements (INSERT)
- supprimer dans cette table tous les enregistrements dont les infos sont deja dans la table finale (DELETE)
- inserer tous les enregistrements restant dans la table finale (INSERT)

Le fait de ne travailler que sur la date d'une journee fait juste qu'au lieu de faire un filtre/une jointure sur le champs champdate, tu travailles avec Format(champdate,"MM/DD/YYYY") par exemple
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h39   #5
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
bien , j'essaie de comprendre ta proposition:

- une autre table temp me permetrait de faire le tri des doublons avant insertion définitive dans la table: temp_journal_even
- en revanche c'est sur le tri que je ne te suis plus : peux-tu m'expliquer comment tu le ferais, en fonction du format de date ?
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h45   #6
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
j'ai par ailleurs pensé à expérimenter un index sur la table: temp_journal_even, afin d'éviter les doublons en prenant soin de de désactiver/ réactiver les messages d'erreur

reste que je sais pas si Now() est compatible avec une contrainte de format ...
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 16h56   #7
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 863
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 863
Points : 10 743
Points : 10 743
Envoyer un message via MSN à jpcheck
etape 1, on insert tous les enregistrements dans la table temp
Code SQL :
SELECT * INTO TEMP FROM TableDepart
etape 2, on supprime les lignes pour lesquelles on a deja des donnees dans TABLEFINALE
Code SQL :
DELETE TEMP.* WHERE TEMP.ID & format(dt,'yyyymmdd') IN (SELECT ID & format(dt,'yyyymmdd') FROM TABLEFINALE)
etape 3, on insert tous les enregistrements de la table temp dans TABLEFINALE
Code SQL :
INSERT INTO TABLEFINALE SELECT * FROM TEMP
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2011, 17h06   #8
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Je te remercie pour ces précisions, je teste demain matin ( pas le temps ce soir ) et te tiens informé .

A bientôt,

Kénavo,

Sébastien
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 10h04   #9
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Bonjour JP,

J'ai une petite question sur le SQL de suppression des doublons:
- cela enlève tous des enregistrements dont la date est identique pour un id identique ( si j'ai bien compris ton code )
- en revanche ça ne prend pas en compte les autres champs de la table temp finale ...

Mon code modifié (avec des erreurs surement):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim sqla As String 'Copie des éléments de scolarité avant modification dans table temp1
    sqla = "INSERT INTO Temp_journal_even_sco ( id_eleve, id_sco, id_annee_scolaire, id_etab, date_even, id_type_even, id_nature_even )" & _
    "SELECT Table_scolarite.id_eleve, Table_scolarite.id_sco, Table_scolarite.id_annee_scolaire, Table_scolarite.id_etab, Now() AS Expr1, 1 AS Expr2, 2 AS Expr3 " & _
    "FROM Table_scolarite WHERE (((Table_scolarite.id_sco)=" & Form_SForm_sco.num_sco & "));"
 
 Dim sqlb As String 'Supprime les doublons de date du même jour  en fonction table temp2
    sqlb = "DELETE Temp_journal_even_sco.* WHERE Temp_journal_even_sco.id_sco & format(date_even,'yyyymmdd') IN (SELECT id_sco & format(date_even,'yyyymmdd') FROM  Temp_journal_even);"
 
  Dim sqlc As String 'Copie les données de temp1 sans doublons dans temp2
    sqlc = "INSERT INTO Temp_journal_even ( id_eleve, id_sco, id_annee_scolaire, id_etab, date_even, id_type_even, id_nature_even )" & _
    "SELECT * FROM Temp_journal_even_sco ;"
 
 DoCmd.SetWarnings True
 
DoCmd.RunSQL sqla
DoCmd.RunSQL sqlb
DoCmd.RunSQL sqlc
 
End Sub

Pour prendre en compte d'autres champs ( code à corriger):
Code :
1
2
3
4
Dim sqlb As String 'Supprime les doublons de date du même jour  en fonction table temp2
    sqlb = "DELETE Temp_journal_even_sco.* WHERE Temp_journal_even_sco.id_sco,Temp_journal_even_sco.id_annee_scolaire,Temp_journal_even_sco.id_etab," & _
    "Temp_journal_even_sco.id_nature_even, & format(date_even,'yyyymmdd') IN (SELECT id_sco,id_annee_scolaire,id_etab,id_nature_even & format(date_even,'yyyymmdd')" & _
    "FROM  Temp_journal_even);"
Dans l'attente de tes commentaires éclairés,

Bien cordialement,
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 10h49   #10
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 863
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 863
Points : 10 743
Points : 10 743
Envoyer un message via MSN à jpcheck
Hello,
oui, il s'agissait bien d'un exemple, comme je n'ai pas la moindre idee des champs qui sont etre tes cles primaires, pas de solution toute faite


Pour la requete de delete, le plus simple est de creer dans l'interface access ta requete juste de selection (avec les jointures), ce afin de pouvoir facilement passer d'une structure SELECT a une structure DELETE
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 10h57   #11
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
ok, j'essaie ça en début d'après-midi

A bientôt,
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 11h36   #12
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Bon, finalement j'ai un peu de temps...

J'ai crée dans l'éditeur de requête une DELETE dont l'affichage remonte bien les 7 enregistrements attendus, mais quant je lance l'exécution, access me demande de préciser la table objet de la suppression... et là je coince

Voici le code :
Code :
1
2
3
DELETE Temp_journal_even_sco.id_even, Temp_journal_even_sco.id_type_even, Temp_journal_even_sco.id_nature_even, Temp_journal_even_sco.date_even, Temp_journal_even_sco.id_eleve, Temp_journal_even_sco.id_annee_scolaire, Temp_journal_even_sco.id_etab, Temp_journal_even_sco.id_sco
FROM Temp_journal_even_sco, Temp_journal_even
WHERE (((Temp_journal_even_sco.id_nature_even)=[Temp_journal_even].[id_nature_even]) AND ((Temp_journal_even_sco.date_even)=[Temp_journal_even].[date_even]) AND ((Temp_journal_even_sco.id_annee_scolaire)=[Temp_journal_even].[id_annee_scolaire]) AND ((Temp_journal_even_sco.id_etab)=[Temp_journal_even].[id_etab]) AND ((Temp_journal_even_sco.id_sco)=[Temp_journal_even].[id_sco]));
Idem en mode select:
Code :
1
2
3
SELECT Temp_journal_even_sco.id_even, Temp_journal_even_sco.id_type_even, Temp_journal_even_sco.id_nature_even, Temp_journal_even_sco.date_even, Temp_journal_even_sco.id_eleve, Temp_journal_even_sco.id_annee_scolaire, Temp_journal_even_sco.id_etab, Temp_journal_even_sco.id_sco
FROM Temp_journal_even_sco, Temp_journal_even
WHERE (((Temp_journal_even_sco.id_nature_even)=[Temp_journal_even].[id_nature_even]) AND ((Temp_journal_even_sco.date_even)=[Temp_journal_even].[date_even]) AND ((Temp_journal_even_sco.id_annee_scolaire)=[Temp_journal_even].[id_annee_scolaire]) AND ((Temp_journal_even_sco.id_etab)=[Temp_journal_even].[id_etab]) AND ((Temp_journal_even_sco.id_sco)=[Temp_journal_even].[id_sco]));
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2011, 14h39   #13
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Salut JP,

Comment passer la structure select dont le code figure ci-dessus à la structure delete selon le modèle que tu m'as suggéré ?

Voici mon essai:
Code :
1
2
3
4
Dim sqlb As String 'Supprime les doublons de date du même jour  en fonction table temp2
    sqlb = "DELETE Temp_journal_even_sco.* WHERE Temp_journal_even_sco.id_sco,Temp_journal_even_sco.id_annee_scolaire,Temp_journal_even_sco.id_etab," & _
    "Temp_journal_even_sco.id_nature_even, & format(date_even,'yyyymmdd') IN (SELECT id_sco,id_annee_scolaire,id_etab,id_nature_even & format(date_even,'yyyymmdd')" & _
    "FROM  Temp_journal_even);"
En te remerciant par avance pour tes commentaires,

Je viens de tester ( runsql sqlb) et j'ai un message d'erreur '3075' m'indiquant le sqlb...

idem pour cette syntaxe:
Code :
1
2
3
4
Dim sqlb As String 'Supprime les doublons de date du même jour  en fonction table temp2
    sqlb = "DELETE Temp_journal_even_sco.* WHERE Temp_journal_even_sco.id_sco,Temp_journal_even_sco.id_annee_scolaire,Temp_journal_even_sco.id_etab," & _
    "Temp_journal_even_sco.id_nature_even,Temp_journal_even_sco.date_even) IN (SELECT id_sco,id_annee_scolaire,id_etab,id_nature_even,Temp_journal_even_sco.date_even)" & _
    "FROM  Temp_journal_even);"
...S.O.S...
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h16   #14
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
Bonjour,

Je viens d'essayer cette syntaxe:
Code :
1
2
3
4
Dim sqlb As String 'Supprime les doublons de date du même jour  en fonction table temp2
    sqlb = "DELETE Temp_journal_even_sco.* FROM  Temp_journal_even_sco WHERE Temp_journal_even_sco.id_even IN (SELECT Temp_journal_even_sco.id_even" & _
"FROM Temp_journal_even_sco, Temp_journal_even " & _
"WHERE (((Temp_journal_even_sco.id_nature_even)=[Temp_journal_even].[id_nature_even]) AND ((Temp_journal_even_sco.date_even)=[Temp_journal_even].[date_even]) AND ((Temp_journal_even_sco.id_annee_scolaire)=[Temp_journal_even].[id_annee_scolaire]) AND ((Temp_journal_even_sco.id_etab)=[Temp_journal_even].[id_etab]) AND ((Temp_journal_even_sco.id_sco)=[Temp_journal_even].[id_sco])));"
Mais j'ai toujours le même message d'erreur... il y aurait-il une âme charitable qui pourrait me sortir de l'ornière ?
wushu29 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h21   #15
Rédacteur/Modérateur
 
Avatar de jpcheck
 
Jean-Philippe ANDRÉ
Inscription : juillet 2007
Messages : 7 863
Détails du profil
Informations personnelles :
Nom : Jean-Philippe ANDRÉ
Âge : 28
Localisation : France

Informations forums :
Inscription : juillet 2007
Messages : 7 863
Points : 10 743
Points : 10 743
Envoyer un message via MSN à jpcheck
Salut,
dans ces cas la, il faut partir a la chasse aux espaces manquant

Ici il en manque un a la fin de ta premiere ligne avant le FROM

Code :
1
2
3
4
Dim sqlb As String 'Supprime les doublons de date du même jour  en fonction table temp2
    sqlb = "DELETE Temp_journal_even_sco.* FROM  Temp_journal_even_sco WHERE Temp_journal_even_sco.id_even IN (SELECT Temp_journal_even_sco.id_even " & _
"FROM Temp_journal_even_sco, Temp_journal_even " & _
"WHERE (((Temp_journal_even_sco.id_nature_even)=[Temp_journal_even].[id_nature_even]) AND ((Temp_journal_even_sco.date_even)=[Temp_journal_even].[date_even]) AND ((Temp_journal_even_sco.id_annee_scolaire)=[Temp_journal_even].[id_annee_scolaire]) AND ((Temp_journal_even_sco.id_etab)=[Temp_journal_even].[id_etab]) AND ((Temp_journal_even_sco.id_sco)=[Temp_journal_even].[id_sco])));"
__________________
Pas de question technique par MP, je ne réponds pas

Mon perso ? Une vraie brute

Tutos Access, Tâches planifiées et Batch,Tables de Paramètres sous Access, Excel et Batch, Tâches planifiées et Access
jpcheck est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 11h37   #16
Membre à l'essai
 
Sébastien
Inscription : mars 2010
Messages : 160
Détails du profil
Informations personnelles :
Nom : Sébastien

Informations forums :
Inscription : mars 2010
Messages : 160
Points : 24
Points : 24
JP t'es un AS !

ça marche au poil !!

Je te remercie pour ta patience et ton aide précieuse .

Kénavo,

Sébastien,

( Je clos)
wushu29 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 17h15.


 
 
 
 
Partenaires

Hébergement Web