Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/12/2011, 11h58   #1
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 3
Points : 3
Par défaut Validation selon la valeur d'un champ de sous formulaire

Bonjours, je souhaiterais créer une macro me permettant d'afficher des messages d'alerte (MsgBox) en fonction des résultats trouvés dans un sous-formulaire.
Je m'explique, j'ai un formulaire principal de dispensation de médicament contenant les champs "médicament" et "Patient".
En fonction de ce que remplit l'utilisateur, apparait dans le sous-formulaire (Si il existe), le dernier numéro d'autorisation pour ce patient et ce médicament ainsi que la date de péremption de cette autorisation.
Je souhaiterais donc afficher deux messages d'alertes sur l'évènement "Après MAJ" du champs médicament du formulaire principal (Le dernier à être remplit):
- Vous ne pouvez pas délivrer ce médicament (si le N° n'existe pas)
- Vous ne pouvez pas délivrer ce médicament (Si la date de péremption est dépassée)

Merci d'avance pour votre aide
Jojovanadium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/12/2011, 16h50   #2
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 659
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 659
Points : 6 225
Points : 6 225
Envoyer un message via MSN à argyronet
Bonjour,

Il n'est pas recommandé d'user du AfterUpdate dans ce cas mais plutôt du BeforeUpdate() avec l'usage du Cancel si nécessaire. L'évenement Exit est intéressant aussi dans le même esprit.

Bon voici un exemple de base :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Private Sub txtMedoc_BeforeUpdate(Cancel As Integer)
Dim strMedicamentNum                                   As String
Dim vntVerif                                           As Variant
 
    strMedicamentNum = Me.txtMedoc.Value
    vntVerif = DLookup("[MedicamentNum]", "TableMidicaments", "MedicamentNum='" & strMedicamentNum & "'")
    If IsNull(vntVerif) Then
        MsgBox "Ouh ouh, y a pas de médoc comme ça dans la table !", vbExclamation
        Cancel = True
    Else
        vntVerif = DLookup("[DatePeremption]", "TableMidicaments", "MedicamentNum='" & strMedicamentNum & "'")
        If IsDate(vntVerif) Then
            If CLng(vntVerif) < CLng(Now) Then
                MsgBox "Ouh ouh, faudrait voir à pas délivrer des truc périmés, humm !!", vbExclamation
                Cancel = True
            End If
        End If
    End If
End Sub
Mais sache qu'à la longue, les msgbox, ça saoule...

Une liste déroulante filtrée et dont la date est supérieure à Now t'éviterait tous ces tracas... A cette liste tu uses de l'évenement NotInList et le tour est joué.

Argy
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/12/2011, 23h50   #3
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 3
Points : 3
Merci de votre aide, j'ai écris le code dans le "Before Update" comme vous me l'avez conseillé, mais cela ne fonctionne pas (Je précise que le Numéro d'autorisation se trouve dans une table différente de celle des médicaments). Pour un peu plus de précisions sur la structure de ma base:
Pour simplifier, pour ce qui m'intéresse ici, il y a 3 tables (Médicaments, patients, Numéros d'autorisation). La table numéros d'autorisation est reliée aux deux autres tables puisqu'un numéro correspond à un couple (patient, médicament)
Pour mon formulaire principal de dispensation des médicaments (qui remplit une 4e table: dispensation); je vais rechercher un médicament dans la table médicament, un patient dans la table patient et ensuite s'affiche dans le sous formulaire le dernier numéro d'autorisation (pas forcément valide, il peut être périmé).
[Le sous formulaire étant basé sur une requête qui va chercher le dernier numéro dans la table "numéros d'autorisation"]

Donc pour faire référence à mes champs dans le code VB, je dois juste écrire leur nom ou ecrire le chemin complet qui s'y rapporte? (en supposant que mon problème vienne d'une erreur de nomenclature)
du style:
Code :
Forms![NomFormulaire]![NomSousFormulaire1].Form![NomSousFormulaire2].Form![MonControle].Value
???
Merci d'avance
Jojovanadium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 14h36   #4
Invité de passage
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Santé

Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 3
Points : 3
Voici votre code que j'ai adapté à ma base; est-il toujours correct?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Quantite_delivree_retro_AfterUpdate()
 
Dim strMedicamentNum As String
Dim vntVerif As Variant
 
    strMedicamentNum = Me.Specialite_ATU.Value
    vntVerif = DLookup("[DernierDeNo_ATU]", "No_ATU", "No_ATU='" & strMedicamentNum & "'")
    If IsNull(vntVerif) Then
        MsgBox "ATTENTION, Vous ne pouvez pas dispenser ce médicament à ce patient car il ne possède pas de N° d'ATU. Veuillez contacter le pharmacien responsable des ATU pour effectuer une demande initiale d'ATU auprès du médecin en charge de ce patient!", vbExclamation
        Cancel = True
    Else
        vntVerif = DLookup("[MaxDePeremption_ATU]", "No_ATU", "No_ATU='" & strMedicamentNum & "'")
        If IsDate(vntVerif) Then
            If CLng(vntVerif) < CLng(Now) Then
                MsgBox "ATTENTION, Vous ne pouvez pas dispenser ce médicament à ce patient car le N° d'ATU pour ce médicament est périmé. Veuillez contacter le pharmacien responsable des ATU pour effectuer un renouvellement d'ATU auprès du médecin en charge de ce patient!", vbExclamation
                Cancel = True
            End If
        End If
    End If
 
End Sub
Que faut-il mettre après le "=" dans l'expression suivante?
Code :
strMedicamentNum = Me.Specialite_ATU.Value
Un autre petit problème: la fonction "dlookup" attend un nom de table comme deuxième critère mais la valeur de mon sous-formulaire est obtenue à partir d'une requete, est-ce important?

Merci d'avance
Jojovanadium est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 15h57   #5
Rédacteur/Modérateur

 
Avatar de argyronet
 
Homme Jean-Philippe AMBROSINO
Panseur de bobos en solutions ETL
Inscription : mai 2004
Messages : 3 659
Détails du profil
Informations personnelles :
Nom : Homme Jean-Philippe AMBROSINO
Localisation : France

Informations professionnelles :
Activité : Panseur de bobos en solutions ETL
Secteur : Finance

Informations forums :
Inscription : mai 2004
Messages : 3 659
Points : 6 225
Points : 6 225
Envoyer un message via MSN à argyronet
Comme dit précédemment, il faut éviter l'événement AfterUpdate() dans votre cas car comme son nom l'indique, vous n'empêcherez rien...

La variable "strMedicamentNum" doit être alimentée comme suit :
Code :
strMedicamentNum = Me!Specialite_ATU
Vous pouvez utiliser une requête dans un DLookup à condition que ce soit une requête SELECT qui ne soit pas une requête action et qui ne requiert aucun paramètre.
__________________
Ils comptent sur vous...

Ce qui donne son sens à la communication, c´est la réponse que l´on obtient. Si vous n´obtenez pas la réponse voulue, communiquez différemment.

Web Site@Mail
Livres : VBA pour OFFICE 2007 et MICROSOFT ACCESS 2007
Nouveau Tutoriel : Déployer vos applications avec Microsoft Access 2010
MDB Viewer : Visionneuse Access v4.0
argyronet est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h21.


 
 
 
 
Partenaires

Hébergement Web