Précédent   Forum du club des développeurs et IT Pro > Logiciels > Microsoft Office > Access > VBA Access
VBA Access Le forum pour les questions relatives au code VBA sous Access, et à son environnement de développement VBE.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/03/2012, 19h18   #1
NeuroTransMetteur
Membre du Club
 
Homme Alain
Inscription : janvier 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : Belgique

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : janvier 2012
Messages : 39
Points : 62
Points : 62
Par défaut [Utilis. Avertis] Types de données et interface utilisateur intelligente: vos solutions ?

Bonjour,
Prenons un exemple conceptuel de création d'une application
Cahier des charges:
  • Statistiques épidémiologiques
  • Fournisseur de donnés externe
  • Interface utilisateur de sélection de critères
  • ...
Modélisation:
  • Données
    • id_Individu
    • id_individu.DateNaissance
    • id_individu.DateNaissance.type
    • ...
    • id_Affection
    • ...
  • ...
Création de la BD:
  • créer les tables
  • créer les champs (des tables)
  • définir le type de champs
  • ...
Création interface utilisateur, modules...
  • ...
Test:
(suivant le modèle: Données ->Intervention Utilisateur ->Traitement ->résultat
  • Exemple de problèmes Type de Données conceptuels:
    • Erreur: Id_Individu.DateNaissance.Type incompatible avec les données
    • Données: 00/00/1959
    • Infos auprès du fournisseur de données : "Certains pays ont des registres nationaux ne précisant pas le jour et même parfois le mois de naissance.
    • solution 1
      • si 00/00/yyyy mettre 01/01
      • Acceptable: Non
      • Raisons : perturbation de statistiques basées sur le mois de naissance
      • Exemple (non il ne s'agit pas d' horoscope) Corrélation entre les affections allergiques saisonnières et la date de naissance.
    • solution 2
      • Créer un champ YYYY, un champ MM et un champ DD
    • Conclusion:
      • Typer les données en situation réelle n'est pas aisé.
    .
  • Exemple de problèmes Type de Données et interface Utilisateur :
    • Erreur: incompatibilité de Type (de données)
    • But: Augmenter la productivité
    • Outils de développements: CREATION D'UNE INTERFACE "INTELLIGENTE"
    • solution 1
      • Agir sur l'événement avant mise à jour
      • Acceptable : non
      • Pourquoi : impossible de modifier un champ pendant la mise à jour.
    • solution 2
      • Agir sur l'événement après mise à jour
      • Accettable: non
      • Pourquoi : impossible de mettre à jour si erreur de type( de données)
    • Autres solutions
      • Formulaires indépendants
      • Tables temporaires
      • EN CONNAISSEZ VOUS D'AUTRES ?

Question:

Lorsque la source d'une [zone de saisie de texte] est liée à un champ dont le type n'est pas texte, quels sont les moyens d'automatiser la correction d'une saisie générant une erreur de type ?

exemple:
  • contrôle.lbl= "cotez ce travail sur dix, entrez un chiffre de un à dix:"
  • source contrôle.Type = integer
  • données saisies = "huit" ou 80% ou 8/10 ...
  • Traitement automatisé : "huit"=>8 "80%"="8/10"=>8 Me.contrôle=8

(PS:Je travaille sur access depuis 20 ans (inutile de me réinventer l'eau chaude), restez concis , merci)

D'avance, merci de m'avoir lu jusqu'ici
Alain.
NeuroTransMetteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2012, 19h37   #2
micniv
Membre Expert
 
Homme Michel
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 1 666
Détails du profil
Informations personnelles :
Nom : Homme Michel
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : mai 2005
Messages : 1 666
Points : 2 398
Points : 2 398
Euh ...
et c'est quoi la problématique ?
__________________
"Allways, look at the bright side of life." Monty Python.
micniv est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/03/2012, 03h26   #3
NeuroTransMetteur
Membre du Club
 
Homme Alain
Inscription : janvier 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : Belgique

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : janvier 2012
Messages : 39
Points : 62
Points : 62
Bonjour,
Une (re)présentation s'impose. (cfr http://www.developpez.net/forums/.../presentations/neurotransmetteur-bonjour/
Je suis concepteur/développeur gestionnaire et utilisateur de ma propre application de ma propre entreprise depuis 20 ans.

J'ai le meilleur outil d'analyse comportemental des "End-Users" face à l'application : mes yeux (car ce sont mes employés).

J'ai subi UNE seule destruction totale de la db en 20 ans. Mais je n'ai perdu aucune donnée car j'ai une classe M.E.L.A à ma sauce : exporter toute Modification, Effacement, Ajoute dans un fichier texte (effacé à chaque sauvegarde réussie).

Access m'a toujours pleinement satisfait SAUF sur un point: EVENEMENT AVANT MISE A JOUR D'UN CONTROLE.

ET le but de ce post est de m'enquérir de vos éventuels "trucs et astuces".
Pour illustrer le cadre de mon interrogation où même Microsoft s'y perd, je vous affiche une page de l'aide ACCESS et leur exemple qui provoque un beau plantage. Options de Verrouillage général et du formulaire réglés sur AUCUN.

Illustration de cette ambiguïté et de la propre confusion de M.S. à ce sujet


<<Extrait de l'aide VBA au sujet de OldValue>>

La propriété OldValue contient la valeur non modifiée d'un contrôle dépendant et n'est accessible qu'en lecture seule dans tous les modes.

Vous ne pouvez accéder à cette propriété qu'à partir d'une macro ou de Visual Basic.

Vous pouvez affecter la valeur de la propriété OldValue à une variable en utilisant la syntaxe suivante :

OriginalValue = Forms!Customers!AmountPaid.OldValue
Microsoft Access utilise la propriété OldValue pour stocker la valeur d'origine d'un contrôle dépendant. Lorsque vous modifiez un contrôle dépendant sur un formulaire, les modifications ne sont enregistrées que lorsque vous passez à un autre enregistrement. La propriété OldValue contient la version non modifiée des données sous-jacentes.

Vous pouvez créer votre propre fonction d'annulation en attribuant à un contrôle la valeur de la propriété OldValue. L'exemple suivant vous montre comment annuler les modifications dans un contrôle de type zone de texte sur un formulaire :

Exemple
L'exemple suivant vérifie que la modification apportée à la valeur d'origine d'un champ est égale ou inférieure à 10 pour cent. Si elle est supérieure à 10 pour cent, la valeur d'origine est restaurée au moyen de la propriété OldValue. Vous pouvez aussi appeler cette procédure à partir de l'événement BeforeUpdate du contrôle qui contient les données à valider.



Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function Validate_Field()
 
    Dim curNewValue As Currency
    Dim curOriginalValue As Currency
    Dim curChange As Currency
    Dim strMsg As String
 
    curNewValue = Forms!Products!UnitPrice
    curOriginalValue = Forms!Products!UnitPrice.OldValue
    curChange = Abs(curNewValue - curOriginalValue)
 
    If curChange > (curOriginalValue * .1) Then
        strMsg = "Change is more than 10% of original unit price. " _ 
        & "Restoring original unit price."
        MsgBox strMsg, vbExclamation, "Invalid change."
        Forms!Products!UnitPrice = curOriginalValue
    End If
End Function
Eh bien, cet exemple est une fameuse ineptie et cause un message d'erreur du genre "impossible de modifier les données pendant la mise à jour" ou "Erreur 2115 La macro ou fonction attribuée à la propriété Avant MAJ ou Valide si pour ce champ empêche Microsoft Access d'enregistrer les données dans le champ."

En réalité, malgré ce que M.S. prétend, ce n'est pas réellement un événement avant mise à jour mais plutôt un événement pendant mise à jour( et donc limité à cancel=True/False ).

Merci de vos lumières et de préciser si vous avez trouvé un moyen ou non de modifier les données avant mise à jour.(Voici une formulation plus simple de ma question.)

Alain
NeuroTransMetteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2012, 22h06   #4
ilank
Membre Expert
 
Inscription : avril 2006
Messages : 1 055
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 055
Points : 1 240
Points : 1 240
Bonsoir à tous,

Il n'y a pas d'ineptie dans le code proposé, tu oublies sûrement un mot important dans la phrase que tu soulignes
Citation:
Vous pouvez aussi appeler cette procédure à partir de l'événement BeforeUpdate du contrôle qui contient les données à valider.
Ici, le code est appelé suite à la modification de la valeur donc lors de l'événement AfterUpdate.
Lors de l'événement BeforeUpdate, il faut juste remplacer la ligne :
Code :
 Forms!Products!UnitPrice=curOriginalValue
par
ilank est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2012, 20h39   #5
NeuroTransMetteur
Membre du Club
 
Homme Alain
Inscription : janvier 2012
Messages : 39
Détails du profil
Informations personnelles :
Nom : Homme Alain
Localisation : Belgique

Informations professionnelles :
Secteur : Santé

Informations forums :
Inscription : janvier 2012
Messages : 39
Points : 62
Points : 62
Par défaut To cancel or Not to cancel ...

Bonjour,
Tout d'abord merci pour cette réponse.

La problématique du code étant
Code :
Forms!Products!UnitPrice = curOriginalValue
qui ne peut être modifiée QU'APRES update.
Citation:
Vous pouvez aussi appeler cette procédure à partir de l'événement BeforeUpdate du contrôle qui contient les données à valider.
devrait en réalité être:

Vous pouvez seulement appeler cette procédure à partir des événements AfterUpdate et postérieus du contrôle qui contient les données à valider (et donc avant la sauvegarde de l'enregistrement)

Il est cependant décevant de ne pouvoir utiliser que UNDO (ou cancel) sur un événement BeforeUpdate.

Il reste les procédures "keydowm" et la surveillance du survol de la souris vers un autre contrôle pour agir avant que la procédure update ne "cancel pas toute notre créativité"

Point positif à l'actif d' Access c'est une meilleur gestion des saisies : (Par exemple : les anciennes versions n'acceptaient pas la saisie de date sous forme "01-03-2012", provoquant un message d'erreur.) les versions >2000 transforment le "01-03-2012" en 01/03/2012 . Preuve qu'il y a quand même moyen d'agir avant la mise à jour.

Alain
NeuroTransMetteur est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 06h08.


 
 
 
 
Partenaires

Hébergement Web