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

  1. #1
    Membre du Club
    Filtrer liste chauffeur sur plusieurs critères
    Bonjour,

    J'ai un formulaire avec ma liste chauffeur dans lequel j'ai un sous formulaire sur ses indisponibilité:



    J'aimerais dans un autre formulaire "transport" créer une liste des chauffeurs disponible qui soit filtrée d'après la date de transport et les indisponibilité des chauffeurs.



    Il faudrait donc que mon filtre s'applique sur le listing chauffeur que si la date de transport est < à la date de début ET > à la date de fin alors ma liste s'affiche.
    Ma difficulté est que je peux avoir plusieurs période d'indisponibilité....

    Pourriez vous m'aider ?

    Je précise que je ne suis pas informaticien et que je débute avec access et le langage VBA.

    BAV.
    Olivier S.

  2. #2
    Membre du Club
    J'ai oublié de préciser que pour l'instant ma liste déroulante "liste des chauffeurs disponible" prend sa source d'une requête qui trie le listing chauffeur sur une donnée "statut" = actif


  3. #3
    Expert éminent
    bonsoir,
    personnellement, en cas de date unique j'aurais plutôt renseigné la date de fin avec la date de début, cela aurait pu éviter de gérer les valeurs nulles.
    Ensuite, il faut mettre une jointure gauche entre les deux tables car tous les chauffeurs n'ont pas forcément une indisponibilité.
    la requête devrait ressembler à cela:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT [Chauffeurs listing].nom, [Chauffeurs listing].prénom, [Chauffeurs listing].statut, [Chauffeurs listing].[N° chauffeur]
    FROM [Chauffeurs listing] LEFT JOIN [Chauffeurs indisponibilité] ON [Chauffeurs listing].[N° chauffeur] = [Chauffeurs indisponibilité].[Numero_chauffeur]
    WHERE [Chauffeurs listing].[statut]="actif" 
    AND ([Formulaires]![transport]![date de transport] 
    Not Between [Chauffeurs indisponibilité].[date début] And Nz([Chauffeurs indisponibilité].[date fin],[Chauffeurs indisponibilité].[date début])=True) 
    OR ([Chauffeurs listing].statut="actif" AND [Chauffeurs indisponibilité].[Numero_auto] Is Null)
    ORDER BY [Chauffeurs listing].nom;
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  4. #4
    Membre du Club
    Concernant la jointure gauche voici ce que j'ai mis, est ce correcte ?


  5. #5
    Membre du Club
    j'ai également modifié pour les dates de début et fin pour que la date de fin ne soit jamais null



    est ce correcte ?

  6. #6
    Membre du Club
    j'ai fait un copier/coller de votre requête mais quand j'essaie de l'exécuter voici la fenêtre qui s'ouvre.
    Que dois je faire ?


  7. #7
    Membre expert
    Vous l'avez exécuté sans vérifier la cohérence en mode d'affichage création ?
    Avez-vous au moins vérifié que noms des tables et des champs correspondent à votre environnement ?

  8. #8
    Membre du Club
    bonjour
    je ne m'y connais pas en sql.. je viens de vérifier le nom des tables et champs..et cela a l'air correct...pourriez-vous m'aider svp ?

    Pourriez-vous me dire si la casse est importante ?

    Je viens de corriger la casse et vérifier tous les champs cela semble correct...que dois-je corriger ?

  9. #9
    Expert éminent
    Bonsoir,
    Citation Envoyé par zire478 Voir le message
    j'ai fait un copier/coller de votre requête mais quand j'essaie de l'exécuter voici la fenêtre qui s'ouvre.
    Que dois je faire ?

    Cette erreur devient un classique, il ne faut pas utiliser l'icône SQL Direct mais Sélection, puis Affichage SQL:

    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  10. #10
    Expert éminent
    Citation Envoyé par zire478 Voir le message
    Concernant la jointure gauche voici ce que j'ai mis, est ce correcte ?

    Ce n'est pas la relation qu'il faut modifier mais la requête source listing chauffeur actif
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  11. #11
    Membre du Club
    Bonjour,

    J'ai donc modifié la requete pour la mettre en "affichage sql" et non en "sql direct".

    Voici l'exemple des indisponibilités pour 2 chauffeurs afin de tester cette requête:


    Quand je fais tourner la requête en dehors du formulaire, j'ai une fenêtre qui s'ouvre me demandant d'entrer une date de transport (normal je suppose puisque pas encoder via le formulaire transport)


    Si j'encode "12/05/2019" la liste de la requête est vide, or qu'il devrait me sortir le chauffeur 2 -> KO
    Si j'encode "13/05/2019" la requête me sort le chauffeur 1 -> OK
    Si j'encode "15/05/2019" la requête me sort le chauffeur 1 et 2 -> KO car je ne devrais pas avoir le chauffeur 1 (puisque date comprise entre 14 et 20).

    Pourriez vous m'aider a régler cela ?

    Si j'encode via le formulaire transport:
    * dès que je choisi le bénéficiaire j'ai la fenêtre qui s'ouvre "entre une valeur" pour la date de transport: est il possible que cette fenêtre ne s'ouvre pas pour me permettre d'entrer la date dans le formulaire ?


    * et même si j'entre une date de transport via cette fenêtre, j'ai une 2eme fenêtre qui s'ouvre avec "liste chauffeur actif et disponible.nom".


    Pourriez vous m'aider a résoudre tout cela ?

    Merci a tous et toutes d'avance.
    Olivier S.

  12. #12
    Expert éminent
    bonjour,
    Si j'encode via le formulaire transport:
    * dès que je choisi le bénéficiaire j'ai la fenêtre qui s'ouvre "entre une valeur" pour la date de transport: est il possible que cette fenêtre ne s'ouvre pas pour me permettre d'entrer la date dans le formulaire ?
    - peux-tu poster le code SQL et donner le nom du formulaire et du sous-formulaire ?
    * et même si j'entre une date de transport via cette fenêtre, j'ai une 2eme fenêtre qui s'ouvre avec "liste chauffeur actif et disponible.nom"
    - quel est le type d'objet de "liste chauffeur actif et disponible" (sous-formulaire, liste déroulante ...) ?
    - Nom est un mot réservé, il vaut mieux éviter de l'utiliser comme nom de champ ou autre objet. Si on ne peut pas faire autrement, dans ce cas il faut mettre des crochets autour du nom de l'objet (y compris ceux contenant des espaces.
    Et même si Access le permet, il est préférable d'éviter l'utilisation des espaces, les caractères spéciaux ou accentués dans le nom des objets, souvent source d'erreur:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    liste_chauffeur_actif_et_disponible.nomchauffeur
    ' est préférable à
    [liste chauffeur actif et disponible].[nom]
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  13. #13
    Membre du Club
    Bonjour,

    Le formulaire s'intitule "Transport encodage".
    Liste des chauffeurs disponible est une zone de liste déroulante.



    Voici le code sql actuel:

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT [Chauffeurs listing].Nom, [Chauffeurs listing].Prénom, [Chauffeurs listing].Statut, [Chauffeurs listing].[N° chauffeur]
    FROM [Chauffeurs listing] LEFT JOIN [Chauffeurs indisponibilité] ON [Chauffeurs listing].[N° chauffeur] = [Chauffeurs indisponibilité].[Numero_chauffeur]
    WHERE [Chauffeurs listing].Statut="Actif" And (Formulaires!Transport![Date de transport] Not Between [Chauffeurs indisponibilité].Date_debut And Nz([Chauffeurs indisponibilité].Date_fin,[Chauffeurs indisponibilité].Date_debut)=True) Or ([Chauffeurs listing].Statut="Actif" And [Chauffeurs indisponibilité].Numero_auto Is Null)
    ORDER BY [Chauffeurs listing].Nom;


    Je peux essayer de le modifier comme vous le conseillez mais sachez que je n'y connais rien en sql.

    BAV.
    Olivier.

  14. #14
    Membre du Club
    pour plus de facilité j'ai renommer le formulaire Transport_encodage: je note cela dans la requête sql.

  15. #15
    Membre du Club
    Attendez avant de me répondre, je modifier tout comme demandé et je reposterai toutes les infos: formulaire, sql...C'est peut être mieux...

    Déja un tout grand merci a vous tous!

  16. #16
    Membre du Club
    Bon voila, j'ai fait plein de modifications:

    Voici mon code sql de la requête "Liste_chauffeurs_actif_disponible" :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Chauffeurs_listing.Nom_chauffeur, Chauffeurs_listing.Prénom, Chauffeurs_listing.Statut, Chauffeurs_listing.Nchauffeur
    FROM Chauffeurs_listing LEFT JOIN Chauffeurs_indisponibilité ON Chauffeurs_listing.Nchauffeur = Chauffeurs_indisponibilité.Numero_chauffeur
    WHERE Chauffeurs_listing.Statut="Actif" And (Formulaires!Transport_encodage!Date_transport Not Between Chauffeurs_indisponibilité.Date_debut And Nz(Chauffeurs_indisponibilité.Date_fin,Chauffeurs_indisponibilité.Date_debut)=True) Or (Chauffeurs_listing.Statut="Actif" And Chauffeurs_indisponibilité.Numero_auto Is Null)
    ORDER BY [Chauffeurs_listing].Nom_chauffeur;


    Quand je la fais tourner seul il me demande d'entrer une valeur pour la Date_transport.

    Voici mon exemple d'indisponibilité:


    Quand je fait tourner ma requête voici ce que j'obtiens:

    * Exemple 1: si je met Date_transport = 14/05/2019


    * Exemple 2: si je met Date_transport = 20/05/2019


    Cela ne correspond pas a l'exemple d'indisponibilité encodée.

    Avez vous besoin d'autres informations pour m'aider ?
    BAV.
    Olivier.

  17. #17
    Expert éminent
    bonsoir,
    en effet, il y avait des erreurs de conception dans ma requête, du coup, c'est un petit peu plus compliqué.
    La voici corrigée:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT Chauffeurs_listing.nom_chauffeur, Chauffeurs_listing.prénom, Chauffeurs_listing.Statut, Chauffeurs_listing.Nchauffeur
    FROM Chauffeurs_listing LEFT JOIN Chauffeurs_indisponibilité ON Chauffeurs_listing.Nchauffeur = Chauffeurs_indisponibilité.Numero_chauffeur
    WHERE (((Chauffeurs_listing.Statut)="Actif") AND ((Chauffeurs_listing.Nchauffeur) Not In (SELECT Chauffeurs_listing.Nchauffeur
    FROM Chauffeurs_listing LEFT JOIN Chauffeurs_indisponibilité ON Chauffeurs_listing.Nchauffeur = Chauffeurs_indisponibilité.Numero_chauffeur
    WHERE (((Chauffeurs_listing.Statut)="Actif") AND (([Formulaires]![Transport_encodage]![Date_transport]) Between [Chauffeurs_indisponibilité].[Date_debut] And [Chauffeurs_indisponibilité].[Date_fin]))
    GROUP BY Chauffeurs_listing.Nchauffeur
    ))) OR (((Chauffeurs_listing.Statut)="Actif") AND ((Chauffeurs_indisponibilité.Numero_auto) Is Null))
    ORDER BY Chauffeurs_listing.nom_chauffeur;
    Quand on est derrière l'écran on n'a aucun clavier sous les mains ...

  18. #18
    Membre du Club
    Bonjour,
    La requête fonctionne très bien!!!

    Mais..eh oui malheureusement..cela ne fonctionne pas dans mon formulaire..auriez vous une idée ?



    Déja un tout grand merci...
    Olivier.

  19. #19
    Membre du Club
    en fait cette liste déroulante fonctionne uniquement quand j'ouvre mon formulaire pour la 1er fois et que je commence a encoder la date de transport...ne fonctionne plus après sauf si je referme le formulaire et commencer de nouveau par encoder la date de transport...pourriez vous m'aider ?

  20. #20
    Membre du Club
    je suppose que je dois dire de réactualiser a chaque fois la liste déroulante a chaque fois que je modifie la date de transport..donc créer un évènement sur la donnée date de transport "après maj" ?
    règlera peut être aussi le soucis que je ne commence pas par encoder cette donnée..qu'en pensez vous ?