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

IHM Discussion :

Formulaire Double Affichage filtré sur variable Publique [AC-2013]


Sujet :

IHM

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut Formulaire Double Affichage filtré sur variable Publique
    Bonjour

    Dans le fichier de supervision des couts clients que je suis en train de construire (suite échange post * http://www.developpez.net/forums/d15...eil-vba-p-sql/ résolu par Jimbolion, je souhaite maintenant filtrer l'affichage des données dans une Formulaire Double affichage, en fonction du consultant choisit lors de l'accès avec le formulaire d'accueil.

    J'ai un début de piste avec un Filtre danses propriétés du Formulaire, mais ce n'est pas automatiques avec ma variable publique.

    Enfin, j'ai un souci plus global d'enregistrement de nouvelles données dans ma table avec ce Formulaire double affichage, car j'ai "sorti" le champs de l'IdConsultant, pour l'afficher en Haut du Formulaire en fonction du choix du consultant effectué à l'Accueil...

    Comme c'est pas simple a expliquer, j'ai fait un petit fichier explicatif avec copie d'écran et contexte de mon projet, et je vous joint aussi le fichier...
    lPièce jointe 197338
    Pièce jointe 197340


    Un grand merci à celui ou celle qui se penchera sur mon fichier.

    RC

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion

    Eh oui encore moi

    Plutôt qu'utiliser ton filtre en utilisant une variable de type publique dans les feuilles de propriétés (impossible à ma connaissance), nous allons définir dans le code l'application de ce filtre.
    Tu vas donc supprimer ce filtre dans ta feuille de propriétés :

    Nom : Capture1.JPG
Affichages : 2953
Taille : 39,8 Ko

    Nous verrons ensuite comment appliquer ce filtre dans la partie VBA

    Concernant ton deuxième souci, le champ idConsultant doit être présent dans ton formulaire, l’absence de ce champ interdit l'injection dans ta table T_Temps car les règles d'application de l'intégrité référentielle ne sont pas respectées.

    Nous allons donc intégrer ce champ dans le formulaire :

    Nom : Capture2.JPG
Affichages : 2813
Taille : 54,3 Ko

    Les propriétés de ce champ seront conformes à ceux décrits sur l'écran ci-dessus (tu remarqueras la propriété visible à <Non>). Nous définirons dans la portion de code VBA que la valeur par défaut de ce champ devra être celui de la variable publique.

    Le code VBA permettant donc de gérer à la fois l'application du filtre et la mise en place de la valeur par défaut sur Idconsultant sera intégré dans l’événement <Sur Ouverture> des propriétés du formulaire : j'ai commenté ces lignes afin de faciliter la lecture du code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub Form_Open(Cancel As Integer)
      Me.lblConsultant.Caption = WConsultant
      '
      ' Définition du filtre appliquée sur la variable publique
      '
      DoCmd.ApplyFilter , "[IdConsultant]=" & WConsultant
      '
      ' La valeur du champ par défaut de IdConsultant appliquée sur la variable publique
      ' afin d'appliquer les règles d'intégrité référentielles entre T_Consutant et T-Temps
      '
      Me.IdConsultant.DefaultValue = WConsultant
      '
      Dim db As Database
      Dim rs As Recordset .....
    Après application de ces correctifs, ton formulaire est prêt à l'emploi. Toutefois il est déconseillé d'utiliser des variables publiques car la moindre exception non gérée dans ton code (erreur levée par ton code) provoque la perte du contenu de ta variable globale. D'autres techniques peuvent être mises en place comme :

    1. Utilisation de parameters https://msdn.microsoft.com/fr-fr/lib.../ff194182.aspx
    2. Gestion de tes variables dans une table temporaire


    Pour donner de la robustesse à ton code, je te conseille de lire ce tutoriel sur la gestion des erreurs (ce tutoriel est destiné à Excel mais s'applique à Access) :

    http://silkyroad.developpez.com/VBA/GestionErreurs/

    et la gestion des techniques de debug :

    http://cafeine.developpez.com/access...el/debugprint/

    Ensuite la construction du formulaire de Saisie des temps aurait pu être réalisé sur la technique des formulaires et sous formulaires :

    http://claudeleloup.developpez.com/t...us-formulaire/

    Je te renvoie donc la base avec mes correctifs

    Bonne continuation et à bientôt pour de nouvelles aventures

    JimboLion
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut
    Bonjour JimboLion,

    merci pour ces correctifs qui me permettent d'avancer, pas à pas.

    Pour les conseils sur les erreurs de SilkyRoad et la technique de debug de Charles, c'est effectivement une bonne ressource.
    Il ya certaines notions que je connaissais et que j'utilise soit dans le VBA Excel, et que je découvre sur ACESS.
    Par contre, pour être clair, à mon niveau de connaissance, je ne suis pas capable de les mettre de suite en pratique.
    J'apprends et surtout comprends quand je rencontre les problèmes sur des cas concrets pour moi, et c'est pour cela que je sollicite des experts pour apporter les bons éclairages. Je te remercie donc pour le temps que tu veux bien accorder à mes demandes.

    Si tu es partant, voici les "quelques" questions suivantes:

    1. Non affichage colonne IdConsulant dans formulaire F-SaisieTemps
    J'ai bien compris le fait de rajouter le champs dans le formulaire pour avoir l'intégrité et le fait de mettre la propriété "non visible" pour qu'il n'apparaisse pas dans la formulaire. En revanche, la colonne apparaît en dessous, dans la soustable...
    J'avais précedement essayer de la supprimer, mais cela crée le problème que tu as résolu...
    Question: est il possible de la cacher?
    Je rebondis sur ta remarque du double formulaire, je suis parti sur cet interface avec l'assistant de formulaire.
    Pour faire ce type de saisis comment aurais tu fais, sachant que ce sont les mêmes données en saisie, et en affichage en bas ?
    Sur l'exemple de Claude Leloup, il y a d'autres infos qui sont rapportées dans le sous formulaire?

    2. Bug 1ère saisie "F-SaisieTemps":
    Avec la version actuelle Variable Publique que j'ai laissé dans le fichier joint, lorsque j'arrive sur le formulaire de "F-SaisieTemps", j'ai mis un focus sur la date .
    Je rencontre un souci, j'arrive à la sélectionner, mais plus à sortir de ce champs. Je suis bloqué et je ne peux rien faire. Si je sors, ca fait planter, et la solution est de supprimer cette 1ère saisie, puis après... ca fonctionne correctement, je peux enregistrer autant de nouvelles saisies que je souhaite. Est ce que le fait de donner le focus à la date au chargement est bloquant ?


    3. Bug non remontée des infos des lignes dans "F-SaisieTemps":
    Dans le sous tableau du formulaire, je ne peux pas remonter les infos des lignes pour les modifier comme c'est le cas dans le formulaire "F-SaisieTempsKm" qui n'est pas encore filtré sur le consultant...
    J'ai bien compris qu'on filtre sur les lignes du Consultant uniquement,

    4. Essai mise en place le paramêtre en remplacement des variables publiques:


    J'ai uniquement besoin de définir le paramètre du consultant.
    Je le fais dans mon formulaire "F-Accueil" lors de la validation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub btnAccèsMenus_Click()
      If Len(Me.chbxConsultant) = 0 Or Len(Me.txtMDP) = 0 Then Exit Sub
      ' essai Paramêtre vs Variables publiques
      DoCmd.SetParameter "prmConsultant", Me.chbxConsultant
    [...]
    Sur l'aide Microsoft pour cette méthode, il est spécifié:
    Étant donné que chacune de ces méthodes qui accepte les paramètres efface la collection parameters lorsqu'elle est terminée, vous devez vous assurer que vos appels SetParameter précèdent immédiatement l'appel à la méthode qui les emploie.
    C'est pas clair pour moi, en fait, je fais un paramètre pour l'utiliser plus tard et non immédiatement...

    Je teste sur le prochain formulaire "F-MenuUtilisateur" ou j'utilisais la variable publique avant:
    et donc ca marche pas, le paramètre est vide, j'imagine que le paramètre s'utilise d'une autre façon?
    D'autre part, l'aide ne parle pas de OpenRecordset... on peut donc pas l'utiliser ici?

    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
    Private Sub btnAccèsMenus_Click()
     
      If Len(Me.chbxConsultant) = 0 Or Len(Me.txtMDP) = 0 Then Exit Sub
      
      ' essai Paramêtre vs Variables publiques
      DoCmd.SetParameter "prmConsultant", Me.chbxConsultant
      
      Dim db As Database
      Dim rs As Recordset
      Dim MotDePasse As String
      Dim StatutConsutlant As String
     
      Set db = CurrentDb
      Set rs = db.OpenRecordset("SELECT Mdp, Statut FROM [T-Consultant] WHERE IdConsultant = " & Me.chbxConsultant & ";")
      ' essai incorrect avec le paramêtre:
      'Set rs = db.OpenRecordset("SELECT Mdp, Statut FROM [T-Consultant] WHERE IdConsultant = " & prmConsultant & ";")
    '[...]

    Le souci est le même dans le formulaire "F-MenuUtilisateur" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    '------------------------------------------------------------
      ' Au chargement, rappel du nom du consultant
    '------------------------------------------------------------
    Private Sub Form_Load()
      
      Dim db As Database
      Dim rs As Recordset
     
      Set db = CurrentDb
      Set rs = db.OpenRecordset("SELECT NomComplet FROM [R-ConsultantEtendu] WHERE IdConsultant = " & WConsultant & ";")
      ' essai incorrect du paramêtre
      'Set rs = db.OpenRecordset("SELECT NomComplet FROM [R-ConsultantEtendu] WHERE IdConsultant = " & prmConsultant & ";")
    '[..]
    et dans "F-SaisieTemps":
    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
    Private Sub Form_Open(Cancel As Integer)
      
      ' Définition du filtre appliquée sur la variable publique
      DoCmd.ApplyFilter , "[IdConsultant]=" & WConsultant
      ' essai incorrect avec paramêtre:
      'DoCmd.ApplyFilter , "[IdConsultant]=" & prmConsultant
      
      
      ' La valeur du champ par défaut de IdConsultant appliquée sur la variable publique
      ' afin d'appliquer les règles d'intégrité référentielles entre T_Consutant et T-Temps
      Me.IdConsultant.DefaultValue = WConsultant
      ' essai incorrect avec paramêtre:
      ' Me.IdConsultant.DefaultValue = prmConsultant
      
      Dim db As Database
      Dim rs As Recordset
      
      Set db = CurrentDb
      Set rs = db.OpenRecordset("SELECT NomComplet FROM [R-ConsultantEtendu] WHERE IdConsultant = " & WConsultant & ";")
      ' essai incorrect avec paramêtre:
      'Set rs = db.OpenRecordset("SELECT NomComplet FROM [R-ConsultantEtendu] WHERE IdConsultant = " & prmConsultant & ";")
    => Peux tu STP m'expliquer comment procéder de la bonne manières avec les paramètres ?

    Pièce jointe 197450


    cela fait quelques points pour échanger, je te remercie par avance pour ton aide "pédagogique",

    RC




  4. #4
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion

    Je vais reprendre çà tranquillement dès ce soir et transformer ton forms en forms + sous forms !

    çà te permettra de comprendre le fonctionnement, le filtre étant directement passé dans l'argument openform

    Jimbolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  5. #5
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion bonjour,

    Je vais traiter dans cette partie ma façon de gérer une table Paramètres afin de conserver les valeurs au gré du déroulement de ton applicatif. Il est vrai que dans ton cas la méthode DoCmd.SetParameter ne répond pas à nos exigences. Concernant la gestion de ton formulaire Saisie_Temps je m'y attelle et te présente dans un nouveau post d'ici demain la façon dont j'ai géré ton problème. Nous utiliserons alors ce que nous allons voir ci-dessous.

    Tu l'auras compris, l'intérêt d'une table Paramètres te permet de conserver les valeurs acquises même lorsqu'une erreur est levée par l'applicatif (en effet le contenu de tes variables globales est alors effacé). Un autre intérêt est de pouvoir visualiser rapidement le contenu de ces dites variables, rien de plus frustrant que de chercher dans le code la valeur d'une variable et l'endroit ou son contenu a été modifié.

    Nous allons dans ce post en mode pas à pas apprendre à construire nos premiers outils d'aide au développement.

    1. Construction de la table :

    Cette entité est composé de deux champs nommés description et valeur. Description défini donc le type de variable alors que valeur décrit son contenu.

    Nom : Capture.JPG
Affichages : 2630
Taille : 59,9 Ko

    2. La partie VBA :

    Afin d'utiliser cette table et la nourrir de nos précieuses informations il va nous falloir créer quelques fonctions :

    1. L'insertion des valeurs
    2. La récupération des valeurs
    3. La suppression des valeurs


    a) L'insertion des valeurs :

    Cette fonction nous permet d'insérer des valeurs dans notre table, ainsi l'insertion d'un ID, d'une clé ou toute autre information nécessitant un archivage pour une utilisation ultérieure. Cette fonction doit également contrôler l'existence d'une clé déjà présente, dans ce cas le type de requête exécutée sera Update et non Insert. Afin de contrôler l'existence d'une clé nous utiliserons la fonction Dcount ici détaillée : https://support.office.com/fr-fr/art...a-11a64acbf3d3

    Le code permet d'utiliser cette fonction :

    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
    Function InsertUpdate_Parametre(p_Description As String, p_Valeur As String) As Boolean
    '
    ' Fonction permettant de Mettre à jour un Parametre dans la table T_Parametres
    ' la fonction détecte la présence de la clé dans ce cas update sinon Insert
    ' Retourne True si la fonction s'est correctement déroulée
     
    On Error GoTo err_InsertUpdate_Parametre
    '
    ' Inserer une nouvelle valeur dans les parametres
    '
    Dim R_Sql As String
    If DCount("Valeur", "T_Parametres", "Description='" & p_Description & "'") = 0 Then
        R_Sql = "INSERT INTO [T_Parametres] " & _
            "(Description, Valeur) " & _
            " VALUES (" & _
            "'" & Nz(p_Description, "") & "', " & _
            "'" & Protected_Quote(Nz(p_Valeur, "")) & "'" & _
            ")"
    Else
        '
        ' Modifier le contenu de la variable
        '
        R_Sql = "UPDATE T_Parametres SET T_Parametres.Valeur = '" & Protected_Quote(Nz(p_Valeur, "")) & "' WHERE (((T_Parametres.Description)='" & Nz(p_Description, "") & "'));"
    End If
    '
    CurrentDb.Execute R_Sql, dbFailOnError
    InsertUpdate_Parametre = True
    Exit Function
    err_InsertUpdate_Parametre:
        MsgBox Err.Description & Err.Number
        Exit Function
    End Function
    Cette fonction exige deux arguments à savoir la clé de description et sa valeur ainsi l'utilisation de cette fonction pourrait s'opérer de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InsertUpdate_Parametre "TVA_Normale",20.6
    et l'alimentation dans la table T_Parametres nous fournirait ceci :

    Nom : Capture2.JPG
Affichages : 2499
Taille : 19,9 Ko

    Il est à noter que la fonction retourne True si l'opération s'est correctement déroulée, l'utilisation du retour permettant d'anticiper certaines actions ou avertir l'utilisateur. La fonction Protected_Quote utilisée gère la présence de quotes dans la chaîne de caractère entraînant les erreurs d'interprétation de la requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function Protected_Quote(ChaineProtect As String) As String
    '
    ' Fonction de protection visant à protéger les simple quotes et doublequotes dans les requetes SQL
    '
    Protected_Quote = Replace(ChaineProtect, "'", "''")
    Protected_Quote = Replace(Protected_Quote, Chr(34), Chr(34) & Chr(34))
    End Function
    b) Récupérer une valeur :

    Lorsque les clés ont été enregistrées dans la base, une fonction permet de récupérer sa valeur ainsi le code suivant répond à cette problématique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function Get_Parametre(p_Description As String) As String
        '
        ' Fonction permettant de retourner un Parametre depuis la table T_Parametres
        ' Retourne une chaine vide si aucune occurence détectée
        '
        Get_Parametre = Nz(DLookup("Valeur", "T_Parametres", "Description='" & p_Description & "'"), "")
    End Function
    Nous avons ici utilisé une fonction de domaine et principalement Dlookup. Je vous conseille la lecture de ce tutoriel afin de vous familiariser avec ces fonctions :

    Les fonctions de domaines dans Access

    A noter que si aucun valeur n'est trouvée dans la table, la fonction renvoie une chaîne vide.

    un exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    msgbox "Le taux de TVA est : " & Get_Parametre("TVA_Normale")
    c) La suppression d'une valeur :

    Il peut être utile de supprimer une clé dans la table, voire éventuellement la totalité des entrées. L'implémentation de ce code répond donc à cette situation :

    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
    Function Del_Parametre(Optional p_Description As String) As Boolean
        '
        ' Fonction permettant de supprimer un Parametre dans la table T_Parametres
        ' Retourne True si la fonction s'est correctement déroulée
        '
        Dim R_Sql As String
        On Error GoTo err_Del_Parametre
        Select Case Nz(p_Description, "")
        Case ""
     
            R_Sql = "DELETE T_Parametres.Description FROM T_Parametres;"
        Case Else
            R_Sql = "DELETE T_Parametres.Description FROM T_Parametres WHERE (((T_Parametres.Description)='" & p_Description & "'));"
        End Select
        CurrentDb.Execute R_Sql, dbFailOnError
        Del_Parametre = True
        Exit Function
    err_Del_Parametre:
        MsgBox Err.Description & Err.Number
        Exit Function
    End Function
    Il est à noter que le retour de la fonction renvoie True si elle s'est correctement déroulée. Nous remarquerons que l'argument Optional n'implique pas nécessairement la présence d'une valeur dans l'appel de la fonction. Si aucun argument n'est renseigné, cela nous permettra de vider le contenu complet de la table. Quelques exemples d'appel ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Del_Parametre "TVA_Normale" ' efface l'entrée Taux de tva
    Del_Parametre               ' Efface toutes les entrées de la table
    Je pense que ce post inspirera plusieurs personnes, alors si vous avez aimé, n'hésitez pas à mettre des

    Amicalement

    JimBolion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  6. #6
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion,

    Pour faire suite au post précédent, nous allons donc reprendre la saisie des temps en appliquant les techniques d'un formulaire père-fils. Dans cette explication, nous irons donc en mode pas à pas et je tâcherai d'être le plus explicite possible. Il existe de multiples techniques afin de résoudre ta problématique, j'ai appliqué une philosophie personnelle qui jusque là m'a donné toute les satisfactions donc autant faire partager.

    I) La problématique et les contraintes :

    Dans la conception de tout projet, il faut d'abord définir les règles et les méthodes à appliquer. Une vision superficielle ou une idée globale conduit généralement à de l'adaptation (bidouillage), et globalement à un projet décousu et non fonctionnel.
    Nous allons donc définir l'objectif souhaité, comment la perception de l'IHM doit être réalisée afin que l'utilisateur y trouve simplicité, ergonomie... Un développeur se doit de penser à la simplicité des utilisateurs avant de penser au sien. Nous rajouterons également des règles de contrôle et interception d'erreurs afin de donner de la robustesse au code.

    Dans ma réflexion, j'aurai pu simplement fournir un formulaire + un sous formulaire dont la relation aurait été bâtie uniquement sur l'ID_Consultant, la saisie des temps s'opérant uniquement dans le sous formulaire. Mais finalement, j'ai adopté ta technique permettant de renseigner sur les mêmes champs avant d'injecter les données dans la saisie des temps. Afin de pas perturber l'utilisateur dans une navigation formulaire <-> Sous-formulaire en ce qui concerne la modification, les changements s’opéreront sur les mêmes champs. Le confort du consultant étant de mise, l'ordre de tri dans le sous formulaire s'effectuera en décroissant sur l'idTemps de ta table héritée ainsi la dernière saisie se trouvera en haut de la liste.

    Je fourni donc une image du résultat attendu et nous verrons comment arriver à ce résultat :

    Nom : Capture1.JPG
Affichages : 2664
Taille : 61,9 Ko


    II) La Construction de notre sous-Formulaire :

    A partir de notre table T_Temps nous allons donc construire notre sous formulaire en glissant les champs nécessaires à la visualisation des données. Afin de satisfaire nos contraintes (interdire l'ajout, interdire les modifications), nous allons donc modifier les propriétés de celui-ci :

    Nom : Capture2.JPG
Affichages : 2798
Taille : 69,6 Ko

    D'autre part j'ai également rendu inactif l'affichage du sélecteur puisque l'ordre de tri implique nécessairement l'affichage de la dernière saisie en tête de liste, un ascenseur vertical autorisant la navigation entre les différents enregistrements (nous sommes donc typiquement dans un formulaire en mode continu).

    Souviens toi, nous avons défini comme contrainte que la modification d'une ligne de temps s’opérera sur le cadre du formulaire prévu à cet effet. Pour cela dès activation d'une ligne de saisie, nous reporterons ces informations sur la partie supérieure de l'écran (dans le forms principal). La propriété <sur Activation> répond donc à notre première problématique :

    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
    Private Sub Form_Current()
        '
        ' Evite de positionner les valeurs de l'enregistrement sur les zones de saisies
        ' indépendantes du formulaire principal lors de l'activation
        ' Contrôle ainsi la première ouverture et considère qu'il s'agit d'une nouvelle saisie
        '
        '
        If Me.Parent.E_Ouverture = 0 Then
            Me.Parent.E_Ouverture = -1
            Me.Parent.E_IdTemps = 0
            Exit Sub
        End If
        '
        ' Récupérer sur les zones de saisies les valeurs du sous formulaire
        '
        Me.Parent.E_IdTemps = Me.N°
        Me.Parent.E_DateIntervention = Me.DateIntervention
        Me.Parent.E_IdClient = Me.IdClient
        Me.Parent.E_Type = Me.Type
        Me.Parent.E_Pourcentage = Me.Pourcentage
        Me.Parent.E_Commentaire = Me.Commentaire
        '
        ' Rendre le bouton <Supprimer> actif
        '
        Me.Parent.B_Delete.Enabled = True
    End Sub
    L'activation s'opérant dès lors de l'ouverture du formulaire, nous contrôlons si il s'agit d'une première ouverture afin de ne pas reporter les résultats sur la ligne de modification. Un flag sera positionné (champ indépendant non visible) sur le formulaire principal afin de valider si il s'agit de la première ouverture ou non.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        If Me.Parent.E_Ouverture = 0 Then
            Me.Parent.E_Ouverture = -1
            Me.Parent.E_IdTemps = 0
            Exit Sub
        End If
    En positionnant 0 sur un champ indépendant du formulaire principal (E_IdTemps non visible), nous pourrons agir sur une insertion et non pas une mise à jour.
    Les propriétés du sous formulaire sont identiques à celles que tu avais déjà élaborés sur ton formulaire, je n'ai donc changé aucune de tes règles de saisies. Pour information j'ai conservé ton ancien formulaire. Après avoir enregistré notre sous formulaire, nous allons donc procéder à la création de notre formulaire. A cet instant un café se mérite ...

    III) La Construction de notre Formulaire :

    La source de données de ce formulaire est basé sur l'entité T-Consultant. Pour rappel le schéma relationnel pour ceux qui liront ce post et n'auront pas connaissance de ton projet est celui là :

    Nom : Capture3.JPG
Affichages : 2555
Taille : 49,5 Ko

    Les propriétés du formulaire principal seront définis ainsi (feuille de propriétés) :

    • Entrées de données : Non
    • Ajout Autorisé : Non
    • Suppr Autorisé : Non


    a) La construction :

    Seules les informations concernant le nom et le prénom du consultant seront affichés des données issues de notre entité constituant la source de données.
    La mise en place des champs de saisies (de type indépendant) permettant l'ajout, la modification ou la suppression des données seront donc insérées dans la partie intermédiaire de l'écran.

    Nom : Capture4.JPG
Affichages : 2562
Taille : 52,0 Ko

    Nous pouvons noter la présence de nos deux champs de contrôle sur la partie supérieure droite de l'écran (propriété visible = Non) permettant de connaître l'état du formulaire (première ouverture) et l'id de la ligne temps (si 0 mode insertion).

    Nous glisserons ensuite dans la partie inférieure notre formulaire SF_SaisieTemps devenant ainsi sous-formulaire de notre formulaire principal que nous appellerons F_SaisieTemps. La relation père-fils s'opère sur le champ idconsultant (clé primaire de la table T_consultants et clé étrangère de la table T_Temps).

    Nom : Capture.JPG
Affichages : 2683
Taille : 55,5 Ko

    b) Le code :

    Il est à noter que le bouton <Supprimer> ne peut être actif que si l’événement <Sur Activation> a été déclenché depuis le sous formulaire SF_SaisieTemps . En effet la suppression ne peut être réalisée sur une nouvelle entrée. Afin d'éviter toute confusion un bouton <RAZ> provoque la réinitialisation (suppression du contenu) des champs de saisie.

    Derrière chaque bouton nous avons donc inséré quelques lignes de code :

    1. La validation :

    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
    49
    50
    Private Sub B_Validate_Click()
    '
    ' Validation de la saisie
    '
    Dim R_Sql As String, Reponse As Integer
    '
    ' On doit  positionner des contrôles ici
    ' Vérification de saisie d'une date, d'un client, un %...
    '
    If Not IsDate(Me.E_DateIntervention) Then
        Reponse = MsgBox("Vous devez renseigner une date", vbCritical + vbOKOnly, "Erreur Date")
        Me.E_DateIntervention.SetFocus
        Exit Sub
    End If
    '
    If Nz(Me.E_IdClient, 0) = 0 Then
        Reponse = MsgBox("Vous devez renseigner un client", vbCritical + vbOKOnly, "Erreur Client")
        Me.E_IdClient.SetFocus
        Exit Sub
    End If
     
    Select Case Nz(Me.E_IdTemps, 0)
    Case 0
        ' Insert il s'agit d'une nouvelle Saisie
            R_Sql = "INSERT INTO [T-Temps] " & _
            "(IdConsultant, IdClient, DateIntervention, Type, Pourcentage, Commentaire) " & _
            " VALUES (" & _
            "" & Nz(Me.IdConsultant, 0) & ", " & _
            "" & Nz(Me.E_IdClient, 0) & "," & _
            "" & Convert_DateUS_Short(Nz(Me.E_DateIntervention, Date)) & "," & _
            "'" & Nz(E_Type, "") & "', " & _
            "" & Nz(E_Pourcentage, 0) & ", " & _
            "'" & Protected_Quote(Nz(E_Commentaire, "")) & "'" & _
            ")"
    Case Else
        ' update
        R_Sql = "UPDATE [T-Temps] SET [T-Temps].IdConsultant = " & Nz(Me.IdConsultant, 0) & ", [T-Temps].IdClient = " & Nz(Me.E_IdClient, 0) & ", [T-Temps].DateIntervention = " & Convert_DateUS_Short(Nz(Me.E_DateIntervention, Date)) & ", [T-Temps].Type = '" & Nz(E_Type, "") & "', [T-Temps].Pourcentage = " & Nz(E_Pourcentage, 0) & ", [T-Temps].Commentaire = '" & Protected_Quote(Nz(E_Commentaire, "")) & "' "
        R_Sql = R_Sql & "WHERE ((([T-Temps].N°)=" & Nz(Me.E_IdTemps, 0) & "));"
    End Select
    '
    CurrentDb.Execute R_Sql
    '
    ' Rafraîchir les données du sous formulaire
    '
    Me.SF_Temps.Requery
    '
    ' Réinitialiser les zones
    '
    Call Raz_Saisie
    End Sub
    Ce code commenté valide une mise à jour ou une insertion en fonction du champ E_IdTemps (0 = insertion, autre = Mise à jour) , procède au rafraîchissement de la liste et la remise à zéro des champs. La portion de code réinitialisation des zones :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Raz_Saisie()
    '
    Me.E_Commentaire = ""
    Me.E_DateIntervention = Null
    Me.E_IdClient = Null
    Me.E_Pourcentage = 0
    Me.E_Type = ""
    Me.E_IdTemps = 0
    Me.B_Delete.Enabled = False
    '
    Me.E_DateIntervention.SetFocus
    End Sub
    Tu noteras que la première partie du code valide la saisie, je te laisserai donc mettre en place les contrôles suivants (%, commentaires, type...) en t’inspirant de ce que j'ai fais.

    2. La Suppression:

    Ce code se passe de commentaire, juste à noter un message de confirmation avant exécution d'une requête de type delete :

    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
    Private Sub B_Delete_Click()
        '
        Dim R_Sql As String
        '
        If MsgBox("Souhaitez-vous supprimer cette entrée ?", vbQuestion + vbYesNo, "Suppression") = vbNo Then Exit Sub
        '
        R_Sql = "DELETE [T-Temps].N° FROM [T-Temps] WHERE ((([T-Temps].N°)=" & Nz(Me.E_IdTemps, 0) & "));"
        CurrentDb.Execute R_Sql
        '
        ' Rafraîchir les données du sous formlaire
        '
        Me.SF_Temps.Requery
        '
        ' Réinitialiser les zones
        '
        Call Raz_Saisie
    3. La réinitialisation:

    L’événement déclenché sur ce bouton n'engendre aucune action sur les données, son rôle est d'effectuer une remise à nu des champs permettant la saisie de nouvelles lignes de temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub B_Reset_Click()
        Call Raz_Saisie
    End Sub
    En visualisant ce code, tu remarqueras que l'appel est dirigé vers la procédure Raz_Saisie décrite précédemment. Cette technique évite la redondance de lignes identiques et facilite ainsi la maintenance et la lisibilité de ton code.


    IV) L'ouverture de notre formulaire F_SaisieTemps:

    Après identification de ton consultant, nous utiliserons donc la technique d'intégration dans la table paramètres vu dans le post précédent. Ainsi cette portion de code généré sur l’événement AccèsMenu va insérer une ligne dans la table T_Parametres

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InsertUpdate_Parametre "prmConsultant", Me.chbxConsultant
    Cette variable est donc utilisable à souhait durant la durée de vie de l'applicatif. L'appel d’ouverture de ton formulaire de saisie ressemblera donc à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub B_Temps_Click()
        If Get_Parametre("prmConsultant") > "" Then
            DoCmd.OpenForm "F_SaisieTemps", , , "[IdConsultant]=" & Get_Parametre("prmConsultant")
        End If
    End Sub
    La méthode openForm intégrera donc un filtre n'autorisant que l'affichage du consultant identifié, un descriptif de cette méthode : La méthode OpenForm

    V) Conclusion:

    Un bref exposé de la constitution d'un formulaire père-fils adapté à tes contraintes. Je te laisse travailler tout çà à ton gré (modification des formulaires, contrôles supplémentaires...). J'espère que cette explication te permettra de voir Access sous un autre jour et avancer dans ta quête.

    Si tu as des questions supplémentaires, je reste à ta disposition.

    Etant limité par le nombre de pièces jointes, le chargement de la base dans le post suivant.

    Cordialement

    JimboLion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  7. #7
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion,

    Comme convenu la base :

    Jimbolion
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => Construction Table Paramêtres
    Jimbolion Bonjour,

    Tout d'abord, un grand merci pour ce retour sur la création d'une "Table Paramètre".
    Voici quelques remarques d'appropriation de tout cela:

    1. Construction de la table :
    Dans le cas précis de l'exercice sur mon fichier des supervision des consultants, j'imagine que je vais avoir dans cette table de paramètres:
    -"Description" (le type de variable) => "IdConsultant" sélectionnée dans le formulaire F-Accueil
    - "valeur" (son contenu) => les différentes valeurs, ex "108", "110" etc dans le fichier créé à date...


    2. La partie VBA :
    2.1 L'insertion des valeurs
    -la description dans l'aide, de la fonctoin DCOUNT vs COUNT est clair; j'avais déjà vu cette fonction pour vérifier l'absence de doublons
    - la fonction "InsertUpdate_Parametre" est aussi bien expliqué, si le paramètre n'est pas présent, on l'insert, sinon, on le met à jour...
    - j'ai bien noté la fonction "La fonction Protected_Quote" pour les soucis de ' et de " ...


    2.2 La récupération des valeurs
    - la fonction est plus simple à comprendre que la précdénte, donc RAS, si ce n'est le DLOOKUP dont j'ai regardé l'aide en ligne...
    - je vais aussi regarder le tutoriel sur les fonctions de domaine avant de passer à la suite des réjouissances


    2.3La suppression des valeurs
    - je me note que la fonction est a utilisé précautionneusement...risque de suppression de toutes les valeurs si pas d'arguments !

    autres remarques :
    - utilisation des "-" ou "_" :
    cette question des simple ou doubles quotes quand on vient du VBA excel, avec toute la modestie du mon niveau, c'est pas évident à suivre, quand on y mêle du SQL pour le VBA ACESS; j'ai parfois du mal à voir ou commencent et finissent les instructions, donc je regarde bien comment du écris tes lignes; j'ai donc remarqué que tu utilises des "_" pour les tables, ex: T_Parametres, du coup, tu mets des " " dans le code VBA: "T_Parametres"
    j'avais vu une autre reco de mettre plutôt des "-", et il me semble qu'on pourrait écrire directement T-Parametres dans le codes, sans guillemets...



    voilà, je continue à digérer tout cela avant de passer au post suivant, et vraiment, c'est super JimboLion Sensei, merci !

    RC

  9. #9
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion,

    cette question des simple ou doubles quotes quand on vient du VBA excel, avec toute la modestie du mon niveau, c'est pas évident à suivre, quand on y mêle du SQL pour le VBA ACESS; j'ai parfois du mal à voir ou commencent et finissent les instructions, donc je regarde bien comment du écris tes lignes; j'ai donc remarqué que tu utilises des "_" pour les tables, ex: T_Parametres, du coup, tu mets des " " dans le code VBA: "T_Parametres"
    Le _ dans le code permet d'écrire sur plusieurs lignes afin de faciliter la lisibilité du code. On aurait pu agréger, il est vrai que j'ai utilisé les deux techniques.

    j'avais vu une autre reco de mettre plutôt des "-", et il me semble qu'on pourrait écrire directement T-Parametres dans le codes, sans guillemets...
    Je ne crois pas non, alors qu'avec l'underscore (_) les guillemets ne sont pas obligatoires.

    2.3La suppression des valeurs
    - je me note que la fonction est a utilisé précautionneusement...risque de suppression de toutes les valeurs si pas d'arguments !
    Effectivement, mais cet appel pourrait se lancer lors du lancement du programme. Cette option n'est pas réellement utile à vrai dire, car l'insertion d'une valeur contrôle déjà sa présence.

    Pour la compréhension, l'utilisation de cette table paramètres est utilisée dans la constitution du formulaire temps.

    Cordialement

    JimboLion
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  10. #10
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => Construction Formulaire Père-Fils #6
    Jimbolion, Bonsoir,

    c'est avec ... admiration et ... une grande respiration que je parcours le post #6 pour la mise en place du double formulaire.
    si tu as pris un café en le rédigeant, j'ai pris mon thermos, c'est plus sûr .

    remarque préambule: je confirme que tu es explicite, et quand tu appliques ta "philo personnelle" sachant que j'ai bien compris qu'avec le code en général, il y a moult façon de faire, c'est en tout cas tout à fait ce que je recherche: déjà voir et apprendre ce que fait le "sensei" comme je te disais...

    Je vais donc essayer avant d'ouvrir le fichier, de réagir à la succession des différentes étapes.


    I) La problématique et les contraintes :

    IHM = Interface Homme Machine
    Sous-formulaire en ce qui concerne la modification, les changements s’opéreront sur les mêmes champs.
    =>impeccable, c'est l'idée, mais je n'y arrivais pas...

    Le confort du consultant étant de mise, l'ordre de tri dans le sous formulaire s'effectuera en décroissant sur l'idTemps de ta table héritée ainsi la dernière saisie se trouvera en haut de la liste
    => idem, parfait
    Je porte une attention particulière à ce point (ergonomie, simplicité), ok, ca ne se voit pas dans l'essai précédent de mon formulaire Saisie-Temps, mais peut-être dans l'interface accueil. Au delà du beau qui est toujours subjectif, c'est essentiel pour lever les freins d'appropriation de l'outil in fine.


    II) La Construction de notre sous-Formulaire :

    construire notre sous formulaire en glissant les champs nécessaires à la visualisation des données
    => ok, avec les contraintes idoines, ni ajout ni modif ni suprr
    nous sommes donc typiquement dans un formulaire en mode continu).
    => voilà qui éclaire ces km de propriétés...
    Pour cela dès activation d'une ligne de saisie, nous reporterons ces informations sur la partie supérieure de l'écran (dans le forms principal). La propriété <sur Activation> répond donc à notre première problématique
    : => ok...
    Private Sub Form_Current()
    => sur activation du formulaire

    point clé: "contrôle de 1ère ouverture avec le flage "E_Ouverture", champs non visible
    En positionnant 0 sur un champ indépendant du formulaire principal (E_IdTemps non visible), nous pourrons agir sur une insertion et non pas une mise à jour.
    => pas encore très clair pour moi, je regarderai avec le fichier, mais je saisi l'idée


    III) La Construction de notre Formulaire :

    Les propriétés du formulaire principal seront définis ainsi (feuille de propriétés)
    => donc ni ajout, ni modif, ni suppression comme pour le fils

    a) La construction :
    Seules les informations concernant le nom et le prénom du consultant seront affichés des données issues de notre entité constituant la source de données
    => pour l'anecdote, j'avais essayer de lier un champs reprenant le nom&prénom via un la Requête étendu sur la T-Consultant... je comprends que ca complexifie, et c'est très bien que tu es repris les champs directs de la Table
    point clé: l'indépendance des champs vs mon essai ou ils étaient liés et les 2 champs de contrôles

    La relation père-fils s'opère sur le champ idconsultant (clé primaire de la table T_consultants et clé étrangère de la table T_Temps)
    => à ce stade là, autant je comprends le pivot que représente IdConsultant à la fois dant T-Consultant et T-Temps, mais moins le fait qu'il sert pour la relation père-fils, dans la mesure ou dans le SF_SaisieTemps, je ne vois pas (sans avoir ouvert encore le fichier), le champs IdConsultant
    Pièce jointe 197717
    "A cet instant, en plus du café, une clope se mérite ..." (faut bien justifier les 1% d’augmentation du marché du tabac en 2015... pas bien


    b) Le code :

    la suppression ne peut être réalisée sur une nouvelle entrée
    => yes, éclaire la notion '<sur Activation>

    1. La validation :
    => ok, donc RAZ des saisies à la fin, je me "note pour plus tard" pour éventuellement garder la possibilité d'avoir la date qui reste dans le cas ou a souvent plusieurs saisie à la suite pour une même date saufi si le temps est de 100% pour cette journée là... et aussi un contrôle suplémentaire pour que, sur une journée donnée, la somme des % soit au max de 100%

    Tu noteras que la première partie du code valide la saisie, je te laisserai donc mettre en place les contrôles suivants (%, commentaires, type...) en t’inspirant de ce que j'ai fais.
    => pas de souci, nickel, notamment sur le % vs ce que j'ai mis juste avant

    2. La Suppression:
    juste à noter un message de confirmation avant exécution d'une requête de type delete :
    => pouce en l'air

    3. La réinitialisation:
    Cette technique évite la redondance de lignes identiques et facilite ainsi la maintenance et la lisibilité de ton code.
    => oui ,je l'utilise en vba sur excel,quand il n'y a pas de paramètre, ca va...


    IV) L'ouverture de notre formulaire F_SaisieTemps:
    => ok, on retombe sur le poste précédent des paramêtre

    V) Conclusion:

    un énorme merci pour ce pied à l'étrier, JimboLion.

    Question, est ce que tu écris le code à la volée, ou passe tu encore un peu par l'éditeur requête SQL ?

    Sinon, prochain étape, j'ouvre le fichier, je prends le tuba et je plonge sous le capot
    Je te remercie pour ton éventuelle, disons plus que probable sollicitation à venir,..., une fois que j'aurais les mains pleines de cambouis
    ...
    bonne nuit !

    RC

  11. #11
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Rc,

    Beau retour sur investissements, je prends le temps de rédiger et tu prends le temps d'analyser : c'est la technique du gagnant-gagnant.

    Donc pour éclaircir quelque peu tes lumières, les points nécessitant compléments d'informations :

    En positionnant 0 sur un champ indépendant du formulaire principal (E_IdTemps non visible), nous pourrons agir sur une insertion et non pas une mise à jour.
    La propriété <Sur Activation> a la particularité d'être levée à chaque changement d'enregistrement. La première ouverture d'un formulaire et à fortiori un sous formulaire active donc cette propriété. Dans le cadre de l'ouverture le report des éléments dans la zone de saisie intermédiaire ne doit pas avoir lieu.

    Seules les informations concernant le nom et le prénom du consultant seront affichés des données issues de notre entité constituant la source de données
    => pour l'anecdote, j'avais essayer de lier un champs reprenant le nom&prénom via un la Requête étendu sur la T-Consultant... je comprends que ca complexifie, et c'est très bien que tu es repris les champs directs de la Table
    Tu peux aussi bien le faire en utilisant des champs calculés directement depuis ton formulaire ainsi =[Nom] & " "& [Prenom] agrège les deux champs.

    Voilà un petit challenge à opérer sur ton formulaire principal F_SaisieTemps

    => à ce stade là, autant je comprends le pivot que représente IdConsultant à la fois dant T-Consultant et T-Temps, mais moins le fait qu'il sert pour la relation père-fils, dans la mesure ou dans le SF_SaisieTemps, je ne vois pas (sans avoir ouvert encore le fichier), le champs IdConsultant
    Il n'est pas nécessaire d'afficher un champ dans un formulaire pour que celui-ci soit toutefois disponible (il fait partie de la source de données). Il est vrai que souvent afin déviter toute confusion avec le lecteur, il m'arrive de le mettre en tant que champ et en lui spécifiant visible=Non. Mais çà n'est pas nécessaire.

    => ok, donc RAZ des saisies à la fin, je me "note pour plus tard" pour éventuellement garder la possibilité d'avoir la date qui reste dans le cas ou a souvent plusieurs saisie à la suite pour une même date saufi si le temps est de 100% pour cette journée là... et aussi un contrôle suplémentaire pour que, sur une journée donnée, la somme des % soit au max de 100%
    Joli contrôle à opérer avant injection <Bouton Valider> dans la saisie des temps (requête de regroupement basé st la date). Tu utiliseras pour ce faire un somme combiné à un regroupement. Cerise sur le gâteau ajuster le % lors de l'entrée sur le champ idoine.

    1ere Saisie : 100, saisie suivantes 100 - la somme des pourcentages basée sur la journée et l'idconsultant

    Cette technique évite la redondance de lignes identiques et facilite ainsi la maintenance et la lisibilité de ton code.
    => oui ,je l'utilise en vba sur excel,quand il n'y a pas de paramètre, ca va...
    Se référer au post précédent pour le passages d'arguments dans une fonction. Cela dit nager avec 50 mètres ou 1 mètre d'eau ne change rien: juste l'appréhension !

    Question, est ce que tu écris le code à la volée, ou passe tu encore un peu par l'éditeur requête SQL ?
    A la volée généralement, pour le code je récupère ce que j'ai écris précédemment (ré-utilisabilité) quand je peux. Pour les requêtes de nombreux SGBD ne disposent pas d'assistants aussi performants impliquant un bon apprentissage du SQL. Cela dit, utiliser l'assistant n'a rien de frustrant non plus et il m'arrive de l'utiliser aussi !

    Sinon, prochain étape, j'ouvre le fichier, je prends le tuba et je plonge sous le capot
    Je te remercie pour ton éventuelle, disons plus que probable sollicitation à venir,..., une fois que j'aurais les mains pleines de cambouis
    Je fournirai le savon

    Bonne lecture et à bientôt

    jmb










    -
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => Retravail Fichier JimboLion du 10/01
    JimboLion, GoodMorning

    Suite à ton dernier billet, j'ai repris comme prévu le fichier que tu m'avais aimablement préparé avec le double formulaire Père-Fils.

    1. toilettage
    J'ai commencé par remettre de l'ordre en suivant tes recommandations et aussi en m'appropriant le code avec quelques toilettage personnelles.
    Je préfère aussi l’utilisation des "_ " plutôt que les "-" pour le nom des tables, donc modification effectuée pour harmoniser (pas totalement harmonisé encore sur l'ensemble des tables et requêtes).
    Ensuite, au lieu des "txt" et "chbx", j'ai repris la dénomination que tu utilises des "E_", tu me diras en passant de quoi cela vient, "entry ou ent ?", car ce sont des champs en françois ?

    1.1 Suppression des variables publiques et utilisation uniquemqent des parametre:
    => dans le F_Accueil et F_MenuUtilisateur ou l'utilsation du paramêtre prmConsultant n'était pas encore en place

    2.1 accès ALT+lettre sur boutons
    j'ai remarqué tu as permis le raccourci clavier sur les boutons de "validation"; merci...
    j'ai compris que c'est dans la propriété de la légende qui permet cela avec le "&"
    Nom : bouton.jpg
Affichages : 2603
Taille : 65,1 Ko
    remarque: j'hésite encore entre les boutons texte et les boutons images...
    il me semble que tu as tranché... pas moi
    Nom : boutonSortir.jpg
Affichages : 2345
Taille : 4,0 Ko

    j'ai remis le nom complet dans l'UF avec le code VBA au chargement
    du coup, j'ai rendu "non visible" les champs "nom" et "prenom" du consultant et je les ai mis en page du formulaire
    question: il me semble que je peux les supprimer puisque l'IdConsultant est dans la table des paramêtre?

    2. l'user forme père fils

    2.1 ce qui fonctionne bien:
    la suppression et le RAZ des champs pas de soucis
    les données remontent bien du fils vers le père, sauf pour la 1ère ligne,.. il faut d'abord cliquer sur une autre, puis revenir sur la 1ère ?...


    2.2 bug en saisie et modif de saisie existante

    remarque: avant de commencer le toilettage, le bug avait lieu (précaution prise)
    Pièce jointe 197850
    j'ai essayé de voir d'ou cela venait dans le code,
    Nom : bug saisie 2.jpg
Affichages : 2597
Taille : 106,3 Ko
    mais les données sont bien remontées et ca marche pas à la fin..
    Nom : bug saisie 3.jpg
Affichages : 2525
Taille : 93,1 Ko

    J'ai rajouté le contrôle qui manquait sur la vérification de l'absence du % et aussi essayer une piste de requête pour mon contrôler les 100% sur la saisie d'une journée,mais j'ai pas pris assez le temps pour la transforamtion du SQL dans le VBA ... si tu peux m'aider après bien sûr lever le bug...
    'If "SELECT [T-Temps].IdConsultant, [T-Temps].DateIntervention, Sum([T-Temps].Pourcentage) AS SommeDePourcentage
    ' FROM [T-Temps]
    ' GROUP BY [T-Temps].IdConsultant, [T-Temps].DateIntervention
    ' HAVING ((([T-Temps].IdConsultant) = "prmConsultant") And (([T-Temps].DateIntervention) = [F_SaisieTemps]![E_DateIntervention]))
    ' ORDER BY [T-Temps].DateIntervention DESC & " ;" > 100 then
    ' Reponse = MsgBox("Le total des pourcentage de la journée ne peuvent excéder 100%", vbCritical + vbOKOnly, "Erreur Pourcentage")
    ' Me.E_Pourcentage.SetFocus
    ' Exit Sub
    ' End If

    le fichier retravaillé: dans post suivant, la ca marchait pas...

    Voilà, ca me fait un peu de cambouis, je vais attendre ton retour avant d'avancer sur le reste des UF...

    merci merci !

    RC

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => fichier retravaillé RC
    Le fichier suite post précédentPièce jointe 197857

  14. #14
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Robert Camion, Hello

    Je préfère aussi l’utilisation des "_ " plutôt que les "-" pour le nom des tables, donc modification effectuée pour harmoniser (pas totalement harmonisé encore sur l'ensemble des tables et requêtes).
    Ensuite, au lieu des "txt" et "chbx", j'ai repris la dénomination que tu utilises des "E_", tu me diras en passant de quoi cela vient, "entry ou ent ?", car ce sont des champs en françois ?
    L'idée est de se fabriquer une pseudo norme (éviter les modifiable, texte...) donc en changeant le nom (exemple CB_CodePostal) tu t'y retrouve beaucoup plus facilement dans l'écriture de ton code !

    CB_ = Combobox, E_ = Etiquette, LB_ = ListBox, CK_ = CheckBox.... plus le nom du champ auquel tu fais référence


    remarque: j'hésite encore entre les boutons texte et les boutons images...
    Alors je dirai individuel et portatif, à partir du moment ou tu respectes une certaine logique dans la conception de tes formulaires...

    j'ai remis le nom complet dans l'UF avec le code VBA au chargement
    du coup, j'ai rendu "non visible" les champs "nom" et "prenom" du consultant et je les ai mis en page du formulaire
    La présence de ces champs dans le formulaire ne revêt pas d'importance (sauf pour de la lisibilité aux débutants) puisque ces données sont dans la source du formulaire et donc implicitement accessibles. J'avais soulevé ce point lors d'un post précédent.

    Par contre plutôt que de passer par une requête inutile (écriture de code et perte de performances), j'ai fait un agrégat des champs directement dans la propriété <SurActivation> de ton formulaire F_SaisieTemps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Current()
        Me.E_Consultant.Caption = Nz(Me.Nom, "") & " " & Nz(Me.Prenom, "")
    End Sub
    2.1 ce qui fonctionne bien:
    la suppression et le RAZ des champs pas de soucis
    les données remontent bien du fils vers le père, sauf pour la 1ère ligne,.. il faut d'abord cliquer sur une autre, puis revenir sur la 1ère ?...
    Oui effectivement l'activation du sous-formulaire interdisait le report des éléments lors de la première ouverture. J'ai donc changé de technique en permettant la modification lors du clic sur la date dans le sous-formulaire (en définissant la propriété de ce champ <AfficherCommeLienHyperlink> à toujours). Du coup je m'affranchis de la gestion de la première ouverture et autorise la modification même sur le premier enregistrement.

    2.2 bug en saisie et modif de saisie existante
    J'ai réussi à reproduire le phénomène chez moi en modifiant les paramètres internationaux de la machine. Il faut changer les séparateurs décimaux et monétaires à partir de ton panneau de configuration (attention la procédure est quelque peu différente suivant ton système d'exploitation). Mettre le point en lieu et place de la virgule (ceci est dû à l'interprétation des requêtes SQL).

    Une discussion à ce sujet : http://www.developpez.net/forums/d11...virgule-point/

    Si cette modification est rédhibitoire, nous casterons la valeur sous forme de . lors de l'injection mais cela suppose que chaque requête utilisant un champ de type numérique soit à reprendre.

    Nom : PInternationaux.JPG
Affichages : 2593
Taille : 154,4 Ko

    J'ai rajouté le contrôle qui manquait sur la vérification de l'absence du % et aussi essayer une piste de requête pour mon contrôler les 100% sur la saisie d'une journée,mais j'ai pas pris assez le temps pour la transforamtion du SQL dans le VBA ... si tu peux m'aider après bien sûr lever le bug...
    J'ai stocké deux requêtes dans le volet de navigation nommées R_CalculPourcentage_I et R_CalculPourcentage_P. Ces requêtes de type regroupements vont nous permettre d'utiliser les fonctions de domaines.

    Dans chacune de ces requêtes les filtres référençant les champs du formulaire (IdConsultant et DateIntervention) ainsi que sur sur la cléPrimaire N° de la table T_Temps (uniquement Update).

    R_CalculPourcentage_I :

    Nom : Capture3.JPG
Affichages : 2560
Taille : 47,6 Ko

    R_CalculPourcentage_P :

    Nom : Capture4.JPG
Affichages : 2565
Taille : 58,7 Ko

    Afin d'éviter de cumuler deux fois le montant du pourcentage de la ligne en cours de modification, le N° (clé primaire) de T_Temps ne doit pas être intégré dans le calcul de la somme des pourcentages (pas bête mais fallait il y penser ).

    Dans le code on simplifie ainsi le contrôle :

    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
      '
      ' Contrôle du pourcentage
      '
      If Nz(Me.E_IdTemps, 0) = 0 Then
        ' insertion
        Total_PC = Nz(DLookup("[SommeDePourcentage_I]", "R_CalculPourcentage"), 0) + Nz(Me.E_Pourcentage, 0)
      Else
        ' Modification, on ne tient pas compte de la ligne en cours de modification (cf. SommeDePourcentage_P et son filtre supplémentaire d'exclusion)
        Total_PC = Nz(DLookup("[SommeDePourcentage_P]", "R_CalculPourcentage"), 0) + Nz(Me.E_Pourcentage, 0)
      End If
      '
      If Total_PC > 1 Then
        Reponse = MsgBox("Le total des pourcentages de la journée ne peuvent excéder 100%", vbCritical + vbOKOnly, "Erreur Pourcentage")
        Me.E_Pourcentage.SetFocus
        Exit Sub
      End If
    Tu vas ainsi pouvoir apporter de la qualité à ton projet en affichant grâce à la propriété <SurEntrée> du % et uniquement dans le cadre d'une insertion le montant par défaut comblant la partie à 100% (tu as toutes les capacités et les éléments pour le faire).

    D'autre part en renommant ton formulaire Accueil, j'ai dû modifier son nom dans les propriétés du projet afin d'ouvrir celui-ci au lancement du programme.

    et un correctif saugrenu de ta part

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      If Nz(Me.E_Commentaire, 0) = 0 Then
        Me.E_Commentaire = "RAS"
        'Exit Sub        ' pourquoi le Exit sub ici du coup l'enregistrement ne s'opère pas ?
      End If
    J'ai commenté la ligne car tu remplaces la chaîne vide par RAS en arrêtant l’exécution de la procédure. soit tu informes à l'utilisateur que la saisie est obligatoire, soit tu transformes le commentaire et autorise la suite du déroulement de ton programme.

    Ci-Joint la base corrigée...

    Bonne lecture et bonne continuation au sensei

    jm
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => suite post #14 , on avance, pas à pas, mais on avance !
    JimboLion, good evening,

    Bon, je reprends la suite des aventures de création de mon fichier de supervisons des consultants.
    Je te remercie donc déjà pour le post qui répond à mes remarques précédentes, et qui me donne de nouveaux outils pour avancer.


    "normification" des champs
    L'idée est de se fabriquer une pseudo norme (éviter les modifiable, texte...) donc en changeant le nom (exemple CB_CodePostal) tu t'y retrouve beaucoup plus facilement dans l'écriture de ton code !
    CB_ = Combobox, E_ = Etiquette, LB_ = ListBox, CK_ = CheckBox.... plus le nom du champ auquel tu fais référence
    C'est clair, je vais appliquer, ca me va bien, du coup, je l'ai pas encore fait, mais j'ai des champs combobox à modifier en CB_... au lieu de E_actuellement


    individuel et portatif
    qu'entends tu par cela ?
    individuel : chacun sa sauce, tous les goûts sont dans la nature?
    portatif: que l'on peut recopier dans d'autre formulaires ?


    champs non visible, inutiles
    La propriété visible ou non ne revêt guère d'importance (sauf pour de la lisibilité) puisque ces données sont dans la source du formulaire. J'avais soulevé ce point lors d'un post précédent.
    donc je supprimes ces deux champs des Noms et Prénoms


    agrégats de champs
    agrégat des champs directement dans la propriété <SurActivation> de ton formulaire F_SaisieTemps :
    en gros, la requête "R-ConsultantEtendu" que j'avais reprise des modèles de Bill Gate,et qui me permet d'avoir le "nom complet" et le "classer-sous" n'a finalement que peu d’intérêt infine ?

    activation 1ère ligne dans formulaire fils
    l'activation du sous-formulaire interdisait le report des éléments lors de la première ouverture. J'ai donc changé de technique en permettant la modification lors du clic sur la date dans le sous-formulaire (en définissant la propriété de ce champ <AfficherCommeLienHyperlink> à toujours)
    ca c'est cool, toutes les lignes sont cliquables pour les faire remonter en modification dans le formulaire père!
    Pièce jointe 198127


    correctif bug en saisie, paramêtres régionaux
    J'ai réussi à reproduire le phénomène chez moi en modifiant les paramètres internationaux de la machine. Il faut changer les séparateurs décimaux et monétaires à partir de ton panneau de configuration (attention la procédure est quelque peu différente suivant ton système d'exploitation). Mettre le point en lieu et place de la virgule (ceci est dû à l'interprétation des requêtes SQL)
    j'ai fait la modification que tu as mis en exergue, mais je m'interroge sur cette solution
    en effet, ma version de windows 10 est standard, je n'avais rien changé et je suis en France et toi aussi ?
    comment ce fait il que le fichier marchait chez toi et pas chez moi, ou plutot , je me progète, est ce que ce paramétrage des paramêtre du symbole décimal en "." plutôt que "," est un problème connu pour Access et qu'il faudra que je veille à le modifier sur l'ensemble des ordis des petits copains ou j'installerai, un jour viendra, ce beau fichier ?


    requête de contrôle du % jour
    Afin d'éviter de cumuler deux fois le montant du pourcentage de la ligne en cours de modification, le N° (clé primaire) de T_Temps ne doit pas être intégré dans le calcul de la somme des pourcentages (pas bête mais fallait il y penser ).
    En gros, la requête I corrigeant mon essai de requête et permet d'avoir le total des pourcentage en fonction du consultant sur une date donnée en cas d'insertion; je note que je plaçais le critère sur le paramètre consultant, alors qu'on a déjà l'IdConsultant présent dans le formulaire...
    Autre remarque, j'avais saisis "[F_SaisieTemps]![E_DateIntervention]" sans le " [Forms]! devant : [Forms]![F_SaisieTemps]![E_DateIntervention], je suppose que ca ne marchait pas...
    Enfin, dans la requête "R_CalculPourcentage_P ", tu résout astucieusement la non prise en compte de la saisie en cours pour effectivement pas compter 2 fois le % en cas de modification.
    Dernière remarque de néophan.. j'avais du mal à retrouver la notion [SommeDePourcentage] dans la requête car elle n'apparait pas dans la requête en mode "Création", mais on la voie en mode SQL et Feuille de données:Pièce jointe 198134
    La question étant: il me semblait que c'est toi qui a donné ce nom, car dans le SQL on voit "As", mais dans le cas là , je me serais attendu à avoir "SommeDePourcentageourcentage"...

    comme dirait qqun, à ce moment là, une pause s'impose

    ok, on continue,


    contrôle % au top
    Tu vas ainsi pouvoir apporter de la qualité à ton projet en affichant grâce à la propriété <SurEntrée> du % et uniquement dans le cadre d'une insertion le montant par défaut comblant la partie à 100%
    Bon, c'est bon, j'y suis arrivé, merci!
    Au début j'ai donc fait exactement comme tu as dis, seulement en instertion:
    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
    '------------------------------------------------------------
      '  Proposition du delta pourcentage à 100%
    ''------------------------------------------------------------
    Private Sub E_Pourcentage_Enter()
      ' Calcul du pourcentage déjà saisi
      If Nz(Me.E_IdTemps, 0) = 0 Then
        ' insertion
        Total_PC = Nz(DLookup("[SommeDePourcentage]", "R_CalculPourcentage_I"), 0) + Nz(Me.E_Pourcentage, 0)
      Else
        ' Modification, on ne tient pas compte de la ligne en cours de modification (cf. SommeDePourcentage_P et son filtre supplémentaire d'exclusion)
      ' Total_PC = Nz(DLookup("[SommeDePourcentage]", "R_CalculPourcentage_P"), 0) + Nz(Me.E_Pourcentage, 0)
      End If
      If Total_PC < 1 Then
        Me.E_Pourcentage = 1 - Total_PC
        Me.E_Pourcentage.SetFocus
        Exit Sub
      End If
    End Sub
    et donc cela marche !
    Nom : delta100%.jpg
Affichages : 2628
Taille : 72,1 Ko
    Après, j'ai voulu être joueur: je me suis dit que cela pourrait aussi marcher en modification, idem, rappeler le delta par rapport à ce qui est saisi, lorsqu'on modifie une ligne, donc rajouter la partie en dessous du else...
    Ca marche pas trop mal.
    Enfin, je me suis dit que ca serait bien après validation de saisie, d'orienter le remplissage des cases en fonction de ce 100%:
    - si inférieur à 100, on continue sur la même journée avec proposition du delta
    - si = 100, on passe à une nouvelle journée
    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
        Total_PC = Nz(DLookup("[SommeDePourcentage]", "R_CalculPourcentage_I"), 0) '+ Nz(Me.E_Pourcentage, 0)
     ' Else
        ' Modification, on ne tient pas compte de la ligne en cours de modification (cf. SommeDePourcentage_P et son filtre supplémentaire d'exclusion)
      '  Total_PC = Nz(DLookup("[SommeDePourcentage]", "R_CalculPourcentage_P"), 0) '+ Nz(Me.E_Pourcentage, 0)
     ' End If
      If Total_PC < 1 Then
        'Reponse = MsgBox("Le total des pourcentages de la journée ne peuvent excéder 100%", vbCritical + vbOKOnly, "Erreur Pourcentage")
        Me.E_IdClient = ""
        Me.E_IdClient.SetFocus
        Me.E_Type = ""
        Me.E_Pourcentage = 1 - Total_PC
        Me.E_Commentaire = ""
        Exit Sub
      Else
         'Call Raz_Saisie
         Me.E_IdClient = ""
         Me.E_Type = ""
         Me.E_Pourcentage = 1 - Total_PC
         Me.E_Commentaire = ""
         Me.E_DateIntervention = CDate(Me.E_DateIntervention) + 1
         Me.E_DateIntervention.SetFocus
      End If
    ca marche pas trop mal, mais en modif, ca arrive à déconner, et je sais pas ou le serpent se mord la queue...
    j'ai aussi rajouter une proposition de date du jour au démararge:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    '------------------------------------------------------------
      '  Chargement Nom du Consultant à l'ouverture
    '------------------------------------------------------------
    Private Sub Form_Current()
        ' Courtoisie Jimbolion
        Me.E_Consultant.Caption = Nz(Me.Prenom, "") & " " & Nz(Me.Nom, "")
        Me.E_DateIntervention = CDate(Date)
        'MsgBox "hello"
    End Sub


    correctif saugrenu
    il est passé aux oubliettes, aucun interêt et j'ai compris la remarque sur le exit sub expiatoire...


    enfin, hormis le correctif du petit serpent ci-dessus, j'ai une autre remarque à échanger avec toi:


    positionnement ligne dynamique formulaire fils
    les saisies s'insèrent bien par le haut...sauf qu'il peut y avoir des aller retour (pas très logique, normalement chronologique, mais sur des modifs c'est possible, et je me projette sur des utilisations alternative sur d'autre saisies dans d'autre formulaire)... ouf, je respire
    donc, ce que je me demandais c'est comment procéder pour:
    - trier les date de façon décroissante
    - positionner l’ascenseur sur la ligne de la date qu'on est en train de rentrer afin de voir les dates similaires à coté... ex si on est sur février, et que subitement, on reva faire quelque saisie sur début janvier, ca serait bien de redescendre dans la liste ou d'y rester le temps de la saisie ...
    là je sens qu'il est temps d'aller me coucher, car ca semble compliquer tout cela...



    Voilà, je joins ma base en l'état, et je te souhaite un bon we!!
    Pièce jointe 198138

    RC





    Première remarque sur la correction du bug d'insertion à priorri lié aux paramêtres régionaux...

  16. #16
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Rc

    Je viens de lire ton fil de discussion et nous allons reprendre tes interrogations une à une :

    C'est clair, je vais appliquer, ca me va bien, du coup, je l'ai pas encore fait, mais j'ai des champs combobox à modifier en CB_... au lieu de E_actuellement
    Attention en changeant le nom de tes contrôles, les procédures événementielles associées seront pas rattachées au nouveau nom mais à l'ancien (Access ne rattache pas l'ancien code). Je te conseilles de faire l'essai sur un nouveau formulaire en créant un contrôle <Bouton>: tu y associes un code sur événement <SurClic>. Tu testes ton bouton puis en mode création tu modifies son nom, tu verras que la procédure événementielle a disparue Donc prudence

    individuel et portatif
    qu'entends tu par cela ?
    individuel : chacun sa sauce, tous les goûts sont dans la nature?
    portatif: que l'on peut recopier dans d'autre formulaires ?
    Oui exactement, lorsque tu as choisi ta charte et pour une application professionnelle tous les écrans se doivent d'avoir la même ergonomie et façon de faire : la RC touch

    donc je supprimes ces deux champs des Noms et Prénoms
    Je constate que tu l'as fait et que çà continue de fonctionner

    en gros, la requête "R-ConsultantEtendu" que j'avais reprise des modèles de Bill Gate,et qui me permet d'avoir le "nom complet" et le "classer-sous" n'a finalement que peu d’intérêt infine ?
    Tout dépend du contexte ! Dans ce cas les données étaient accessibles puisque dans la source du formulaire. Inutile d'aller faire une recherche dans la table (perte de performances) alors que tes données étaient disponibles.
    Tu ne vas pas chercher du sel au supermarché alors que tu en as dans ton placard. Je sais c'est tiré par les cheveux, mais çà exprime assez bien l'inutilité de ta fonction.

    ca c'est cool, toutes les lignes sont cliquables pour les faire remonter en modification dans le formulaire père!
    Le confort de l'utilisateur avant celui du développeur. La saisie ou modification se fait toujours sur les mêmes zones.

    j'ai fait la modification que tu as mis en exergue, mais je m'interroge sur cette solution
    en effet, ma version de windows 10 est standard, je n'avais rien changé et je suis en France et toi aussi ?
    comment ce fait il que le fichier marchait chez toi et pas chez moi, ou plutot , je me progète, est ce que ce paramétrage des paramêtre du symbole décimal en "." plutôt que "," est un problème connu pour Access et qu'il faudra que je veille à le modifier sur l'ensemble des ordis des petits copains ou j'installerai, un jour viendra, ce beau fichier ?
    En règle générale, la majorité des utilisateurs d'Access ont eu recours à la modification de leurs paramètres régionaux. Si pour une raison ou une autre tu ne souhaites pas effectuer cette opération, nous pourrons créer une fonction (type protection des quotes) afin de transformer la virgule des valeurs numériques en point. Cette transformation n'a lieu que pour les requêtes écrites en vba et n'impacte pas les requêtes stockées.

    La technique est ici : Transformer virgule en point

    Cette décision doit être prise assez rapidement afin d'éviter la retouche de code.


    Contrôle %
    Après, j'ai voulu être joueur: je me suis dit que cela pourrait aussi marcher en modification, idem, rappeler le delta par rapport à ce qui est saisi, lorsqu'on modifie une ligne, donc rajouter la partie en dessous du else...
    Ca marche pas trop mal.
    Enfin, je me suis dit que ca serait bien après validation de saisie, d'orienter le remplissage des cases en fonction de ce 100%:
    - si inférieur à 100, on continue sur la même journée avec proposition du delta
    - si = 100, on passe à une nouvelle journée
    D'un avis personnel en modification ce contrôle aura plus tendance à perturber l'utilisateur et ne trouve aucun intérêt !

    Un exemple : Je crée une nouvelle ligne (donc ajout) en mettant 30% ! L'utilisateur après validation vient de se rendre compte de son erreur (l'affectation du client). Je ne vais pas remettra 100% d'affectation alors qu'il se préparait à saisir une nouvelle ligne à 70%. La présence ou non d'un contrôle se mesure en termes d'efficacité. Par contre après saisie, le contrôle du max à 100% reste de rigueur.

    ca marche pas trop mal, mais en modif, ca arrive à déconner, et je sais pas ou le serpent se mord la queue...
    j'ai aussi rajouter une proposition de date du jour au démararge:
    Attention tu n'as pas compris la valeur de E_Idtemps qui considère qu'il s'agit d'ne mise à jour ou non. A la suite de tes contrôles il est nécessaire de remettre cette valeur à 0. L'idée de simplification de la saisie est une excellente chose (par défaut compensation au % sur une saisie à la journée, date suivante si quota des 100%), je dis mais il faut penser qu'on repart sur une nouvelle saisie.

    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
      If Total_PC < 1 Then
        'Reponse = MsgBox("Le total des pourcentages de la journée ne peuvent excéder 100%", vbCritical + vbOKOnly, "Erreur Pourcentage")
        Me.E_IdClient = ""
        Me.E_IdClient.SetFocus
        Me.E_Type = ""
        Me.E_Pourcentage = 1 - Total_PC
        Me.E_Commentaire = ""
        Me.E_IdTemps = 0
      Else
         'Call Raz_Saisie
         Me.E_IdClient = ""
         Me.E_Type = ""
         Me.E_Pourcentage = 1 - Total_PC
         Me.E_Commentaire = ""
         Me.E_DateIntervention = CDate(Me.E_DateIntervention) + 1
         Me.E_DateIntervention.SetFocus
         Me.E_IdTemps = 0       ' cette valeur est hypra importante car elle conditionne la ligne de modif ou pas
      End If
    le Me.E_IdTemps = 0 est alors d'une importance capitale car si l'appel de validation suivant il s'agira bien d'une insertion et pas d'une modification (ce qui se passait dans ton code).

    Il faut que tu analyses cette partie et la comprenne, c'est crucial

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select Case Nz(Me.E_IdTemps, 0)
        Case 0
        ' Insert il s'agit d'une nouvelle Saisie
    correctif saugrenu
    il est passé aux oubliettes, aucun interêt et j'ai compris la remarque sur le exit sub expiatoire...
    Donc on considère que la valeur saisie n'est pas obligatoire ! Pas de soucis, c'est une règle que je considère recevable et qui t'appartient

    les saisies s'insèrent bien par le haut...sauf qu'il peut y avoir des aller retour (pas très logique, normalement chronologique, mais sur des modifs c'est possible, et je me projette sur des utilisations alternative sur d'autre saisies dans d'autre formulaire)... ouf, je respire
    donc, ce que je me demandais c'est comment procéder pour:
    - trier les date de façon décroissante
    - positionner l’ascenseur sur la ligne de la date qu'on est en train de rentrer afin de voir les dates similaires à coté... ex si on est sur février, et que subitement, on reva faire quelque saisie sur début janvier, ca serait bien de redescendre dans la liste ou d'y rester le temps de la saisie ...
    là je sens qu'il est temps d'aller me coucher, car ca semble compliquer tout cela...
    Concernant la date et le tri descendant, j'ai pris pour règle de trier de manière descendante sur le N° (clé primaire) de la table T_Temps. Si tu reprends l'un de mes posts précédents , j'ai expliqué la manière de le faire. Il suffit alors de changer l'ordre de tri dans le sous formulaire (chose faite sur la version jointe).

    Concernant la position du curseur, j'ai donc mémorisé dans une variable globale (enfin disons la technique de la table Paramètres) la position du curseur ainsi l’événement sur clic s'est vu transformé ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Private Sub DateIntervention_Click()
      '
      Me.Parent.E_IdTemps = Me.N°
      Me.Parent.E_DateIntervention = Me.DateIntervention
      Me.Parent.E_IdClient = Me.IdClient
      Me.Parent.E_Type = Me.Type
      Me.Parent.E_Pourcentage = Me.Pourcentage
      Me.Parent.E_Commentaire = Me.Commentaire
      '
      ' Rendre le bouton <Supprimer> actif'
      Me.Parent.B_Delete.Enabled = True
      '
      InsertUpdate_Parametre "positTemps", Me.CurrentRecord
    End Sub
    Je ne reviendrai pas sur l'utilisation de cette syntaxe dûment explicitée dans nos échanges antérieurs.

    Tu l'auras remarqué le requery du sous formulaire provoque le retour à la première ligne. Il nous faut donc redonner le focus au sous formulaire et atteindre l'enregistrement souhaité. La méthode GotoRecord va nous être bénéfique :

    Se positionner à un enregistrement précis dans un formulaire continu

    La transformation après validation devient donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      '
      ' Si il s'agit d'une modification on repositionne le pointeur sur la ligne souhaitée
      '
      If Me.E_IdTemps > 0 Then
        Old_Position = Val(Get_Parametre("positTemps"))
        '
        DoCmd.GoToControl "SF_Temps"
        Me.SF_Temps.SetFocus
        If Old_Position > 1 Then
            DoCmd.GoToRecord , , , Old_Position - 1
        End If
      End If
    Deux remarques sur ce code :

    1. Le E_IdTemps nous permet encore une fois de contrôler si il s'agit d'une modification. Dans le cadre d'une insertion l'enregistrement n'étant pas créé avant saisie, difficile de se positionner sur cette ligne (on supposera de toute façon que dans 99% des cas ce sera la dernière date et donc la première ligne de saisie).

    2. Le GoToRecord semble souffrir d'un léger Bug (faut que je creuse un peu) en positionnant le curseur sur l'enregistrement suivant de celui qui est passé comme argument (d'où le -1). J'ai bien évidemment contrôlé mon code avant de valider le source que je te fourni ! S'agit t'il d'un problème récurrent à la version 2013 d'Access ?

    Bon te voilà avec quelques sources d'inspirations supplémentaires.

    Bon courage et bonne lecture

    Amicalement

    jm

    *Ps : certaines pièces jointes de ton fil ne sont pas valides ??
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => suite au psot #16
    Jimbolion, guten abend !

    Merci pour les réponses apportées à notre dernier échange.

    Voici la suite de mes pérégrinations.
    Je prends bien compte de l'ensemble des remarques, mais je ne reviens plus que sur celles ou j'ai encore besoin d'échanger.

    remplacement virgule par points:
    a majorité des utilisateurs d'Access ont eu recours à la modification de leurs paramètres régionaux.
    si c'est le BaBa, "when in Rome, do as the Romans do" , donc je prendrai donc cette habitude dès maintenant.


    contrôle des % en ajout et ou modification
    D'un avis personnel en modification ce contrôle aura plus tendance à perturber l'utilisateur et ne trouve aucun intérêt !
    je me range à ton expérience et je la garderai en "ajout"


    valeur de E_Idtemps qui considère qu'il s'agit d'ne mise à jour ou non
    effectivement, je n'ai pas encore saisie précisemment ce point
    j'ai recherché dans les différents échanges:
    une mise à jour ou une insertion en fonction du champ E_IdTemps (0 = insertion, autre = Mise à jour) ,
    donc je pense que c'est clair, quand la valeur du champs est = "0" on est en insertion, donc une nouvelle ligne va être créée
    et sinon, "case else"... on est en modification d'un ligne existante ex "If Me.E_IdTemps > 0 Then..."


    modification du tri
    Concernant la date et le tri descendant, j'ai pris pour règle de trier de manière descendante sur le N° (clé primaire) de la table T_Temps. Si tu reprends l'un de mes posts précédents , j'ai expliqué la manière de le faire. Il suffit alors de changer l'ordre de tri dans le sous formulaire (chose faite sur la version jointe).
    merci, je suis bien conscient, ce n'était pas précisé en démarrage...
    j'ai donc rejeté un coup d'oeil sur le sous formulaire et j'ai retrouvé l'endroit:
    Nom : triDate.jpg
Affichages : 2664
Taille : 74,3 Ko
    remarque:: j'ai remarqué qu'un certain nombre d'infos sont stockées dans les formulaire et d'autres dans le VBA ... c'est encore qqchose d'un peu troublant à mon niveau


    position du curseur
    Concernant la position du curseur, j'ai donc mémorisé dans une variable globale (enfin disons la technique de la table Paramètres) l
    Nom : positTemps.jpg
Affichages : 2390
Taille : 34,7 Ko
    ok, je te suis, la mise en place des paramêtres nous est donc encore utile!


    test saisies
    pour ce soir, et avant d'aller plus loin, j'ai fait quelques test de saisie.
    j'ai pris l'exemple d'une saisie sur un jour, en ayant plusieurs clients pour atteindre les 100%
    globalement, ca fonctionne bien avec les controles à 100% qui me propose le jour suivant à la fin;
    mais j'ai quelques bug d'affichage bizarre sur la case des %, je pense que cela est dû au format:
    est ce que tu me conseille de travailler plutot avec un chiffre "sans le format du %" ?
    enfin, après une saisie successive, si je reviens sur l'une des lignes en modification, qui m'a permis d'atteindre le 100%,
    j'ai testé au lieu de 10%, en mettant 20% et je comprens pas pourquoi ca ne m'effectue pas le controle,
    alors que les 2 cas sont traités (_I et _P) ?
    voici les illustrations:
    Nom : saisie5.jpg
Affichages : 2499
Taille : 61,2 KoNom : saisie4.jpg
Affichages : 2446
Taille : 39,0 KoNom : saisie3.jpg
Affichages : 2488
Taille : 52,2 Ko


    le fichier précédent reste d'acualité


    merci pour tout Herr JimboLion

    gute nacht

    RC

  18. #18
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    RC,

    On épure petit à petit le fil de questions.

    donc je pense que c'est clair, quand la valeur du champs est = "0" on est en insertion, donc une nouvelle ligne va être créée
    et sinon, "case else"... on est en modification d'un ligne existante ex "If Me.E_IdTemps > 0 The
    oui et l'affectation d'une ligne en modification est appliqué sur l’événement <SurClic> de la date d’intervention du sous 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
    Private Sub DateIntervention_Click()
      '
      Me.Parent.E_IdTemps = Me.N°
      Me.Parent.E_DateIntervention = Me.DateIntervention
      Me.Parent.E_IdClient = Me.IdClient
      Me.Parent.E_Type = Me.Type
      Me.Parent.E_Pourcentage = Me.Pourcentage
      Me.Parent.E_Commentaire = Me.Commentaire
      '
      ' Rendre le bouton <Supprimer> actif'
      Me.Parent.B_Delete.Enabled = True
      '
      InsertUpdate_Parametre "positTemps", Me.CurrentRecord
    End Sub

    pour ce soir, et avant d'aller plus loin, j'ai fait quelques test de saisie.
    j'ai pris l'exemple d'une saisie sur un jour, en ayant plusieurs clients pour atteindre les 100%
    globalement, ca fonctionne bien avec les controles à 100% qui me propose le jour suivant à la fin;
    mais j'ai quelques bug d'affichage bizarre sur la case des %, je pense que cela est dû au format:
    est ce que tu me conseille de travailler plutot avec un chiffre "sans le format du %" ?
    enfin, après une saisie successive, si je reviens sur l'une des lignes en modification, qui m'a permis d'atteindre le 100%,
    j'ai testé au lieu de 10%, en mettant 20% et je comprens pas pourquoi ca ne m'effectue pas le controle,
    alors que les 2 cas sont traités (_I et _P) ?
    voici les illustrations:
    Moi généralement je ne travaille jamais avec les %, ce typage étant une particularité d'Access, donc je préfère les réels. La plupart des sgbd n'offrant pas cette solution.
    Malgré tout dans le report du calcul une erreur sur ton code que je n'avais pas levée !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Else
         'Call Raz_Saisie
         Me.E_IdClient = ""
         Me.E_Type = ""
         Me.E_Pourcentage = 1                ' Me.E_Pourcentage = 1 - Total_PC  ligne en erreur
         Me.E_Commentaire = ""
         Me.E_DateIntervention = CDate(Me.E_DateIntervention) + 1
         Me.E_DateIntervention.SetFocus
         Me.E_IdTemps = 0       ' cette valeur est hypra importante car elle conditionne la ligne de modif
      End If
    En effet sur une nouvelle journée la valeur par défaut doit être 100 et pas 100-la somme des % de la veille.

    Pour ma part j'ai de mon côté modifier les % en réels simples (l'entier est peut être préférable). Je te joins donc la base corrigée.

    ps : il reste encore un cas à traiter dans ton raisonnement. en admettant qu'une saisie sur la date du 20.01.2016 soit opérée avec un taux à 20% et que l'utilisateur décide de modifier un client sur une date ou la somme des % atteint les 100, dans ce cas ton raisonnement applique la création d'une nouvelle journée avec un taux à 100% alors que cette valeur devrait être de 80%. Il faudrait dans ce cas effectuer une différence entre 100 et la valeur des sommes de la nouvelle journée. Même si ce cas est à la marge (et recontrôler au moment de la validation) ne faudrait il pas corriger cela ? La qualité coûte chère

    Jm
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  19. #19
    Nouveau membre du Club
    Homme Profil pro
    Consultant Organisation TPE
    Inscrit en
    Juin 2014
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant Organisation TPE
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2014
    Messages : 82
    Points : 39
    Points
    39
    Par défaut => réponse au post #18
    JimboLion, Bonjsoir

    Après une petite pause d'access, je reviens !

    Ce qui marche à date
    une saisie sur une journée avec contrôle à 100%
    Nom : saisie100%.jpg
Affichages : 2538
Taille : 79,3 Ko
    on passe bien au jour suivant avec retour à 100%...

    Ce qui ne marche pas encore
    Les contrôles des champas indispensables, bug au 2nd coup...
    ex: j'ai pris une ligne à 100%, je la modifie à 80%
    on me propose bien 20%, par contre, si je clique sur "VALIDER" sans avoir renseigner le client et le type... ca bug:
    Nom : controle des vides ne marchent pas.jpg
Affichages : 3099
Taille : 150,5 Ko
    en revanche si je rempli après, le Client et le Type, l'insertion se fait bien...

    essai retour en haut de tableau après RAZ:
    Sub Raz_Saisie()
    ' Courtoisie Jimbolion
    Me.E_Commentaire = ""
    Me.E_DateIntervention = Null
    Me.E_IdClient = Null ' repasse en insertion nouvelle ligne
    Me.E_Pourcentage = 0
    Me.E_Type = ""
    Me.E_IdTemps = 0
    Me.B_Delete.Enabled = False
    ' essai pour se repositionner en haut du tableau après RAZ
    ' DoCmd.GoToControl "SF_Temps"
    ' Me.SF_Temps.SetFocus
    ' DoCmd.GoToRecord , , , 0
    '
    Me.E_DateIntervention.SetFocus
    '
    End Sub
    je ne sais pas indiquer le 1er nuémero de ligne... si tu peux m'aider, je te remrecie

    affichage dans SF:
    dans le sousformulaire, qui me sert uniquement à remonter les lignes déjà saisies, j''ai souhaiter épurer l'apparence.
    j'ai enlever le selecteur de dates, de la date d'intervention, ca c'est bon...
    par contre, pour mes listes déroulantes, j'ai pas réussies à les mettre en "locked" : en effet, dans le sousformulaire, elle ne servent pas ces listes déroulantes...
    j'ai pensé mettre des espèce de text box à la place mais je pouvais pas récupérer le contenu:
    Nom : reflextion combo sf.jpg
Affichages : 2517
Taille : 77,9 Ko
    Faut-il travailler avec un tableau type listview pour avoir qqchose de nickel ?
    après, cela peut aller comme cela, mais c'est pour faire le tour des possibilités...
    merci de tes conseils...

    dernier cas %

    en admettant qu'une saisie sur la date du 20.01.2016 soit opérée avec un taux à 20% et que l'utilisateur décide de modifier un client sur une date ou la somme des % atteint les 100, dans ce cas ton raisonnement applique la création d'une nouvelle journée avec un taux à 100% alors que cette valeur devrait être de 80%. Il faudrait dans ce cas effectuer une différence entre 100 et la valeur des sommes de la nouvelle journée. Même si ce cas est à la marge (et recontrôler au moment de la validation) ne faudrait il pas corriger cela ?
    j'ai regardé avec attention ta remarque, mais je n'ai pas vu de souci .
    quand je fait une saisie > 100% sur un jour J, on me propose par défaut, le delta à 100% sur le jour J.
    si je clique sur une ligne d'un jour F, le pourcentage de ce Jour F remonter bien et non le delta à 100% du jour J....

    Voilà voilà,
    je te remercie vraiment pour ta patience et tes échanges... conscient que je remontent plus de problème que de solutions.......

    le fichier:Pièce jointe 199078

    bonne soirée


    RC

  20. #20
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Rc Hello,

    Donc j'ai repris le code et après quelques minutes pour remettre dans le cambouis, effectivement quelques correctifs à faire :

    Les contrôles des champas indispensables, bug au 2nd coup...
    ex: j'ai pris une ligne à 100%, je la modifie à 80%
    on me propose bien 20%, par contre, si je clique sur "VALIDER" sans avoir renseigner le client et le type... ca bug:
    effectivement le RAZ n'appliquait pas nécessairement la bonne méthode, j'ai donc converti le retour en numérique pour effectuer les contrôles :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      If Val(Nz(Me.E_IdClient, 0)) = 0 Then
        Reponse = MsgBox("Vous devez renseigner un client", vbCritical + vbOKOnly, "Erreur Client")
        Me.E_IdClient.SetFocus
        Exit Sub
      End If
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     If Val(Nz(Me.E_IdTemps, 0)) = 0 Then
        ' en insertion
        Total_PC = Nz(DLookup("[SommeDePourcentage]", "R_CalculPourcentage_I"), 0) + Nz(Me.E_Pourcentage, 0)
      Else
    dans le sousformulaire, qui me sert uniquement à remonter les lignes déjà saisies, j''ai souhaiter épurer l'apparence.
    j'ai enlever le selecteur de dates, de la date d'intervention, ca c'est bon...
    par contre, pour mes listes déroulantes, j'ai pas réussies à les mettre en "locked" : en effet, dans le sousformulaire, elle ne servent pas ces listes déroulantes...
    j'ai pensé mettre des espèce de text box à la place mais je pouvais pas récupérer le contenu:
    J'ai transformé le source du sous formulaire en effectuant une jonction sur la table Clients. Ainsi ce n'est plus l'id qu'on affiche (et de fait corréler le nom avec une liste et deux entrées) mais à la fois l'id et le nom de la société. Dès lors l'utilisation d'une zone de texte devient un jeu d'enfant.

    Nom : Capture3.JPG
Affichages : 2543
Taille : 62,3 Ko

    je ne sais pas indiquer le 1er nuémero de ligne... si tu peux m'aider, je te remrecie
    Un requery dans ce cas aurait suffit :

    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
    Sub Raz_Saisie()
      ' Courtoisie Jimbolion
      Me.E_Commentaire = ""
      Me.E_DateIntervention = Null
      Me.E_IdClient = Null ' repasse en insertion nouvelle ligne
      Me.E_Pourcentage = 0
      Me.E_Type = ""
      Me.E_IdTemps = 0
      Me.B_Delete.Enabled = False
      ' essai pour se repositionner en haut du tableau après RAZ
    '  DoCmd.GoToControl "SF_Temps"
      Me.SF_Temps.SetFocus
      Me.Requery
      '
      Me.E_DateIntervention.SetFocus
      '
    End Sub
    j'ai regardé avec attention ta remarque, mais je n'ai pas vu de souci .
    quand je fait une saisie > 100% sur un jour J, on me propose par défaut, le delta à 100% sur le jour J.
    si je clique sur une ligne d'un jour F, le pourcentage de ce Jour F remonter bien et non le delta à 100% du jour J....
    La modification des valeurs sur une date antérieure et lorsque le total est de 100% implique donc la création d'une nouvelle journée. Or si cette journée existe déjà et comptabilise des temps le taux ne devrait pas être de 100% mais de 100-la somme de cette journée.

    Cet exemple illustre mes propos :

    Nom : Capture1.JPG
Affichages : 2475
Taille : 77,6 KoNom : Capture2.JPG
Affichages : 3102
Taille : 78,8 Ko

    Je pense que dans ce cas il faudrait modifier le code en interdisant le recalcul lorsqu'il s'agit d'une modification ! A toi de voir

    Cordialement

    ci-joint mes correctifs

    Jim
    Fichiers attachés Fichiers attachés
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

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

Discussions similaires

  1. [AC-2010] ColumnHidden, ColumnOrder sur formulaire double affichage
    Par rnd dans le forum IHM
    Réponses: 5
    Dernier message: 03/09/2020, 15h43
  2. [AC-2010] Formulaire double affichage sur formulaire unique ?
    Par AlPot dans le forum IHM
    Réponses: 9
    Dernier message: 29/12/2012, 17h25
  3. [AC-2007] Tri/Filtre et formulaire double affichage
    Par niko8181 dans le forum IHM
    Réponses: 3
    Dernier message: 22/02/2012, 07h45
  4. [AC-2007] Setfocus sur formulaire double affichage
    Par billybob2 dans le forum IHM
    Réponses: 0
    Dernier message: 09/07/2010, 08h10
  5. [AC-2007] imprimer le résultat d'un filtre sur formulaire double affichage
    Par johanaquatique dans le forum IHM
    Réponses: 6
    Dernier message: 18/06/2009, 13h54

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