Comment coder delphi (pascal) pour récuperer certains champs d'une feuille exel (csv) et les copier dans une table de la 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.
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.
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.
Bonjour,
voici ce qu'il te faut pour importer un csv vers une table Access :
Et pour appeler ce 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
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;
Code : Sélectionner tout - Visualiser dans une fenêtre à part ImportDirectCVSToBase(ADOconnection1,cheminfichiercsv, nomfichiercsv, DBPath, 'matable',';');
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+
Salut,
résolvons le problème des pseudos messages d'erreurs ...
voici le code modifié pour toi :
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 !
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.
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 !
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:
Quelqu'un peut-il m'expliquer ; tous les champs portent un nom?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.
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 !
la première ligne de ton fichier csv est-elle bien composée des titres des champs ?
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 !
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 .
effectivement cela peut poser problème !
Il te faut donc modifier le type de chaque champ en conséquence.
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+
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager