PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 2024 → Erreur d'intégrité côté clé étrangère
Erreur d'intégrité côté clé étrangère
Débuté par Bruno, 10 mar. 2017 18:54 - 11 réponses
Membre enregistré
12 messages
Posté le 10 mars 2017 - 18:54
Bonjour !
Je code en ce moment une application interne, et je me heurte à une erreur d'intégrité qui veut décidément pas partir...

Côté BDD:
J'utilise le HFSQL, voilà l'arbre pour ce qui concerne la partie où il y a l'erreur :


http://img4.hostingpics.net/pics/145990BDDHFSQL.png


La fenêtre associé :


http://img4.hostingpics.net/pics/228674fenetre.png

Voilà mon code d'enregistrement d'une nouvelle entrée (ici d'un nouveau point):

HRAZ(point); // reset total pour ajout sain

point.deNuit = Null //
point.faune_ecoute = Null //
point.milieuPoint = ZR_Milieu.ATT_ID
point.ID_lieu_dit = COMBO_lieu_dit..Valeur
point.libelle_perso = SAI_Libellé..Valeur
point.nom_Machine = genereNomMachine()
point.session_ID = gnSessionID
point.type_chiro = Null
point.typePoint = COMBO_TypePoint..Valeur



laPosition est un geoPosition = dernierPointGPS()

point.x = laPosition..Longitude
point.y = laPosition..Latitude

// Après on complète si nécessaire
SI COMBO_TypePoint..Valeur = 2 ALORS //ici, ID du type de point = 2 c'est pour les points d'écoute, alors il faut agir en conséquence
// dans les deux cas...
point.faune_ecoute = COMBO_FauneEcoute..Valeur;

SI COMBO_FauneEcoute..Valeur = 1 ALORS //si la faune écouté sont des chiros ...
point.deNuit = INT_nuit..Valeur;
point.type_chiro = COMBO_TypeChiro;
FIN

FIN



//après, on ajoute dans la bdd
SI HAjoute(point,hVérifieIntégrité) = Faux ALORS // si erreur on l'indique !
Erreur("Erreur lors de l'ajout: " + HErreur(hErrEnCours),HErreurInfo(hErrComplet))
gnIsOk = Faux
Ferme()
FIN



Je ne comprend pas pourquoi il m'indique une erreur d'intégrité ! Pourtant toutes les données sont initialisés, je ne comprend vraiment pas ... Voilà un type d'erreur :



http://img4.hostingpics.net/pics/180632erreur.png

Avez vous une idée ?

Merci de votre aide !
Membre enregistré
129 messages
Popularité : +5 (5 votes)
Posté le 11 mars 2017 - 05:26
Bonjour Bruno,

Si je comprends bien,

Fichier maître : milieux
0,n
- Chaque milieux (ID_milieux) n'a pas un point (milieuPoint)
- Chaque milieux peut avoir plusieurs points
ET
1,1
- Chaque point (milieuPoint) a au moins un milieux (ID_milieux)
- Chaque point n'a pas plusieurs milieux

Que doit afficher ZR_Milieu.ATT_ID ?
une liste de milieux alors que chaque point n'a qu'un seul milieux...
Comment remplis-tu ta ZR_Milieu ?
- une requête ?

--
Cdlt
JPhD
Posté le 11 mars 2017 - 12:18
Bonjour Bruno,

SI J'AI BIEN LU (et je suis allé vite) :

une cardinalité 1-1 indique qu'il faut TOUJOURS qu'il y ait un enreg de
chaque coté de la liaison...

HORS, tu ne peux créer/ajouter qu'UN enreg A LA FOIS...

Donc, sauf codage spécifique de ta part (et la je parles de désactiver
la gestion d'intégrité lors de l'ajout du premier enreg du couple), il
est IMPOSSIBLE d'ajouter des enregs en mode 1-1

Cordialement


--
Fabrice Harari
Consultant WinDev, WebDev et WinDev Mobile International

A votre disposition : WXShowroom.com, WXReplication (open source) et
maintenant WXEDM (open source)

Plus d'information sur http://fabriceharari.com


Le 3/10/2017 à 12:54 PM, Bruno a écrit :
Bonjour !
Je code en ce moment une application interne, et je me heurte à une
erreur d'intégrité qui veut décidément pas partir...

Côté BDD:
J'utilise le HFSQL, voilà l'arbre pour ce qui concerne la partie où il y
a l'erreur :







La fenêtre associé :






Voilà mon code d'enregistrement d'une nouvelle entrée (ici d'un nouveau
point):

HRAZ(point); // reset total pour ajout sain

point.deNuit = Null //
point.faune_ecoute = Null //
point.milieuPoint = ZR_Milieu.ATT_ID
point.ID_lieu_dit = COMBO_lieu_dit..Valeur
point.libelle_perso = SAI_Libellé..Valeur
point.nom_Machine = genereNomMachine()
point.session_ID = gnSessionID
point.type_chiro = Null
point.typePoint = COMBO_TypePoint..Valeur



laPosition est un géoPosition = dernierPointGPS()

point.x = laPosition..Longitude
point.y = laPosition..Latitude

// Après on complète si nécessaire
SI COMBO_TypePoint..Valeur = 2 ALORS //ici, ID du type de point = 2
c'est pour les points d'écoute, alors il faut agir en conséquence
// dans les deux cas...
point.faune_ecoute = COMBO_FauneEcoute..Valeur;

SI COMBO_FauneEcoute..Valeur = 1 ALORS //si la faune écouté sont
des chiros ...
point.deNuit = INT_nuit..Valeur;
point.type_chiro = COMBO_TypeChiro;
FIN

FIN



//après, on ajoute dans la bdd
SI HAjoute(point,hVérifieIntégrité) = Faux ALORS // si erreur on
l'indique !
Erreur("Erreur lors de l'ajout: " +
HErreur(hErrEnCours),HErreurInfo(hErrComplet))
gnIsOk = Faux
Ferme()
FIN



Je ne comprend pas pourquoi il m'indique une erreur d'intégrité !
Pourtant toutes les données sont initialisés, je ne comprend vraiment
pas ... Voilà un type d'erreur :






Avez vous une idée ?

Merci de votre aide !
Membre enregistré
12 messages
Posté le 11 mars 2017 - 14:57
Bonjour,
merci de vouloir m'aider !

Alors :
ZR_Milieu.ATT_ID est un attribut qui est rempli par programmation. Voilà le code d'initialisation de ZR_Milieu :

POUR TOUT milieux
ZoneRépétéeAjouteLigne(ZR_Milieu,milieux.'libelle_long',milieux.ID_milieux)
FIN


En fait en retour j'obtient l'ID_Milieux du milieux que l'utilisateur a sélectionné, il s'agit d'un nombre. Normalement il me suffit donc de configurer cet ID à un nouvel enregistrement, je ne comprend pas pourquoi ça ne marche pas ...
Membre enregistré
129 messages
Popularité : +5 (5 votes)
Posté le 11 mars 2017 - 16:28
Bruno,

Ce qui me surprend, mais je n'ai pas ton modèle de donnée en tête,

c'est l'apparente contraction entre
- Chaque point (milieuPoint) a au moins un milieux (ID_milieux)
- Chaque point n'a pas plusieurs milieux

et le fait de chercher à afficher une liste de libellé de milieu pour un point qui n'en aurait qu'un de par la traduction des contraintes d'intégrité que je comprend.

Soit ton point peut avoir plusieurs milieux, auquel cas, j'aurais une table 1 point, n milieux et donc une ZR
soit ton point n'a qu'un seul milieu, stocké dans la table point, auquel cas je ne saisis pas l'utilité de la ZR sur les milieux.

--
Cdlt
JPhD
Membre enregistré
12 messages
Posté le 11 mars 2017 - 18:28
Dans la fenêtre, il est question de la création d'un point. J'affiche donc tous les milieux qui existent dans la base afin que l'utilisateur en choisisse un seul !

C'est un peu comme un catalogue où on te demande de choisir un plat parmi la carte. Chaque personne peut manger un seul plat, mais dans la carte les plats peuvent être demandé par aucune ou plusieurs personnes.

Ai-je été assez clair ?
Membre enregistré
129 messages
Popularité : +5 (5 votes)
Posté le 11 mars 2017 - 19:11
Ok,

Il s'agit donc d'une liste de choix déroulant.
Pourquoi ne pas l'avoir gérée sous forme de champ combo ?
et je n'aurais pas géré de contraintes d'intégrité référentielle.

--
Cdlt
JPhD
Membre enregistré
12 messages
Posté le 11 mars 2017 - 19:30
Comme il y a beaucoup d'éléments, j'ai préféré une liste plutôt qu'un combo très long (il y a près de 50 éléments) ! De plus, on peut faire une recherche dans l'onglet au dessus et la zone-répétée se met automatiquement à jour ; on peut directement voir les différents milieux qui restent sans avoir à re-regarder dans une combo ...

Du coup, vous avez une idée de pourquoi il y a cette erreur ?
Message modifié, 11 mars 2017 - 19:31
Membre enregistré
129 messages
Popularité : +5 (5 votes)
Posté le 11 mars 2017 - 21:18
Re,

En debug, est-ce que ZR_Milieu.ATT_ID a bien la valeur milieux.ID_milieux souhaitée avant de cliquer sur Enregistrer.
Car pour enregistrer un point, il faut avoir choisi un milieux.

--
Cdlt
JPhD
Message modifié, 11 mars 2017 - 21:18
Membre enregistré
12 messages
Posté le 12 mars 2017 - 00:06
Bonsoir,

@Fabrice Harari : Désolé de ne pas vous avoir répondu, je n'avais pas du tout vu votre message dans la journée ! Il existe d'autres endroits dans le programme où il y a des cardinalités 1,1 et ça marche très bien ! Les fichiers de données "maître" sont eux déjà rempli à l'avance, c'est le fichier point que l'utilisateur doit créer, en utilisant les multiples possibilités qui lui sont offertes dans les fichiers "maîtres".
Voilà un autre endroit de la BDD où il y a des cardinalités 1,1 qui marchent bien. Pareil les fichiers maîtres sont déjà rempli, il reste juste à créer les enregistrement pour les plantes trouvée en utilisant la liste mise à disposition:

http://img4.hostingpics.net/pics/263370BDDEXTEND.png

@Jean-Philippe DEGLET: J'y ait pensé et j'avais déjà fait du débug de ce côté là. Je met juste en dessous quelques screens d'un débug mais je ne vois rien qui semble louche ! Par contre une chose dont j'ai remarqué : si je place ce code-ci :

HRAZ(point); // reset total pour ajout sain

// on prend un cas simple, si on a un pt_precis ou un pt_site

point.deNuit = Null //
point.faune_ecoute = Null //
point.milieuPoint = ZR_Milieu.ATT_ID // MON PARAMÉTRAGE A CET ENDROIT
point.ID_lieu_dit = COMBO_lieu_dit..Valeur
point.libelle_perso = SAI_Libellé..Valeur
point.nom_Machine = genereNomMachine()
point.session_ID = gnSessionID
point.type_chiro = Null
point.typePoint = COMBO_TypePoint..Valeur


ou ce code là :

HRAZ(point); // reset total pour ajout sain

// on prend un cas simple, si on a un pt_precis ou un pt_site

point.deNuit = Null //
point.faune_ecoute = Null //
point.ID_lieu_dit = COMBO_lieu_dit..Valeur
point.libelle_perso = SAI_Libellé..Valeur
point.nom_Machine = genereNomMachine()
point.session_ID = gnSessionID
point.type_chiro = Null
point.typePoint = COMBO_TypePoint..Valeur
point.milieuPoint = ZR_Milieu.ATT_ID // JE LE MET A LA FIN


J'ai une erreur différente ! Là l'erreur se porte sur les histoires des lieux dits ! La position du remplissage du fichier a donc une incidence sur l'erreur, bizarre (et dont l'erreur de cardinalité qui se pose apparement pour tous mes fichiers "maîtres"

Voilà quelques screens débogage :

Déjà le code du débug :

HRAZ(point); // reset total pour ajout sain

// on prend un cas simple, si on a un pt_precis ou un pt_site

point.deNuit = Null //
point.faune_ecoute = Null //

point.milieuPoint = ZR_Milieu.ATT_ID

HLitRecherchePremier(milieux,ID_milieux,ZR_Milieu.ATT_ID)

Info("Valeur retenu ID milieu par utilisateur :" + ZR_Milieu.ATT_ID,"Correspondance avec le milieu :" + milieux.libelle_long)


point.ID_lieu_dit = COMBO_lieu_dit..Valeur
point.libelle_perso = SAI_Libellé..Valeur
point.nom_Machine = genereNomMachine()
point.session_ID = gnSessionID
point.type_chiro = Null
point.typePoint = COMBO_TypePoint..Valeur



Donc le résultat à l'exécution :


http://img4.hostingpics.net/pics/968685Screenshot20170312001017.png


Et le fichier des milieux :


http://img4.hostingpics.net/pics/819123map.png
Membre enregistré
12 messages
Posté le 15 mars 2017 - 22:31
Bonjour à tous,
Je viens de trouver l'erreur dans le code, je poste ma solution au cas où il y aurai des gens dans mon cas ...

lors de la création du point :

HRAZ(point); // reset total pour ajout sain

// on prend un cas simple, si on a un pt_precis ou un pt_site

point.deNuit = 0
point.faune_ecoute =0
point.milieuPoint = ZR_Milieu.ATT_ID
point.ID_lieu_dit = COMBO_lieu_dit..Valeur
point.libelle_perso = SAI_Libellé..Valeur
point.nom_Machine = genereNomMachine()
point.session_ID = gnSessionID
point.type_chiro = Null
point.typePoint = COMBO_TypePoint..Valeur


J'invoque une fonction "genereNomMachine()" qui à l'intérieur ... manipulait un fichier point aussi !

Du coup mon fichier "point" dans le code au dessus avait complètement changé juste après l'exécution de cette fonction, car le contexte HFSQL est le même !!

Comme dans mon code je testai sans aucun point auparavant, tout se réinitialisait en fait, ce qui expliquait qu'il trouvait pas les clés étrangères ...

Merci à ceux qui ont voulu m'aider quand même !
Membre enregistré
129 messages
Popularité : +5 (5 votes)
Posté le 16 mars 2017 - 04:38
Merci de ton retour,
car réfléchir aux "bugs" des autres est toujours formateur.

--
Cdlt
JPhD