Eros2007
Messages postés36Date d'inscriptionmardi 5 septembre 2006StatutMembreDernière intervention16 avril 2023
-
8 janv. 2007 à 11:42
Eros2007
Messages postés36Date d'inscriptionmardi 5 septembre 2006StatutMembreDernière intervention16 avril 2023
-
16 janv. 2007 à 12:31
salut , je debute dans la programmation , j'ai un ptit pbm concernant la création d'un index multiple (expression index) sous dbase , lors de la sauvegarde de la table avec le nouvel index j'ai le message d'erreur " descripteur d'index incorrect"
Eros2007
Messages postés36Date d'inscriptionmardi 5 septembre 2006StatutMembreDernière intervention16 avril 2023 8 janv. 2007 à 19:19
Merci
Thierry je vous remercie pour avoir répondu à ma premiere question sur ce forum.
c'est trés sympa.
comme je l'ai fait dêja savoir , je débute dans la programmation ,et je vient de rencontrer un petit problème.
voila
j'ai 3 table table1 table2 et table3
pour pouvoir enregistrer des donnée:
La table1 renferme l'enregistrement des élèves
La table2 renferme les enregistrements des type de cours
La table3 renferme les seances prises par un éleve pour un type de cours bien defini.
comment faire la relation entre les 3 tables ?
j'ai mis dans la proprieté master source de la table2 datasource1qui est reliée à la table1
cela marche bien.
mais cela se gate quand je fait relier la table3 en mettant sa proprieté master source a datasource2 qui est relier à la table2
cela ne marche pas bien ,j'ai pensé qu'il falai mettre un index multiple (expresion index pour mettre plusieurs champs en index)
dans lequel je choisi les champs( élève+cour+seance) , jobtient une fenetre qui me demande de saisir un (index tag name)
je saisi un nom et je fait OK il accepte ,mais au moment oû j'essai d'enregistrer la table3 avec le nouvel index j'obtient un messge d'erreur <<< descripteur d'index incorrect>>>.
ThWilliam
Messages postés418Date d'inscriptionmardi 3 janvier 2006StatutMembreDernière intervention26 novembre 20134 9 janv. 2007 à 16:09
Salut,
Avec un fichier DBase, un index sur plusieurs champs doit se faire sous la forme : "ELEVE+COURS+SEANCE" , c'est à dire une expression d'index.
Ceci, placé dans la zone expression d'index de l'outil Delphi 'Module Base de données' ne devrait provoquer aucune erreur.
Mais il est impossible avec ce genre d'index d'affecter une relation table maître/détail, puisque il faut faire une relation entre 1 champ de la table maître et 1 champ de la table détail, mais ici nous n'avons pas un "champ" indexé, mais une expression d'index.
Table1 = les élèves : donc 1 seul champ suffit : ELEVE. Index sur ce champ.
Table2 = les cours. Mais comme tu as établi avec succès une relation avec la table1, tu l'as fait sur base du champ Eleve. Donc dans table2, tu as comme enregistrements :
Dupuis/Math, Dupuis/ Histoire, Legrand/Math... Chose que je ne ferais pas : la table2 ne devrait que renseigner les cours, sans s'occuper des élèves (donc un champ Cours + index sur ce champ).
Les tables 1 et 2 servent en fait de codes obligatoires pour le reste : un élève dans la table 3 doit se trouver dans la table1, un cours dans la table3 doit se trouver dans la table2...
Si tu as besoin de connaître les élèves inscrits à tels cours, il te faut une table 3 qui aura comme champs eleve et cours. Si tu l'indexes sur 'eleve', tu pourras établir une relation avec la table1. Si tu l'indexes sur 'cours', tu pourras établir une relation avec la table2.
La table 4 reprend les champs eleve,cours,seance + autres infos. Index sur les 3 premiers champs.
Pas de déclaration de relation avec les autres tables. Les informations obtenues dans le dbgrid lié à cette table seront obtenues par filtre des données. Très simple en utilisant l'événement OnFilterRecord :
procedure TForm1.Table4FilterRecord(DataSet: TDataSet;
var Accept: Boolean);
begin Accept: ((Table4.FieldByName('ELEVE').asString Table3.FieldByName('ELEVE').asString) and
(Table4.FieldByName('COURS').asString = Table3.FieldByName('COURS').asString));
end;
Pour activer le filtre, la propriété Filtered doit être true. Donc, le plus simple, deux boutons:
procedure TForm1.FiltrerBtnClick(Sender: TObject);
begin
Table4.Filtered: = true;
end;
procedure TForm1.SupprimerFiltreBtnClick(Sender: TObject);
begin
Table4.Filtered:= false;
end;
Donc tu te ballades dans le dbgrid lié à la table3, clic sur filtrer et les infos obtenues ne concerneront que l'élève x et le cours y.
Remarque : il y a moyen de coder différemment le filtre pour avoir toutes les séances de tel élève (pour tous les cours) ou toutes les séances de tel cours (pour tous les élèves).
Je ne sais pas si j'ai été très clair. Aussi n'hésite pas...
Eros2007
Messages postés36Date d'inscriptionmardi 5 septembre 2006StatutMembreDernière intervention16 avril 2023 9 janv. 2007 à 19:04
Merci
Thierry
Jevais essayer de déquortiquer votre réponse pour bien comprendre ,et faire un essai ,
je vous dirai le résultat par la suite ,
encore merci ,
A+
Vous n’avez pas trouvé la réponse que vous recherchez ?
Eros2007
Messages postés36Date d'inscriptionmardi 5 septembre 2006StatutMembreDernière intervention16 avril 2023 15 janv. 2007 à 16:58
salut Thierry
j'ai bien décortiquer votre réponse qui m'a vraiment aider ,c'est simple vous m'avez tout simplement (et avec peu de code) mis sur le bon chemin.
encore merci.
pour l'index:
Tout à fait Thiery , l'expression index passe trés bien en rajoutant les + entre chaque index .
*pour mon problème d'enregistrement sur la table3 des séances tout en voulant avoir dans mon dbgrid {qui est lui même relier à la table3(seances)} l'affichage des ( num_eleve , num_cours ,et num_seance ).
*Pour enregitrer les seances d'un (élève N° ..n ), en relation avec un( cours N°..n ), j'ai coder comme suite:
NB: la table2 (cours) c'est une table qui enregistre des numero de cours qui s'ajoutent au fûr et à mesure que l'élève en demande((le type de cours, est comme vous me l'aviez dit, n'intervient pas dans les enregistrements)).
j'ai relier la table2 (cours) à la table1(élève).<<maitre detail>> pour faire le lien entre num_eleve et num_ cours.
et j'ai relier la table3(seances) à la table2(cours).<<maitre detail>> pour afficher les num_cours dand le dbgrid {qui est relier à la table3 }et faire le lien avec les seances..
procedure TForm1.nouvelle_seanceClick(Sender: TObject);
begin
table3.Edit;
table3.Append;
table3.FieldValues['num_seance']:=table3.RecordCount+1;
table3.FieldValues['num_eleve']:=table1.FieldValues['num_eleve']; // pour afficher le num_eleve dans le dbgrid relier à la table3
** donc avec le premier élève tout marche trés bien.
** seulement pour les autres élèves, à chaque fois que je veut donner une nouvelle séance au cour N°n de l'élève N°n cela se gate.
Je pense que cela arrive parceque je ne suis pas encore arriver a lier les trois tables en même temps pour qu'à chaque fois, que je change le num_eleve
il ya changement dans les num_cours et dans les num_seances.
////je sais qu'il ya une solution quelque part certe, mais il va faloir me doter de patience, j'en ai pas mal ,j'espère.
cher Thiery j'espere être un bon élève à ceux qui savent bien aider autrui!!!!!
merci encore .