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 :

Gestion base SQLITE - DBedit - DBnavigator [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 Gestion base SQLITE - DBedit - DBnavigator
    Bonjour,

    J'utilise pour gérer une base de données SQLITE le couple "ensemble de DBEdit" - "DBNavigator". Si je parcours les enregistrements ou si j'ajoute un enregistrement à la base : (click sur + , entrée des données puis click sur Post) la création d'un nouvel enregistrement ne pose pas de problèmes. Dés que je veux soit effacer soit modifier un enregistrement existant ( Click sur edit puis sur post j'ai un message d'erreur : " LE Projet ... a levé une classe d'exception avec le message : Operation is not allowed in READ ONLY Mode".
    J'ai vérifié et aucun des composants ou contrôles utilisés n'ont de propriété "Read Only" à " True" dans l'ensemble utilisé et, pire, j'ai déjà dans une autre base utilisé exactement le même type de syntaxe et de composants et tout fonctionne bien.
    Le code qui pourrait être mis en cause est le suivant :
    1 - la partie qui permet la connection à la base de données ( l'interface est contenue dans un Tpanel) :
    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
      if BR_Promo.Checked = True then
                 Begin
                 Pan_Promo.caption := '';
                 EdNomPromo.Text := '' ;
                 EdNumPromo.Text := '';
                 Pan_Promo.Height := 195 ;
                 Pan_Promo.Width := 475 ;
                 Pan_Promo.visible := True;
                 // Préparation de la connection à la table NomPromo
                 ZC_MaPromo.Database := Dnombase ;
                 ZC_Mapromo.Connected := True ;
                 SQLOuvPromo := 'Select * From Nompromo' ;
                 ZQ_Ecole.SQL.Clear ;
                 ZQ_Ecole.SQL.Text := SQLOuvPromo ;
                 ZQ_Ecole.ExecSQL ;
                 ZQ_Ecole.active := True ;
                 end;
    2 -puis la partie utilisation du DBNavigator :

    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
    procedure TForm_Ecole.DBNavPromoClick(Sender: TObject; Button: TDBNavButtonType
      );
    Var Flag1 : String ;
    Var Nbenr : String;
    Var NumEnr : String;
    Var NomPromo1 : String ;
    Var NumPromo1 : String;
    Var Period1 : String;
    begin
     NomPromo1:= DBNomPromo.text;   // récupération des valeurs par défauts dans la base
     NumPromo1 := DBNumPromo.text;
     Period1 := DBPeriod.text;
     EDNomPromo.Text := NomPromo1 ; // affectation des valeurs aux contrôles ED
     EDNumPromo.Text := NumPromo1 ;
     MEDPeriod.Text := Period1 ;
    Case Button of
         NbPost  : Flag1 := 'OK1' ;  // Types d'actions à réaliser par le DBNavigator
         NbRefresh : Flag1 := 'OK2' ;
         Nbfirst : Flag1 := 'OK3' ;
         NbPrior : Flag1 := 'OK3' ;
         NbNext  : Flag1 := 'OK3' ;
         NbLast  : Flag1 := 'OK3' ;
    end;
    // ************************* ajout ou rafraichissement de la table Promo
     
    if Flag1 = 'OK1' Then
    Begin
         Nbenr:= intToStr(ZQ_Ecole.recordcount) ;
         Lb_Enr.caption := Nbenr + ' Enr.' ;
         DBPeriod.Text := MedPeriod.Text ; //affectation des invariants aux champs de la table Promo
         DBNomPromo.text := EDNomPromo.text ;
         DBNumPromo.Text := EDNumPromo.text ;
         showmessage ('Enregistrement ajouté avec succès') ;
    End ;
    if Flag1 = 'OK2' Then
       Begin
       Try
       Nbenr:= intToStr(ZQ_Ecole.recordcount) ;  // affichage Position et Nb d'enregistrements
       NumEnr := intToStr(ZQ_Ecole.RecNo) ;
       Lb_Enr.caption := NumEnr + ' / ' + NbEnr + ' Enr.' ;
       DBPeriod.Text := MedPeriod.Text ; //affectation des invariants aux champs de la table Promo
       DBNomPromo.text := EDNomPromo.text ;
       DBNumPromo.Text := EDNumPromo.text ;
       showmessage ('Enregistrement modifié avec succès') ;
       Except
       showmessage ('Verifiez  vos entrées');
    if Flag1 = 'OK3' Then
       Begin
       Nbenr:= intToStr(ZQ_Ecole.recordcount) ;
       NumEnr := intToStr(ZQ_Ecole.RecNo) ;
       Lb_Enr.caption := NumEnr + ' / ' + NbEnr + ' Enr.' ;
    End ;
    end;
    end ;
    end;
    Quelqu'un peut-il me dire ce qui ne colle pas ?

    Merci par avance


    R. O.

  2. #2
    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 Database SQLITE - DBNavigator - Edit - Refresh
    Bonjour,

    Je relance autrement la discussion que j'avais postée le 04/10 - En effet, j'ai revu mon code, vérifié certaines hypothèses et.... je suis toujours bloqué sur des options impliquant la modification des champs d'une table à l'aide du composant DBNavigator avec le message suivant : " LE Projet ... a levé une classe d'exception avec le message : Operation is not allowed in READ ONLY Mode"..
    Il semble donc que les enregistrements stockés dans ma table soient considérés comme étant en "lecture seule" . Je peux cependant ajouter de nouveaux enregistrements sans problème (bouton NbINsert + NbPost). J'ai bien vérifié que les TDBedit que j'utilise ont tous la propriété ReadOnly à "False" et que le TZQuery que j'utilise est lui aussi à False. La valeur du SQL de TZQuery est "Select * from Nomtable".
    J'ai, comme je l'ai déjà mentionné, utilisé une syntaxe tout à fait similaire dans la construction d'une autre application et cela à fonctionné sans Problèmes.
    Je remet en joint le code concerné. De plus, je m'aperçois que dans le DBNavigator le bouton NbDelete ne s'affiche pas même si son affichage est à "True" . CEla était déjà le cas dans l'autre application que j'ai construit. Est-ce normal ?

    Mon 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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    procedure TForm_Ecole.DBNavPromoClick(Sender: TObject; Button: TDBNavButtonType
      );
      Var Flag1 : String ;
      Var Nbenr : String;
      Var NumEnr : String;
     // Var LogoEcole : String ;
    begin
    // NomECole := EdEcole.text ;
    // DBNomEcole.Text :=  NomEcole ;
    Case Button of
         NbPost  : Flag1 := 'OK1' ;  // Types d'actions à réaliser par le DBNavigator
         NbRefresh : Flag1 := 'OK2' ;
         Nbfirst : Flag1 := 'OK3' ;
         NbPrior : Flag1 := 'OK3' ;
         NbNext  : Flag1 := 'OK3' ;
         NbLast  : Flag1 := 'OK3' ;
         NbDelete : Flag1 := 'OK4' ;
    end;
    // ************************* ajout ou rafraichissement de la table Promo
             DBNomEcole.Text:= EdEcole.Text ;
             DBSigLEcole.Text := EdSiglEcole.Text ;
             DBLogoEcole.Text := Ed_LogoEcol.Text ;
             DBNomPromo.text := EdNomPromo.Text ;
             DBNumPromo.Text := EdNumPromo.Text;
             DBPeriod.Text := MEdPeriod.Text;
     
    if Flag1 = 'OK1' Then
      Begin
     
        Try
             Nbenr:= intToStr(ZQ_promo.recordcount) ;  // compteur d'enregistrements
             Lb_Enr.caption := 'Enr. N° : ' + Nbenr  ;
             //les noms de section long et court sont directement des DBedit
             showmessage ('Enregistrement ajouté avec succès') ;
         Except
             ShowMessage ('Vérifiez vos entrées ! ') ;
         end;
      End ;
     
    if Flag1 = 'OK2' Then
     Begin
          ZQ_Promo.readonly := False ;
       Try
         Nbenr:= intToStr(ZQ_promo.recordcount) ;  // affichage Position et Nb d'enregistrements
         NumEnr := intToStr(ZQ_promo.RecNo) ;
         Lb_Enr.caption := NumEnr + ' / ' + NbEnr + ' Enr.' ;
          showmessage ('Enregistrement modifié avec succès') ;
         Except
          showmessage ('Verifiez  vos entrées');
         End ;
     End ;

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    bonjour,

    Désolé du retard , je vais très peu sur le forum Lazarus .

    TZQuery implique une utilisation des ZEOSDBO composant (me trompe-je dirais l'éléphant ?) . Si c'est le cas il faut ajouter un TZUpdateSQL

  4. #4
    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 SQLITE3- Lazarus- Mise à jour d'un enregistrement
    Bonjour à tous et merci à SergioMaster pour sa suggestion.
    J'ai suivi le conseil et ajouté un TZUpdate au TZQuery. Après avoir fouiné sur le forum et consulté la FAQ de SQL j'ai réussi à faire fonctionner la fonction INSERT (Insert INTO( champ1 , champ2,...) VALUES ( val1, Val2 ,...) mais je bute un peu sur la fonction "Mise a jour d'un enregistrement" (ModifySQL du composant SQL) . En effet selon l'aide SQL que j'ai consultée la syntaxe serait du type : UPDATE nomtable1 SET NomCHAMP1 = "valeur champ1", NomCHAMP2 = "valeurchamp2", ... et ce pour chaque champ WHERE Nom CHAMP4 = "Valchamp4" etc.. . Si l'on a beaucoup de champs dans la table cela va devenir très lourd a écrire.
    Mon objectif est de modifier la valeur d'un champ quelconque d'une table suite par exemple à un enregistrement erroné suite à une faute de frappe (ce qui peut se produire pour n'importe quel champ ou à un changement de données (changement d'adresse par exemple). Est-ce nécessaire de renseigner la clause WHERE ou les clauses UPDATE ... SET ... suffisent -elles ?
    De plus, j'ai vu sur certains sites que la syntaxe du UPDATE était := et non simplement = quelqu'un pourrait-il m'éclairer sur la présence des :.
    Enfin je n'ai toujours pas dans le DBnavigator d'affichage du bouton - (delete) . Ma version W32 Lazarus 1.08 - SQLIte 3 - Zeos 7.0 .

    Merci d'avance


    R. O.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,



    • Un bout de code lorsque je testais la récupération du N° des erreurs en pgSQL9... et non pas avec Zeos [je n'utilise plus] mais avec un classique TSQLQuery [et sans TZUpdate que j'ai abandonné rapidement quand j'utilisais Zeos notamment à cause de la difficile (impossible ?) gestion des problèmes de verrous (mais cela ne concerne pas SQLlite à moins que vous ne vouliez réaliser un code portable)].

    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
    procedure TFormMain.Button10Click(Sender: TObject);
    var strm: TStream;
      Result : boolean;
    begin
      strm:=TMemoryStream.Create;
      imgSrc.Picture.SaveToStream(strm);
      with pgQueryUID do try
         if not DataBase.Connected then DataBase.Connected := True;
         Close;
         TSQLTransaction(pgQueryUID.Transaction).StartTransaction;
         with SQL, Params do begin
           Clear;
           SQL.Text := 'INSERT INTO test2012 '+
                       '(teid, tenom, teblob) '+
                       'VALUES ' +
                       '(:paID, :paNOM, :paIMAGE );';
           ParamByName('paID').AsString  := AleaString();
           ParamByName('paNOM').AsString := 'TEST numéro 6';
           ParamByName('paIMAGE').SetBlobData(Strm, Strm.Size);
         end;
         ExecSQL;
         Close;
         TSQLTransaction(pgQueryUID.Transaction).Commit;
         Result := True;
       except
         on E: EPQDatabaseError do
           begin
              TSQLTransaction(pgQueryUID.Transaction).Rollback;
             Showmessage('Database error: '+
             'Severity:           '+E.Severity + LineEnding +
             'SQLSTATE:           '+E.SQLSTATE + LineEnding +
             'Primary mesage:     '+E.MESSAGE_PRIMARY + LineEnding +
             'Detailed message:   '+E.MESSAGE_DETAIL + LineEnding +
             'Message hint:       '+E.MESSAGE_HINT + LineEnding +
             'Statement position: '+E.STATEMENT_POSITION);
             Result := False;
           end;
        on Z: Exception do
           begin
             // Assume it's an executable query.
             // A query containing a syntax error etc will be wrongly detected as executable
             // todo: fix this based on detailed error message retrieved from db!?!?
             showmessage('Exception : '+Z.ClassName+'/'+Z.Message);
           end;
       end;
        strm.Free;
     end;
    J'espère que cela pourra répondre un peu à votre question.
    Bonne continuation. Cordialement. Gilles
    Dernière modification par Invité ; 21/10/2013 à 19h15.

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 658
    Billets dans le blog
    65
    Par défaut
    Bonsoir,

    Non il 'est très facile de créer les SQL , il y a juste un clic droit (ou un Double clic , je ne sais plus ) à faire sur le ZUpdate et un joli wizard se met en place

    Quant à la clause Where , c'est un peu la même chose on sélectionne les champs 'clé' , les champs à modifier et ça roule

    Enfin je n'ai toujours pas dans le DBnavigator d'affichage du bouton - (delete) .
    vérifier les options du DBNavigator

  7. #7
    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,

    Après de nombreux essais, j'ai fini par trouver une réponse à réponse à mon problème. En effet, il semble sue le DBNavigator dispose, lui-même, de tous les outils lui permettant de gérer efficacement les commandes d'ajout, modification ou suppression d'enregistrements. Pour ce faire il suffit donc de rendre la table active par la séquence d'instructions de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ZQ_Promo.Active := False ;
           ZQ_promo.SQL.Clear ; // Mise à zéro de la chaîne SQL
           ZQ_promo.SQL.Text := SQLOuvPromo ;
           ZQ_promo.active := True ; //Connexion à la table InfoPromo OK
    et surtout pas de créer ensuite une instruction d’exécution du type :
    ZQ_Promo.execSQL ; qui passe la table en lecture seule d'où les messages d'erreur que j'avais.
    La question est enfin résolue pour moi. Ouf en attendant le prochain écueil.

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

Discussions similaires

  1. Eclipse + gestion base de données
    Par fanette dans le forum Eclipse Java
    Réponses: 11
    Dernier message: 04/11/2018, 19h41
  2. Gestion Base de données SQLite
    Par AnonymZZ dans le forum Android
    Réponses: 6
    Dernier message: 27/11/2013, 17h41
  3. Gestion Base de données SQLITE
    Par Thethros dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 25/06/2011, 04h23
  4. Compresser/Compacter une base Sqlite
    Par Gold.strike dans le forum SQLite
    Réponses: 1
    Dernier message: 18/07/2006, 10h12

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