Mon Select Distinct ne marche pas! [Résolu]

Signaler
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
-
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
-
Bonjour à tous,

j'ai deux tables :

tableformation(idformation,numformation,dateformation,intituleformation,numapprenant)
tableapprenant(numapprenant,nomapprenant)

En supposant que je pour la formation numéro FOR012-09 j'ai 5 apprenants voici ce que j'aurai dans ma table tableformation :

1, FOR012-09 , 09/09/09, VB, 1
2, FOR012-09 , 09/09/09, VB, 6
3, FOR012-09 , 09/09/09, VB, 3
4, FOR012-09 , 09/09/09, VB, 9
5, FOR012-09 , 09/09/09, VB, 10

Pour éviter l'affichage des doublons (de numformation) dans mon flexgrid je fais :

Dim rsformation As New Recordset
rsformation.Open "select distinct numformation from Tableformation order by (numformation) ", cn, 1, 2

mais il ne m'affiche rien. Mais si je fais

Dim rsformation As New Recordset
rsformation.Open "select * from Tableformation order by (numformation) ", cn, 1, 2


Là il m'affiche tout avec les doublons.

Quelqu'un pourrait-il m'aider s'il vous plaît?

Merci d'avance.

Cordialement.

23 réponses

Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
je viens de regarder le zip :

SELECT DISTINCT nummission FROM TableTempMission ORDER BY nummission;

db.RS.RecordCount me retourne bien 2 (sur les 3 en table)

ps : le nom de famille dans les tables, sur le net çà fait pas très sécuritaire...
(tu aurais du mettre des noms fictifs, nom1 nom2 etc)

bref dans ces conditions le DISTINC fonctionne bien
essaye dans l'éditeur de requête d'access avant de mettre le code en pratique

++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
il y a 15 champs (pas 14)

access 2003 je ne sais plus, pas dispo

sous access 2007 :

[i]onglet créer > frame autre > création de requête > (fenêtre d'assistant) bouton fermer
frame résultats > affichage > mode SQL

SELECT DISTINCT nummission, * FROM TableTempMission ORDER BY nummission;

frame résultats > executer/i

PS (je ne l'avais pas précisé mais bon) => niveau code, préfère toujours les constantes !
tu l'as bien fait pour PRESQUE toutes tes requêtes (.OPEN), le premier est encore à 2,3 (à remplacer par adOpenDynamic, adLockOptimistic )

++
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
en fait ma réponse n'est pas tout à fait exacte....
(pour ne pas dire fausse )

le distinct ne permet pas d'afficher plusieurs champs différents (en conservant le filtre unique)

en SQL on ferait un IN (SELECT ...), or le IN n'est pas supporté par access

si tu as la possibilité (droits, diffusion de la base) de modifier la base, il faudrait y enregistrer le requête DISTINCT, et faire ta requête SELECT where table.nummission = requete.nummission, ou quelque chose du genre

pose éventuellement aussi ta question sur SQLFR.COM, ta question concerne plus le SQL que le VB...

++
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
J'utilise VB 6.0 et Access 2003. Merci d'avance.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
salut,

et si tu supprimes le order by ?
[hr]
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour et Merci PCPT pour ton intervention. C'est la même chose même si je supprime le order by.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
depuis access 2007, j'ai reproduit uniquement ta table tableformation (sans clé étrangère donc)

table enregistrée au format access 2002-2003

nouveau projet, références ADO 2.8 et ADOX 2.8

une classe clsdb contenant ce code :
http://www.codyx.org/snippet_connexion-base-donnees-access_107.aspx#1907


code de ma form1 :

Option Explicit

Private Sub Form_Load()
    Dim db As New clsdb
    db.DBConnect "c:\tmp2003.mdb", , Jet4x
    
    db.RSExecute "SELECT * FROM tableformation ORDER BY numformation;"
    MsgBox "nombre d'enregistrements = " & db.RS.Fields.Count
    
    db.RSExecute "SELECT DISTINCT numformation FROM tableformation ORDER BY numformation;"
    MsgBox "nombre d'enregistrements = " & db.RS.Fields.Count
    
    db.DBClose
    Set db = Nothing
    
    Unload Me
End Sub



j'ai bien 5 puis 1

seules différences :
-table sans majuscule
-requêtes terminées par ;
-paramètres RS = 2,3 (adOpenDynamic, adLockOptimistic) et non 1,2
-pas de clé étrangère
-pas de parenthèses


dans le tas, la seule chose qui me semble pouvoir jouer est donc :
rsformation.Open "select distinct numformation from Tableformation order by (numformation)", cn, 2, 3


[hr]
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
ça ne marche toujours pas. Je n'y comprends vraiment rien. Pourtant, je ne crée pas de lien entre mes tables dans access. J'ai testé avec 2, 3 et avec et sans le order by mais rien n'y fait. Ce n'est pas du tout logique. Même

Dim rsformation As New Recordset
rsformation.Open "select numformation from Tableformation ", cn, 2, 3


ne marche pas.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
essaye avec la classe + lien ci-dessus stp
(voir si çà vient d'une partie de ton code, ou de ta base...)
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Le problème est que j'ai d'autres formulaires et pourtant ça marche très bien. Y a-t-il un endroit où je pourrai envoyer mon appli svp? Merci d'avance.

Cordialement.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
çà serait bien que tu testes avant de nous demander de tester

nouveau projet, classe, etc...
(comme j'ai fait pour te répondre )
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Je vous prie de bien vouloir m'excuser. Dans ma BD j'ai 5 enregistrements concernant deux formations différentes. 2 enregistrements concernant la 1ère formation et 3 enregistrements concernant la 2ème formation. Mais lorsque j'exécute votre code au lieu de m'afficher 5 il m'affiche 15 pour le premier code et concernant le deuxième code au lieu de m'afficher 2 il m'affiche 1. C'est à devenir fou. Je n'y comprends plus rien. Aidez-moi s'il vous plaît. Merci d'avance.
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
j'ai repris ton exemple avec tes informations

si elles ne sont pas bonnes (l'énoncé donc) çà ne va pas nous aider

héberge ta base sur www.cijoint.fr et donne le lien, je referai le test (que je n'ai pas sauvé bien sûr )
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
malheureusement l'extension .mdb n'est pas accepté. Comment faire?
Messages postés
13280
Date d'inscription
lundi 13 décembre 2004
Statut
Modérateur
Dernière intervention
3 février 2018
35
...

appelle ce numéro
[i]Service Client Corel
0805 639 920 (numéro gratuit)/i
c'est l'éditeur de winzip

demande s'ils peuvent envoyer un technicien chez toi pour compresser ton fichier

(poser une question sur un forum n'implique pas de ne plus rien faire une fois le bouton "envoyer" pressé!!)
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Re-Bonjour,

je suis désolé pour le silence mais j'avais tellement réfléchis (sans malheureusement trouver de solution) que j'avais super mal à la tête. Voici donc le lien de ma BD : http://www.cijoint.fr/cjlink.php?file=cj200909/cijuB8mViM.zip.. La table à problème s'appelle TableTempMission. Je suis désolé d'avoir menti mais comme il s'agit d'une application que je dois développer pour mon job j'avais peur de donner les bonnes infos. Croyez-moi j'en suis vraiment désolé . Rappel: J'ai plusieurs enregistrements avec le même numéro de mission (nummission) mais avec des idmission différents et j'aimerai juste en afficher un au lieu de tous les enregistrements. Merci d'avance pour votre aide.

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Bonjour PCPT et Merci du fond du coeur pour ton aide. Tu m'as vraiment ouvert les yeux. Je ne sais malheureusement pas utiliser les requêtes sous access mais comptes sur moi pour maîtriser ça. En effet ça marche comme tu l'as souligné. Malheureusement, ma requête était fausse par rapport à ce que je voulais avoir comme résultat. Comme tu l'as constaté, tabletempmission a 14 champs. J'aimerai donc afficher tous les 14 champs mais en évitant les doublons de nummission. Est-ce que tu vois un peu s'il te plaît? J'ai essayé cette requête mais elle ne marche malheureusement pas :


Dim rsmission As New Recordset
rsmission.Open "select * from (select distinct nummission from Tabletempmission)", cn, 2, 3


celle-là non plus :

Dim rsmission As New Recordset
rsmission.Open "select * from tabletempmission where nummission = (select distinct nummission from Tabletempmission)", cn, 2, 3


Merci d'avance pour ton aide.

Cordialement.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
En fait la dernière requête ne marche que pour le 1er nummission. Mais pour ce qui est des autres nummission ça ne marche pas. Il ne m'affiche que le premier nummission.
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Voici mon code complet :

Dim rsmission As New Recordset
rsmission.Open "select * from tabletempmission where nummission = (select distinct nummission from Tabletempmission)", cn, 2, 3

Dim rs2 As New Recordset

Dim rs3 As New Recordset

Dim rs4 As New Recordset

Dim rs5 As New Recordset

i = 1

While (Not rsmission.EOF)
If Not IsNull(rsmission) Then

rs3.Open "select tableimputation.imputation from tableimputation, tabletempmission where tabletempmission.numimputation tableimputation.numimputation and idmission " & rsmission(0) & "", cn, adOpenDynamic, adLockOptimistic

rs4.Open "select tablechauffeur.nomprenomchauffeur from tablechauffeur, tabletempmission where tabletempmission.numchauffeur tablechauffeur.numchauffeur and idmission " & rsmission(0) & "", cn, adOpenDynamic, adLockOptimistic

rs5.Open "select tablevehicule.vehicule from tablevehicule, tabletempmission where tabletempmission.numvehicule tablevehicule.numvehicule and idmission " & rsmission(0) & "", cn, adOpenDynamic, adLockOptimistic

If IsNull(rsmission(1)) Then
msfmission.TextMatrix(i, 0) = ""
Else
msfmission.TextMatrix(i, 0) = rsmission(1)
End If
If IsNull(rsmission(0)) Then
msfmission.TextMatrix(i, 1) = ""
Else
msfmission.TextMatrix(i, 1) = rsmission(0)
End If
..................................................................
.................................................................

If IsNull(rs2(0)) Then
msfmission.TextMatrix(i, 14) = ""
Else
msfmission.TextMatrix(i, 14) = rs2(0)
End If

End If

i = i + 1
rsmission.MoveNext


Wend

msfmission.Refresh

rsmission.Close

Set rsmission = Nothing
Set rs2 = Nothing
Set rs3 = Nothing
Set rs4 = Nothing
Set rs5 = Nothing


msfmission_Click
Messages postés
576
Date d'inscription
samedi 14 octobre 2006
Statut
Membre
Dernière intervention
27 janvier 2014
2
Tout simplement FABULEUX . Je te remercie du fond du coeur pour tout. Tes remarques, tes critiques, tes conseils et ton aide. MERCI, MERCI, MERCI. Passe une excellente soirée et prends bien soin de toi.

Cordialement.