PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Help code pour éviter les doublons à l'aide d'une requête
Help code pour éviter les doublons à l'aide d'une requête
Débuté par Maxime, 22 fév. 2019 11:08 - 9 réponses
Posté le 22 février 2019 - 11:08
Bonjour tout le monde,
Je suis tout nouveau dans le monde du code et mon responsable m'a demandé de créer une appli sur WinDev23 pour un inventaire de parc jusque là tout va bien mais je bloque sur un code pour gérer les doublons. J'ai fais une requête et sur mon code un HExecute mais ça ne fonctionne pas c'est peut être tout bête mais j'aurai besoin d'un petit coup de pouce.
Je suis en reconversion pro donc soyez gentil avec moi :D

Voici mon code:

SI SansEspace(Nom)=""ALORS //si le nom est vide
Erreur("Vous devez saisir un nom" ) //alors erreur
SINON //sinon on vérifie le prénom
SI SansEspace(Prénom)=""ALORS //si le prénom est vide
Erreur("Vous devez saisir un prénom") //alors erreur SI Service..ValeurAffichée=""ALORS
Erreur ("Vous devez saisir un Service")
HExécuteRequête(REQ_UTILISATEUR,hVérifieDoublon,ParamNom,ParamPrénom)
HLitPremier(REQ_UTILISATEUR)
SI HEnDehors(REQ_UTILISATEUR)= Vrai ALORS SINON //sinon on ajoute l'utilisateur dans la table
Utilisateur.Nom=Nom
Utilisateur.Prénom=Prénom
Utilisateur.Service=Service
SI HAjoute(Utilisateur)ALORS
Info ("Utilisateur crée")
SINON
Erreur("Une erreur a été détectée pendant la récupération des données.") FIN
FIN
FIN
FIN
FIN


Merci d'avance :)
Posté le 22 février 2019 - 13:00
Salut,

As tu moyen de nous donner le contenu de ta REQ_UTILISATEUR ?
Membre enregistré
299 messages
Popularité : +16 (16 votes)
Posté le 24 février 2019 - 14:34
SI SansEspace(Nom)=""ALORS //si le nom est vide
Erreur("Vous devez saisir un nom" ) //alors erreur
SINON //sinon on vérifie le prénom
SI SansEspace(Prénom)=""ALORS //si le prénom est vide
Erreur("Vous devez saisir un prénom") //alors erreur SI Service..ValeurAffichée=""ALORS
Erreur ("Vous devez saisir un Service")



Avant de répondre à votre question avant que vous postiez le code je vous conseille de revoir votre gestion de contrôle.
Si vous continuez ainsi vous allez tellement indenter le code que vous allez finir en dehors de l'écran.

Essayez
SI SansEspace(Nom)=""ALORS //si le nom est vide
Erreur("Vous devez saisir un nom" ) //alors erreur
RepriseSaisie(Nom)
FIN
//sinon on vérifie le prénom
SI SansEspace(Prénom)=""ALORS //si le prénom est vide
Erreur("Vous devez saisir un prénom")
RepriseSaisie(Prénom)
FIN
SI Service..ValeurAffichée=""ALORS
Erreur ("Vous devez saisir un Service")
RepriseSaisie(Service)
FIN


tant que vous y êtes donnez à vos objets des noms normalisés. WD propose une charte pour cela.
Membre enregistré
2 messages
Posté le 25 février 2019 - 08:51
Bonjour Geoffrey, voici ma requête


Membre enregistré
2 messages
Posté le 25 février 2019 - 08:52
Bonjour Michel, je vous remercie pour toutes vos informations qui vont bien m'aider à m’améliorer :)
Membre enregistré
299 messages
Popularité : +16 (16 votes)
Posté le 25 février 2019 - 16:04
Si vous pouviez envoyer plutôt le texte SQL de la requete.
Bouton droit de souris puis Texte SQL.
Posté le 26 février 2019 - 08:21
SELECT
Utilisateur.IDUtilisateur AS IDUtilisateur,
Utilisateur.Nom AS Nom,
Utilisateur.Prénom AS Prénom
FROM
Utilisateur
ORDER by
Nom Asc,
Prénom Asc


Cela vous convient ?
Membre enregistré
299 messages
Popularité : +16 (16 votes)
Posté le 26 février 2019 - 11:57
Vous pouvez aussi détecter le doublon éventuel en effectuant un comptage.
Si le comptage est égal à 0 il n'y a pas doublon

LC_SQL est une chaîne
LC_SQL = " SELECT count(*) as NB FROM Utilisateur "
LC_SQL += "where Nom = '" + Nom + "' "
LC_SQL += " and Prenom = '" + Prenom + "' "

MaRequête est une Source dede Données
SI PAS HExécuteRequêteSQL(MaRequête, LC_SQL) ALORS
Erreur("Erreur d'initialisation de la requête" + RC + HErreurInfo())
RETOUR
FIN
HLitPremier(MaRequête)
SI MaRequête.NB = 0 pas de doublon


Vous pouvez bien sûr placer le code SQL dans une requete WD et passer Nom et Prenom en paramètre.
Vous éviterez ainsi de devoir gérer les apostrophes dans les noms.
L'avantage est que vous limitez ici au maximum le volume de données échangées : juste un nombre.
Message modifié, 26 février 2019 - 11:58
Membre enregistré
1 298 messages
Popularité : +20 (72 votes)
Posté le 23 mars 2019 - 11:56
Donc le souhait est de s'assuré qu'il n'y a jamais deux fois la même combinaison NOM PRENOM SERVICE

afin de protégé ta base de données indépendamment de ton programme, mais aussi pour facilité et optimisé la recherche,

1° créer une clé composée sur les 3 éléments,

2° indexé cette clé en index unique


ensuite, tu as deux possibilité,

a. faire une Req et voir si tu as au moins une fiche, si oui tu as déja une occurence et donc tu ne crée pas

b. faire une interception d'erreur sur le hajoute, et si une erreur est détectée c'est que tu a essayer d'ajouter un doublon

--
Bertin CARRIERE - SPRL RGPD.Zen-Project.be
bertin.carriere@gmail.com
http://www.zen-project.be http://www.linkedin.com/in/bertincarriere

Belgique +32(0)2/318.02.67
France +33(0)3/66.722.542
Espagne +34.5/12.702.266

http://www.be-dev.be
Membre enregistré
299 messages
Popularité : +16 (16 votes)
Posté le 23 mars 2019 - 23:00
a. faire une Req et voir si tu as au moins une fiche, si oui tu as déja une occurence et donc tu ne crée pas
C'est différent de ce que j'avais écrit ?

b. faire une interception d'erreur sur le hajoute, et si une erreur est détectée c'est que tu a essayer d'ajouter un doublon
Pour ma part je n'aime pas ce genre de solution. Ce la génère un flux de donnée inutile. Cela équivaut à foncer dans le mur et, si on ne s'est pas tapé la tête on considère qu'il n'y a pas de mur.
Et pourquoi créer une clé pour chaque contrôle ?