Les table père fils et sql [Résolu]

coeurblanc1351 - 28 juin 2013 à 02:44 - Dernière réponse :  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
Afficher la suite 

Votre réponse

3 réponses

Meilleure réponse
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 28 juin 2013 à 10:18
3
Merci
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...

Merci sp40 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 102 internautes ce mois-ci

Commenter la réponse de sp40
coeurblanc1351 - 28 juin 2013 à 23:47
0
Merci
salut

merci, ça donne une resultat 10/10
Commenter la réponse de coeurblanc1351
coeurblanc1351 - 29 juin 2013 à 01:01
0
Merci
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
Commenter la réponse de coeurblanc1351

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.