TSDFDataset et transfert vers SQLITE
Bonjour,
Toujours en phase d'apprentissage de Lazarus, je bute sur une nouvelle difficulté.
Je souhaite importer un fichier de type texte (séparateur de champs ; - fin de ligne par retour ligne) par Lazarus afin d'en importer les champs dans une table (Sproduit dans mon cas) d'une base SQLITE3. Dans mon cas, j'ai choisi d'importer à l'intérieur d'une boucle les champs du fichier Texte (CSV) vers divers TEdit puis d'injecter le contenu du Tedit dans la table SQLITE gérée par les composants Zeos (l'importation directe sans passer par le TEdit serait certainement plus élégante).
Le code est le suivant :
Code:
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
| procedure TFormStocks.Bt_LancimpCSVClick(Sender: TObject);
Var FichimpCSV : String ; // le nom complet du fichier CSVà traiter
Var Fich_CSV : TextFile ;
// Var TamponCSV : String ;// variable de stockage temporaire de la ligne du fichier CSV en cours de lecture
// Var Nomcolprod : String ; // Le Nom de chacune des colonnes du fichier CSV à importer
// Var NomcolDes : String ;
// Var Nomcolcat : String ;
// Var NomcolPrix : String ;
// Var NomcolQt : String ;
Var NbenrTotCSV : String ;
Var ii : integer ;
// Var icolCSV : Integer ; // Le nom de colonnes du fichier CSV (traduit en entier)
begin
Try
FichimpCSV := FNE_impCSV.FileName ; // Choix du fichier à importer (utilsasation d'un TfileEditName
Sdf_SQlite.active := False ;
assignfile(Fich_CSV, FichimpCSV) ; //assignation de Fic_CSV comme un fichier texte
Sdf_Sqlite.FileName := FichimpCSV ; //QuotedStr('FichimpCSV') ; // renseigne les propriétés du contrôle TSDFDataset : Sdf_SQLite -
Sdf_SQlite.Delimiter := ';';
Sdf_SQlite.FirstlineAsSchema := True ; // La première ligne du fichier CSV est le nom de la colonne
// La propriété FieldsDefs du contrôle Sdf_Sqlite est définie avec 5 champs
// FiledProd FieldDesign.. correspondants à ceux de la table Sproduit
//ils sont tous du type frString
ZC_Stock.Connected := True ; // on s'assure que les accès à la table SProduit sont possibles
ZQ_Stock.active := True ;
//****************************************************
// fin de la configuration du contrôle TSdfDataset Sdf_SQlite
Sdf_Sqlite.Open ; //Ouverture du fichier CSV
reset(Fich_CSV) ; // se positionne à la première ligne du fichier
NbenrTotCSV := intToStr(Sdf_SQlite.recordcount) ;
// icolCSV := StrToInt(ED_NbColCSV.Text) ;
ii := 0 ; // compteur de lecture du fichier à importer
While not EOF(Fich_CSV) Do // la référence au fichier CSV est faite à partir du nom de l'asignation
Begin
ii := ii +1 ;
Lb_Compt1.caption := intToStr(ii) + ' / ' + NbenrTotCSV ; //Nb d'enreistremets lus et Nb total
// Traitement des enregistrements
Ed_ProdC.text := Sdf_SQlite.FieldByName(quotedStr('FieldProd')).AsString ; // Lecture et affectation du champ du CSV
Ed_DesC.text := Sdf_SQlite.FieldByName('FieldDesign').AsString ;
Ed_CatC.text := Sdf_SQlite.FieldByName('FieldCat').AsString ;
Ed_PrixC.text := Sdf_SQlite.FieldByName('FieldPrix').AsString ;
Ed_QtC.text := Sdf_SQlite.FieldByName('FieldQt').AsString ;
// transfert du contenu vers la Table Sproduit de la DB
DBED_Produit.datafield := Ed_ProdC.text ; // injection de la donnée dans la table Sproduit
DBED_Designation.DataField := Ed_DesC.text;
DBCB_Categorie.datafield := Ed_CatC.text ;
// DBED_Prix.datafield := '12,32' ;
// DBED_Quantite := Ed_QtC.text ;
// Mise à jour de la table
ZQ_Stock.append;
ZQ_Stock.post ;
end;
Closefile (Fich_CSV) ; // fermeture du fichier CSV après lecture
Sdf_SQlite.active := False ;
ZQ_Stock.active := False ;
ZC_Stock.Connected := False ;
ShowMessage('Importation du fichier texte réussie ');
Except
ShowMessage(' Vérifiez le nom complet et la structure du fichier à importer') ;
end;
end; |
Cela fonctione convenablement pour le choix de la base mais la boucle d'importation pour l'ajout à la table SQLITE provoque une erreur sur la ligne :
Code:
1 2 3 4
| Ed_ProdC.text := Sdf_SQlite.FieldByName(quotedStr('FieldProd')).AsString ; // Lecture et affectation du champ du CSV
Ed_DesC.text := Sdf_SQlite.FieldByName('FieldDesign').AsString ;
Ed_CatC.text := Sdf_SQlite.FieldByName('FieldCat').AsString ;
Ed_PrixC.text := Sdf_SQlite.FieldByName('FieldPrix').AsString ; |
Quelqu'un pourrait-il me dire là ou cela ne colle pas.
Merci
R.O.