Les table père fils et sql

Résolu
coeurblanc1351 - 28 juin 2013 à 02:44
 coeurblanc1351 - 29 juin 2013 à 01:01
salut

j une bdd avec 2 table:
1ere (table pere) tcota(num_cota,code_cota,date_cota)avec 'ix_code_cota' index secondaire.
2eme (table fils) tabonne(num_abonne,code_cota, nom_abonne,prenom_abonne,date_naiss...)

j utilisé 2 dbgrid:
1er affiche les cota son data source DScota
2eme affiche liste des abonné son data source DSabonne.
quand je section un enregistrement dans 1er dbgrid me donne tous les abonne conserné de cette cota dans 2eme dbgrid, jusqu’au là tous va bien.
mon souci comment farie un sql pour pour pouvoir afficher les enreg des deux tables sur des dbedit
j utilisé le sql suivant
select *
from tcota, tabonne
where (tabonne.code_cota=tcota.code_cota) and (tabonne.code_cota=:p) avec params de p string
et deux speed bouton pour next et prior
on click du 1er speed buton:
DataModule1.Tabonne.IndexName := 'ix_code_cota';
DataModule1.Tcota.IndexName:= 'ix_code_cota';
Query1.Close;
query2.ParamByName('p').Value :=dbedit1.Text;
//dbedit1 porte le code_cota
query1.Open;
Query1.Prior;
la même chose avec speed buton2 avec: Query1.next;

le résultat de tous ça me donne que deux enregistrements sur les dbedit malgré j des cota porte 20 abonnés

3 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
28 juin 2013 à 10:18
Salut,

Alors, trois petites remarques pour commencer :
1) Renommes tes composants, ton code sera plus lisible... query1, query2, dbedit1... Toi tu vois ce que c'est, mais pas un autre développeur...

2) Intégrité référentielle...
1ere (table pere) tcota(num_cota,code_cota,date_cota)avec 'ix_code_cota' index secondaire.
2eme (table fils) tabonne(num_abonne,code_cota, nom_abonne,prenom_abonne,date_naiss...)

Si la clé primaire de ta table père est num_cota, dans la table fils, j'aurais reporté le champ num_cota plutôt que code_cota. En partant du principe que le num_cota est une clé que l'utilisateur ne voit pas : si l'utilisateur modifie un code_cota dans la table père, tu es obligé de reporter la modification dans la table fils par un update. En revanche, si le num_cota est reporté dans la table fils, et que ton utilisateur change le code_cota dans la table père, cette opération est transparente pour ta base de donnée. Tu vois ce que je veux dire ?

3) Select *
Je te déconseille très fortement l'utilisation du select *. C'est très dangereux. En cas d'évolution de ta base de données, tu peux avoir des surprises... Par exemple, imaginons deux tables : table1(champ11, champ12) et table2(champ21, champ22). Dans ton code, tu fais un "insert into Table1(Champ11, Champ12) select * from table2". Ça marche, nickel, livraison de l'appli au client, client content... Puis, deux ans plus tard, ton client te demande une évolution de la base de donnée, à savoir ajouter un champ "champ23" à table2. Pas de problème, tu fais la modif, et tu testes ton appli. Si tu testes bien, tu vas trouver le bug de ton insert, sinon, ça peut être ton client qui le trouve... Alors que si tu avais codé "insert into Table1(Champ11, Champ12) select Champ21, Champ22 from table2", il n'y aurait eu aucun souci... Au passage, sur un insert, toujours préciser les champs de la table dans laquelle tu insères pour les même raisons...

Sinon, pour répondre à ton problème :
Codes ta requête comme ceci :
select t1.num_cota, t1.code_cota, t1.date_cota, t2.num_abonne, t2.code_cota, t2.nom_abonne, t2.prenom_abonne, t2.date_naiss, ...
from tcota t1 
(left/inner ? voir sur internet l'instruction appropriée) join tabonne t2 on t1.Code_cota = t2.Code_cota
where t2.code_cota = :p_code_cota (Remarque : un nom de paramètre explicite est plus... explicite)


Dans ton code :
(Je pars du principe que ton query1 sélectionne tous les code_cota, et que le dbedit1 affiche le code_cota de ton query1)
DataModule1.Tabonne.IndexName := 'ix_code_cota';
DataModule1.Tcota.IndexName:= 'ix_code_cota';
Query1.Close;
query2.ParamByName('p').Value :=dbedit1.Text; // ici, ton query1 est fermé, dbedit1.Text ne vaut rien, et tu transmets une valeur nulle à ton paramètre
//dbedit1 porte le code_cota
query1.Open;
Query1.Prior; 


Si tu remplaces ça par :
{ Mets ces deux lignes ailleurs, ça ne sert à rien d'affecter l'indexname à chaque fois, fais le une fois pour toute sur le formcreate par exemple
DataModule1.Tabonne.IndexName := 'ix_code_cota'; 
DataModule1.Tcota.IndexName:= 'ix_code_cota';
}
With query2 do begin
     if Active 
then Close;
 ParamByName('p_code_cota').Value := dbedit1.Text;
 Open;
end;


Dis-moi ce que ça donne...
3
coeurblanc1351
28 juin 2013 à 23:47
salut

merci, ça donne une resultat 10/10
0
coeurblanc1351
29 juin 2013 à 01:01
salut

dzl toujour il y a un probleme j ai trouvé que résultat de recherche donne redondance des enregistrement exemple:
- normalement résultat donne 1 enreg mais requette donne 11
- normalement résultat donne 2 enreg mais requette donne 22
- normalement résultat donne 3 enreg mais requette donne 33
veut dire résultat réel * 11
0
Rejoignez-nous