Quickreport, lier 3 tables, comment ?

vegeta_356 Messages postés 3 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 3 mai 2005 - 27 avril 2005 à 20:13
vegeta_356 Messages postés 3 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 3 mai 2005 - 3 mai 2005 à 17:03
Bonjour !



Mon programme est celui d'une gestion de patients et des vaccins qu'ils
ont eu. La base de données comporte 3 tables: PATIENTS,
VACCINS_PATIENTS et VACCINS.



La table PATIENTS comporte un numéro généré automatiquement (PAT_NO) et les infos sur le patient.



La table VACCINS_PATIENTS comporte elle aussi un numéro automatique, un
champs pour la date de la vaccination, et deux champs contenant les clé
étrangères de la table PATIENTS et VACCINS (PAT_NO et VAC_NO)



La table VACCINS comporte seulement un numéro, et le nom du vaccin.



J'essaie de créer un rapport avec Quickreport, donnant le nom et prénom
du patient (et autres infos) contenu dans une bande Détail, la date de
vaccination et le nom du vaccin correspondant dans la SubDetail. Il y a
3 objets IBTable et un datasource pour lier les tables.



Bon, et maintenant, mon problème:



Quand j'essaie de lier la table VACCINS aux autres, je peux pas car
elle est référencé au datasource, qui lui est référencé à la table
PATIENTS (IBTable1). Donc, je ne peux pas afficher le nom du vaccin
correspondant à la date de vaccination, et au patient. J'aimerais
savoir si c'est possible de régler ce problème là, ou que c'est
impossible avec QuickReport.




Delphi 6


BD: Interbase



Désolé pour le message un peu long

4 réponses

ada_azoul Messages postés 22 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 8 juin 2005
28 avril 2005 à 09:47
Normalement vous vous travaillez avec Tquery
lieaison avec join lift ,right ou full
ensuite entreprendre un appelle dans ta qreport par uses
ensuite dépot des expression qreport

mais auparavant tu dois mettre (PAT_NO) dans les autres tables

par insertion

CAD
table PATIENTS,
(PAT_NO)

nom
etc...

table VACCINS_PATIENTS ,
(PAT_NO)

vaccin
etc...

table VACCINS_PATIENTS ,
(PAT_NO)

autre
etc...

la liaison s'effectura par (PAT_NO)

salut
ADA
0
vegeta_356 Messages postés 3 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 3 mai 2005
28 avril 2005 à 17:12
Merci pour la réponse, mais bon... ça ne m'a pas dépanné pour ce problème, car de la façon dont la BD est monté, je ne peux pas ajouter un champs PAT_NO dans la table vaccins.



Mais suite à ta réponse, j'ai encore continuer et j'ai trouvé une alternative.



J'ai créé un deuxième datasource. Celui-ci pointe maintenant sur
l'objet IBTable de la table VACCINS_PATIENTS. Ensuite, j'ai fais
pointer mon IBTable de la table VACCINS sur le datasource nouvellement
créé et j'ai ajouté la contrainte du no (Propriété Masterfields).



Jme demande pq je n'y ai pas pensé avant...



Mais j'aimerais bien que tu m'éclaires sur ta méthode ad_azoul, j'ai pas tout compris de la première partie de ton message:



Normalement vous vous travaillez avec Tquery
lieaison avec join lift ,right ou full
ensuite entreprendre un appelle dans ta qreport par uses
ensuite dépot des expression qreport
0
ada_azoul Messages postés 22 Date d'inscription samedi 31 juillet 2004 Statut Membre Dernière intervention 8 juin 2005
30 avril 2005 à 09:33
voici qlq chose en ce sens

//==================================
try
IBQuery_QREPORT.Close; // tu peux changer le nom de ton Query TABLE.Close; idem pour les autres
IBQuery_QREPORT.SQL.Clear;
IBQuery_QREPORT.SQL.Add(' select * from "'+table_PATIENT+'" TBPAT'+
' left OUTER JOIN "'+table_VACCIN+'" TB_VAC '+
' on (TBPAT.NUMERO=TB_VAC.NUMERO) '+
' left OUTER JOIN "'+table_AUTRE+'" TB_ATR '+
' on (TBPAT.NUMERO=ID_RG.NUMERO) '+'
' ORDER BY TBPAT.nom_pat '); // tri sur le nom ascendant exple


si tu ajoute un where voici le bloc
//======== debut bloc


' left OUTER JOIN "'+table_AUTRE+'" TB_ATR '+
' on (TBPAT.NUMERO=ID_RG.NUMERO) '+
' where TBPAT.NUMERO = '''+MON_NUMERO+''' '+
' ORDER BY TBPAT.nom_pat '); // tri sur le nom ascendant exple
//============ fin bloc



if not IBQuery_QREPORT.Prepared then
IBQuery_QREPORT.Prepare;
IBQuery_QREPORT.Open;
except
end;


//=============================



sinon il faut faire fontionner la table par un DataSource
de la table maitresse IBQuery_QREPORT.DataSource:=DS_VACCIN;



dans ces condition il faudrai aussi un autre TIBquery pour la 3eme table
tu pourrait aussi faire ça dans l'inspecteur d'objet directement



try
IBQuery_QREPORT.DataSource:=DS_VACCIN;
IBQuery_QREPORT.Close;
IBQuery_QREPORT.SQL.Clear;
IBQuery_QREPORT.SQL.Add(' SELECT * from "'+table_PATIENT+'" TBPAT'+
' left OUTER JOIN "'+table_VACCIN+'" TB_VAC '+
' on (NUMERO=TB_VAC.NUMERO) '+
' Where TBPAT.NUMERO = :NUMERO '+
' ORDER BY TBPAT.nom_pat ');
if not IBQuery_QREPORT.Prepared then
IBQuery_QREPORT.Prepare;
IBQuery_QREPORT.Open;
except
end;


//================ toute fois toi seul qui connait les combinaisons exactes


Bn Prog

ADA
0
vegeta_356 Messages postés 3 Date d'inscription mardi 24 août 2004 Statut Membre Dernière intervention 3 mai 2005
3 mai 2005 à 17:03
Ok, mais ce code, c'est où tu l'insères, dans l'événement On Preview? ailleurs?



J'ai essayé de mettre en application cette méthode via seulement
l'inspecteur d'objet pour voir, mais on dirait qu'il y a seulement un
problème. Le query ne change pas d'enregistrement une fois terminé, il
fais seulement répété la première de sa liste en continu...



J'ai aussi essayé de mettre des objets IBTable, pour que le table
change les enregistrements, et je les ai relié par un datasource aux
querys, mais aucun succès.



Merci bcp pour ton aide, c'est très apprécié !
0
Rejoignez-nous