Parcourir une table Paradox pour remplir des champs.. - Delphi/Pascal - Programmation
Marsh Posté le 22-04-2003 à 17:16:12
le moyen le plus rapide est d'utiliser une DBComboBox
est-ce que tu utilises Paradox par choix ou par obligation ? c'est pas le meilleur choix idem pour BDE que tu utilises aussi j'imagine (plutôt qu'ADO)
Marsh Posté le 23-04-2003 à 09:29:02
Paradox par obligation..
En fait, c'est dans le cadre d'un stage
et je me plie à ce que l'on me demande..
Mais quant à ta 2e question, je n'en sais rien
car je n'y connais pas encore grand chose..
Sinon, je ne vois pas comment écrire une
requête SQL afin d'utiliser le résultat,
en parcourant un à un, afin de remplir ma
combo. En fait, je ne sais pas quels composants
utiliser et comment les mettre en relation,
et surtout, où vont se trouver les enregistrements
ici du résultat de la requête ??
Merci.
Marsh Posté le 23-04-2003 à 10:36:35
enfin, soit, donc Paradox puisque c'est une obligation.
Tu utilises les composants TDatabase, TTable, TQuery je suppose ? (donc BDE)
Une des solutions est d'utiliser le TQuery, et de lui assigner soit un DatabaseName soit un DataSource selon ce que tu utilises pour la connexion aux tables, puis de faire ta requête et tu remplis ta liste :
with Query1 do
begin
ComboBox1.Items.Clear;
Close;
SQL.Text := 'SELECT * FROM BIDULE';
Open;
while not Eof do
begin
ComboBox1.Items.Add(FieldByName('Champ1'.AsString);
Next;
end;
end;
Sinon tu peux aussi mettre ta requête en design time dans le TQuery (ou utiliser un TTable si c'est une requête simple), mettre un TDataSet, le lier au TQuery (ou TTable), mettre une TDBComboBox, la lier au TDataSet, et normalement les données qui y apparaissent quand la connexion est ouverte sur le TQuery/TTable.
Mais souvent quand on utilise ces composants on se retrouve avec des trucs bricolés sur toutes les forms, et ça devient l'enfer.
Un conseil : passe par un TDataBase, et met tous les composants de connexion aux BD dans un Data Module (File -> New -> Data Module) pour isoler tout ce qui est accès BD, de manière à ce que dans les forms tu ne touches pas directement à la BD, tu fais juste des demandes de listes etc. (fonctions que tu ajoutes au Data Module)
C'est juste un conseil; tu n'es pas obligé de le suivre, mais je t'assure que le jour où tu dois changer des trucs dans la connexion à la BD toi (ou ton successeur sur le programme) va être très content de ça
Marsh Posté le 23-04-2003 à 10:56:43
Ok, je te remercie beaucoup de toutes
ces explications et conseils.
Ca fait plaisir de voir quelqu'un qui
ne traite pas de "newbie" comme énormément font..
En plus, je viens juste d'avoir des conseils
d'une personne ici, et je pense que combinés
aux tiens, je devrais aboutir à quelque chose
avant la fin de la journée
Il m'a conseillé d'utiliser un alias, et ensuite
de me servir de TDataBase et TQuery.
Je ne sais plus si j'aurais besoin d'un TDataSource
mais bon, je verrai bien.
Voilà, je vais essayer tout ça.
Merci beaucoup
et je te tiens au courant !!
Marsh Posté le 23-04-2003 à 11:06:48
le TDataSource (que j'ai appelé à tord TDataSet ) c'est pour si tu veux lier un TQuery/TTable à un composant "automatique" genre TDBEdit, TDBComboBox, etc. (composants qui affichent tout seul le contenu d'une table, ou la valeur du champ courant, etc.)
Marsh Posté le 23-04-2003 à 11:56:01
Haa, là j'ai un tout petit pb..
Je reprends un ancien prog pour tester
les DataModules, avant de le faire dans
le programme dont j'ai parlé ici.
J'ai mis un DataModule comprenant une TTable,
une TDataSource et une TDataBase.
La TDataBase est reliée a un alias comprenant mes
tables Paradox.
J'ai mis la propriété DataBaseName de la TTable
au nom de la même propriété de la TDataBase.
Enfin, la TDataSource est reliée à la TTable.
Je souhaite obtenir la liste des tables
référencées dans l'alias que j'ai créé,
et je ne vois pas comment..
J'ai testé plusieurs méthodes et j'ai tjs rien..
Ca ne doit pas être bien compliqué je pense.
Sois un doit falloir parcourir l'alias
avec un FindFirst et FindNext, ou alors
obtenir la liste de ces tables dans une TStrings.
Mais là, je bloque encore..
Marsh Posté le 23-04-2003 à 12:14:39
TDatabase.GetTableNames ?
Marsh Posté le 23-04-2003 à 12:21:26
Ben il me fait une erreur à l'exécution..
Je mets une TStrings en paramètre,
mais erreur au niveau mémoire je crois.
Marsh Posté le 23-04-2003 à 12:27:54
"Je mets une TStrings en paramètre" c'est très vague
tu déclares juste une variable de type TStrings que tu lui passe ? c'est normal que ça plante
ex:
var
liste: TStringList;
begin
liste := TStringList.Create; // TStrings et ses dérivé ce sont des classes, il faut en créer une instance pour l'utiliser
DataBase.GetTableNames(liste);
// ici tu joues avec ta liste
liste.Free; // on la supprime quand on n'en a plus besoin
end;
Marsh Posté le 23-04-2003 à 12:36:55
Haaa, OK (je suis vraiment à l'Ouest.. )
Merci bien, je vais manger et j'essaie ça juste
après. Bon appétit
Marsh Posté le 23-04-2003 à 14:32:14
Bon, c'est bon, ça marche nickel pour la liste !!
Merci beaucoup.
En plus maintenant, mon programme est beaucoup
plus léger et simple (avant je changeait le répertoire
courant, puis j'allais dans le répertoire des
tables et je le parcourais en prenant le nom de chaque
fichier *.db, sans prendre l'extension, et enfin
je l'ajoutait à ma combo... )
Mais maintenant, la combo est remplie de façon
très simple et c'est vrai que c'est plus sympa
avec le Module de Données.
Bon, je vais maintenant regarder pour lancer
la table sélectionnée (ça devrait encore simplifier
mon prog) et juste après, je reprends mon programme
avec les requêtes SQL !!
Merci merci !!
Marsh Posté le 23-04-2003 à 15:05:43
Bon, c'est bon, les toutes petites modif
ont été faites et j'ai testé ==> NO PROBLEME !!!
Bon, je repasse donc à celui de ce matin.
J'espère que tu resteras dans les parages,
on ne sait jamais..
Merci.
Marsh Posté le 23-04-2003 à 16:23:02
Bon, pour l'instant, ça fonctionne.
J'ai réussi à mettre dans une TDBComboBox
le résultat d'une requête.
Je me suis basé sur ce que tu m'avais donné
plus haut, mais j'ai dû me résigner à utiliser
FindFirst et FindNext sur la Query car ça me
faisait comme une boucle infinie avec le EOF..
Mais tu m'avais dit plus haut que la TDBComboBox
se remplissait "toute seule" mais je n'ai pas
réussi à le faire, bien que je lui ai appliqué
la propriété DataField..
Je ne sais pas alors si ça vaut le coup de la garder..
Marsh Posté le 23-04-2003 à 16:25:17
si tu la remplis manuellement vaut mieux pas la garder
une combobox normale suffira
Si l'Eof n'est pas détecté, à part un manque de "Next" je vois pas trop ce que ça pourrait être
Faut peut-être faire un First entre le Open et le while.
Marsh Posté le 23-04-2003 à 16:38:32
OK. Bon, je vais laisser comme ça pour le moment
et si vraiment je suis embêté, j'essairai avec l'Eof.
Je vais remettre une ComboBox toute simple.
Marsh Posté le 23-04-2003 à 16:39:35
Au fait, je ne vois pas à quoi sert mon
TDataSource dans ce cas-là..
Marsh Posté le 23-04-2003 à 17:04:12
ReplyMarsh Posté le 23-04-2003 à 17:25:30
Je me disais aussi
Bon, je continuerai tout ça demain.
Encore merci et bonne soirée !
Marsh Posté le 24-04-2003 à 08:49:24
Bon, ça y est, je suis de retour!
Je vais donc me remettre au boulot
Marsh Posté le 22-04-2003 à 15:33:46
Slt !
Je souhaite réaliser une petite application
qui utilise des tables Paradox.
En fait, on doit choisir tout d'abord un nom
de fournisseur à l'aide d'une comboBox.
Mais je souhaite remplir cette comboBox
à partir de ma table des fournisseurs bien
évidemment
Mais en fait, je ne sais pas par quels moyens
je peux lire ma table, dans une colonne donnée,
en la parcourant pour remplir ma comboBox..
Dois-je obligatoirement passer par des requêtes SQL
et si oui comment ?? ou y a t'il un autre moyen ??
Merci d'avance !