Pardon, dans une base de donnée Paradox, dans outils>module base de données ( j'ai fait ça en lisant un tutoriel sur ce site )
Version imprimable
Pardon, dans une base de donnée Paradox, dans outils>module base de données ( j'ai fait ça en lisant un tutoriel sur ce site )
Bon, en // j'ai installé le composant Query, donc on peut essayer de faire la requête SQL que je mets dans "SQL".
Comment je peux faire pour stocker le résultat de la requête pour l'afficher dans un autre DBGrid... ( pour mettre les résultats dans un autre DBgrid j'entends ).
Salut,
pour cela, il suffit que dans la propriété DataSource de ton nouveau TDBGrid tu indique de TDataSource que tu utilise pour ta connexion à la base de données, ensuite tu fait de même dans ton TQuery et dès que tu vas exécuter une requête dans ton TQuery, ton TDBGrid va se mettre à jour.
Ok , je pense avoir compris ce que tu veux dire, je vais essayer ça. Par contre j'ai déjà des difficultés à lancer une requête pour faire un tri ( http://www.developpez.net/forums/d24...trier-bdd-dbf/ ). Donc je vais attendre que ceci marche avant de me lancer dans la recherche.
Si tu vois quelque chose, hésite pas à me le dire.
Alors là il n'y a rien de plus simple. Par exemple si tu utilises DBE, il suffit de placer un composant TQuery. Il possède une propriété SQL qui est en fait une stringlist qu'il suffit de remplir avec les instruction SQL.
On peut aussi le faire en code par exemple dans ton cas ça donnerais ça
Je comprend ça mais personnellement j'ai abandonné cette méthode depuis longtemps les requêtes SQL sont plus efficaces et très puissantes.Code:
1
2
3
4
5
6
7 QRech = new TQuery(NULLl); QRech->SQL->Clear; QRech->SQL->Add("SELECT * FROM LaTable"); sprintf(st,"WHERE Client=%s OR Produit=%s",Edit1->Text,Edit1->Text); QRech->SQL->Add(S); QRech->Open;
Merci pour ta réponse...
En fait ça marche pas.
J'ai mis le composant TQuery sur mon TForm et je l'ai "lié" à mon DataSource ( qui s'appelle chez moi DateSource1 ). Je l'ai activé après avoir mi la requête SQL qu'il y a plus haut dans ce topic ... et j'ai déclenché l'exécution de la requête quand j'appuies sur un bouton : ça donne ça :
Je suis pas trop un expers en SQL, je connais que les bases mais il doit manquer quelque chose là non ? Que manque-t-il?Code:
1
2
3
4 void __fastcall TForm1::Button2Click(TObject *Sender) { Query1->Open(); }
Pour info, j'ai lié mon composant Query1 au même composant DataSource que j'ai utilisé pour ma table...
Faut pas en créer un autre non ?
Je suis un peu dans le brouillard là ...
Maintenant il faut récupérer le résultat de la requête. En fait il faut considérer la requête comme une table et la lire en la parcourant.
Petit exemple où je met les produits trouvé dans une listbox
Le DataSource du query n'est pas indispensable. Il ne va servir que si on veut accéder au résultat de la requête avec un composant comme un DBGrid.Code:
1
2
3
4
5
6
7
8 Query1->Open(); while(!Query->Eof) { S=Query1->FieldValue["Produit"]; ListBox1->Items->Add(S); Query1->Next(); }
Il existe de très bon tutoriel en Delphi la conversion vers le C est simple.
Merci à toi
Par contre,dans:
C'est quoi "S", et FieldValue sert à quoi ?Code:S=Query1->FieldValue["Produit"];
S est une chaine de caractère ( ça aurait pu être un entier si le champs produit avait été un entier)
FieldValue permet de récupérer (ou de modifier) la valeur d'un champs d'une table (ou d'une requète)
La valeur entre "" est le nom du champs.
avec ce code:
j'ai l'erreur :[C++ Erreur] Unit1.cpp(70): E2034 Impossible de convertir 'Variant' en 'char *'Code:
1
2
3
4
5
6
7
8
9
10 void __fastcall TForm1::Button2Click(TObject *Sender) { char* S; Query1->Open(); while(!Query1->Eof) { S=Query1->FieldValues["Produit"]; ListBox1->Items->Add(S); Query1->Next(); }
Salut,
il suffit que tu appelle la méthode de conversion du Variant, ici pour un AnsiString par exempleCode:
1
2
3
4
5
6
7
8
9
10 void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString S; Query1->Open(); while(!Query1->Eof) { S=Query1->FieldValues["Produit"].AnsiString(); ListBox1->Items->Add(S); Query1->Next(); }
J'ai toujours une erreur: [C++ Erreur] Unit1.cpp(70): E2316 'AnsiString' n'est pas un membre de 'Variant'. Bizarre.........
Exuse moi, voici le bon code :Code:
1
2
3
4
5
6
7
8
9
10 void __fastcall TForm1::Button2Click(TObject *Sender) { AnsiString S; Query1->Open(); while(!Query1->Eof) { S=AnsiString(Query1->FieldValues["Produit"]); ListBox1->Items->Add(S); Query1->Next(); }
Hum, j'insère des valeurs dans la table de donnée ( paradox ) comme ça par exemple:
ça commence à me casser les c****** ce trucCode:
1
2
3
4 Form1->Table1->FieldByName("Client")->Value=Edit1->Text; Form1->Table1->FieldByName("Produit")->Value=ComboBox1->Text; Form1->Table1->FieldByName("Expiration")->Value=Edit3->Text; Form1->Table1->FieldByName("Clef")->Value=Edit2->Text;
OK, j'avais pas vu ta modification pottiez, bon la compilation marche là.
Je devrais y arriver d'ici une semaine pf...
En attendant, quand je clique sur le bouton qui est censé afficher dans la ListBox1 j'ai
" le projet a provoqué une classe d'exception EVariantTypeCastError avec le message Impossible de convertir le variant de type(Null) en type(string).... ect
Ah mais ça c'est le coup classique de la chaine vide ou NULL. Il faut savoir que dans les base de donnée le champs d'un table peut avoir une valeur spécifique qui est NULL. Sauf erreur de ma part ça été fait pour permettre que certains champs d'une table ne soit pas renseignés.
Dans ces conditions il faut ajouter un petit test qui vérifie que le FieldValue n'est pas NULL avant de le passer à la chaine S.
Allez courage :) ça va se faire personnellement j'ai aussi pas mal galéré avant d'y arriver :cry:
J'ai testé pour if, mais j'ai pas trouvé, ça marchait toujours pas ... peux tu me l'écrire que je compare ?
En revanche:
J'ai essayé autre chose qui semble marcher:
Code:
1
2
3
4
5
6 Query1->Open(); while(!Query1->Eof) { ListBox1->Items->Add(Query1->FieldByName("Client")->AsString); Query1->Next(); }
Avec pour requête SQL:
Ici ,je cherche à tout sélectionner dans ma table "NouveauTest" et trier tout par ordre alphabetique dans la champ "Client". ( mais les autres champs doivent suivrent )Code:SELECT * FROM NouveauTest ORDER BY Client;
Problème:
J'ai que le premier champ de la ligne qui s'affiche
Par exemple : la ligne numéro 1 par ordre alphabetique est :
ARTHUR WORD 20/09/85 ECDFHGK
J'ai que "Arthur" qui s'affiche
Il faut lire aussi les autres champs.
Veut dire sélectionne tous les champs de la table NouveauTest et ordonne chaque ligne en fonction du champs clientCode:SELECT * FROM NouveauTest ORDER BY Client
ne permet d'accéder qu'au champs Client de ta requête.Code:Query1->FieldByName("Client")
Pour accéder aux autres champs (comme le champs produit par exemple) il faut ajouter.
ce qui donneraisCode:Query1->FieldByName("Produit")
Pour avoir comme résultatCode:
1
2
3
4
5
6
7
8
9
10
11 AnsiString S; Query1->Open(); while(!Query1->Eof) { //S est utilisée pour clarifier le code S=Query1->FieldByName("Client")->AsString; S+=" "+Query1->FieldByName("Produit")->AsString; ListBox1->Items->Add(S); Query1->Next(); }
Arthur Word