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 :

[SQLite] Construction par code [Lazarus]


Sujet :

Lazarus Pascal

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut [SQLite] Construction par code
    Bonjour,

    Reprenant mon initiation à l'environnement Lazarus, et tout particulièrement à la gestion des bases de données, je me heurte à quelques difficultés.
    Mon objectif est de créer, renseigner, modifier et extraire dans un environnement monoposte une base de données. J'utilise pour cela une base de type SQLITE3 et la palette de composants Zeos.
    J'ai réussi (non sans mal, mais rien d'étonnant à cela ) à*:
    - Construire un formulaire qui permet d'accéder à la création/ouverture d'une base de données puis à ouvrir (au choix) l'une des deux tables de cette base (form1). Ce formulaire contient donc les divers contrôle Zeos*: Zlit_Stock (TZ connection), ZquerStocks (TZQuery), Ztb_Stock et Tdatasource*: Donnees.
    L'ouverture de la table étant acquise, ce formulaire est masqué pour laisser la place à un autre formulaire (form_remplir) qui sera destiné à gérer la base de données. Il contient des contrôles «*Tedit*» destinés à recevoir les informations qui viendront renseigner les divers champs de la table concernée. Il continent aussi des contrôles boutons ( contrôles TBItBtbn) destinés à créer un enregistrement vide ( Bt_Nouveau), valider la création de l'enregistrement après avoir renseigné les champs correspondants, sélectionner un enregistrement pour le modifier, sélectionner un enregistrement pour le supprimer.
    La communication entre les divers formulaires est convenablement assurée (d'après mes tests) par les déclarations d'unités.
    La compilation se déroule sans problème, ainsi que la création de la base et des tables. Par contre, lorsque je tente d'ajouter un enregistrement (Click sur Nouveau – form_remplir) j'ai un message d'erreur*: SQL error*: SQL logic error or missing Database .
    J'ai donc certainement oublié de renseigner quelque chose dans les contrôles de la form1 ou des instructions manquent pour que la table soit accessible mais Quoi*?
    Mon code pour les deux feuilles concernées suit*:
    FORM1 :
    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
     
    procedure TForm1.Bt_creatClick(Sender: TObject);
    Var NomRepBase : String ;
    Var Dnombase :string ;
    Var NomBase0 : String ;
    Var Cree_tableSQL : string ;
    Var Cree_table2SQL : string ;
     var Toto : string ;
     
    begin
         NomRepBase := Dir_RepBase.Text ;
         NomBase0 :=  File_NomBase.text ;
         DNombase :=  NomRepBase + '\' +  NomBase0 + '.sqlite' ;
     
      if BR_Cree.checked = True Then
     
         if fileexists(DNomBase) then   // recherche si la base à déjà été créée dans le chemin complet indiqué par Dnombase
              Begin
              Showmessage ('ATTENTION - La base ' + Nombase0 + ' existe ' + #13 +'           Changer de Nom !! ') ;
              File_NomBase.Setfocus ;
              end
          Else
              Begin
              Zlit_Stock.Database := Dnombase ;
              Zlit_Stock.Connected := True  ;
               // Définition de la table Stock_A associée à la base SQLITE qui vient d'être Créée
     
               Cree_tableSQL :='CREATE TABLE Stock_A ("IDProduit" INTEGER PRIMARY KEY AUTOINCREMENT,  "Produits" VARCHAR(15), "Designation" VARCHAR(40),' ;    // ici la syntaxe est conforme
               Cree_tableSQL :=  Cree_tableSQL + '"Categorie" VARCHAR(2),"Prix" Numeric(6,2),"Quantite" Integer )';   // au langage SQL
               // Fin de la construction de la chaine de caractères définissant la structure de la table à créer
               Cree_table2SQL :='CREATE TABLE Clients ("NOM" VARCHAR(60), "Prenom" VARCHAR(120),' ;
               Cree_table2SQL :=  Cree_table2SQL + '"Ville" VARCHAR(40), "Code" VARCCHAR(5) )';
               // Définition de la seconde table
               // Création des tables
               ZQuerStocks.SQL.Clear ; // vide la chaine SQL existante   par instruction SQL du contrôle ZQuerStocks
               ZQuerStocks.SQL.Text := Cree_tableSQL ; // chargement de la commande SQL à Exécuter
               ZQuerStocks.execSql ; //Exécution de la commande SQL
               ZQuerStocks.SQL.Clear ; // vide la chaine SQL existante   par instruction SQL du contrôle ZQuerStocks
               ZQuerStocks.SQL.Text := Cree_table2SQL ; // chargement de la commande SQL à Exécuter
               ZQuerStocks.execSql ; //Exécution de la commande SQL
              // ZQuerStocks.active := True ;
              // ZTB_Stock.open ; // La table est céée on peut l'ouvrir
               // Message de succès de création de la base
               Showmessage ('Base ' + Dnombase + ' + table Créées !') ;
                edit2.caption := Dnombase ;
               end ;
                Toto := 'Coucou' ;
                edit1.caption := Toto ;
                Zlit_Stock.Connected:=True ;
             // ouverture de la table et de la feuille correspondante selon choix du bouton 'Choix de table'
        // ouverture de la base SQLITE désignée par RepBase et NomBase (valeur du bouton radio)
     
        // accéder à la table Stock_A  ou Clients
      if  BR_Produits.Checked  = True then
         Begin
         ZTb_Stock.tablename := 'Stock_A' ;
         Form_remplir.show ;
         End
         Else
         Begin
     // If BR_Clients.checked := True then
         ZTb_Stock.tablename := 'Clients' ;
         FormClient.show ;
     end ;
     End;
     
     
     
     end.
    Form_remplir:
    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
    var
      Form_remplir: TForm_remplir;
     
    implementation
    Uses
      unitstocks;  //permet l'accès à Form1 depuis le formulaire de remplissage
     
    {$R *.lfm}
     
    { TForm_remplir }
     
     
     
    procedure TForm_remplir.Bt_NouveauClick(Sender: TObject);
    var Nombase2  : string ;
     
    begin
     Nombase2 := Form1.Edit2.Text;
     Form1.Zlit_Stock.Database := nombase2 ;
     Form1.Zlit_Stock.Connected := True  ;
     
    Form1.hide ;   //masquer le formulaire d'entrée
    ED_Produit.text := '' ;  // vider les diverses boites d'entrée des variables
    Ed_Designation.text := '' ;
    Ed_Prix.text := '00.00' ;
    Ed_Quantite.Text := '0';
     
    Form1.ZTb_Stock.tableName := 'Stock_A' ;
    Form1.ZTb_Stock.active := True;
    Form1.ZTb_Stock.append;  // ajoute un enregistrement vierge à la table Stock_A
    Form1.ZTb_Stock.Fieldbyname('Produits').asstring := Ed_Produit.text;
    Form1.ZTb_Stock.Fieldbyname('Designation').asstring := Ed_Designation.text;
    Form1.ZTb_Stock.Fieldbyname('Categorie').asstring := CB_Categorie.text;
    Form1.ZTb_Stock.Fieldbyname('Prix').asFloat := Strtofloat(Ed_Prix.text) ;
    Form1.ZTb_Stock.Fieldbyname('Quantite').asinteger := Strtoint(Ed_Quantite.text);
    end;
     
    procedure TForm_remplir.Bt_ValideClick(Sender: TObject);
    begin
     Form1.ZTb_Stock.post;
    end;
     
    end.
    Je précise que la Form1 contient un DBGRID dont je ne me suis pas servi pour l'instant. Certaines lignes sont inutiles ou laissées en remarque ce sont des résidus de mes tests.
    Question subsidiaire :
    J'ai tenté de modifier la couleur du texte de certains boutons pour agrémenter l'interface (par exemple Supprimer en rouge) mais malgré la modification faite dans la "Font" du bouton rien ne se passe (Bug ?)

  2. #2
    Membre du Club
    Homme Profil pro
    retraité
    Inscrit en
    Février 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autriche

    Informations professionnelles :
    Activité : retraité
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2008
    Messages : 28
    Points : 59
    Points
    59
    Par défaut
    Bonsoir!
    Juste une suggestion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Form1.ZTb_Stock.edit;
    Form1.ZTb_Stock.append;

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Suite à la suggestion de Michel VBG
    Bonjour,
    Merci pour votre suggestion mais cela ne marche pas : Réponse : "operation cannot be performed on an inactive dataset".
    R.O.

  4. #4
    Membre averti
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 156
    Points : 331
    Points
    331
    Par défaut
    bonjour,
    je pense qu'il faut que la connexion soit désactivée lorsque tu affectes la propriété Connection à ton TZTable. Essaie ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Form1.Zlit_Stock.Connected := False ;
    Form1.Ztb_Stock.Connection := Form1.Zlit_Stock;
    Form1.ZTb_Stock.tableName := 'Stock_A' ;
    Form1.Zlit_Stock.Connected := True;
    Form1.ZTb_Stock.Open;
    Amicalement, nullosse

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

    Informations forums :
    Inscription : Mars 2010
    Messages : 206
    Points : 179
    Points
    179
    Par défaut Database - Sqlite3
    Bonjour à tous (et tout particulièrement à Nullose),

    Je remercie Nullose pour sa réponse pertinente qui m'a permis de débloquer la situation (je mets donc la discussion comme résolue). Maintenant je vais m'attaquer à l'aspect "sélection, modification des enregistrements", certainement à travers DBNavigator qui semble le contrôle le mieux adapté pour cela.

    Merci

    R.O.

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

Discussions similaires

  1. Fermeture fenetre crée par code javascript
    Par Kerod dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 27/02/2010, 00h04
  2. Tri par Codes Postaux + Noms d'entreprises
    Par matperino dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/07/2005, 14h04
  3. Retirer une clé primaire par code
    Par Arrown dans le forum Bases de données
    Réponses: 3
    Dernier message: 28/07/2004, 15h15
  4. [VCL] Scroller un contrôle par code
    Par sbeu dans le forum Composants VCL
    Réponses: 3
    Dernier message: 31/03/2004, 10h39
  5. [VB6] Datagrid afficher ou cacher des colonnes par code
    Par soazig dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 06/02/2003, 17h19

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