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:
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:
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.
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:
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 ; |
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.