Adoquery comment l'utiliser lier 04 tables

cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013 - 2 janv. 2013 à 21:50
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013 - 15 janv. 2013 à 09:41
Bonsoir c'est mon premier message dans votre forum, merci de m'ouvrir votre site.
ma question svp c'est comment utiliser dans delphi 2010 base donnée access 2007, composant Adoquery (liaison de trois tables].
merci pour votre aide.
NB: Bonne année mes meilleurs vœux de bonheur à toute l'humanité.

30 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
3 janv. 2013 à 09:15
Bonjour,

"Utiliser" : Que veux tu faire exactement ?
"AdoQuery (liaison de trois tables)" : une requête SQL avec des jointures...

Donne un peu plus de détails pour une aide un peu plus précise.

Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
5 janv. 2013 à 14:11
Bonjour, en fait j'ai 04 tables sous access 2007
1- table concessionnaires clé : Id_Conc
2- table marque-----------clé : Codmarq
3- table infrastructure --clé : Id_Infras
4 table concédants -------clé : Id_Conced
voilà mes 04 tables, donc je souhaiterais quand je clique sur un concessionnaire donné il doit m'afficher les informations des 04 tables en fait.
j'utilise delphi 2010 base données access 2007 ado
merci pour votre aide.
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
5 janv. 2013 à 18:18
Bonsoir,
je sais que personne ne va répondre à ma question...???
j'ai retrouvé la même question qui date depuis très longtemps et que personne n'a pu répondre à cette question.
la plupart du temps les gens c-a-d vous, vous vous êtes porté volontaires à aider les gens qui ne sont pas forcément des informaticiens, sur des forums publics. mais pour des questions pertinentes c'est les sois disant manque de précisions etc...???
maintenant si vraiment y a des problèmes faites payer les gents.
je pose ma question sur adoquery comment lier 04 tables : réponse: ce n'est pas ado qui lie les tables c'est sql. y a problèmes à cela??? enfin.
sans rancunes
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
6 janv. 2013 à 07:33
Hé ho garçon ! Pourquoi cet énervement ?
Je t'ai dit que je voulais bien t'aider mais que j'avais besoin de plus d'infos... Je regarde ça des que possible et te repondrai dès que possible.

Bonne année et à bientôt !

Simon
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 janv. 2013 à 10:05
Bonjour,

Avant tout, une petite remarque : Il vaut mieux éviter les caractères accentués (les caractères spéciaux en général) dans les noms de tables, ça peut te poser des problèmes à l'utilisation (requêtes, delphi...).
Pour sélectionner les données des 4 tables, il faudrait savoir quelles sont les relations entre ces tables, c'est à dire quels sont les champs que l'on retrouve dans l'une et l'autre de ces tables.
Une fois que ces liaisons sont définies, tu fais une requête avec jointures sur tes tables que tu mets dans la propriété SQL de ton AdoQuery.

La requête va être de la forme :

Select concessionnaires.[Champ1], concessionnaires.[Champ2], ..., marque.[Champ1], marque.[Champ2], ..., infrastructure.[Champ1], infrastructure.[Champ2], ..., concedants.[Champ1], concedants.[Champ2], ...
From concessionnaire [inner ou left ou right, ça dépend de ce que tu veux faire] join marque on concessionnaire.[Champ de liaison] = marque.[Champ de liaison]
[inner ou left ou right] join infrastructure on on concessionnaire.[Champ de liaison] = infrastructure.[Champ de liaison]
...
Where concessionnaire.Id_Conc = [Valeur sélectionnée]

(Les informations entre crochets sont à remplacer par les vraies données)

Tu lies le AdoQuery à ton AdoConnection (correctement configurée). Puis sur ta fiche, tu poses un TDbGrid, un TDataSource. Tu lies le DBGrid au Datasource, et le datasource à l'AdoQuery. Si tu actives ton AdoQuery, tu dois voir les données apparaître dans ton dbGrid.

Pour la requête, je veux bien t'aider un peu plus, mais il faut me donner la description complète de tes tables avec les liaisons.

Voilà, j'espère que ça te permettra d'avancer un peu. Hésites pas à demander si je n'ai pas été très clair...


Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
8 janv. 2013 à 15:01
Merci pour votre réponse c'est gentil.
je m'excuse pour la dernière fois, sincèrement.
En fait ce que je souhaiterais connaitre c'est comment faire afficher dans 03 Dbgrid différentes les différents données : je m'explique.
j'ai un champ société [table concessionnaire], quand une société est sélectionnée alors les 03 Dbgrids réagissent en même temps
1ère Dbgrid m'affiche les marques
2ème Dbgrid m'affiche les différents concédants
3ème Dbgrid m'affiche les infrastructures.

donc toutes ces Dbgrids liées au champ société.
voilà
PARDON
Merci pour votre aide.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 janv. 2013 à 16:13
Pas de problèmes, mais tu sais on est tous un peu occupé, les réponses ne viennent pas forcément dans la seconde...

Peut être que le plus simple dans ton cas est d'utiliser des TAdoTable au lieu des TAdoQuery.
Dans l'inspecteur d'objet, tu renseigne la propriété Connection de ton AdoTable. Tu passes la propriété Filtered à true. (Tu rattaches comme un adoquery l'adotable à un datasource, puis à un dbgrid). Ensuite quand tu sélectionnes une société, tu appliques un filtre sur chacune des tables : Adotable.filter :'Societe '''+ [Nom de la société] +'''';
Ça devrait faire ce que tu veux. Attention, le DBGrid te permet de mettre à jour ta table par défaut. Si tu veux empêcher la modification, passe la propriété Options>goEditing à false.

Si tu veux absolument utiliser des AdoQuery, utilise une requête paramétrée pour chacune de tes trois tables (propriété SQL du composant) :
Select * from Marques
Where Societe = :Nom_Societe
Et quand tu sélectionnes une société, tu codes : ADOQuery1.Parameters.ParamByName('Nom_Societe').Value := [Nom de la société]

Dis moi si tu t'en sors...



Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
8 janv. 2013 à 21:29
Bonsoir
Merci pour l'orientation.
s'agissant de ta suggestion pour l'utilisation des TAdotables, pour les besoins de l'application je dois utiliser TAdoquery.
merci pour le tout, la question reste ouverte.
merci encore
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 janv. 2013 à 23:17
Dans ce cas, utilises des requêtes paramétrées comme je t'ai expliqué. Dis moi si je dois mieux t'expliquer


Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
9 janv. 2013 à 13:18
Bonsoir
merci pour l’intérêt que vous accordé à mon problème.
oui svp quelques orientations dans la mesure du possible.
merci

je suis coincé.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
9 janv. 2013 à 15:20
On va faire par étape :

Sur la palette des composants, tu as les onglets suivants ou tu trouveras les composants dont on a besoin :
- ADO :
* ADOConnection
* ADOQuery
- AccèsBD :
* DataSource
- Contrôle BD :
* DBGrid

D'abord, la connexion à ta base de données :
Il faut que tu poses (on peut se tutoyer, hein ?) un ADOConnection
- clic droit sur le composant, et choisis "Modifier la chaine de connexion".
- Choisis "Utiliser la chaine de connexion" et cliques sur "Construire".
- Tu dois arriver à une fenetre "Propriétés des liaisons de données". Dans la liste, choisis "Microsoft OLE DB Provider for ODBC Driver" et clique sur "Suivant".
- Dans le menu déroulant "Utiliser le nom de la source de donnée", choisis la tienne. (si elle n'apparait pas, il faut que tu la configure dans tes sources de données ODBC. Là, je ne peux pas t'aider, je risque de te dire des bêtises, mais tu trouveras sûrement ton bonheur sur internet). Renseigne le nom d'utilisateur et le mot de passe et teste ta connexion.
- Une fois que tu as fait tout ça, dans l'inspecteur d'objet, passes le connected à true. Si ça ne marche pas, donne moi le message d'erreur rencontré.

Ensuite la table des concessionnaires :
- Pose un ADOQuery sur ta form.
- Dans l'inspecteur d'objet, affecte la Connection au composant ADOConnection précédemment posé.
- Toujours dans l'inspecteur d'objet, modifie la propriété "SQL", en y mettant :
Select * from Concessionnaire
- Essaie de connecter ton ADOQuery en modifiant dans l'inspecteur d'objet sa propriété Active à "True". Si ça ne marche pas, donne moi le message d'erreur rencontré.

- Pose un DataSource
Dans sa propriété DataSet, choisis l'ADOQuery.

- Pose un DBGrid
Dans sa propriété DataSource, choisis le datasource que tu viens de poser, normalement, les données doivent s'afficher dans la grille.

Tu arrives jusqu'ici ?



Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
9 janv. 2013 à 17:58
Bonsoir
merci pour ce que tu fais là, je suis ému sincèrement, je ne trouve pas les mots pour te remercier pour le tout. ( mais il faut bien qu'on se tutoie )
s'agissant de mon problème, pour être sincère ODBC jamais configuré, simple question
est ce que c'est possible d'utiliser Microsoft.Jet.OLEDB.4.0 pour la liaison ?, si c'est possible c'est bon jusque là...??? à défaut un peu de lecture et j'arriverais à configurer ODBC.
merci encore pour le tout.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
9 janv. 2013 à 18:36
Je suis vraiment désolé mais je n'y connais pas grand chose en ODBC. J'ai eu l'occasion de bosser dessus pour Hyperfile (base de donnée windev), mais c'est tout. En général j'utilise plutôt Firebird qui s'attaque directement sous Delphi. Essaie de voir sur le net, il doit bien y avoir des tutos pour créer un lien odbc pour access...

Essaie de faire marcher la connexion et reviens vers moi si tu as besoin.

Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
9 janv. 2013 à 19:24
Bonsoir
merci encore
problème réglé, la dbgrid m'affiche le tout c-à-d la connexion s'est faite normalement.
merci
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
10 janv. 2013 à 09:15
Cool !
Et pour les trois autres tables ? Tu y es arrivé ?

Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
10 janv. 2013 à 10:09
Bonjour
c'est toujours moi, désolé.
Oui c'est fais, les 03 dbgrids affichent les données des tables respectives.
Maintenant reste les jointures entre tables
merci pour le tout.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
10 janv. 2013 à 10:45
Pour les jointures, il faut que tu utilises des requêtes paramétrées pour tes trois sous tables (marques, infrastructure et concedants).

Par exemple pour marques :
dans le AdoQuery, dans la propriété SQL, mets la requête suivante :
[b]Select * from Marques
Where Societe = :Nom_Societe/b

Ensuite, prends ton datasource "Sociétés" (celui qui fait le lien entre ton AdoQuery société et ton tdbgrid société). Dans l'inspecteur d'objet, va sur l'onglet "Evénements". Là tu vas trouver l'événement "OnDataChange" qui correspond au changement d'enregistrement. Double clic dessus, delphi te prépare la procedure. Dans cette procédure, tu n'as plus qu'à valoriser le paramètre de ton AdoQuery_Marques en codant :

AdoQuery_Marques.Active := False;
AdoQuery_Marques.Parameters.ParamByName('Nom_Societe').Value := [Nom de la société] 
AdoQuery_Marques.Active := True;



Simon
0
cs_massi Messages postés 28 Date d'inscription mardi 18 mars 2003 Statut Membre Dernière intervention 31 janvier 2013
10 janv. 2013 à 17:29
Bonsoir
c'est toujours moi,
merci pour le tout.
en fait y a des choses qui m'échappent:
Select * from Marques ----> OK
Where Societe :Nom_Societe -----> Where societe c'est l'index [Clé]?
:Nom_Societe ? c'est le nom du champ ?
là il m'affiche un message d'erreur suivant au moment ou adoquery_marques est activé:
Objet parameter défini de manière incorrect, des informations incohérents ou incomplètes ont été fournies

merci et pardon.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
10 janv. 2013 à 18:08
C'est pas la peine de t'excuser...

Alors dans le :

Select * from marques
Where Societe = :Nom_Societe

Le premier Societe correspond au nom du champ de la table marques qui te permet de faire la liaison avec la clé de la table des concessionnaires.

Le :Nom_Societe est un paramètre SQL. On aurait pu l'appeler comme on veut. Le tout c'est que quand tu le valorise par
AdoQuery_Marques.Parameters.ParamByName('Nom_Societe').Value := [Nom de la société], tu gardes le même nom.

->> Plus simple !
Si tu n'y arrives pas avec les requêtes paramétrées, utilises le filtre.
Tu passes la propriété filtered de tes adoquery à True. Et sur le OnDataChange de ton DataSource de ta table des sociétés, tu codes :
ADOQuery_Marques.Filter :  'Societe '''+ ADOQuery_Concessionnaire.Fields[x].AsString + '''';
if ADOQuery_Marques.Active 
   then ADOQuery_Marques.Refresh
else ADOQuery_Marques.Active := True;


Avec le x qui est le numéro de ton champ clé dans la table concessionnaire (celui qui fait le lien avec les autres tables). Attention, on commence à compter à partir de 0 et non de 1...

Allez ! Tu vas y arriver !!!

Simon
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
10 janv. 2013 à 18:11
J'ai oublié de te dire. Si tu utilises les filtres, tu n'as plus besoin des requêtes paramétrées. Dans tes trois ADOQuery (Marques, etc...) tu ne mets qu'un

select * from marques (par exemple pour marques)

Simon
0
Rejoignez-nous