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 :

Importer données table


Sujet :

Bases de données Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut Importer données table
    Bonsoir,

    Je voudrais fair un system d'importation et d'exportation des données...

    Lors de l'éxportation, je viendrais copier le fichier.db (la table) et lors de l'importation, je viendrais ajouter les données de la table à celle déjà éxistante.

    Mais le souci, c'est que je ne sais pas comment faire pour éviter les doublons pour "filtrer" en quelque sorte... car je ne veux pas qu'il y ait deux fois les même valeur dans la table...

    Merci de votre aide !

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    L'idée à la plus simple à mon avis est de créer sur ta table Destination un index "UNIQUE" sur la ou les colonnes que tu ne veux pas doublonner, puis d'insérer tes enregistrements, non par une requête SQL unique, mais un par un dans une boucle sur ta table source. Et tu places l'insertion dans un bloc try...except, comme ça la tentative d'insertion du doublon provoque une erreur, mais interceptée par ton bloc try.
    Roland

  3. #3
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Oui... mais je debute et j'ai pas tout saisi...
    Peut tu me donner un exemple? merci

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Pour l'index, tu l'ajoutes dans le Module de Base de Données, à la création par exemple.
    Ensuite dans le Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Table1 .Open;
    Table2 .Open;
    while not Table1 .Eof do
    begin
      try
        Table2 .Insert;
        for i := 0 to Table1 .FieldCount - 1 do
           Table2 .Fields [i] .Value := Table1 .Fields [i] .Value ;
        Table2 .Post; {Cette ligne va provoquer une erreur en cas de doublon}
      except
        on E: Exception do
        {si l'erreur est une erreur de duplication de clé, on la passe sous
          silence, sinon, on affiche le message d'erreur}
          if (EDBEngineError(E).Errors[0].ErrorCode = DBIERR_KEYVIOL)
               then Table2 .Cancel
               else raise;
      end;
      Next;
    end;
    Roland

  5. #5
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci pour cette réponse, mais j'ai un souci avec

    "DBIERR_KEYVIOL" j'ai un identificateur non declaré..? pourquoi?

    Merci de ton aide !

  6. #6
    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
    Citation Envoyé par jojo86 Voir le message
    "DBIERR_KEYVIOL" j'ai un identificateur non declaré..? pourquoi?
    Parce que il te manque BDE dans tes uses.

    @+ Claudius

  7. #7
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Je galère...

    J'ai le message :
    "Le projet Project2.exe a provoqué une classe d'exception EDatabaseError avec le message 'Impossible de modifier le champ 'Id''. "

    A quoi est-ce du?

  8. #8
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Il peut y avoir différentes raisons. La première à laquelle je pense est que tu as déclaré le champ Id de ta table Destination en AutoIncrémenté, alors quand tu essaies de lui affecter une valeur, il n'est pas content. Remplace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i := 0 to Table1 .FieldCount - 1 do
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i := 1 to Table1 .FieldCount - 1 do
    pour laisser de côté le champ Id, qui sera généré automatiquement.
    Roland

  9. #9
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Alors... ça fonctionne, mais ma table2 se rempli entierement par le premier enregistrement de l'autre table...

    Je comprend pas pourquoi...

  10. #10
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Est-ce que tu n'as pas oublié le Next, qui devrait d'ailleurs être :
    Désolé de l'erreur.
    Mais ce que je ne comprends pas, c'est que ta table se remplit de doublons ??? Il doit y avoir un pb quelque part. As-tu bien créé l'index ? Sur quelles colonnes ?
    Roland

  11. #11
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Merci de ton aide c'est très gentil.

    Mes tables parlons en !

    Les deux tables ont la même structure : un champ "Id" avec une incrémentation automatique et qui est l'index. Ensuite, un champ Application et un champ Pass qui sont des champs de type alphanumérique...

    je viens de rajouter le Table1.next...

    Maintenant, la totalitée de la table1 est copiée dans la table 2... j'ai éssayé de "bidouiller" pour trouver quelque chose mais je peux rien faire moi...

    Merci !

  12. #12
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je n'ai pas le Module de Base de Données sous les yeux, mais de mémoire, tu dois avoir dans le menu contextuel de ta table un "Restructurer Table". Et dans la fenêtre de restructuration une possibilité de créer des index secondaires. Là, tu spécifies la ou les colonnes de l'index, et tu n'oublies pas de cocher Unique. Ensuite, ta table n'accepte plus les doublons sur ces colonnes.
    Roland

  13. #13
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Je peux me tromper, mais n'aurais-tu pas oublié le - 1 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i := 1 to Table1 .FieldCount - 1 do
    Roland

  14. #14
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bon pour récapituler, voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    var i:integer;
    begin
    Table1 .Open;
    Table2 .Open;
    while not Table1 .Eof do
    begin
      try
        Table2 .Insert;
        for i := 1 to Table1 .FieldCount - 1 do
        Table2 .Fields [i] .Value := Table1 .Fields [i] .Value ;
        Table2 .Post; {Cette ligne va provoquer une erreur en cas de doublon}
        Table1.Next;
      except
        on E: Exception do
        {si l'erreur est une erreur de duplication de clé, on la passe sous
          silence, sinon, on affiche le message d'erreur}
          if (EDBEngineError(E).Errors[0].ErrorCode = DBIERR_KEYVIOL)
               then Table2 .Cancel
               else raise;
      end;
      Next;
    end;
    end;
    Je vien de modifier la table comme tu m'as dit, et donc maintenant quand j'execute le code, j'ai un message qui me dit :"violation de clé. Index:unique"...

    J'avance pas des masses...

  15. #15
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Mais si, mais si, on avance .
    Je suppose que tu as ce message d'erreur lorsque tu exécutes ton programme à partir de Delphi. Or, par défaut, le débogueur intégré affiche les messages d'erreur, même si les erreurs sont gérées - le programme continue, mais après avoir fermé le message.
    Pour voir si c'est ça, tu peux lancer directement l'exe (en dehors de Delphi, par l'Explorateur Windows par exemple). Ou alors, tu vas (chemin dans Delphi 5, à adapter selon versions) dans Outils / Options du débogueur / Exceptions du langage et tu décoches "Arrêter sur exceptions Delphi". Tu valides, et tu réessaies.
    Et tu me tien au courant
    Roland

  16. #16
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bien m'sieur, je fais ça tout de suite !

  17. #17
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Bon et bien, si je créer un index secondaire sur mes tables, l'application ce bloque... si je supprime l'index secondaire, l'application ne bug plus, mais cette fois, on recopie tout le contenu de la table1 dans la table2...


  18. #18
    Membre averti
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Janvier 2007
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Formateur en informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 144
    Points : 337
    Points
    337
    Par défaut
    Yes c'est bon !!!

    J'avais oublié de mettre
    Juste après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (EDBEngineError(E).Errors[0].ErrorCode = DBIERR_KEYVIOL)
               then Table2.Cancel;
    Donc je pense que le programe était bloqué dans la boucle... j'ai donc rajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (EDBEngineError(E).Errors[0].ErrorCode = DBIERR_KEYVIOL)
               then begin
               Table2.Cancel;
               Table1.Next;
               end
    Et maintenant ça fonctionne !!!

    Voici le code complet pour ceux qui voudront :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    var i:integer;
    begin
    Table1 .Open;
    Table2 .Open;
     
    while not Table1 .Eof do
    begin
      try
        Table2 .Insert;
        for i := 1 to Table1 .FieldCount - 1 do
        Table2 .Fields [i] .Value := Table1 .Fields [i] .Value ;
        Table2 .Post; {Cette ligne va provoquer une erreur en cas de doublon}
        Table1.Next;
      except
        on E: Exception do
        {si l'erreur est une erreur de duplication de clé, on la passe sous
          silence, sinon, on affiche le message d'erreur}
          if (EDBEngineError(E).Errors[0].ErrorCode = DBIERR_KEYVIOL)
               then begin
               showmessage ('bloquer');
               Table2.Cancel;
               Table1.Next;
               end
               else raise;
      end;
      Next;
    end;
    end;
    Un grand merci à rsc. Merci beaucoup !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [A-07] Importer données excel dans une table access
    Par Angelo91 dans le forum VBA Access
    Réponses: 1
    Dernier message: 07/10/2008, 12h48
  2. Importer données d'une colonne dans une autre table
    Par Monkey_D.Luffy dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/06/2008, 16h08
  3. Importer données d'une table d'une base à une autre
    Par kat40 dans le forum VBA Access
    Réponses: 4
    Dernier message: 01/02/2008, 14h57
  4. Access : Importer données Excel dans une table Access
    Par kamala dans le forum VBA Access
    Réponses: 1
    Dernier message: 18/09/2007, 08h36

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