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 :

Donnée feuille Excel vers table base Access


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut Donnée feuille Excel vers table base Access
    Comment coder delphi (pascal) pour récuperer certains champs d'une feuille exel (csv) et les copier dans une table de la base ACCESS.

  2. #2
    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 304
    Points
    2 304
    Par défaut
    Salut;

    Utilises les composants serveurs Acces et Excel sur la palette Servers.

    En plus, ya des trucs très sympa pour la récupération de données dans la FAQ Delphi.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Dans la fac j'ai lu l'article de Laurent Dardenne "charger directement un fichier csv dans une table Access" mais je dois avouer que le déroulement de l'ensemble des procedures qui le composent me parait compliqué vu mon niveau ,je vais tenter de persévèrer dans cette étude.

    Je vais donc également orienter mes recherches vers les composants servers ami Kelloucheaeh.

  4. #4
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Bonjour,

    voici ce qu'il te faut pour importer un csv vers une table Access :

    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
    30
    31
    Procedure CreerSchemaIni(APath, ANameOnly: TFileName; const ADelimiteur: ShortString);
    var
    SchemaIni: TIniFile;
    begin
        SchemaIni:=Nil;
      try
        SchemaIni:=TIniFile.Create(IncludeTrailingPathDelimiter(APath)+'Schema.ini');
        SchemaIni.WriteString(ANameOnly, 'Format', 'Delimited('+ADelimiteur+')');
      finally
        SchemaIni.Free;
      end;
    end;
     
     
     
    procedure ImportDirectCVSToBase(ADOObject : TADOConnection ; PathFichierCSV, NomFichierCSV, DBPath:TFileName ; NomTable : string ; Delimiteur : Char);
    const
    Requete='INSERT INTO [%s] IN "%s" SELECT * FROM %s';
    begin
      try
        CreerSchemaIni(PathFichierCSV, NomFichierCSV,Delimiteur);
        ADOObject.Close;
        ADOObject.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+PathFichierCSV+';Extended Properties="text;HDR=YES;Format=Delimited"';
        ADOObject.Execute(Format(Requete,[NomTable,DBPath,NomFichierCSV]));
      Except
        on E:Exception do
        begin
          showmessage(E.Message);
        end;
      end;
    end;
    Et pour appeler ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ImportDirectCVSToBase(ADOconnection1,cheminfichiercsv, nomfichiercsv, DBPath, 'matable',';');
    [Il était une fois Delphi ....]


  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Hé zemeilleurofgreg j'ai lu tes posts ,celui ci et tes précédents courant juillet sur l'importation d'un fichier CSV dans une table Access.

    J'ai placé sur ma feuille un tadoconnection1,un tadotable1,j'ai relié le tout .

    J'ai essayé de recréer la même chose sur une form delphi ,mais sans y parvenir ,en fait je n'ai pas compris ou placer le code que tu décris ci dessus.
    Sur la feuille code de la form,si je le place aprés begin une erreur de structure me précise qu'il ne s'attendait pas a y trouver une Procedure,mais si je le place a la fin de la procedure principale qui souvre en cliquant sur la form ,il m'annonce la même erreur ,le tout agrémenté de plusieurs autres qui en découlent.

    Je viens de me rapeler que je pourais peut être le placer dans un bouton mais cela va t'il fonctionner!

    S'il te plait pourais tu m'apporter des précsisions sur la manière d'intégrer ce code et quels objets je dois placer sur ma feuille ou/et si possible une copie de feuille de code concernant l'importation d'un fichier CSV dans la Base Access ce qui constituerais un exellent tuto.
    D'autre part j'ai un doute sur la façon de renseigner les variables apathonly,afichieronly.
    Je précise que je n'ais qu'une connaissance toute perso dans les bases de données et delphi , j'ai lu il y a logtemps le livre MS ACCESS ,je recherche de l'info sur internet mais il y a vraimement beaucoup trop de choses a lire et le temps me manque pour tout déchiffrer et comprendre.

    A+

  6. #6
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    Salut,

    résolvons le problème des pseudos messages d'erreurs ...

    voici le code modifié pour toi :

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls,ADODB,IniFiles, DB;
     
    type
      TForm1 = class(TForm)
        btnImporter: TButton;
        ADOConnection1: TADOConnection;
        procedure btnImporterClick(Sender: TObject);
      private
        Procedure CreerSchemaIni(APath, ANameOnly: TFileName; const ADelimiteur: ShortString);
        procedure ImportDirectCVSToBase(ADOObject : TADOConnection ; PathFichierCSV, NomFichierCSV, DBPath:TFileName ; NomTable : string ; Delimiteur : Char);
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    Procedure TForm1.CreerSchemaIni(APath, ANameOnly: TFileName; const ADelimiteur: ShortString);
    var
    SchemaIni: TIniFile;
    begin
        SchemaIni:=Nil;
      try
        SchemaIni:=TIniFile.Create(IncludeTrailingPathDelimiter(APath)+'Schema.ini');
        SchemaIni.WriteString(ANameOnly, 'Format', 'Delimited('+ADelimiteur+')');
      finally
        SchemaIni.Free;
      end;
    end;
     
     
     
    procedure TForm1.ImportDirectCVSToBase(ADOObject : TADOConnection ; PathFichierCSV, NomFichierCSV, DBPath:TFileName ; NomTable : string ; Delimiteur : Char);
    const
    Requete='INSERT INTO [%s] IN "%s" SELECT * FROM %s';
    begin
      try
        CreerSchemaIni(PathFichierCSV, NomFichierCSV,Delimiteur);
        ADOObject.Close;
        ADOObject.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+PathFichierCSV+';Extended Properties="text;HDR=YES;Format=Delimited"';
        ADOObject.Execute(Format(Requete,[NomTable,DBPath,NomFichierCSV]));
      Except
        on E:Exception do
        begin
          showmessage(E.Message);
        end;
      end;
    end;
     
    procedure TForm1.btnImporterClick(Sender: TObject);
    var
    cheminfichiercsv,nomfichiercsv,chemindatabase:TFileName;
    begin
      cheminfichiercsv:='C:\Program Files\';
      nomfichiercsv:='toto.csv';
      chemindatabase:='C:\Program Files\mabase.mdb';
      ImportDirectCVSToBase(ADOconnection1,cheminfichiercsv, nomfichiercsv, chemindatabase, 'matable',';');
      //ADOconnection est un objet ADO que tu déposes sur ta form et connecte à ta DB
      //cheminfichiercsv est le chemin du fichier sans le nom du fichier ==> ex : C:\Program Files\
      //nomfichiercsv est le nom du fichier csv ==> ex : toto.csv
      //DBPath est le chemin de la base de données comportant le nom de celle ci
      //'matable' est le nom de la table dans laquelle je veux envoyer les données de mon fichier csv
    end;
     
    end.
    moi j'ai utilisé TForm1 devant mes procédures parce que ma Form s'appelle Form1 mais si ta form s'appelle toto, utilises TToto !
    [Il était une fois Delphi ....]


  7. #7
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message

    moi j'ai utilisé TForm1 devant mes procédures parce que ma Form s'appelle Form1 mais si ta form s'appelle toto, utilises TToto !
    Merci pour ta reponse rapide ,cela me parait plus clair ,je n'ai plus d'erreurs de structure et je vais pouvoir étudier tout cela maintenant.

    A+

  8. #8
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    j'espère avoir pu t'aider !

    tu peux même si tu fais souvent ce genre de manip mettre ces 2 procédures dans une dll que tu appelles au besoin !
    [Il était une fois Delphi ....]


  9. #9
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    j'espère avoir pu t'aider !
    C'est fait ,j'ai du me replonger dans le langage Pascal de Delphi que j'avais visité en 2001 mais que j'avais aussitôt abandonné aprés quelques essais car je n'en avais pas vraiment l'utilité,j'utilisai alors le basic pour mes bidouilles.

    Grace a ton post j'ai réussi a créer l'EXE mais j'obtiens l'erreur suivante:

    L'instruction INSERT INTO contient le nom de champ inconnu suivant : 'NONAME'.
    Assurez vous que vous avez correctement saisi le nom puis recommencer l'opperation.
    Quelqu'un peut-il m'expliquer ; tous les champs portent un nom?
    Je pense qu'il sagit d'une erreur connue SQL ,la requete n'a t-elle pas réussit a lire le nom du champ !
    Je vais essayer le débogage

    Comment savoir si l'erreur vient de la lecture du fichier csv ou bien de l'ecriture dans la table ?


    * La table a étè crée en important le fichier CSV dans Access
    * Les champs sont donc identiques
    * Je ne vois pas de champ sans nom ou vide
    * Jai suprimé tous les enregistrements de la table en ne gardant que les noms des champs mais j'obtiens le même message.
    * schema.ini OK


    Dur Dur la prog en Delphi et dire que je ne suis qu'au début de mon projet !

  10. #10
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    la première ligne de ton fichier csv est-elle bien composée des titres des champs ?
    [Il était une fois Delphi ....]


  11. #11
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    si tu veux tester la requête il te suffit de récupérer la valeur de la variable "requete" dans un memo et la copier dans le mode SQL de Access !
    [Il était une fois Delphi ....]


  12. #12
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    la première ligne de ton fichier csv est-elle bien composée des titres des champs ?
    Je me pose la question suivante:

    Sur le fichier CSV des champs sont du type texte alors que dans ma base ils sont du type numerique.

    Cela peut-il provoquer une erreur?

    Ce matin j'ai changer le type des deux premiers champs de la base,le prog a retourné le même message,mais elle contient plus d'une douzaine de champs.

    Dans tous les cas je te remerci pour tes suggestions je verrai cela ce soir .

  13. #13
    Membre averti Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Points : 346
    Points
    346
    Par défaut
    effectivement cela peut poser problème !
    Il te faut donc modifier le type de chaque champ en conséquence.
    [Il était une fois Delphi ....]


  14. #14
    Futur Membre du Club
    Inscrit en
    Septembre 2008
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 18
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    la première ligne de ton fichier csv est-elle bien composée des titres des champs ?
    Voila,l'erreur venait de là.
    Mon fichier CSV contenait des retours charriots qui étaient ignorés lorsque je l'ouvrais avec EXCEL,mais une présence inconnue a été rendue visible dans l'editeur de texte.Il a suffit de l'ouvrir puis de nouveau l'enregistrer sous EXCEL.


    Merci zemeilleurofgreg tout fonctionne parfaitement.

    A+

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

Discussions similaires

  1. [Toutes versions] Copier données feuille Excel vers table Access sans doublons
    Par dragoes64 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/09/2011, 09h11
  2. Envoyer une plage Excel vers une base Access
    Par alain59320 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 04/01/2009, 19h21
  3. données tableau excel vers table access ?
    Par alexkickstand dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/09/2007, 21h11
  4. Importer des données d'une feuille Excel vers TABLE
    Par souminet dans le forum Bases de données
    Réponses: 1
    Dernier message: 07/11/2006, 09h10
  5. [débutant] importation de données d'excel vers table
    Par vivelesgnous dans le forum Access
    Réponses: 6
    Dernier message: 24/02/2006, 21h13

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