2010-04-15 8 views
0

J'essaie de copier des données d'une table maître et 2 autres tables enfant. Lorsque je sélectionne un enregistrement dans la table principale, je copie tous les champs de cette table pour l'autre. (Tableau 1 copie de ADOQuery l'enregistrement sélectionné)delphi Ado (mdb) mise à jour des enregistrements

procedure TForm1.copyButton7Click(Sender: TObject); 
SQL.Clear; 
SQL.Add('SELECT * from ADoquery'); 
SQL.Add('Where numeracao LIKE ''%'+NInterv.text);// locate record selected in Table1 NInterv.text) 
Open; 

// iniciate copy of record´s 

begin 
    while not tableADoquery.Eof do 

     begin 
     Table1.Last; 
     Table1.Append;// how to append if necessary!!!!!!!!!! 
     Table1.Edit; 
     Table1.FieldByName('C').Value := ADoquery.FieldByName('C').Value; 
     Table1.FieldByName('client').Value := ADoquery.FieldByName('client').Value; 
     Table1.FieldByName('Cnpj_cpf').Value := ADoquery.FieldByName('Cnpj_cpf').Value; 
     table1.Post; 
     table2.next;/// 
     end; 
end; 

// Comment puis-je mettre à jour le TableChield, TableChield1 des champs TableChield_1 et TableChield_2 en même temps?

font la même chose pour les tables enfant TableChield < = TableChield_1
TableChield1 < = TableChield_2

grâce

+0

On ne sait pas ce que vous voulez. Essayez de montrer l'expexted de et vers les données. – BennyBechDk

+0

L'un des moyens les plus efficaces consiste simplement à insérer directement à partir des instructions select en utilisant INSERT INTO SELECT. Manière beaucoup plus rapide de mettre à jour les tables d'un autre. – yozey

Répondre

1

Les champs seront tous mis à jour en même temps. La mise à jour réelle est effectuée lorsque vous appelez poste (ou même alors, cela dépend si les mises à jour par lots sont activés ou désactivés).

Mais s'il vous plaît reconsidérer votre logique. Il serait beaucoup plus efficace d'utiliser des instructions SQL (INSERT) afin d'insérer les données à l'autre table

SQL.Clear; 
SQL.Add('INSERT INOT TABLE_1(C, client, Cnpj_cpf)'); 
SQL.Add('VALUES(:C, :client, :Cnpj_cpf)'); 

Ensuite, remplissez simplement les valeurs dans une boucle.

SQL.Parameters.ParamByName('C').Value := ADoquery.FieldByName('C').Value; 
SQL.Parameters.ParamByName('client').Value := ADoquery.FieldByName('client').Value; 
SQL.Parameters.ParamByName('Cnpj_cpf').Value := ADoquery.FieldByName('Cnpj_cpf').Value; 
SQL.ExecSQL; 

Vous pouvez également faire le Updade - Insérez un motif si les données peuvent déjà être dans la table cible.

comme ceci:

if SQL.ExecSQL = 0 then 
begin 
    // no records were update, do an insert 
end; 

Et aussi l'indication que vous copiez les données du tableau 1 au tableau 2 pourrait être un signe de défaut de conception. Mais je ne peux pas le dire à coup sûr sans en savoir plus. Quoi qu'il en soit, la duplication de données n'est jamais bonne.

0

Je crois que le demandeur a été pensé à l'intégrité des données, ce qui signifie, assurez-vous que seuls toutes les tables seront mises à jour ou pas ...

La façon dont je sais pour y parvenir avec la sécurité exécute toutes ces mises à jour (ou insère, aussi) en utilisant des commandes SQL dans une transition.

Questions connexes