|
| Structure base de données |
| Iniciado por JVE, 17,ene. 2020 15:57 - 11 respuestas |
| |
| | | |
|
| |
Miembro registrado 48 mensajes |
|
| Publicado el 17,enero 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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 2.682 mensajes |
|
| Publicado el 17,enero 2020 - 17:42 |
Bonjour,
A tout hasard, est-ce que l'enregistrement "SRTUCTURE_PROJET" existe ?
-- Cordialement,
Philippe SAINT-BERTIN |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 356 mensajes |
|
| Publicado el 17,enero 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 |
| |
| |
| | | |
|
| | |
| |
| Publicado el 18,enero 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. |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.362 mensajes |
|
| Publicado el 18,enero 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 tourneMensaje modificado, 18,enero 2020 - 11:20 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 166 mensajes |
|
| Publicado el 19,enero 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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.362 mensajes |
|
| Publicado el 19,enero 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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 21,enero 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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 4.362 mensajes |
|
| Publicado el 21,enero 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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 356 mensajes |
|
| Publicado el 21,enero 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 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 356 mensajes |
|
| Publicado el 21,enero 2020 - 15:20 |
| |
| |
| | | |
|
| | |
| |
Miembro registrado 48 mensajes |
|
| Publicado el 21,enero 2020 - 17:08 |
| Merci le val a résolu mon problème. |
| |
| |
| | | |
|
| | | | |
| | |
|