SQL - Erreur "database schema has changed"
Bonjour à tous,
Je retourne sur le forum après une petite année de silence. En effet, dans le but de compléter les fonctionnalités d'un logiciel de saisie de données généalogiques que j'avais conçu l'an passé, j'ai eu l'idée de vérifier les tables (SQLite 3) générées par ce logiciel, j'ai eu l'idée de faire afficher dans un "StringGrid" une liste simplifiée (Nom, Prénom, date de l'acte) pour chacune des 3 tables générées. Pour cela j'ai construit un mécanisme de sélection des infos à afficher (choox de la table par un groupe "boutons radio" et choix de l'année à vérifier par un "Tedit" et affichage par ordre alphabétique selon le nom des entrées effectuées, le tout avec lancement de la procédure par Click sur un bouton décdié. Ceci correspond au code 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
| procedure TF_AcACG.Bt_AffichAnClick(Sender: TObject);
Var ChoixAn, Nomtable, SQLSelaffich : String ;
Var NomCol1, NomCol2, NomCol3, AnneeSel : String ;
Var DirNomBase, Nombase0, DnomBase : String ;
Var ChoixTable : Integer ;
begin
// Choix du type d'entrées à afficher
ChoixAn := Ed_SelAn.text ;
ChoixTable := Integer(RG_ChoixVerif.ItemIndex);
Case ChoixTable of
0 : // Choix d'affichage --> Naissances
Begin
NomTable := 'Naissance' ;
NomCol1 := 'NomEnft' ;
NomCol2 := 'PrenomEnft' ;
NomCol3 := 'DtActeN' ;
AnneeSel := 'AnActN' ;
end;
1 : // Choix d'affichage --> Décès
Begin
NomTable := 'Deces' ;
NomCol1 := 'NomDCD' ;
NomCol2 := 'PrenomDCD' ;
NomCol3 := 'DtActeD';
AnneeSel := 'AnActDC' ;
end;
2 : // Choix d'affichage --> Mariages
Begin
Nomtable := 'UnionMar';
NomCol1 := 'LuiNom' ;
NomCol2 := 'LuiPrenom' ;
NomCol3 := 'DtUnion';
AnneeSel := 'AnActU' ;
end;
end;
//Connection à la base de données
DirNomBase := Dir_CreeOuvre.Text ;
NomBase0 := ED_NomBase.text ;
DNombase := DirNomBase + '\' + NomBase0 + '.db3' ;
F_AcACG.ZC_Affich.Connected := False ;
F_AcACG.ZC_Affich.Database := Dnombase ;
F_AcACG.ZC_Affich.Connected := True ;
// Requête SQL de sélection des infos à afficher
SQLSelAffich := 'Select ' + NomCol1 + ','+ NomCol2 + ',' + NomCol3 + 'From '+ NomTable ;
SQLSelAffich := SQLSelaffich + 'Where ' + AnneeSel + ' = ' + QuotedStr(ChoixAn) ;
SQLSelAffich := SQLSelAffich + ' Order by ' + NomCol1 ;
// Exécution de la requête SQL et affichage dans un StringGrid
F_AcACG.ZQ_Affich.Active := False ;
F_AcACG.ZQ_Affich.SQL.Clear ;
F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
F_AcACG.ZQ_Affich.Open ;
end; |
Ce code semble fonctionner correctement (aucune erreur à la compilation et lancement correct) mais après que le logicile ait tourné 2 ou 3 secondes un message s'affiche : "SQL Error - Database Schema has changed"
Quelqu'un a t-il une idée de ce que signifie ce message et comment y remédier
Merci
R.O.
Alanglet et Tourlourou - a/s vos propositions
Bonjour,
Merci de vous intéresser à mon problème.
Effectivement je n'avais pas vu les erreurs sur la rédaction de la requête SQL avec From et Where alors que j'y avais fait attention pour le "Order by". J'ai corrigé et il semble que cela change quelque chose car je n'ai plus le message " Database schema as changed ":D mais une erreur correspondant à une mauvaise lecture de la table concernée avec un message "Field not found "NomduChamp":(. J'avais déjà eu ce genre de message lors de mes précédentes confrontations avec SQLITE et LAZARUS mais, n'étant qu'un amateur occasionnel j'ai oublié qu'elle en était la cause et comment j'avais résolu le problème.
Mais voyons le "verre à moitié plein" et considérons que le problème à trouvé un début de solution... il reste à trouver la suite et si vous avez une suggestion.
Merci
R.O.
a/s Database schema as Changed - Fin de discussion
Bonjour,
Un mot pour signaler que j'ai trouvé une solution à mon problème qui était du, comme "alanglet" l'avait suggéré aux erreurs de syntaxe dans la rédaction de la requête SQL. Les dysfonctionnements signalés par la suite (message de 12H46) étaient imputables à des défauts de paramétrage des diverses propriétés du StringGrid et des containers Zeos et (ZC et ZQ) et data Access associés dont certains étaient mal ou non renseignés car je n'avais pas déroulé les fenêtres qui apparaissent en cascade quand on clique dessus, en particulier pour ce qui est de la propriété Column du DBStringGrid qui fait apparaitre la liste des items puis pour chaque Item ses propriétés et en particulier le champ concerné.
Je joins à toutes fins utiles mon code actuel :
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
| procedure TF_AcACG.Bt_AffichAnClick(Sender: TObject);
Var ChoixAn, Nomtable, SQLSelaffich : String ;
Var NomCol1, NomCol2, NomCol3, AnneeSel : String ;
Var DirNomBase, Nombase0, DnomBase : String ;
Var ChoixTable : Integer ;
begin
//Choix de la base de données
DirNomBase := Dir_CreeOuvre.Text ;
NomBase0 := ED_NomBase.text ;
DNombase := DirNomBase + '\' + NomBase0 + '.db3' ;
//Connection à la base de données
F_AcACG.ZC_Affich.Connected := False ;
F_AcACG.ZC_Affich.Database := Dnombase ;
F_AcACG.ZC_Affich.Connected := True ;
// Choix du type d'entrées à afficher
ChoixAn := Ed_SelAn.text ;
ChoixTable := Integer(RG_ChoixVerif.ItemIndex);
Case ChoixTable of
0 : // Choix d'affichage --> Naissances
Begin
// Identification des variables à afficher
NomTable := 'Naissance' ;
NomCol1 := 'NomEnft' ;
NomCol2 := 'PrenomEnft' ;
NomCol3 := 'DtActeN' ;
AnneeSel := 'AnActN' ;
// Requête SQL de sélection des infos à afficher
SQLSelAffich := 'Select ' + NomCol1 + ','+ NomCol2 + ',' + NomCol3 + ' From '+ NomTable ;
SQLSelAffich := SQLSelaffich + ' Where ' + AnneeSel + ' = ' + QuotedStr(ChoixAn) ;
SQLSelAffich := SQLSelAffich + ' Order by ' + NomCol1 ;
// Exécution de la requête SQL et affichage dans un StringGrid
F_AcACG.ZQ_Affich.Active := False ;
F_AcACG.ZQ_Affich.DataSource := F_Naiss.DataNaiss ;
F_AcACG.ZQ_Affich.SQL.Clear ;
F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
F_AcACG.ZQ_Affich.Open ;
end;
1 : // Choix d'affichage --> Décès
Begin
// Identification des variables à afficher
NomTable := 'Deces' ;
NomCol1 := 'NomDCD' ;
NomCol2 := 'PrenomDCD' ;
NomCol3 := 'DtActeD';
AnneeSel := 'AnActDC' ;
// Requête SQL de sélection des infos à afficher
SQLSelAffich := 'Select ' + NomCol1 + ','+ NomCol2 + ',' + NomCol3 + ' From '+ NomTable ;
SQLSelAffich := SQLSelaffich + ' Where ' + AnneeSel + ' = ' + QuotedStr(ChoixAn) ;
SQLSelAffich := SQLSelAffich + ' Order by ' + NomCol1 ;
// Exécution de la requête SQL et affichage dans un StringGrid
F_AcACG.ZQ_Affich.Active := False ;
F_AcACG.ZQ_Affich.DataSource := F_Deces.DataDC ;
F_AcACG.ZQ_Affich.SQL.Clear ;
F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
F_AcACG.ZQ_Affich.Open ;
end;
2 : // Choix d'affichage --> Mariages
Begin
// Identification des variables à afficher
Nomtable := 'UnionMar';
NomCol1 := 'LuiNom' ;
NomCol2 := 'LuiPrenom' ;
NomCol3 := 'DtUnion';
AnneeSel := 'AnActU' ;
// Requête SQL de sélection des infos à afficher
SQLSelAffich := 'Select ' + NomCol1 + ','+ NomCol2 + ',' + NomCol3 + ' From '+ NomTable ;
SQLSelAffich := SQLSelaffich + ' Where ' + AnneeSel + ' = ' + QuotedStr(ChoixAn) ;
SQLSelAffich := SQLSelAffich + ' Order by ' + NomCol1 ;
// Exécution de la requête SQL et affichage dans un StringGrid
F_AcACG.ZQ_Affich.Active := False ;
F_AcACG.ZQ_Affich.DataSource := F_Mariage.DataMar ;
F_AcACG.ZQ_Affich.SQL.Clear ;
F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
F_AcACG.ZQ_Affich.Open ;
end;
end;
end; |
Je sais bien qu'il est plutôt rustique car des informations redondantes apparaissent aux 3 niveaux proncipaux de subdivision, mais il fonctionne.
Peut-être essaierais-je de le rendre beaucoup plus élégant un peu plus tard, simplement pour le plaisir.
Cordialement et merci à ceux qui ce sont intéressés au problème.
R.O.
a/s Database schema as Changed - Fin de discussion
Bonjour,
Désolé mais je reviens sur le sujet car je me suis aperçu que j'avais oublié quelques paramétrages obligatoires par code sur le StringGrid et que la structure n'était vraiment pas élégante. Alors je propose le code suivant que j'ai modifié en conséquence, l'objectif étant toujours d'afficher les données de 3 tables différentes dans un même StringGrid:
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
| procedure TF_AcACG.Bt_AffichAnClick(Sender: TObject);
Var ChoixAn, Nomtable, SQLSelaffich : String ;
Var NomCol1, NomCol2, NomCol3, AnneeSel : String ;
Var DirNomBase, Nombase0, DnomBase : String ;
Var ChoixTable : Integer ;
begin
//Choix de la base de données
DirNomBase := Dir_CreeOuvre.Text ;
NomBase0 := ED_NomBase.text ;
DNombase := DirNomBase + '\' + NomBase0 + '.db3' ;
//Connection à la base de données
F_AcACG.ZC_Affich.Connected := False ;
F_AcACG.ZC_Affich.Database := Dnombase ;
F_AcACG.ZC_Affich.Connected := True ;
// Choix du type d'entrées à afficher
ChoixAn := Ed_SelAn.text ;
ChoixTable := Integer(RG_ChoixVerif.ItemIndex);
Case ChoixTable of
0 : // Choix d'affichage --> Naissances
Begin
// Identification des variables à afficher
NomTable := 'Naissance' ;
NomCol1 := 'NomEnft' ;
NomCol2 := 'PrenomEnft' ;
NomCol3 := 'DtActeN' ;
AnneeSel := 'AnActN' ;
end;
1 : // Choix d'affichage --> Décès
Begin
// Identification des variables à afficher
NomTable := 'Deces' ;
NomCol1 := 'NomDCD' ;
NomCol2 := 'PrenomDCD' ;
NomCol3 := 'DtActeD';
AnneeSel := 'AnActDC' ;
end;
2 : // Choix d'affichage --> Mariages
Begin
// Identification des variables à afficher
Nomtable := 'UnionMar';
NomCol1 := 'LuiNom' ;
NomCol2 := 'LuiPrenom' ;
NomCol3 := 'DtUnion';
AnneeSel := 'AnActU' ;
end;
end ;
// Requête SQL de sélection des infos à afficher
SQLSelAffich := 'Select ' + NomCol1 + ' , '+ NomCol2 + ' , ' + NomCol3 + ' From '+ NomTable ;
SQLSelAffich := SQLSelaffich + ' Where ' + AnneeSel + ' = ' + QuotedStr(ChoixAn) ;
SQLSelAffich := SQLSelAffich + ' Order by ' + NomCol1 ;
// Exécution de la requête SQL et affichage dans un StringGrid
DBGrid_alpha.columns[0].FieldName := NomCol1 ;
DBGrid_alpha.Columns[1].FieldName := NomCol2 ;
DBGrid_alpha.Columns[2].Fieldname := NomCol3 ;
F_AcACG.ZQ_Affich.Active := False ;
// F_AcACG.ZQ_Affich.DataSource := quotedStr(ContainData);
F_AcACG.ZQ_Affich.SQL.Clear ;
F_AcACG.ZQ_Affich.SQL.Text := SQLSelAffich ;
F_AcACG.ZQ_Affich.Open ;
end; |
Merci
R.O.