PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Structure base de données
Structure base de données
Débuté par JVE, 17 jan. 2020 15:57 - 11 réponses
Membre enregistré
48 messages
Posté le 17 janvier 2020 - 15:57
Bonjour

J'ai un message d'erreur lors de la mise à jour de la base de données concernant la structure de cette base. Je ne vois ce que je dois changer sur les cardinalités.

Que s'est-il passé ?
Erreur d'intégrité.
Les cardinalités côté clé étrangère (1,1) entre les rubriques <STRUCTURE_PROJET.NumNAF> et <INDICATEUR_BUDGET.NumNAF> ne sont pas respectées.

Code erreur : 70015
Niveau : erreur non fatale
Code erreur WD55 : 15

Dump de l'erreur du module 'wd250hf64.dll' (01F250052j - 25.0.138.0).
Identifiant des informations détaillées (.err) : 70901
Informations de débogage :
IEWDHF=137.5
Module=<WDHF>
Version=<25.0.138.0>
Informations supplémentaires :
EIT_LOGICALTABLENAME : <INDICATEUR_BUDGET>
EIT_ITEMNAME : <NumNAF>
EIT_LINKNAME : <Contrainte_STRUCTURE_PROJET_INDICATEUR_BUDGET>

La base de données a cette structure :





Le code de chargement de ces données (d'après fichier excel) :






Merci pour votre aide
Membre enregistré
2 572 messages
Popularité : +222 (260 votes)
Posté le 17 janvier 2020 - 17:42
Bonjour,

A tout hasard, est-ce que l'enregistrement "SRTUCTURE_PROJET" existe ?

--
Cordialement,

Philippe SAINT-BERTIN
Membre enregistré
355 messages
Popularité : +37 (39 votes)
Posté le 17 janvier 2020 - 19:18
Bonsoir,

Si je ne me trompe pas, la liaison 1,1 sur la table "INDICATEUR_BUDGET" indique que pour ajouter un enregistrement dans la table, il faut qu'il existe préalablement dans la table"STRUCTURE_PROJET" un enregistrement avec la même clé "NumNAF".
En d'autres termes comme le précise la description de la liaison 'Chaque "indicateur_budget" a au moins un "structure_projet"'
Est-ce bien le cas ?

Peut-être à compléter le commentaire que tu as laissé "// Faire test d'intégrité sur ...' par du code ou changer la cardinalité de la liaison.

--
Francis MOREL
http://www.SoftProtect.fr
Posté le 18 janvier 2020 - 10:45
(1-1), tu es sur ?

1-1, ca veut dire DEUX choses :
- pour pouvoir écrire un enreg du premier fichier, il faut que l'enreg du deuxième fichier existe
---ET----
- pour pouvoir écrire un enreg du deuxième fichier, il faut que l'enreg du premier fichier existe

On est donc dans la situation proverbiale de l'oeuf et de la poule... si tu essaye d'écrire en premier dans le premier fichier, tu ne peux pas parceque l'enreg n'existe pas encore dans le deuxième, et vice-versa...

La cardinalité 1-1 est donc à proscrire complètement, vu qu'il est techniquement impossible de créer les 2 enregs en même temps.
Membre enregistré
3 886 messages
Popularité : +227 (347 votes)
Posté le 18 janvier 2020 - 11:17
Francis MOREL a écrit :
changer la cardinalité de la liaison.


Surtout pas, la cardinalité correspond à une règle de gestion, donc à une demande du client, on n'appelle pas cela une contrainte pour rien. C'est le code qui doit s'adapter au MPD, pas le contraire.
Il faut dans ce cas vérifier l'existence du NumNAF concerné avant l'ajout de ton enregistrement, s'il n'existe pas, il faut proposer la création du tuple.

Une solution est la combo basée sur les NumNAF, avec une première ligne <Nouveau NAF>, cela évite à l'utilisateur d'avoir à interagir avec les boîtes de dialogue.

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 18 janvier 2020 - 11:20
Membre enregistré
165 messages
Popularité : +12 (12 votes)
Posté le 19 janvier 2020 - 10:11
Bonjour;

Dans le cas de : FichierPère (0,N) <-----------> (1,1) FichierFils

FichierPère (CléPère, Rub1, Rub2, ......)
FichierFils (CléFils, RubA, RubB, ....., CléPère)

- On ne peut pas AJOUTER un enregistrement dans le FichierFils si la valeur de sa CléPère n'existe pas dans le FichierPère
- On ne peut pas SUPPRIMER un enregistrement dans le FichierPère si la valeur de sa CléPère existe dans le FichierFils

On ne change pas les règles de gestion, il faut les traiter par le CODE, comme l'a évoquer monsieur Voroltinquo.

Bon Dev
Membre enregistré
3 886 messages
Popularité : +227 (347 votes)
Posté le 19 janvier 2020 - 11:04
Argus a écrit :
(1-1), tu es sur ?

1-1, ca veut dire DEUX choses :
- pour pouvoir écrire un enreg du premier fichier, il faut que l'enreg du deuxième fichier existe
---ET----
- pour pouvoir écrire un enreg du deuxième fichier, il faut que l'enreg du premier fichier existe

Ce que tu décrit, c'est une liaison, (1,*)-(1,*)
(*,*)-(1,1) signifie que pour créer un tuple dans la table concernée, il faut que la référence dans l'autre table existe (le 1 de droit) et que ce tuple n'aura pas d'autre référence (le 1 de droite.) C'est une liaison très forte en effet. Elle correspond à une CIF Merise.



C'est par exemple une table Ville qui est reliée à un département. Une Ville ne peut appartenir qu'à un seul département et elle doit être dans un département. Par contre, lorsqu'on décide de la création d'un département il ne comporte aucune ville.

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
48 messages
Posté le 21 janvier 2020 - 14:36
Bonjour
Merci pour vos réponses. Effectivement je suis dans le cas de l'exemple de Voroltinquo (Ville et Département).
Dans tous les cas j'ai aussi du faire une erreur dans mon code d'import (d'après fichier excel). Voir ci dessous :
SELON SEL_FICHIER

CAS 1 //mise à jour STRUCTURE PROJET AVEC LISTE ITEMS
SI OuiNon("Voulez mettre à jour la Liste des Items ?")

POUR i = 2 À xlsNbLigne(MonDocXLS)
SI HLitRecherchePremier(STRUCTURE_PROJET,NumNAF,SansEspace(xlsDonnée(MonDocXLS,i,1,Faux)))=Vrai ALORS
Info("Enregistrement existant")
SINON
HRAZ(STRUCTURE_PROJET)
STRUCTURE_PROJET.NumProjet=SansEspace(xlsDonnée(MonDocXLS,i,1,Faux))
STRUCTURE_PROJET.NumSection=SansEspace(xlsDonnée(MonDocXLS,i,2,Faux))
STRUCTURE_PROJET.NumItem=SansEspace(xlsDonnée(MonDocXLS,i,3,Faux))
STRUCTURE_PROJET.NumNAF=SansEspace(xlsDonnée(MonDocXLS,i,4,Faux))
STRUCTURE_PROJET.Designation=SansEspace(xlsDonnée(MonDocXLS,i,5,Faux))
STRUCTURE_PROJET.Scope=SansEspace(xlsDonnée(MonDocXLS,i,6,Faux))
HAjoute(STRUCTURE_PROJET)
FIN

FIN
Info("Mise à jour terminée.")
ChangeFenêtreSource(CFI_MAJ,FI_LISTE_ITEM)
FIN
CAS 2 // mise à jour DONNEES DELAIS
SI OuiNon("Voulez mettre à jour les délais ?")

POUR i = 2 À xlsNbLigne(MonDocXLS)
//Faire test intégrité sur NumNAF dans STRUCTURE PROJET
//SI HLitRecherchePremier(STRUCTURE_PROJET,NumNAF,SansEspace(xlsDonnée(MonDocXLS,i,1,Faux)))=Faux alors
// Info("Item inexistant")
//SINON
SI HLitRecherchePremier(INDICATEUR_DELAI,NumNAF,SansEspace(xlsDonnée(MonDocXLS,i,1,Faux)))=Vrai ET HLitRecherchePremier(INDICATEUR_DELAI,DateModif,DateDuJour())=Vrai ALORS
Info("Enregistrement existant")
SINON
HRAZ(INDICATEUR_DELAI)
// traitement informations générales
INDICATEUR_DELAI.NumNAF =SansEspace(xlsDonnée(MonDocXLS,i,1,Faux))
INDICATEUR_DELAI.IndiceRev =SansEspace(xlsDonnée(MonDocXLS,i,3,Faux))
INDICATEUR_DELAI.NbBC =Val(xlsDonnée(MonDocXLS,i,4,Faux))
// traitement informations "dates" - pour les dates réelles ce sont les 1ere dates et non la dernière - comment transformer en n° semaine / année
INDICATEUR_DELAI.PrevueBE =ChaîneVersDate(xlsDonnée(MonDocXLS,i,5,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.ReviseeBE =ChaîneVersDate(xlsDonnée(MonDocXLS,i,6,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.ReelleBE =ChaîneVersDate(xlsDonnée(MonDocXLS,i,7,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.PrevueBC =ChaîneVersDate(xlsDonnée(MonDocXLS,i,10,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.ReelleBC =ChaîneVersDate(xlsDonnée(MonDocXLS,i,11,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.PrevueRec =ChaîneVersDate(xlsDonnée(MonDocXLS,i,14,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.ReelleRec =ChaîneVersDate(xlsDonnée(MonDocXLS,i,19,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.PrevueCont =ChaîneVersDate(xlsDonnée(MonDocXLS,i,22,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.ReelleCont =ChaîneVersDate(xlsDonnée(MonDocXLS,i,23,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.PrevueExp =ChaîneVersDate(xlsDonnée(MonDocXLS,i,26,Faux),"jj/mm/aaaa")
INDICATEUR_DELAI.ReelleExp =ChaîneVersDate(xlsDonnée(MonDocXLS,i,27,Faux),"jj/mm/aaaa")
// traitement informations durées avec test numériques
SI EstNumérique(xlsDonnée(MonDocXLS,i,26,Faux))=Vrai ALORS
INDICATEUR_DELAI.JoursBE =Val(xlsDonnée(MonDocXLS,i,31,Faux))
INDICATEUR_DELAI.JoursBC =Val(xlsDonnée(MonDocXLS,i,32,Faux))
INDICATEUR_DELAI.JoursRec =Val(xlsDonnée(MonDocXLS,i,33,Faux))
INDICATEUR_DELAI.JoursCont =Val(xlsDonnée(MonDocXLS,i,34,Faux))
INDICATEUR_DELAI.JoursExp =Val(xlsDonnée(MonDocXLS,i,35,Faux))
FIN
// date de modification correspondant à la date du jour
INDICATEUR_DELAI.DateModif =DateDuJour()
HAjoute(INDICATEUR_DELAI)
FIN
//FIN
FIN

Info("Mise à jour terminée.")
ChangeFenêtreSource(CFI_MAJ,FI_DELAI)
FIN
CAS 3 // mise à jour DONNEES BUDGETS
SI OuiNon("Voulez mettre à jour les Budgets ?")

POUR i = 2 À xlsNbLigne(MonDocXLS)

//Faire test intégrité sur NumNAF dans STRUCTURE PROJET
SI PAS SansEspace(xlsDonnée(MonDocXLS,i,2,Faux))="" ALORS
HRAZ(INDICATEUR_BUDGET)
INDICATEUR_BUDGET.NumNAF =SansEspace(xlsDonnée(MonDocXLS,i,1,Faux))
INDICATEUR_BUDGET.SectionCout =SansEspace(xlsDonnée(MonDocXLS,i,2,Faux))
INDICATEUR_BUDGET.PrixVente =Val(xlsDonnée(MonDocXLS,i,3,Faux))
INDICATEUR_BUDGET.CoutBudget =Val(xlsDonnée(MonDocXLS,i,4,Faux))
INDICATEUR_BUDGET.CoutEngage =Val(xlsDonnée(MonDocXLS,i,5,Faux))
INDICATEUR_BUDGET.CoutRealise =Val(xlsDonnée(MonDocXLS,i,6,Faux))
INDICATEUR_BUDGET.CoutRestant =Val(xlsDonnée(MonDocXLS,i,7,Faux))
INDICATEUR_BUDGET.DateModif =DateDuJour()
HAjoute(INDICATEUR_BUDGET)
FIN
FIN

Info("Mise à jour terminée.")
ChangeFenêtreSource(CFI_MAJ,FI_BUDGET)
FIN
FIN
Membre enregistré
3 886 messages
Popularité : +227 (347 votes)
Posté le 21 janvier 2020 - 15:02
A vue de nez, tu utilises SansEspace, donc tu traites des chaines.
Dans certains cas, cette chaîne est affectée à un numérique (au sens général du terme, pas au sens Windev) donc ce numérique prend la valeur 0. Un petit Val() au niveau des instruction concernées réglerait peut être le problème. C'est ce que tu as fait sur certaines lignes d'ailleurs, mais pas au niveau de NumNAF par exemple qui est décrit comme un numérique

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
355 messages
Popularité : +37 (39 votes)
Posté le 21 janvier 2020 - 15:04
Bonjour ,

Ne serait ce pas plutot
SI HLitRecherchePremier(STRUCTURE_PROJET,NumNAF,SansEspace(xlsDonnée(MonDocXLS,i,4,Faux)))=Vrai ALORS
   Info("Enregistrement existant")
SINON
...

4 au lieu de 1 Pour être conforme a la suite

--
Francis MOREL
http://www.SoftProtect.fr
Membre enregistré
355 messages
Popularité : +37 (39 votes)
Posté le 21 janvier 2020 - 15:20
Non désolé je n'avais pas lu correctement ton code.

--
Francis MOREL
http://www.SoftProtect.fr
Membre enregistré
48 messages
Posté le 21 janvier 2020 - 17:08
Merci le val a résolu mon problème.