MS Access : Recherche et filtrage

Répondre
Partager Rechercher
Bonjour à vous tous

J'ai fait un petit système de recherche dans une base de données Access ( rien de bien difficile ), or, j'aimerais que ces données subissent un petit traitement.

Voilà le type de données ( par nom de colonnes ) qui va servir au traitement :

N° Poste :

1 | 2 | 3 |... ( ce nombre est égal au numéro de contrat engagé avec un organisme X, le 1 étant le premier contrat que l'on avec eux, le 2, le deuxième etc. )

Ce nombre va de 1 à illimité ( mais n'a jamais dépassé le 4 .. ;p )

Type Poste :

0,5, | 0,8 | 1 | ( ce nombre donne le type de contrat à savoir mi-temps, 4/5ième temps ou plein temps )

Nb de Postes :

1 | 2 | 3 | ... ( nombre de personnes engagées avec le contrat )

Ce nombre va de 1 à .. tout plein ( genre 12 .. 17 .. )

N° employeur :

Chiffre totalement libre .. 158, 296, 1210 etc.

N° de Décision :

Ce chiffre représente la décision concernant l'engagement des personnes.

Voilà pour l'intro

En fait, ces données ne sont pas de moi et sont triées d'une manière qui m'est assez exotique.

A chaque poste occupé et donc, à chaque employé, correspond un numéro ( numéro de travailleur ) mais cela n'a probablement pas d'importance pour la suite.

En fait, si je fais une recherche pour telle société, le programme me sort plusieurs lignes pour la même car elles y sont dans la base de données.

Si je cite, dans l'ordre, un numéro de contrat, voici ce que ça donne :

N° Poste | Type de Poste | Nb Poste | N° Employeur | N° de Décision

1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583

Comme vous pouvez le voir, pour la même décision et le même numéro de contrat ( n° de poste ), il y a 3 lignes CAR 3 employés

Et même, parfois, il peut y avoir 4 lignes ( au lieu de 3 même si 3 employés ) car un des employés a été remplacé donc, techniquement, il y'a toujours 3 employés MAIS 4 lignes. Un peu compliqué ?

Et, aussi, il peut y avoir MOINS de lignes que prévu ( vous suivez, là ? ) car le contrat de cette personne fut terminé avant une date X ou engagé avant une date Y !

Bref, vous voyez le bordel ? Pas la joie, hein ?

En gros, j'aimerais savoir si vous pourriez me dire COMMENT trier correctement ces données une fois la recherche effectuée.

Comment les trier ? "Simple". J'aimerais que la requête recherche procède comme ceci :

Pour une décision X avec un Type de Poste Y du N° de Poste Z, qu'il y ai 1 seule ou 6 lignes, il faut en afficher qu'une seule avec un résultat correct.

Donc, lorsque la recherche sera effectuée, il faudra qu'il sorte pour ce type de résultat :

1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583 ( <= employé différent )
2 | 0,5 | 2 | 739 | 1583
2 | 0,5 | 2 | 739 | 1583

Quelquechose de plus propre Genre ceci, donc :

1 | 0,8 | 3 | 739 | 1583
2 | 0,5 | 2 | 739 | 1583

Vous comprenez ?

Voici le code du système de recherche :

Code:
Private Sub Recherche_Manuelle_Click()
On Error GoTo Err_Recherche_Manuelle_Click

    Dim stDocName As String
    Dim stLinkCriteria As String

    stDocName = "Query BDD PTP"
    
    stLinkCriteria = "[Code postal]=" & Me![Texte9]
    DoCmd.OpenForm stDocName, acFormDS, , stLinkCriteria

Exit_Recherche_Manuelle_Click:
    Exit Sub

Err_Recherche_Manuelle_Click:
    MsgBox Err.Description
    Resume Exit_Recherche_Manuelle_Click
    
End Sub
Comme vous avez pu remarquer, la recherche se fait sur base du code postal.

Merci d'avance ^^

Perso, j'en suis à la phase JMTLGCLM.

Oui oui, J'Me Tape La Gueule Contre Le Mur.
Citation :
Publié par eulbobo
j'aurai tendance à dire....

Utilise le SQL et la puissance du group by sur les deux derniers champs....

Voila....

... Oui on me l'a déjà dit mais ..

Je sais pas de quoi vous parlez
Ca va peut être paraître simpliste, mais si j'ai bien compris le problème et si tu souhaite éviter de passer par la saisie directe d'une requête SQL tu devrais utiliser les options de regroupements du générateur de requête.

Sur une requête ouverte en mode création : tu trouvera dans la barre de menu un bouton "Totaux". Active le et une ligne supplémentaire apparaîtra dans le tableau de requête. Cette ligne sert à définir l'opération appliquée à chaque champ. Pour regrouper des lignes et éviter les doublons sélectionne "Regroupement" au niveau du champ concerné.

Ensuite n'oublie pas d'éditer la requête en mode SQL pour regarder la traduction SQL de tout ça. A terme ce sera parfois plus simple de se passer du générateur

En espérant avoir bien compris le problème et que ceci pourra t'aider !

(si tu sais déjà tout ça toutes mes excuses)
Bon, voilà la base et les explications qui vont avec :

http://users.skynet.be/aiki/BDD.mdb

Dans la partie "formulaire" se trouve "Recherche 1" et c'est le formulaire de recherche.

Faites pas gaffe à la partie en dessous, elle foire, je sais.

Si vous avez besoin d'autres explications, je suis là.

Oh, les noms des employeurs ont été modifié, normal aussi, ce genre de donnée n'a pas trop sa place en public, même si ça n'a aucun impact ^^
Citation :
Publié par eulbobo
C'est quelle version de access que tu utilises? j'ai que un 97 la et ca risque de pas marcher
2000 mais ça ne devrait pas poser de problèmes ^^
J'essaye de regarder le biniou, mais j'ai peur de ne pas trop comprendre ce que tu recherches. Pourrais-tu expliquer clairement les données que tu veux récupérer ? Même si ce sont des données calculées ( sommes, regroupement par même employé, etc ).

Une fois ta demande expliquée le plus clairement possible, je devrais pouvoir la traduire en SQL en m'appuyant sur ta base de données. Et après, tu n'auras qu'à copier/coller la requête.

EDIT = bizarre ta table avec les codes postaux. pourquoi y'a tant de répétition ?
Citation :
Publié par Paluche / Sumomo
Bonjour à vous tous
Donc, lorsque la recherche sera effectuée, il faudra qu'il sorte pour ce type de résultat :

1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583
1 | 0,8 | 3 | 739 | 1583 ( <= employé différent )
2 | 0,5 | 2 | 739 | 1583
2 | 0,5 | 2 | 739 | 1583

Quelquechose de plus propre Genre ceci, donc :

1 | 0,8 | 3 | 739 | 1583
2 | 0,5 | 2 | 739 | 1583

Pour ça, requête SQL avec SELECT DISTINCT .....
.....

Oula...
...

OULALALALA....

Bon, le premier truc que je pourra te conseiller, ca serai de séparer tes données dans plusieurs tables distinctes...

Mais à voir ca, je me doute que tu ne connais pas le concept de troisieme forme normale....

Parce que pour le moment, ca va, y'a pas trop de données (encore que ta liste des codes postaux est assez impresionnant de redondances) et tu va rapidement avoir des soucis si les données continuent de s'accumuler comme ca.


En gros, refais toi des tables (tout simplement : une table par truc qui demande un identifiant unique)
Travailleur
Poste
Employeur
Decision

Identifie les elements qui vont dans chaque table et les liens qui existent entre elles

Et crée des liens entres les tables.... Deja, ca sera plus clair et ensuite tu pourra créer autant de requetes que tu veux (parce que la, tu as une requete qui lit l'intégralité des données de la table et ensuite tu essaye par le code de decouper le tout.... autant utiliser le SQL plutot que le code)



Sinon, pour que tout de suite ca marche, voila la solution
Ouvre la requete Query BDD PTP en modification
Vire les colonnes qui ne seront pas affichées (laisse tout le reste en afficher et regroupement)
Enregistre le tout et ca devrait marcher

Voila

Mais franchement, essaye de séparer les tables entres elles, tu y verra plus clair et ca sera plus simple à gérer....
Eulbobo, tu as compris la requête qu'elle cherchait à avoir ? Moi non

Pis pour les tables, je suppute qu'on lui a fourni comme elles sont là, et qu'elle n'y a pas touché. M'enfin, c'est une intuition, je me goure peut-être. Dans tous les cas, je ne pense pas que lui dire de passer en troisième forme normale et d'identifier clairement les occurrences l'aide beaucoup.
C'est pas un reproche, ni une critique. A mon avis, la personne qui t'a demandé de faire ça, Paluche, ne se rendait pas compte que tu n'étais pas armée pour ( à plus forte raison si c'est toi-même qui t'es lancée dessus comme ça ).
Citation :
Publié par Dienekès
J'essaye de regarder le biniou, mais j'ai peur de ne pas trop comprendre ce que tu recherches. Pourrais-tu expliquer clairement les données que tu veux récupérer ? Même si ce sont des données calculées ( sommes, regroupement par même employé, etc ).

Une fois ta demande expliquée le plus clairement possible, je devrais pouvoir la traduire en SQL avec ta base que j'ai downloadé en m'appuyant sur ta base de données. Et après, tu n'auras qu'à copier/coller la requête.
En gros, lorsque je lance la recherche ( voir le formulaire "Recherche 1" ) par code postal, j'aimerais qu'il me sorte :

Les employeurs de cette ville ( correspondante au code postal)
Le numéro de la décision ( N° décision )
Type de poste ( le 0.5 / 0.8 )
Nombre de poste
Fin de poste

Mais je ne veux pas que ça fasse ceci :

http://users.skynet.be/aiki/recherche.jpg

=> http://users.skynet.be/aiki/resultat.jpg

Désolé de tagger les noms ^^

Donc, comme tu peux le voir, pour un élément semblable, il donne plusieurs lignes, or, j'aimerais qu'il n'en affiche qu'une ( comme cité "GROUP BY" mais je ne vois pas ce que c'est )

donc si pour une société il y'a une "décision" XXXX qui donne un "type de poste" Y et un "nombre de postes" N, au lieu de l'afficher 2 fois, 7 fois ou que sais-je ..

La décision XXXX parlant du type de poste Y et possédant le même nombre de poste soit affiché d'une traite.

Pour une décison XXXX, il peut y avoir des postes 0.5 ET 0.8 et donc il faut les afficher dans deux catégories ( forcément )

Mais donc, au lieu de voir :

Décison | Type de poste | Nmbre de Postes |
450 | 0.5 | 3 |
450 | 0.5 | 3 |
450 | 0.5 | 3 |
450 | 0.8 | 7 |
450 | 0.8 | 7 |
450 | 0.8 | 7 |
450 | 0.8 | 7 |
450 | 0.8 | 7 |
450 | 0.8 | 7 |

On verra :

Décison | Type de poste | Nmbre de Postes |
450 | 0.5 | 3 |
450 | 0.8 | 7 |

Si tu l'a bien remarqué, il y'a 6 lignes pour le 0.8 alors que le nombre de postes en affiche 7, ça PEUT arriver ( ils n'ont pas trouvé d'employés ou il a été viré .. )

Donc il faut que cela soit classé en rapport au nombre de postes et que le reste des résultat affichant ET la même décision ET le même type de poste ET le même nombre de postes soit tout simplement invisible.

Je ne sais pas si je suis clair ? ^^
fait la bidouille sur la requete que je te dis et dit moi si ca marche

Sinon, oui, j'avais compris ce qu'elle cherchait à avoir, j'ai deja du me demerder avec une base de données medicale faite par un medecin qui ressemblait à peu pres à ca aussi....

Mais en nettement plus 'touffu'....


Je commence à avoir l'habitude...
Lorsque l'on a plusieurs lignes identiques et que l'on n'en veut qu'une c'est un SELECT DISTINCT qu'il faut faire en SQL.

Le GROUP BY regroupe selon certains critères, mais ne supprime pas les doublons.

Je verrai bien une requête du type:

SELECT DISTINCT Décison, Type de poste, Nmbre de Postes etc.. FROM nom de la table WHERE code_postal = xxxxx;
C'est gentil de m'aider

Mais si vous savez le faire dans le programme ( et me recopier la modif ou envoyer le prog ) ça serait encore mieux .. car je ne sais absolument pas comment faire ce que vous dites

enfin si .. mais je ne vois pas où ni dans quoi ...

Concernant le bazzar dans la BDD .. je ne vous le fais pas dire mais elle ne peut être changée

C'est "leur" façon ( bordellique ) de programmation et de s'y retrouver.

C'est d'ailleurs pire concernant les codes postaux mais je pense filtrer les doublons dans une liste à part "Localités - codes postaux" pour en obtenir une propre afin de pouvoir faire des recherches plus faciles.
Bon, on va voir si ce que j'ai bidouillé peut t'aider.

Ouvre ta base de données. Va dans l'onglet "Requêtes". Crées-en une nouvelle, en mode "design" ( connais plus la traduc Fr ). Il te propose d'ajouter des tables, tu ajoutes la grosse. Ensuite, dans le coin supérieur gauche, y'a une petite icône juste sous "Fichier". Tu cliques dessus et tu choisis "SQL view". Là, dans la plage de texte, tu copies/colles ceci :

Code:
SELECT DISTINCT [BDD PTP].[N° de décision], [BDD PTP].[Type poste], Count([BDD PTP].[Nb de postes]) AS Nb_de_postes, [BDD PTP].[N° Employeur], [BDD PTP].[Nom Employeur], [BDD PTP].[Code postal], [BDD PTP].Localité
FROM [BDD PTP]
WHERE ((([BDD PTP].[Code postal])=["Code Postal"]))
GROUP BY [BDD PTP].[N° de décision], [BDD PTP].[Type poste], [BDD PTP].[N° Employeur], [BDD PTP].[Nom Employeur], [BDD PTP].[Code postal], [BDD PTP].Localité;
Ensuite, tu exécutes avec le point d'exclamation. Il te demandera de rentrer un Code postal à la main.

J'ai pas trop le temps de fignoler, mais déjà, si c'est le résultat que tu espérais, ça te guidera, je pense. Il restera à modifier ton formulaire pour le faire pointer vers cette nouvelle requête et refaire le lien entre une boîte de dialogue pour rentrer le code postal tel que ça existe déjà, et cette nouvelle requête.

Là, je dois aller manger, mais je pourrais peut-être continuer de t'aider après.

Ceci dit, je suis en train de me dire que non seulement j'ai absolument pas le droit de faire ça au boulot, mais que toi non plus, tu n'es pas à l'abri de problème si on s'aperçoit que les données qu'on te confie se ballade sur le Net. Fais gaffe
Citation :
Publié par Paluche / Sumomo
C'est "leur" façon ( bordellique ) de programmation et de s'y retrouver.
Fuis !


Bon, plus sérieusement, d'apres ce que tu as mis à disposition, je te fais la marche à suivre point par point

Onglet requete
Selectionne Query BDD PTP et clique sur modifier
Selectionne les colonnes qui ne t'interessent pas en cliquant sur la petite zone en haut de la colonne et qppuie sur suppr (pouf, pu de colonne)
Ferme, enregistre.....

Ca devrait marcher

Par sécurité, avant, copie la requete Query BDD PTP dans un coin pour ne pas la paumer definitivement.
Citation :
Publié par eulbobo
Fuis !


Bon, plus sérieusement, d'apres ce que tu as mis à disposition, je te fais la marche à suivre point par point

Onglet requete
Selectionne Query BDD PTP et clique sur modifier
Selectionne les colonnes qui ne t'interessent pas en cliquant sur la petite zone en haut de la colonne et qppuie sur suppr (pouf, pu de colonne)
Ferme, enregistre.....

Ca devrait marcher

Par sécurité, avant, copie la requete Query BDD PTP dans un coin pour ne pas la paumer definitivement.
ah mais ça, j'ai déjà nettoyé la requête .. mais ça n'empêchera pas d'avoir plusieurs lignes en résultat car c'est comme ça dans la table des données elle-même !
Citation :
Publié par Dienekès
Bon, on va voir si ce que j'ai bidouillé peut t'aider.

Ouvre ta base de données. Va dans l'onglet "Requêtes". Crées-en une nouvelle, en mode "design" ( connais plus la traduc Fr ). Il te propose d'ajouter des tables, tu ajoutes la grosse. Ensuite, dans le coin supérieur gauche, y'a une petite icône juste sous "Fichier". Tu cliques dessus et tu choisis "SQL view". Là, dans la plage de texte, tu copies/colles ceci :

Code:
SELECT DISTINCT [BDD PTP].[N° de décision], [BDD PTP].[Type poste], Count([BDD PTP].[Nb de postes]) AS Nb_de_postes, [BDD PTP].[N° Employeur], [BDD PTP].[Nom Employeur], [BDD PTP].[Code postal], [BDD PTP].Localité
FROM [BDD PTP]
WHERE ((([BDD PTP].[Code postal])=["Code Postal"]))
GROUP BY [BDD PTP].[N° de décision], [BDD PTP].[Type poste], [BDD PTP].[N° Employeur], [BDD PTP].[Nom Employeur], [BDD PTP].[Code postal], [BDD PTP].Localité;
Ensuite, tu exécutes avec le point d'exclamation. Il te demandera de rentrer un Code postal à la main.

J'ai pas trop le temps de fignoler, mais déjà, si c'est le résultat que tu espérais, ça te guidera, je pense. Il restera à modifier ton formulaire pour le faire pointer vers cette nouvelle requête et refaire le lien entre une boîte de dialogue pour rentrer le code postal tel que ça existe déjà, et cette nouvelle requête.

Là, je dois aller manger, mais je pourrais peut-être continuer de t'aider après.

Ceci dit, je suis en train de me dire que non seulement j'ai absolument pas le droit de faire ça au boulot, mais que toi non plus, tu n'es pas à l'abri de problème si on s'aperçoit que les données qu'on te confie se ballade sur le Net. Fais gaffe
Je vais essayer

Edit 1 : No problemo ( pour moi en tout cas ) pour la BDD qui se ballade, j'ai fais exprès de bidouiller les données pour que ça donne des noms strictement inventés ..

Edit 2 : Heyyy ça m'a tout l'air de fonctionner

Autre petit souci maintenant, comment je dois définir mon bouton de recherche ?
Si le bouton lance la requête, cela me demande le code postal, or, j'aimerais qu'il prenne ce qu'il y a d'écrit dans la fenetre "texte 9" ( la où il est demandé un code postal, donc ) ..

Bon je vais essayer par moi-même, on ne sait jamais
Citation :
Publié par Paluche / Sumomo
ah mais ça, j'ai déjà nettoyé la requête .. mais ça n'empêchera pas d'avoir plusieurs lignes en résultat car c'est comme ça dans la table des données elle-même !
Apres il suffit d'ouvrir la requete SQL et de rajouter le mot DISTINCT apres le select et tu devrais plus avoir le soucis
Citation :
Publié par Paluche / Sumomo
Autre petit souci maintenant, comment je dois définir mon bouton de recherche ?
Si le bouton lance la requête, cela me demande le code postal, or, j'aimerais qu'il prenne ce qu'il y a d'écrit dans la fenetre "texte 9" ( la où il est demandé un code postal, donc ) ..

Bon je vais essayer par moi-même, on ne sait jamais
.. J'ai essayé par moi-même .. il veut bien exécuter un système de recherche sur des formulaires .. mais pas ce type d'options sur des requêtes ..

et quand je bidouille par moi-même .. il m'envoie bouler comme quoi des arguments ne sont pas corrects .. gniiii !!!
Euh, mes souvenirs en MS Access sont un peu loin. Je ne sais pas trop comment faire. Je passe donc la main à quelqu'un d'autre de plus compétent ^^

L'idée serait de lier le bouton de ton formulaire avec la nouvelle requête. Or, d'après ce que j'ai vu, le gros formulaire se base sur un formulaire intermédiaire se basant sur la requête. Donc, faudrait créer un formulaire basé sur la nouvelle requête. Avec l'assistant, c'est assez simple : définir la source du formulaire comme étant la nouvelle requête, ajouter toutes les colonnes, choisir un affichage DataSheet et accepter le reste.
Ensuite, pour lier le gros formulaire avec ce formulaire intermédiaire, clic droit sur le bouton du gros formulaire -> Propriétés -> onglet "Evènements" -> clic sur les [...] à côté de [Event Procedure] .... là, on a le code exécute lors du clic sur le bouton ... il faut donner le bon nom de formulaire intermédiaire appelé. J'ai réussi à faire ça, mais il demande toujours le code postal comme dans la requête. Pour qu'il prenne à la place le CP indiqué dans le champ du gros formulaire, faut bidouiller avec des variables en VB ( le code ). Et là, je sais plus trop comment faut faire.

Groumpf, moi qui voulais faire une réponse simple et rapide



Sinon, bah, tu exécutes "à la main" la requête que je t'ai indiquée.

@eulbobo : les group by, c'est bien, mais faut aussi un count dans le SQL
Répondre

Connectés sur ce fil

 
1 connecté (0 membre et 1 invité) Afficher la liste détaillée des connectés