IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[ADO] ADOQuery et Dataset


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut [ADO] ADOQuery et Dataset
    Bonjour,
    N'ayant rien vu dans les recherches et ni dans la FAQ (enfin, j'espère ), je me permets de vous demander a quoi sert la propriété DataSet d'un Query. Enfin, je suppose que cela permet de faire un requete dans une autre requete. Donc, j'aurai aimé savoir: Comment l'utilise t'on ?


    Merci.

  2. #2
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Tu veux dire la propriété DataSource ?

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  3. #3
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    La propriété DataSource de ta Query permet de faire du maitre/détail. Tu rempliras cette propriété avec le DataSource de ta requête maitre.

    A+
    Cyril

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Bloon
    Tu veux dire la propriété DataSource ?

    Bloon
    Oops , oui , c bien DataSource.

    La propriété DataSource de ta Query permet de faire du maitre/détail. Tu rempliras cette propriété avec le DataSource de ta requête maitre
    Donc, on peut faire une requete sur une autre requete , c'est bien ca ?

  5. #5
    Membre habitué
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Points : 185
    Points
    185
    Par défaut
    Re

    Non pas vraiment.
    DataSource: Aide de Delphi
    Spécifie le composant source de données depuis lequel on extrait les valeurs de champ en cours à utiliser pour les paramètres de même nom dans l'instruction SQL de la requête ADO

    Description

    Initialisez DataSource pour renseigner automatiquement les paramètres d'une requête avec la valeur des champs d'un autre ensemble de données.Les paramètres portant le même nom que les champs de l'autre ensemble de données sont remplis avec la valeur des champs.Les paramètres dont le nom n'est pas identique àcelui d'un champ de l'autre ensemble de données ne sont pas initialisés automatiquement et doivent l'être par du code.Si,par exemple,la propriétéSQL de TADOQuery contient l'instruction SQL suivante et si l'ensemble de données désignépar DataSource a un champ CustNo,la valeur de l'enregistrement en cours dans cet autre ensemble de données est utilisée dans le paramètre CustNo.

    SELECT *
    FROM Orders O
    WHERE (O.CustNo =:CustNo)

    DataSource doit désigner un composant TDataSource liéàun autre composant ensemble de données ;elle ne peut pas pointer sur ce composant requête.L'ensemble de données spécifiédans DataSource doit avoir étécréé,rempli et ouvert avant d'essayer de lier les paramètres.Les paramètres sont liés en affectant la valeur true àla propriétéPrepared du composant requête ADO avant d'exécuter la requête.Si l'instruction SQL utilisée par la requête ne contient pas de paramètres ou si tous les paramètres sont liés par l'application en utilisant la propriétéParameters ou la méthode ParamByName,il n'est pas nécessaire d'initialiser DataSource.L'exemple suivant illustre la manière d'affecter ADOQuery1 àla propriétéDataSource de ADOQuery2,de préparer ADOQuery2 et de l'activer*:

    withADOQuery2 do begin
    DataSource :=DataSource1;
    Prepared :=True;
    Open;
    end;
    ADOQuery2->DataSource =DataSource1;
    ADOQuery2->Prepared =true;
    ADOQuery2->Open();

    Si l'instruction SQL de TADOQuery est une requête SELECT,la requête est exécutée en utilisant les nouvelles valeurs de champ àchaque fois que le pointeur d'enregistrement est déplacédans l'autre ensemble de données.Il n'est pas nécessaire d'appeler àchaque fois la méthode Open de TADOQuery.Cela permet d'utiliser la propriétéDataSource pour filtrer dynamiquement l'ensemble d'enregistrements d'une requête,ce qui est utile pour établir une relation maître-détail.Affectez àla propriétéDataSource de la requête détail le composant TDataSource de l'ensemble de données maître.

    Si l'instruction SQL utilise autre chose qu'une requête SELECT (par exemple INSERT ou UPDATE),les paramètres portant le même nom que les champs de l'autre ensemble de données obtiennent également leurs valeurs mais la requête doit être exécutée explicitement chaque fois que le pointeur d'enregistrement est déplacédans l'autre ensemble de données.Par exemple,l'instruction SQL suivante utilise l'instruction INSERT et utilise les paramètres CustNo et CompanyName*:

    INSERT INTO Customer
    (CustNo,Company)
    VALUES (:CustNo,:CompanyName)

    Un autre ensemble de données,ADOQuery1 et DataSource1,a un champ CustNo mais pas de champ CompanyName.Si cet ensemble de données est utilisévia la propriétéDataSource,une valeur doit être affectée par code au paramètre CompanyName.Comme ADOQuery1 contient un champ CustNo et que ADOQuery1 est référencée via la propriétéDataSource,le paramètre CustNo reçoit automatiquement une valeur.

    withADOQuery2 do begin
    DataSource :=DataSource1;
    ParamByName('CompanyName').AsString :=Edit1.Text;
    Prepared :=True;
    ExecSQL;
    end;
    ADOQuery2->DataSource =DataSource1;
    ADOQuery2->ParamByName("CompanyName")->AsString =Edit1->Text;
    ADOQuery2->Prepared =true;
    ADOQuery2->ExecSQL();

    Si l'instruction SQL contient des paramètres portant le même nom que des champs de l'autre ensemble de données,n'affectez pas manuellement de valeur àces paramètres.Toute valeur définie par code,par exemple en utilisant la propriétéParameters ou la méthode ParamByName,est remplacée par les valeurs automatiques.Il faut donner des valeurs par code aux autres paramètres.Ces paramètres ne sont pas affectés par l'initialisation de DataSource.

    DataSource peut être spécifiée àl'exécution ou àla conception en utilisant l'inspecteur d'objet.A la conception,sélectionnez le TDataSource souhaitédans la liste déroulante ou saisissez son nom.
    .

    A+
    Cyril

  6. #6
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    En quelque sorte...Obtenir des détails d'une requête.


    http://delphi.developpez.com/faq/?page=SQL#maitredetail

  7. #7
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    Citation Envoyé par portu
    Donc, on peut faire une requete sur une autre requete , c'est bien ca ?
    Pas du tout :-)

    C'est assez bien expliqué dans l'aide : si ta query est liée à un DataSource, ce DataSource sera utilisé pour renseigner ses paramètres

    Exemple :

    query1 : select ident from client
    et Datasource1.DataSet = query1

    query2 : select * from commandes where client = :IDENT
    et query2.DataSource = Datasource1

    query2 affichera les commandes du client correspondant à l'enregistrement courant dans query1. Si tu changes de client, query2 sera mis à jour automatiquement et affichera les commandes du nouveau client courant dans query1.

    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  8. #8
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Ok, ok , merci les gars. Je comprends mieux.
    Heu par hasard, y a t'il moyen de faire une requete dans une requete (un SELECT bien entendu ) . Par ce que Faire plusieur requete dans une table de 20.000 (voir +) , ca met du temps. Là , je m'amuse a faire des SELECT INTO mais bon, c'est pas tres propre. Faut qu'a chaque fois je DROP la table et donc la db va pas arreter de grossir à grande vitesse (obligé de la compacter souvent).


    Merci pour tout.

  9. #9
    Membre expérimenté
    Avatar de Bloon
    Homme Profil pro
    Consultant Freelance
    Inscrit en
    Avril 2002
    Messages
    467
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant Freelance
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2002
    Messages : 467
    Points : 1 339
    Points
    1 339
    Par défaut
    ça dépend du SGBD. Sous Oracle tu peux imbriquer les SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT *  FROM ...)
    Bloon
    A lire : Les règles du club
    Delphi : La FAQ - Articles

  10. #10
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    Sous SQL serveur également

    select * from .... where valeur in (select * from ....)

    Mais tu as aussi les opérations ensemblistes sur les requêtes UNION, et INTERSECT

    [Select * from....]
    INTERSECT
    [Select * from....]
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  11. #11
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Bloon
    ça dépend du SGBD. Sous Oracle tu peux imbriquer les SELECT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT *  FROM ...)
    Bloon
    Je suis sous Access.

    Cette technique est bonne mais peu être longue dans certains cas.

    Lors d'une édition, je dois faire une requete sur une grosse table (20.000 record +-). A chaque ligne imprimé , je dois recalculer deux soldes. Je peux tres bien le faire en une requete comme tu l'a mentionnée mais pour une question d'optimisation, on peut tres bien utilisé le résultat de la premiere requete pour recalculer tout les soldes.
    Donc, mieux vaut faire une requête sur +- 200 records triées que sur +- 20.000 records non triées.

    Enfin, voilà, j'espère qu'il y a moyen

  12. #12
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Citation Envoyé par portu
    Heu par hasard, y a t'il moyen de faire une requete dans une requete (un SELECT bien entendu
    Tout sur les sous-requêtes :
    http://sqlpro.developpez.com/cours/sqlaz/sousrequetes/

  13. #13
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    1 085
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 085
    Points : 886
    Points
    886
    Par défaut
    Bon un petit exemple pour mieux vous expliquer

    j'ai une table1

    La structure des champs est la suivant

    Date---N°Client---Montant
    A l'impression , la structure est la suivante

    N°Client---Montant Débit---Montant Crédit--Solde débit---Solde Crédit
    Les champs "Montant débit" et "Montant Crédit" se gère par un simple Iif dans la requête

    Les champs "Solde débit" et "Solde crédit" sont la somme des montants dont la date est inférieur à la date courante ou égale .

    Exemple:

    Dans ma table j'ai ceci
    Date--------- N°Client-------Montant
    01/01/2004 * 100 ******** 150,55 €
    02/01/2004 * 100 ******** 520,15 €
    02/01/2004 * 110 ******** -150,03 €
    03/01/2004 * 100 ******** -850,55 €
    04/01/2004 * 110 ******** 370,55 €
    04/01/2004 * 100 ******** -50,55 €
    05/01/2004 * 100 ******** 960,55 €
    Lors de ma première requete, j'ai ca (client 100)
    N°Client---------Montant Débit --------- Montant Crédit
    100 ********* ****NULL**** ******* 150,55 €
    100 ********* ****NULL**** ******* 520,15 €
    100 ********* ****850,55 ** ******* NULL
    100 ********* ****50.55 *** ******* NULL
    100 ********* ****NULL *** ******* 960,55 €
    Mon résultat final sera dans ce style :
    Lors de ma première requete, j'ai ca (client 100)
    N°Client---------Montant Débit -------- Montant Crédit----Sld DB--- Sold CR
    100 ********* ****NULL**** ****** 150,55 €*** ***NULL**** 150.55
    100 ********* ****NULL**** ****** 520,15 €*** ***NULL**** 670.70
    100 ********* ****850,55 ** ****** NULL****** ***850.55** NULL
    100 ********* ****50.55 *** ****** NULL****** ***900.10** NULL
    100 ********* ****NULL *** ****** 960,55 €*** *** NULL *** 1631.25
    Donc, pour récupérer les soldes, je dois bien faire une requete ou une sous requete.

    Le probleme de la sous requete est quelle travaille non pas sur la requete parent mais sur la table donc, elle doit refaire en plus le tri de la requete parent à chaque fois.

    C'est pour ca que c'est plus avantageux en temps de faire une requete sur une requete

    J'espère que je me suis bien fait comprendre

    Merci pour le lien King

Discussions similaires

  1. ADO.NET, Initialisation DataSet
    Par suRem dans le forum C#
    Réponses: 3
    Dernier message: 03/05/2008, 16h59
  2. [ADO.Net][C#/DataSet] Comment différer l'exécution de méthodes ?
    Par L`artiste dans le forum Accès aux données
    Réponses: 4
    Dernier message: 26/04/2006, 16h14
  3. [ADO.Net][C# 1.1]Comment réaliser relation pour 2 Dataset ?
    Par misa dans le forum Accès aux données
    Réponses: 2
    Dernier message: 07/01/2006, 06h55
  4. [ADO.NET] MAJ BDD à partir d'un DataSet d'un DataGrid
    Par bart64 dans le forum Accès aux données
    Réponses: 15
    Dernier message: 20/12/2005, 18h16
  5. [VB.NET] [ADO.NET] Adapter, TableMapping et DataSet xsd
    Par neo.51 dans le forum Accès aux données
    Réponses: 14
    Dernier message: 23/09/2004, 16h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo