2010-11-23 7 views
0

J'ai un DBGrid couplé à un ADOQuery en utilisant une instruction SELECT.Mettre à jour un champ pour tous les enregistrements?

Je souhaite mettre à jour un champ pour tous les enregistrements. Par exemple, lorsque j'entre des données dans une zone de texte, le champ «Nom» (juste un exemple) de tous les enregistrements serait modifié.

+0

Je vous conseille de vous est d'élaborer vos questions. Il est souhaitable que vous fassiez un meilleur effort pour décrire votre situation, y compris toutes les choses qui comptent pour un problème spécifique. Dans ce cas, des choses comme la nature de la sélection (certains ensembles de résultats sélectionnés sont en lecture seule au niveau de la base de données) et si vous voulez le faire dans la base de données ou en utilisant ce même composant ADOQuery. Si vous voulez que les gens investissent (ou gaspillent) un peu de temps à essayer de vous aider, il vaut mieux que vous investissiez du temps pour essayer de faire comprendre à votre entourage votre situation au départ. – jachguate

Répondre

5

à cette fin, vous pouvez lancer une requête.

"UPDATE table SET nom = textBox.text"; suivez la syntaxe de selon vous. il suffit de changer ce champ sans aucune clause où va changer toutes vos entrées.

+0

chère, j'ai dit ma commande Adoquery est select et dbgrid me montre cette table et ce select peut être une jointure de certaines tables (pas seulement une table) – micheal

+1

@micheal, vous n'avez pas dit que le select est une jointure de plusieurs tables mais que assistez, Isha a raison. Vous pouvez effectuer une mise à jour et actualiser votre grille après cela. –

+0

Même si vous avez joint des tables, le champ proviendra d'un seul. Une situation plus complexe serait que ce champ provienne d'une UNION. –

1

Vous pouvez utiliser l'instruction SQL UPDATE pour mettre à jour tous ces enregistrements à la fois.

Si vous ne voulez pas (ou ne peut pas) utiliser un UPDATE SQL pour une raison quelconque, et que vous souhaitez faire la mise à jour en utilisant ADO d'enregistrements, vous pouvez écrire un code comme ceci:

var 
    AField : TField; 
begin 
    Assert(AdoQuery1.Active, 'Dataset is not active!'); 
    try 
    AdoQuery1.DisableControls; 
    AField := AdoQuery1.FieldByName('MyFieldName'); 
    AdoQuery1.First; 
    while not AdoQuery1.Eof do 
    begin 
     AdoQuery1.Edit; 
     AField.Value := Edit1.Text; 
     AdoQuery1.Post; 
     AdoQuery1.Next; 
    end; 
    finally 
    AdoQuery1.EnableControls; 
    end; 
end; 
+0

Veuillez mettre le FieldByName hors de la boucle. Stockez la référence dans un objet Field local, puis utilisez-la dans la boucle. J'en ai marre de voir cette fois et de nouveau se glisser dans le code de production. –

+0

@Francois, oui, utiliser FieldByName dans une boucle a un inconvénient de performance, mais ce n'est pas un code de production, je l'ai juste écrit rapidement pour lui donner une idée de comment il peut itérer sur les enregistrements. Quoi qu'il en soit, je l'ai changé pour refléter votre demande aussi. – vcldeveloper

+0

Merci. Vous ne pouvez pas imaginer combien de fois j'ai vu cela dans le code de production, d'abord à partir de pépites récoltées ici ou là, mais à gauche quand même ... –

Questions connexes