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

Delphi Discussion :

Résultat de Query de 2 Query dans un DBGrid


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Par défaut Résultat de Query de 2 Query dans un DBGrid
    Salut à tous et merci aux membres du forum pour toute l'aide qu'ils nous apportent dans nos problèmes.
    Voilà. J'ai le résultat d'une requête et l'autre d'une table : ils sont identiques sur les champs, sauf les deux champs du montant. Le but de cela c'est de trouver la différence dans un champ nommé Écart.

    Comment faire pour rassembler les 2 (résultat de la requête 'Oracle' et le résultat de la table 'Access') dans un seule DBGrid ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Bonjour
    Citation Envoyé par masterdash Voir le message
    Salut à tous et merci aux membres du forum pour toutes l'aide qui nous apporte dans nos problèmes.
    c'est gentil mais encore faudrait-il que le problème soit expliqué correctement
    comment faire pour rassembles les deux (résultat de la requête 'Oracle' et le résultat de la table 'Access') dans un seule DBGrid
    Quel composants de connexion ? car, pour donner un exemple Firedac permet un LocalSQL donc des requêtes entre deux bases de données
    Quel version de Delphi tant qu'à donner des explications autant le faire complètement même si "DBGrid" fait obligatoirement référence à du VCL

    Il est très difficile de répondre de manière hypothétique genre Ecart:=table1.FieldByName('montant').asCurrency-table2.FieldByName('montant').asCurrency;
    avez-vous pensé au OnCalcField ?

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Par défaut
    Salut, personne n'a d'ide pour mon problème.

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 706
    Billets dans le blog
    65
    Par défaut
    Tant que vous ne donnez pas plus de précisions ! Je vous ai déjà donné les indications nécessaire à savoir utiliser l'événement OnCalcfield sur une des deux sources de données.

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    TClientDataSet, tu repliques la structure (nommage distinct) des deux DataSet Oracle et ACCESS puis tu recopies les données
    tu connectes un Datasource, et le DbGrid affichera tes données, en espérant que tu es une clé commune entre les deux pour faire la conciliation (normalement le cas puisque tu évoques une structure identique)

    Autre approche, ajoute deux champs calculés sur un dataset qui iront lire leur donnée depuis le second dataset dans OnCalcField, un simple Locate pour la synchronisation
    Un troisième champ, toujours calculé, tu affiche ton écart

    Il y a tellement d'approche possible et tellement trivial quand on connait un peu le fonctionnement du TDataSet

    Mais on peut faire aussi cela en dehors de Delphi avec les Bridges ODBC, depuis ORACLE tu peux accéder à ACCESS : CREATE DATABASE LINK avec Oracle Heterogeneous Services
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Par défaut
    Merci Sergio,
    j'utilise Delphi XE3
    Les composants ODAC pour Oracle ORAQUERY et AdoQuery pour la base Acces.

    le but afficher les 2 tables dans un seul DBGrid pour une comparatif.

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    As-tu étudié les propositions ci-dessus
    soit TClientDataSet avec copie des deux DataSet (30 lignes de codes)
    soit directement dans le TOraQuery champs persistants et champs calculés (un peu d'IDE et 10 lignes de codes)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    Ah encore mieux, considérer l'une des tables comme un thésaurus et faire un lookup, je te laisse ajouter le champ calculé pour la delta entre le champ d'origine et le champ connecté


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    //------------------------------------------------------------------------------
    procedure TDataSetSliteHelper.ConnectDataSet(ADataSet: TDataSet; const AKeyFields: string; const AFieldsNames: array of string);
    var
      I: Integer;
      Field: TField;
      ConnectedField: TField;
    begin
      if Self.Active then
        raise EDatabaseError.Create('The extended DataSet must be close');
     
      // Avant de forcer la création d'un champ lié, il faut créer les champs persistants définis.
      if Self.Fields.Count = 0 then
        raise EDatabaseError.CreateRes(@SErrorMustCreateFieldBeforeAddCalculated);
     
      if not ADataSet.Active then
        raise EDatabaseError.Create('The connected DataSet must be open');
     
      for I := Low(AFieldsNames) to High(AFieldsNames) do
      begin
        Field := ADataSet.FieldByName(AFieldsNames[I]);
        ConnectedField := TFieldClass(Field.ClassType()).Create(Self);
        ConnectedField.FieldName := 'ConnectTo' + AFieldsNames[I];
        ConnectedField.FieldKind := fkLookup;
        ConnectedField.Size := Field.Size;
        ConnectedField.LookupDataSet := ADataSet;
        ConnectedField.LookupKeyFields := AKeyFields;
        ConnectedField.LookupResultField := AFieldsNames[I];
        ConnectedField.KeyFields := AKeyFields;
        ConnectedField.Lookup := True;
        ConnectedField.DataSet := Self;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  9. #9
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 124
    Par défaut
    Pour créer un champ calculé à la volée sans passer par l'IDE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    //------------------------------------------------------------------------------
    function TDataSetSliteHelper.AddCalculatedField(const Name: string; DataType: TFieldType; Size: Integer = 0; Required: Boolean = False): TField;
    begin
      // Avant de forcer la création d'un champ calculé, il faut créer les champs persistants définis.
      if Self.Fields.Count = 0 then
        raise EDatabaseError.CreateRes(@SErrorMustCreateFieldBeforeAddCalculated);
     
      Result := Self.FindField(Name);
      if not Assigned(Result) then
      begin
        Result := DefaultFieldClasses[DataType].Create(Self);
        Result.FieldName := Name;
        Result.Name := Name;
        if Self is TClientDataSet then
          Result.FieldKind := fkInternalCalc
        else
          Result.FieldKind := fkCalculated;
     
        Result.DataSet := Self;
      end;
    end;
    Il faut définir les champs persistants dans l'IDE ou par Code de ton OraQuery1
    Tu peux définir les champs calculés par l'IDE ou par l'appel de OraQuery1.AddCalculatedField('Delta', ftFloat);.

    Ensuite il faut remplir OnCalcFields pour calculer 'Delta' en considérant que tu as déjà connecté le champ 'Value' de ton AdoQuery en utilisant ConnectDataSet


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TZooVCLControlExperimentForm.ClientDataSetCtrlGridCalcFields(DataSet: TDataSet);
    begin
      DataSet.FieldByName('Delta').AsFloat := DataSet.FieldByName('Value').AsFloat - DataSet.FieldByName('ConnectToValue').AsFloat;
    end;
    Comme je le disais, c'est trivial, codé, testé, publié en 40 minutes.
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. $db->query ne marche pas dans tous les cas
    Par bigorre1000 dans le forum Zend_Db
    Réponses: 8
    Dernier message: 22/07/2008, 20h50
  2. Data non present dans ms query mais il est dans la bd
    Par sboffin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/09/2007, 15h44
  3. ClientDataSet, Query, Envoyé les modifications dans la base
    Par bassydiak dans le forum Bases de données
    Réponses: 4
    Dernier message: 31/08/2007, 18h56
  4. Sélection dans un query via case à cocher dans un form
    Par Bernard123 dans le forum Access
    Réponses: 2
    Dernier message: 22/12/2005, 15h49
  5. Écriture dans un DBgrid quand utilise un query comme dataset
    Par dcayou dans le forum Bases de données
    Réponses: 3
    Dernier message: 13/07/2004, 23h22

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