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

Lazarus Pascal Discussion :

TSDFDataset et transfert vers SQLITE [Lazarus]


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut 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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    hello,
    houla ! tu mixtes une lecture de fichier avec l'utilisation d'un dataset ce qui me semble complètement incompatible (sauf erreur de ma part).
    Pour te remettre dans le droit chemin voici un exemple de lecture par un tsdfdataset :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Button3Click(Sender: TObject);
    var FirstField,SecField : string;
    begin
      SdfDataSet1.First;   // on se place sur le premier enregistrement
      While not (SdfDataSet1.EOF) do  // on teste la fin des enregistrements
      begin
      //   on lit le champ ORDRS_ID
      FirstField := SdfDataSet1.FieldByName('ORDRS_ID').asString;
      // ou alors on lit le premier champ
      //FirstField :=  SdfDataSet1.Fields[0].AsString;
      SecField := SdfDataSet1.FieldByName('ORDR').asString;
     // SecField :=  SdfDataSet1.Fields[1].AsString;
      SdfDataSet1.Next; // on passe à l'enregistrement suivant
      end;
    Amicalement, nullosse

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Par défaut
    Bonjour à tous et merci encore une fois à Nullose qui m'a mis sur la voie pour résoudre mon problème. Mon code initial était inspiré d'un import dans un datgrid du livre de Mathieu Giroux. J'ai pu résoudre mon problème en associant le TSDFdataset avec un Ztable et des TDBEdit qui m'avaient déjà servi pour renseigner la table.
    Je joins, à toutes fins utiles pour un autre néophite le code que j'i utilisé pour cette procédure d'importation vers SQLIte du contenu d'un fichier Texte. Ce n'est peut-être pas le plus élaboré mais il fonctionne.
    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
    procedure TFormStocks.Bt_LancImpCSV1Click(Sender: TObject);
              Var  FichimpCSV : String ; // le nom complet du fichier CSVà traiter
              Var ChampProd : String ; // Le Nom de chacune des colonnes du fichier CSV à importer
              Var ChampDesign  : String ;
              Var ChampCat  : String ;
              Var ChampPrix : String ;
              Var ChampQt   : String ;
              Var NbenrTotCSV  : String ;
              Var ii : integer ;
    begin
      Try
        FichimpCSV :=  FNE_impCSV.FileName ; // Choix du fichier à importer (utilisation d'un TfileEditName)
        Sdf_SQlite.active := False ;
        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
        ZT_Stock.tablename := 'Sproduit' ;
        ZT_Stock.open ;
        //****************************************************
        // fin de la configuration du contrôle TSdfDataset Sdf_SQlite
        Sdf_Sqlite.Open ; //Ouverture du fichier CSV
        Sdf_Sqlite.First ; // se positionne à la première ligne du fichier-premier enregistrement
       // reset(Fich_CSV) ;  // se positionne à la première ligne du fichier
        NbenrTotCSV := intToStr(Sdf_SQlite.recordcount -1)  ;
        ii := 0 ;  // compteur de lecture du fichier à importer -initialisation
     
       While not  (Sdf_SQlite.EOF) 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'enregistrements lus et Nb total
             // Traitement des enregistrements
                ChampProd := Sdf_Sqlite.Fields[0].asString ;
                ChampDesign := Sdf_Sqlite.Fields[1].asString ;
                ChampCat := Sdf_Sqlite.Fields[2].asString ;
                ChampPrix := Sdf_Sqlite.Fields[3].asString ;
                ChampQt := Sdf_Sqlite.Fields[4].asString ;
     
             // transfert du contenu vers la Table Sproduit de la DB
             ZT_Stock.append ;
                  ZT_Stock.Fieldbyname('Produits').asstring := ChampProd ; // injection de la donnée dans la table Sproduit
                  ZT_Stock.Fieldbyname('Designation').asstring := ChampDesign ;
                  ZT_Stock.Fieldbyname('Categorie').asstring := ChampCat;
                  ZT_Stock.Fieldbyname('Prix').asFloat := StrToFloat(ChampPrix) ;
                  ZT_Stock.Fieldbyname('Quantite').asinteger := StrToInt(ChampQt) ;
               // Mise à jour de la table
             ZT_Stock.Post ;
             Sdf_Sqlite.next;  // passage à la prochaine ligne du fichier CSV à importer
             end;
             Sdf_SQlite.active := False ;
             ZT_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;
    Encore une fois merci à Nullose


    Cordialement

    R.O.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/01/2008, 11h31
  2. Transfert vers un Sagem
    Par alex6891 dans le forum Développement Mobile en Java
    Réponses: 10
    Dernier message: 27/02/2007, 16h14
  3. Migration MySQL vers SQLite
    Par fadeninev dans le forum Outils
    Réponses: 14
    Dernier message: 24/11/2006, 09h25
  4. transfert vers un serveur tcp
    Par angy_y dans le forum Réseau
    Réponses: 6
    Dernier message: 19/06/2006, 09h25
  5. Transfert vers une table selon condition
    Par Monsieur Peck dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 13/06/2006, 13h34

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