IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Access Discussion :

Appl Access besoin de soutiens pas à pas [Débutant(e)]


Sujet :

Access

  1. #41
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    La solution que je te proposais ne fonctionne pas à cause du fait que certaines colonnes de la requête contiennent des valeurs nulles.
    Dans ton exemple, la colonne EtatAtt contient partout la valeur Null.
    De ce fait lorsque dans la requête tu as une comparaison avec
    « Comme "*" & [Formulaires]![FmRechercheAtt]![zdlFiltreEtatAtt] & "*" », Access répond non => ce qui explique qu’aucun enregistrement n’est sélectionné (toutes les conditions sont liées).

    Il va donc falloir construire dynamiquement la requête en fonction des valeurs figurant dans les contrôles filtres quand ceux-ci sont complétés.

    Je te reviens lorsque j'ai quelque chose qui tient la route.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  2. #42
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Voici une construction qui permet le fonctionnement de ton FmRechercheAtt.

    Comme source ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [TbAtt].[IDAtt], [TbAtt].[VEN], [TbAtt].[VENLie], [TbAtt].[NPage], [TbAtt].[Client], [TbAtt].[IDCodeAtt], [TbAtt].[IDActivite], [TbAtt].[DateAtt], [TbAtt].[IDCAFF], [TbAtt].[DLR], [TbAtt].[Origine], [TbAtt].[LieuW], [TbAtt].[LieuW2], [TbAtt].[Commune], [TbAtt].[NomAbo], [TbAtt].[ND], [TbAtt].[IDTech], [TbAtt].[DebutW], [TbAtt].[FinW], [TbAtt].[NPoteau1], [TbAtt].[NPoteau2], [TbAtt].[NPoteau3], [TbAtt].[NPoteau4], [TbAtt].[NPoteau5], [TbAtt].[NPoteau6], [TbAtt].[HeuresW], [TbAtt].[IDEtatW], [TbAtt].[NDecharge], [TbAtt].[CommentairesAtt], [TbAtt].[IDDetailAtt], [TbAtt].[IDMarche], [TbAtt].[IDEtatAtt], [TbAtt].[IDSR], [TbCAFF].[CAFF], [TbEtatW].[EtatW], [TbEtatAtt].[EtatAtt], [TbCodeAtt].[CodeAtt], [TbTech].[Nom] FROM TbTech RIGHT JOIN (TbEtatAtt RIGHT JOIN (TbEtatW RIGHT JOIN (TbCodeAtt RIGHT JOIN (TbCAFF RIGHT JOIN TbAtt ON [TbCAFF].[IDCAFF]=[TbAtt].[IDCAFF]) ON [TbCodeAtt].[IDCodeAtt]=[TbAtt].[IDCodeAtt]) ON [TbEtatW].[IDEtatW]=[TbAtt].[IDEtatW]) ON [TbEtatAtt].[IDEtatAtt]=[TbAtt].[IDEtatAtt]) ON [TbTech].[IDTech]=[TbAtt].[IDTech];
    Qui permet d’afficher tous les enregistrements parmi lesquels tu veux faire tes choix.

    L’idée, c’est de modifier cette source en fonction des choix des critères que l’utilisateur saisit dans les filtres.

    Chaque fois que l’utilisateur modifie un filtre, nous allons construire une nouvelle source.

    Pour avoir un exemple du code que nous devons construire dynamiquement, j’ai construit cette requête, juste pour voir :



    C’est-à-dire, celle de la source d’origine dans laquelle on limite à deux choix exprimés dans le formulaire.
    Si tu examines le SQL de cette requête, tu constates trois parties :



    la clause « Select », tu dis les colonnes à sélectionner ;
    la clause « From », tu dis où les trouver ;
    la clause « Where », tu dis quand sélectionner l’enregistrement.

    Dans notre construction dynamique, seule la partie rouge va évoluer.

    On y exprime, les valeurs qui ont été saisies par l’utilisateur. Chacune séparée par un « and ».
    Pour le SQL, il faut américaniser Formulaires => Forms.

    J’ai créé la table TbFiltre (sans « s », f-leb) :




    Colonne Filtre : le nom du contrôle dans le formulaire.
    Colonne Parametre : le code « américanisé ».

    Donc l’algorithme notre construction dynamique sera :
    - une partie fixe (les cadres bleu et vert)
    - une partie dynamique : Where suivi des « parametre » qui correspondent à chaque contrôle non null, chacun suivi de « and » (sauf le dernier).

    Voici la fonction qui sera appelée dans chaque événement « Après mise à jour » des contrôles « xxxFiltrexxx » de notre formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Sub SourceFmRechercheAtt()
    Dim sSql As String
    Dim sWhere As String
    Dim ctl As Control
    Dim bWhereExist As Boolean
    'Partie fixe
    sSql = "SELECT TbAtt.IDAtt, TbAtt.VEN, TbAtt.VENLie, TbAtt.NPage, TbAtt.Client, TbAtt.IDCodeAtt, TbAtt.IDActivite, TbAtt.DateAtt, TbAtt.IDCAFF, TbAtt.DLR, TbAtt.Origine, TbAtt.LieuW, TbAtt.LieuW2, TbAtt.Commune,"
    sSql = sSql & "TbAtt.NomAbo, TbAtt.ND, TbAtt.IDTech, TbAtt.DebutW, TbAtt.FinW, TbAtt.NPoteau1, TbAtt.NPoteau2, TbAtt.NPoteau3, TbAtt.NPoteau4, TbAtt.NPoteau5, TbAtt.NPoteau6, TbAtt.HeuresW, TbAtt.IDEtatW, "
    sSql = sSql & "TbAtt.NDecharge, TbAtt.CommentairesAtt, TbAtt.IDDetailAtt, TbAtt.IDMarche, TbAtt.IDEtatAtt, TbAtt.IDSR, TbCAFF.CAFF, TbEtatW.EtatW, TbEtatAtt.EtatAtt, TbCodeAtt.CodeAtt, TbTech.Nom "
    sSql = sSql & "FROM TbTech RIGHT JOIN (TbEtatAtt RIGHT JOIN (TbEtatW RIGHT JOIN (TbCodeAtt RIGHT JOIN (TbCAFF RIGHT JOIN TbAtt ON TbCAFF.IDCAFF = TbAtt.IDCAFF) ON TbCodeAtt.IDCodeAtt = TbAtt.IDCodeAtt) ON "
    sSql = sSql & "TbEtatW.IDEtatW = TbAtt.IDEtatW) ON TbEtatAtt.IDEtatAtt = TbAtt.IDEtatAtt) ON TbTech.IDTech = TbAtt.IDTech "
    'Construction de la clause Where
    sWhere = "Where "
    'Une boucle sur chaque contrôle filtre, compléter la clause si le contrôle n'est pas null
    For Each ctl In Me.Controls
        If ctl.Name Like "*filtre*" And Not IsNull(ctl) Then
            bWhereExist = True
            sWhere = sWhere & DLookup("Parametre", "TbFiltre", "Filtre=""" & ctl.Name & """") & " and "
        End If
    Next ctl
    'Si on a trouvé des filtres, supprimer le dernier " and " et placer à la suite du sql. Sinon pas de clause Where
    If bWhereExist Then
       sWhere = Left(sWhere, Len(sWhere) - 5)
       sSql = sSql & sWhere
    End If
    'Placer le point-virgule final
    sSql = sSql & ";"
    'Affecter cette requête comme source du formulaire
    Me.RecordSource = sSql
    End Sub
    Ceci suppose que dans le formulaire, seuls les contrôles « filtre » contiennent la chaîne « filtre » dans leur nom.

    Vois si ça te convient. Nous reparlerons ensuite des zones de liste « Filtre ».
    À cette occasion essaie d’expliquer ce que représente « Poteau », du point de vue métier et en quoi une sélection sur ce critère est intéressante.
    Images attachées Images attachées    
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  3. #43
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Bonjour Claude,

    Effectivement jamais je ne m'en serais sortis là, j'étais à 1000 lieux d'en voir cette complexité. Par tes explication cela semble effectivement ce à quoi on devrais s'attendre oui.

    J'ai donc essayé, mais j'ai des erreurs qui s'affichent comme ds l'image que je t'envoie.

    Bien à toi,
    Sylvain

  4. #44
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour,

    Désolé, c'est une faute de frappe dans le "parametre" de ce contrôle : il y a un ")" en trop à la fin.
    Corrige cette faute et tu verras que ça marche.

    Pour la suite, tu devrais étoffer la table tbAtt pour permettre de faire des tests complets.
    J'attends ton explication de la notion de poteau avant de continuer.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  5. #45
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Claude,

    Génial oui ça fonctionne, hormis Origine, NDecharge, VENlie, Poteau ?
    Le bouton commande au dessus c'est pour quoi faire ?

    Bien à toi
    Sylvain

  6. #46
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    hormis Origine, NDecharge, VENlie, Poteau
    Poteau, c'est normal : je n'ai pas encore compris !
    Pour les autres : complète ta table avec des exemples et explique avec de cas concret "ce qui ne va pas".

    Le bouton commande au dessus c'est pour quoi faire ?
    On peut le supprimer, il m'a servi à mettre le système au point.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  7. #47
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Claude,

    Alors, les poteaux, on peux en saisir jusqu'à 6 dans la TbAtt, largement suffisant, mais dans le filtre on devrais juste taper un N° de poteau et que cela fasse la recherche dans tous les champs poteaux car on peux nous demander des renseignements sur 1 poteau qui serait dans les 6 champs.

    Ok je supprime le btn commande.

    • Origine : Est la date de reception de l'OT "Ordre de Travail"
    • VENlie : "VEN est le N° d'OT" VENlie est un OT qui serait lié à un autre, pour une reintervention par exemple.
    • NDecharge : Est le N° de décharge qui est attribué pour un OT en fin de travaux quand les travaux ont étés effectués mais qu'un problème ne pouvant pas nous être imputé subsiste malgré tout.

    J'ai déjà ajouté dans la TbAtt ces données pour servir dans la recherche.

    Bien à toi
    Sylvain

  8. #48
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Sylvain,

    hormis Origine, NDecharge, VENlie
    Je ne l’ai pas fait exprès, mais ça tombe bien.
    Tu dois trouver toi-même pourquoi.

    La piste c’est soit :
    la table des filtres qui n’est pas correcte pour ces cas ;
    l’événement après mise à jour n’appelle pas la routine qui modifie la source.

    Quand tu as trouvé et corrigé, modifie ton formulaire de manière telle que les filtres soient des zones de liste modifiables.
    Comme, en toute logique, tu vas changer leur nom (zdtxxx =>zdlxxx), n’oublie pas de modifier la tbFiltre en conséquence et n’oublie pas que le critère change.

    Tu dis quand tu es OK.

    Avant cela, dis-moi si tous les numéros de poteau sont différents. En d’autres mots, un N° de poteau ne se trouve que dans un seul enregistrement de tbAtt.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  9. #49
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Claude,

    Oki je cherche l'erreur, merci pour l'indice

    oui tous les N° de poteaux sont différent sur un OT, mais peuvent revenir sur d'autre OT.

    1 OT = 1 enregistrement sur TbAtt

    Bien à toi
    Sylvain

  10. #50
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Claude,

    J'ai corrigé les erreur mais certaines persistent, Origine et ND, j'ai changé tous les filtres en zdl, fais le changement dans TbFiltre et ds les événements liés aux zdl, un autre indice pour moi ?

    Je te retourne la mdb avec les modifs.

    Bien à toi
    Sylvain

  11. #51
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour Syvain,

    J’ai un peu modifié la routine SourceFmRechercheAtt.

    Il y a une requête « r_FmRechercheAtt » dont nous allons modifier dynamiquement le SQL pour tenir compte des choix.

    Cette requête sera la source du formulaire.

    Pour ce qui est des zones de liste « filtre », c’est aussi cette requête qui servira de source.
    Par exemple, pour zdlFiltreVEN, nous aurons comme contenu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [r_FmRechercheAtt].[VEN] FROM r_FmRechercheAtt GROUP BY [r_FmRechercheAtt].[VEN] HAVING (((r_FmRechercheAtt.VEN) Is Not Null));
    Idem pour les autres, sauf pour zdlFiltrePoteau où nous aurons une requête Union pour intercepter les valeurs des six « NPoteau ». La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    SELECT TbAtt.NPoteau1
    FROM TbAtt
    GROUP BY TbAtt.NPoteau1
    HAVING (((TbAtt.NPoteau1) Is Not Null)) union SELECT TbAtt.NPoteau2
    FROM TbAtt
    GROUP BY TbAtt.NPoteau2
    HAVING (((TbAtt.NPoteau2) Is Not Null)) union SELECT TbAtt.NPoteau3
    FROM TbAtt
    GROUP BY TbAtt.NPoteau3
    HAVING (((TbAtt.NPoteau3) Is Not Null)) union SELECT TbAtt.NPoteau4
    FROM TbAtt
    GROUP BY TbAtt.NPoteau4
    HAVING (((TbAtt.NPoteau4) Is Not Null)) union SELECT TbAtt.NPoteau5
    FROM TbAtt
    GROUP BY TbAtt.NPoteau5
    HAVING (((TbAtt.NPoteau5) Is Not Null)) UNION SELECT TbAtt.NPoteau6
    FROM TbAtt
    GROUP BY TbAtt.NPoteau6
    HAVING (((TbAtt.NPoteau6) Is Not Null));

    Voici la nouvelle version de « SourceFmRechercheAtt() » :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Public Sub SourceFmRechercheAtt()
    Dim sSql As String
    Dim sWhere As String
    Dim ctl As Control
    Dim q As QueryDef
    'Partie fixe
    sSql = "SELECT TbAtt.IDAtt, TbAtt.VEN, TbAtt.VENLie, TbAtt.NPage, TbAtt.Client, TbAtt.IDCodeAtt, TbAtt.IDActivite, TbAtt.DateAtt, TbAtt.IDCAFF, TbAtt.DLR, TbAtt.Origine, TbAtt.LieuW, TbAtt.LieuW2, TbAtt.Commune,"
    sSql = sSql & "TbAtt.NomAbo, TbAtt.ND, TbAtt.IDTech, TbAtt.DebutW, TbAtt.FinW, TbAtt.NPoteau1, TbAtt.NPoteau2, TbAtt.NPoteau3, TbAtt.NPoteau4, TbAtt.NPoteau5, TbAtt.NPoteau6, TbAtt.HeuresW, TbAtt.IDEtatW, "
    sSql = sSql & "TbAtt.NDecharge, TbAtt.CommentairesAtt, TbAtt.IDDetailAtt, TbAtt.IDMarche, TbAtt.IDEtatAtt, TbAtt.IDSR, TbCAFF.CAFF, TbEtatW.EtatW, TbEtatAtt.EtatAtt, TbCodeAtt.CodeAtt, TbTech.Nom "
    sSql = sSql & "FROM TbTech RIGHT JOIN (TbEtatAtt RIGHT JOIN (TbEtatW RIGHT JOIN (TbCodeAtt RIGHT JOIN (TbCAFF RIGHT JOIN TbAtt ON TbCAFF.IDCAFF = TbAtt.IDCAFF) ON TbCodeAtt.IDCodeAtt = TbAtt.IDCodeAtt) ON "
    sSql = sSql & "TbEtatW.IDEtatW = TbAtt.IDEtatW) ON TbEtatAtt.IDEtatAtt = TbAtt.IDEtatAtt) ON TbTech.IDTech = TbAtt.IDTech "
    'Construction de la clause Where
    'Une boucle sur chaque contrôle filtre, compléter la clause si le contrôle n'est pas null
    For Each ctl In Me.Controls
        If ctl.Name Like "*filtre*" And Not IsNull(ctl) Then
            sWhere = sWhere & DLookup("Parametre", "TbFiltre", "Filtre=""" & ctl.Name & """") & " and "
        End If
    Next ctl
    'Si on a trouvé des filtres, supprimer le dernier " and " et placer à la suite du sql. Sinon pas de clause Where
    If Len(sWhere) <> 0 Then
       sWhere = Left(sWhere, Len(sWhere) - 5)
       'Y a-t-il une recherche sur "Poteau" ?
       If sWhere Like "*poteau1*" Then
          sWhere = sWhere & " or " & Replace(sWhere, "poteau1", "poteau2") _
                          & " or " & Replace(sWhere, "poteau1", "poteau3") _
                          & " or " & Replace(sWhere, "poteau1", "poteau4") _
                          & " or " & Replace(sWhere, "poteau1", "poteau5") _
                          & " or " & Replace(sWhere, "poteau1", "poteau6")
       End If
     
       'Terminer la clause Where (encadrer le code entre Where (  et )
       sWhere = "Where (" & sWhere & ")"
       sSql = sSql & sWhere
    End If
    'Placer le point-virgule final
    sSql = sSql & ";"
    'Modifier la requête r_FmRechercheAtt
    Set q = CurrentDb.QueryDefs("r_FmRechercheAtt")
    q.sql = sSql
    'Affecter cette requête comme source du formulaire
    Me.RecordSource = "r_FmRechercheAtt"
    'Rafraîchir les listes
    For Each ctl In Me.Controls
        If ctl.Name Like "zdlfiltre*" Then
           ctl.RowSource = ctl.RowSource
        End If
    Next ctl
    End Sub
    Remarque ce qui se passe si le filtre zdlFiltrePoteau a une valeur (la clause Where contient une référence à « poteau1 », on démultiplie les critères pour rechercher aussi dans les colonnes « Npoteau2 » à « Npoteau6 ».

    Vois, à la fin, comment on "réveille" les listes pour tenir compte du rafraîchissement de "r_FmRechercheAtt".
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  12. #52
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Bonjour Claude,

    Géniallissime, c'est exactement cela Claude.

    Peux tu me guider maintenant pour TbAtt et sa liaison avec FmDetailAtt je l'ai mis en place mais je ne sais pas si le champ pères et le champ fils sont corrects car au lieu d'ajouter plusieurs produits par Att cela n'ajoute qu'un seul produit et bloque au deuxième, quels indices pourrais tu me donner pour que je creuse ds le bon sens ? Merci d'avance cher professeur

    Bien à toi,
    Sylvain

    NB :

    Pour ma compréhension du SQL que veux dire le HAVING dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HAVING (((TbAtt.NPoteau4) Is Not Null)) union SELECT TbAtt.NPoteau5
    FROM TbAtt

  13. #53
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour Sylvain,

    Peux tu me guider maintenant pour TbAtt et sa liaison avec FmDetailAtt
    Je ne comprends pas la question s’agit-il de

    FmAtt et sa liaison avec FmDetailAtt ?

    La table TbDetailAtt est vide.

    Explique ce que tu cherches à faire.

    Pour ma compréhension du SQL...
    Tu dois lire comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TbAtt.NPoteau1 FROM TbAtt GROUP BY TbAtt.NPoteau1 HAVING (((TbAtt.NPoteau1) Is Not Null)) 
    union  
    SELECT TbAtt.NPoteau2 FROM TbAtt GROUP BY TbAtt.NPoteau2 HAVING (((TbAtt.NPoteau2) Is Not Null));
    Constitue l’union de deux requêtes :
    la première cherche dans TbAtt toutes les valeurs de NPoteau1 (sauf null)
    la seconde cherche dans TbAtt toutes les valeurs de NPoteau2 (sauf null)

    Pour construire une telle requête :
    1er temps, tu crées chaque requête individuelle.
    2e temps, tu prends le sql de la 1re, tu supprimes le point-virgule final et tu ajoutes <espace>union<espace suivi du sql de la seconde.

    Et ainsi de suite.

    Tape « requête union » dans l’aide Access, c’est expliqué.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  14. #54
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Claude,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FmAtt et sa liaison avec FmDetailAtt ?
    Oui c'est cela Claude, Elle est vide car je n'arrives pas à faire la liaison entre les deux, et je ne sais pas comment la remplir pour faire en sortes qu'elle soit liée à un seul VEN.

    Bien à toi,
    Sylvain

  15. #55
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Explique avec des mots la finalité de ce que tu veux faire.

    Ex : avec un formulaire, je voudrais...
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  16. #56
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Claude,

    Avec ce formulaire je souhaiterais pouvoir ajouter les détails des produits utilisés dans chaque Att et l'etat de cet Att "TbEtatAtt".

    Bien à toi,
    Sylvain

  17. #57
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Tu veux donc qu’à un enregistrement de ta table TbAtt correspondent n enregistrements dans TbDetailAtt.

    Donc il faut dans TbDetailAtt, un champ IdAtt qui va permettre d’établir la relation entre les deux tables.
    Vois la modification apportée dans le schéma des relations.

    N.B. Dans TbAtt, j’ai supprimé IdDetailAtt qui n’a aucune raison d’être.

    xxxxxxxxx

    La coordination entre FmAtt et FmDetailAtt doit se faire sur les champs qui lient leur source : c’est-à-dire idAtt.
    J’ai ajouté dans les deux formulaires, un contrôle zdtIDAtt. Comme ils n’ont pas d’utilité pour l’utilisateur du formulaire, j’ai mis leur propriété Visible à non.

    Lorsqu’on veut ajouter un enregistrement dans TbDetailAtt, il faut (en raison de la relation de
    TbDetailAtt avec TbAtt) que le champ idAtt de TbDetailAtt soit égal à la valeur de idAtt dans tbAtt.
    Vois l’instruction attachée à l’événement « avant insertion » du formulaire FmDetailAtt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.zdtIDAtt = Me.Parent!zdtIDAtt
    En français : avant d’insérer un nouvel enregistrement, mettre dans ZdtIDAtt [du formulaire FmDetailAtt], ce qui trouve dans le champ ZdtIDAtt du parent de FmDetailAtt [c.-à-d. FmAtt].

    Et voilà !
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  18. #58
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Bonjour Claude,

    Génial oui je comprends la logique, par contre dans Tbdetail les champs Désignation, Unité et tarif U devraient s'afficher automatiquement à la sélection de l'article, toutes ces données sont dans la TbProduit, et le champTotalArticle doit être un champ calculé, chose que j'ai réussis à faire
    En bas j'ai ajouté aussi la somme des champs TotalArticle que j'ai aussi réussis, choses somme toute simplissime pour toi mais dont je suis très fier d'avoir fait
    Y a t'i moyen de rendre le FmDetailAtt auto-extensible dans le FmAtt ?
    Je te joint le zip avec ces ajouts.

    Les lettres de chaque coté de l'article c'est soit devant soit derrière, j'ai ajouté leur significations qui seront utiles à avoir : N = BORNE OU CANA - F = FACADE OU IMMEUBLE - Q =AERIEN - X = PLEINE TERRE

    Maintenant ce que je voudrais savoir c'est comment ajouter la majoration qui est liée au type de marché.
    Les Marchés sont liés par le Code d'attachement, PO, PF, BL ... car il y a des attachement qui sont Majorés (Non Forfaitisés) et Non Majorés (Forfaitisés)
    Les coefficients sont dans TbMarche.

    Je ne sais pas si c'est important pour l'instant mais, les coefficients sont liés à une date ils sont valables 3 ans, mais peuvent changer en cours de route.
    ce qui m’inquiètes, c'est que les Attachement faits avant changements restent basés sur les coefficients postérieurs, il ne faut absolument pas qu'ils prennent comme coef les nouvelles valeurs.

    Bien à toi,
    Sylvain

  19. #59
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 282 192
    Points
    282 192
    Par défaut
    Bonjour Sylvain,

    Dans la dernière bdd que tu postes, le formulaire fmAtt ne fonctionne plus, en tout cas, pas chez moi. Les enregistrements de détail ne s’affichent plus.

    Je suis donc reparti de ma proposition précédente, en essayant de comprendre ce que tu recherches.


    FmDetailAtt

    Intéresse-toi à la source des contrôles : Designation, CodeU, Tarif et Total.
    Examine les propriétés des zones de liste Article, EtatAtt (Contenu, nbre colonnes…).
    Je n’ai pas compris :
    - pourquoi EtatAtt est dans la section Entête du formulaire et non dans la section Détail ;
    - ce que signifient TotalIHM et TotalIM.

    Remarques sur ton modèle

    Dans tbDetailAtt, les champs Designation, Unite, TarifU sont inutiles car redondants (infos dans TbProduit).
    J’ignore ce que veulent dire TotalHM et TotalM, probablement inutiles aussi.

    ------------------

    Mon avis

    Cette discussion part dans tous les sens et risque de devenir un dialogue sans intérêt pour les autres participants du forum.

    Je suggère ceci :

    - tu clôtures cette discussion ;
    - si nécessaire, pour continuer la mise au point de fmAtt et fmDetailAtt, tu ouvres une discussion spécifique, avec comme sujet par exemple :
    Comment procéder pour gérer, à l’aide d’un formulaire, deux tables liées entre elles.

    Quand ce sujet sera épuisé, tu en ouvriras un autre pour discuter du problème qui concerne la valorisation avec un tarif qui évolue dans le temps, un autre pour dimensionner ton formulaire et le sous-formulaire en fonction du nombre d’enregistrements affichés…
    Idéalement, chaque discussion devrait avoir un titre qui permet, à un participant qui a un problème semblable, de la retrouver facilement.

    Et y aller progressivement : ne pas passer à un autre sujet tant que tu n'as pas compris et assimilé la solution proposée. Le but de la démarche est de te faire progresser en Access et non pas te livrer un machin qui fonctionne.

    À bientôt.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  20. #60
    Membre régulier
    Homme Profil pro
    Technico - Administratif
    Inscrit en
    Août 2008
    Messages
    384
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technico - Administratif
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Août 2008
    Messages : 384
    Points : 107
    Points
    107
    Par défaut
    Bonjour Claude,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    - pourquoi EtatAtt est dans la section Entête du formulaire et non dans la section Détail ;
    - ce que signifient TotalIHM et TotalIM.
    EtatAtt est dans l'entête car il est valable pour l'ensemble des détails et non pas détail par détail comme actuellement. D'ailleurs je ne comprends pas pourquoi la zdlEtatAtt change par details, je souhaiterais qu'une seule sélection de zdlEtatAtt soit lié à la TbDetailAtt.


    TotalHM : est le total des détails Hors Majoration c'est bien comme suit qu'il faut faire ?
    TotalM : est le Total * "Coef du marché lié au CodeAtt"
    Je récupéres cette valeur dans la TbMarch Comme suit?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TotalM = [TotalHM]*[TbMarche.Coef]
    Ok Claude, dés que TbDetailAtt est Ok je clôtures et crée une autre discutions pour la suite.

    Bien à toi
    Sylvain

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 4 PremièrePremière 1234 DernièreDernière

Discussions similaires

  1. bdd Access 97 ne s'ouvre pas
    Par tleboukaka dans le forum Access
    Réponses: 5
    Dernier message: 21/08/2008, 12h19
  2. [ADO, Access]_Paramètre ?_2 n'a pas de valeur par défaut?
    Par Gdal dans le forum Accès aux données
    Réponses: 1
    Dernier message: 04/03/2008, 22h19
  3. Réponses: 3
    Dernier message: 29/11/2007, 14h19
  4. Réponses: 3
    Dernier message: 24/09/2007, 19h40
  5. [Access] Update ne s'exécute pas complètement car PK
    Par JulienCEA dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/02/2006, 22h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo