|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
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);
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
SI COMBO_TypePoint..Valeur = 2 ALORS point.faune_ecoute = COMBO_FauneEcoute..Valeur;
SI COMBO_FauneEcoute..Valeur = 1 ALORS point.deNuit = INT_nuit..Valeur; point.type_chiro = COMBO_TypeChiro; FIN FIN
SI HAjoute(point,hVérifieIntégrité) = Faux ALORS 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);
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
SI COMBO_TypePoint..Valeur = 2 ALORS c'est pour les points d'écoute, alors il faut agir en conséquence point.faune_ecoute = COMBO_FauneEcoute..Valeur;
SI COMBO_FauneEcoute..Valeur = 1 ALORS des chiros ... point.deNuit = INT_nuit..Valeur; point.type_chiro = COMBO_TypeChiro; FIN
FIN
SI HAjoute(point,hVérifieIntégrité) = Faux ALORS 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 JPhDMessage 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);
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
ou ce code là :
HRAZ(point);
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
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);
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);
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 |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|