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

Bases de données Delphi Discussion :

Access TADOTable copier un enregistrement d'une table vers une autre


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Août 2006
    Messages : 106
    Points : 55
    Points
    55
    Par défaut Access TADOTable copier un enregistrement d'une table vers une autre
    Bonjour,
    Ma question est simple, y'a t'il une astuce ou une commande qui permet de copier un enregistrement d'une Adotable vers une autre Adotable et qui ont les mêmes champs biensure. Il est biensure possible de copier cet enregistrement champ par champ en utilisant l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ADOTable1.FieldByName('Champ1').AsVariant:=ADOTable2.FieldByName('Champ1').AsVariant
    ADOTable1.FieldByName('Champ2').AsVariant:=ADOTable2.FieldByName('Champ2').AsVariant
    .
    .
    .
    Mais c'est un peu lourd surtout s'il y a beaucoup de champs mais si quelqu'un connaiterait une astuce pour résumer tout ça en une seule ligne ça serait merveilleux.

    Merci à tous.

    Delphi 7
    Access et ADO.

  2. #2
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Il suffit de faire une boucle sur les Fields, quelque chose comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var
      I: Integer;
    begin
      ADOTable1.Append;
      for I := 0 to ADOTable1.FieldCount - 1 do
        ADOTable1.Fields[I].Value := ADOTable2.Fields[I].Value;
      ADOTable1.Post;
    end;
    @+ Claudius

  3. #3
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Attention ce code suppose que tu es sur le bon enregistrement !

  4. #4
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Une boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i:=0 to ADOTable1.FieldCount - 1 do
      if Assigned(ADOTable2.FindField(ADOTable1.Fields[i].FieldName) then
       ADOTable2.FindField(ADOTable1.Fields[i].FieldName).value := ADOTable1.Fields[i].value;
    Tu dois pourvoir le faire en SQL aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      insert into TABLE2 (select * from TABLE1 where table1.XXX='ZZZ')
    voir
    http://sqlpro.developpez.com/cours/sqlaz/dml/#LII-E

  5. #5
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Je trouve que le code en SQL est plus propre pas besoin de faire une recherche sauf peut-être qu'il faut mettre dans la clause where un identifiant unique sinon tu n'aura pas toujours le bon résultat.

  6. #6
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    Attention ce code suppose que tu es sur le bon enregistrement !
    Citation Envoyé par Just-Soft Voir le message
    ....sauf peut-être qu'il faut mettre dans la clause where un identifiant unique sinon tu n'aura pas toujours le bon résultat.

    abondance de biens ne nuit pas,
    il aura ainsi le choix.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Août 2006
    Messages : 106
    Points : 55
    Points
    55
    Par défaut
    var
    I: Integer;
    begin
    ADOTable1.Append;
    for I := 0 to ADOTable1.FieldCount - 1 do
    ADOTable1.Fields[i].Value := ADOTable2.Fields[i].Value;
    ADOTable1.Post;
    end;
    C'est une bonne solution j'y ai pas pensé merci Cl@udius.

    Tu dois pourvoir le faire en SQL aussi

    Code :

    insert into TABLE2 (select * from TABLE1 where table1.XXX='ZZZ')
    voir
    http://sqlpro.developpez.com/cours/sqlaz/dml/#LII-E
    Il y a aussi la solution SQL qui est très bien aussi donc j'ai le choix merci Yurck.
    Attention ce code suppose que tu es sur le bon enregistrement !
    Oui avant de faire l'insertion il faut pointer les bons enregistrements des côtés et aussi tester la clé s'il y a pas eu une autre insertion entre temps d'un autre poste pour ne pas avoir 2 enregistrements avec la même clé. Merci aussi Just-Soft.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Août 2006
    Messages : 106
    Points : 55
    Points
    55
    Par défaut
    Mainentant je rencontre un autre problème qui est comme suit :
    Quand l'utilisateur séléctionne un enregistrement pour le modifier, automatiquement je créé une copie de cete enregistrement dans une autre table de même structure, j'ai fait ça à l'aide d'une requête SQL jusque-là c'est bon l'enregistrement est bien créé dans la table Access mais quand je veux accéder à partir de Delphi par exemple par un DBGrid je ne trouve pas cet enregistrement bien qu'il soit dans la table et j'ai remarqué que quand je ferme toute l'application et je réouvre je le trouve dans le dbgrid. J'ai essayé et j'ai essayé aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AdoTable.Active:=False;
    AdoTable.Active:=True;
    mais l'enregistrement n'apparaît toujours pas. C'est quoi le problème ?
    Merci d'avance.

  9. #9
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    je ne connais pas access ni le middle ware que tu utilises.

    Mais la solution réside dans l'isolation de transaction.
    Il faut voir au niveau des objets de type "Session" "Transaction" etc ...

    a+

  10. #10
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Citation Envoyé par walid_kerkoub Voir le message
    Mainentant je rencontre un autre problème qui est comme suit :
    Quand l'utilisateur séléctionne un enregistrement pour le modifier, automatiquement je créé une copie de cete enregistrement dans une autre table de même structure, j'ai fait ça à l'aide d'une requête SQL jusque-là c'est bon l'enregistrement est bien créé dans la table Access mais quand je veux accéder à partir de Delphi par exemple par un DBGrid je ne trouve pas cet enregistrement bien qu'il soit dans la table et j'ai remarqué que quand je ferme toute l'application et je réouvre je le trouve dans le dbgrid. J'ai essayé et j'ai essayé aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    AdoTable.Active:=False;
    AdoTable.Active:=True;
    mais l'enregistrement n'apparaît toujours pas. C'est quoi le problème ?
    Merci d'avance.

    Salut,

    Essai un Close puis un Open, sa marche à tous les coups

    Bye bye

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    106
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Août 2006
    Messages : 106
    Points : 55
    Points
    55
    Par défaut
    Pour Yurk
    je ne connais pas access ni le middle ware que tu utilises.

    Mais la solution réside dans l'isolation de transaction.
    Il faut voir au niveau des objets de type "Session" "Transaction" etc ...
    Je n'utlise pas access mais uniquement le SGBD Access, j'utilise Delphi 7 avec ADO et pour l'insertion du champ vers la table j'utilise un TADOQuery.

    J'ai essayé le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ADOTable.Close;
    ADOTable.Open;
    ça n'a pas marché mais pour tester j'ai inséré un Tbutton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    ADOTable.Close;
    ADOTable.Open;
    end;
    J'ai remarqué qu'en clickant plusieurs fois sur ce bouton, l'enregistrement finit par apparaître , des fois une seule fois suffit et d'autres il faut 3 ou 7 clicks pour que ça marche (donc plusieurs close et open). J'ai pensé à mettre une boucle Repeat comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Repeat
    Form1.Button1.Click;
    Until ADOTable.IsEmpty=False;
    Form1.ShowModal;
    Ca a marché l'enregistrement apparaît mais la form prend environ 3 sec des fois jusqu'à 5 sec pour s'ouvrir à cause du nombre de fois de Close et Open, S'il y a un truc plus rapide ça serait mieux, qu'est-ce que vous en dites ?

Discussions similaires

  1. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  2. [VB.Net] Comment copier une DataRow d'une table vers une autre ?
    Par YLF dans le forum Accès aux données
    Réponses: 7
    Dernier message: 05/09/2012, 23h23
  3. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  4. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  5. copier une ligne d'une table vers une autre
    Par Adren dans le forum Langage SQL
    Réponses: 5
    Dernier message: 08/08/2006, 11h54

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