PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Reprise saisie ++
Reprise saisie ++
Débuté par alexeyk, 13 déc. 2004 20:19 - 3 réponses
Posté le 13 décembre 2004 - 20:19
Bonjour,

J'aimerais simplifier le contrôle des saisies dans les fiches.
Et j'ai besoin de donner le focus à des champs de saisie
qui peuvent se trouver dans les onglets ou super – champs imbriqués.
Comment faire?

Ce que j'aimerais réaliser :
- Chaque fichier comporte une liste de rubriques obligatoires (rubriques_obligatoires_fichier=rubrique1+tab+rubrique2...) paramétrée à l'init du programme
- L'utilisateur valide la saisie (bouton "enregistrer") d'une fenetre fiche
- Le programme analyse tous les champs de saisie de la fenêtre (énumération par programmation)
- Si un champ a une liaison fichier, je dois voir si la rubrique est obligatoire (cf. la liste),
puis vérifier si l'utilisateur a saisi une valeur correcte ou non (fenetre.champ dans liste_valeurs_interdites (0, null, ‘’, …))
- Si la rubrique est obligatoire et l'utilisateur n'a rien saisi alors il faut :
colorier le libellé du champ en rouge
ajouter le libellé champ dans une chaîne de compte rendu d'erreur
- A la fin du test sur tous les champs de la fenêtre il faut :
afficher un message d'erreur (liste de tous les champs en erreur)
donner le focus (reprisesaisie / ecranpremier ??? -> c’est la que je cherche une solution) au premier champ en erreur

1) Comment énumérer tous les champs d'une fenêtre qui ont une liaison fichier
2) Code générique pour donner le focus à un champ quelconque
3) Contraintes :
- Un champ peut être dans un onglet / super - champ
- Les onglets onglet / super - champs peuvent être imbriqués sur plusieurs niveaux
- Il faut que le code fonctionne sur n'importe quelle fenêtre
dont on ne connaît pas le contenu à l'avance
- La plupart des champs concerné sont des champs de saisie simples (monétaire, numérique, date, texte …) ou des combos. On ne contrôle pas la saisie dans les tables et autres champs complexes.

Le but c'est de positionner automatiquement l'utilisateur sur les champs en erreur
quand il valide la fiche. L'utilisateur corrige la saisie, valide, et le programme le positionne sur le champ en erreur suivant, jusqu'à validation de la fiche (tous les champs obligatoires sont renseignés).

A vous les experts :)

Cordialement,
Alexey K.
Posté le 14 décembre 2004 - 11:45
>1) Comment énumérer tous les champs d'une fenêtre qui ont une liaison fichier

J'ai pas testé, mais en utilisant une fonction de ce style, ça doit marcher :

PROCEDURE MonEnumere (MonParent)

MonChamp = EnumereSousElement (MonParent, enumPremier)
TANTQUE MonChamp <> ""
SELON MonChamp..Type
CAS typOnglet, typSuperChamp, ... :
MonEnumere ({MonParent+"."+MonChamp, indChamp}..nom)
CAS typComboAVS, typDate, ... :
SI {MonParent+"."+MonChamp, indChamp}..LiaisonFichier <> "" ALORS
// Ajouter le champ à la liste
FIN
AUTRES CAS :
FIN

EnumereSousElement (MonParent)
FIN


2) Code générique pour donner le focus à un champ quelconque

Si dans la liste obtenu ci-dessus tu sauvegardes {MonPArent+"."+MonChamp}..Nom comme élément de la liste, il suffit de faire RepriseSaisie (ElementDeLaListe)
Posté le 14 décembre 2004 - 17:18
Code 1 : énumération des champs, ne fonctionne pas
- Avec un cas simple d'imbrication : fenêtre(onglet1Volet2(onglet2Volet3(champ)))
- Si un volet / super - champ de la chaîne n'est pas accessible par tab et n'a pas d' ordre de navigation

Code 2 : prise de focus sur champ, ne fonctionne pas
- Avec un cas simple : la fenêtre contient un onglet avec 2 volets, le volet ouvert est le 1, le champ se trouve dans le 2eme. RepriseSaisie n'ouvre pas le volet 2

Il faut que à la fin du traitement :
- Les bons volets soient positionnés (si le champ est dans le volet 2 et que l'utilisateur est sur le volet 1, il faut ouvrir le volet 2 par programmation)
- Il faut que le curseur de saisie soit positionné dans le champ

Donc le problème n'est pas aussi simple qu'il n'y parait

Cordialement,
Alexey K.
Posté le 15 décembre 2004 - 10:30
Code 1 : énumération des champs, ne fonctionne pas
- Avec un cas simple d'imbrication : fenêtre(onglet1Volet2(onglet2Volet3(ch
amp)))


J'ai pas de problème à priori, essaie d'exécuter pas à pas pour voir d'où te vient l'erreur : il faut peut-être un peu plus détailler chaque cas (onglet/superchamp/... ). Note qu'il doit y avoir un '.' entre le nom de ton onglet et le numéro de ton volet

Il faut que à la fin du traitement :
- Les bons volets soient positionnés (si le champ est dans le volet 2 et que l'utilisateur est sur le volet 1, il faut ouvrir le volet 2 par programmation)
- Il faut que le curseur de saisie soit positionné dans le champ


C'était un exemple rapide que j'ai donné, dans des cas un peu plus complexes il peut être nécessaire d'analyser le nom extrait de ta liste (si fenêtre n'est pas celle en cours, l'afficher devant, affecter l'onglet au numéro de volet corespondant, ... ). L'aide est suffisamment explicite pour ça.