Contrôle de données avant l'enregistrement

Bonjour,

Dans un formulaire, lorsque je choisi une valeur précise dans une liste déroulante j’ai une zone d’attributs qui s’affiche. Je voudrais empêcher l’utilisateur d’enregistrer le formulaire si ces attributs ne sont pas remplis.

Je pense faire le contrôle dans un preValidate(), correct?
Si les attributs ne sont pas remplis, est-ce que je peux afficher un message d’erreur et stopper l’enregistrement?

merci d’avance
Fabrice

Si vous jouez de manière conditionnelle sur le caractère obligatoire/facultatif des attributs en question vous n’avez rien à faire de plus => le validate se chargera de remonter des erreurs si des attributs obligatoires ne sont pas renseignés, et ces erreurs s’afficheront au bon endroit dans le formulaire.

Vous pouvez implémenter ce règles soit sous forme de contraintes soit dans le hook preValidate. Personnellement je le ferais plutôt via des contraintes (“front+back” = UI+serveur) pour plus d’interactivité. Pour rappel les contraintes “back” = serveur s’appliquent juste avant le preValidate.

J’ai oublié de préciser que les attributs qui sont affichés proviennent d’une table liée, du coup je ne peux pas jouer sur le caractère obligatoire/facultatif des attributs (qui par ailleurs sont obligatoires dans leur table). De plus le fait qu’ils sont obligatoires seulement si une rubrique à un contenu précis empêche d’avoir une obligation générique

Ce qui doit être rendu conditionnement obligatoire/facultatif ici c’est alors l’attribut foreign key

J’ai essayé mais du coup la notion obligatoire/facultatif s’applique sur tous les enregistrements existants sans tenir compte du contenu de la rubrique.

Si le contenu de la rubrique Type d’événement est différent de “perception des jetons de présence” la saisie d’un représentant est masquée. La saisie d’un représentant n’est possible et obligatoire seulement si le contenu de la rubrique Type d’événement est “perception des jetons de présence”

Je me suis inspiré de votre site documentation et de ce que j’ai trouvé sur le forum pour :

 	@Override
	public List<String> preValidate(){
		String ctrlRep = presenceRepresentant();
		List<String> msgs = new ArrayList<>();
		
		if (ctrlRep.equals("PAS OK")) {
  		       msgs.add(Message.formatError("Données obligatoires", "Veuillez renseigner un représentant", null));
		}
		return msgs;
	}

et

	public String presenceRepresentant(){
		//Vérifie qu'un représentant soit bien saisi si le type d'événement est "Perception des jetons de présence"

		if (getFieldValue("participationEvenementType").equals("jeton") && getFieldValue("FK_ParticipationEvenement_ParticipationRepresentant").equals(""))
		return "PAS OK";
		
		return "OK";
	}	

Est-ce que c’est correct ou est-ce du mauvais code?

Cf. ma première réponse, vous réinventez des choses qui existent en standard = la remontée de message d’erreur sur un attribut obligatoire non renseigné.

Comme dit dans ma réponse, l’idéal est sans doute de paramétrer des contraintes mais si vous tenez à implémenter ça uniquement coté serveur dans le preValidate il suffit d’écrire un truc du genre:

getField("FK_ParticipationEvenement_ParticipationRepresentant").setRequired(
    "jeton".equals(getFieldValue("participationEvenementType")
);

Merci pour vos réponses. J’avais mal interprété où je plaçais la contrainte obligatoire, mais la nuit porte conseil :slight_smile:

Ce matin j’ai mis en place le caractère obligatoire à la bonne place.

Tout fonctionne sans code!

Merci!!