[SQLite/Zeos] Problème de remplissage d'une table
Bonjour,
J'ai un problème de remplissage d'une table (BD -Sqlite3) à partir des composants Zeos :
l'instruction
Code:
Dm_rap.ZT_Synth.FieldByName('Nb_Ind').AsString := Ed_Col2.Text ;
ou toute autre instruction similaire provoque une erreur à l'exécution du code.
ZT_Synth est un TZConnexion de Zeos situé dans un data module de nom Dm_rap.
Le nom de la table est Synth et Nb_Ind et le nom de l'un des champs de cette table. Ed_Col2 est un TEdit placé sur la page de travail.
La création et l'ajout d'enregistrements à la table fonctione parfaitement à la suite d'instructions suivantes :
Code:
1 2 3
| Dm_Rap.ZC_synth.Connected := False ;
Dm_Rap.ZC_synth.Database := DNombaseC ;
Dm_Rap.ZC_synth.Connected:= True ; |
......
Code:
1 2 3 4 5 6 7 8
| Dm_rap.ZT_Synth.Close ;
Dm_rap.ZT_Synth.Connection := Dm_rap.ZC_Synth ;
Dm_rap.ZT_Synth.TableName := 'Synth' ;
Dm_rap.ZT_Synth.Active := True ;
Dm_rap.ZT_Synth.append ;
Dm_rap.ZT_Synth.FieldByName('Nb_Ind').AsString := Ed_col2.Text ;
Dm_rap.ZT_Synth.Post ; //Sauvegarde des valeurs dans la table
Dm_rap.ZT_Synth.Close ; // Fermeture de la table |
Ce que j'ai pu vérifier en rendant inactive (//) l'instruction
Code:
Dm_rap.ZT_Synth.FieldByName('Nb_Ind').AsString := Ed_col2.Text ;
et en utilisant SQliteAdmin pour vérifier l'éventuelle création des enregistrements.
J'ai essayé d'utiliser L'instruction QuotedStr pour vérifier si cela corrigeait l'erreur, en vain.
Merci pour vos éventuelles suggestions.
Cordialement
R.O.
Précisions apportées à mon message
Citation:
Envoyé par
Jipété
Salut,
on croit rêver...
Mais de quelle erreur parles-tu, bon sang de bois ?
Ah ben vi, tu parles de l'erreur générée par on ne sait trop quoi puisqu'on n'a rien, aucune info sur cette fichue erreur ! :massacre: :rouleau: :furieux: :langue:
:cristal:
Et bon, une fois cette énigme résolue, je n'irai pas plus loin, ne connaisant rien aux B2D.
Bonjour,
Effectivement mon message manquait de clarté car j'ai voulu essayer de faire court. Je n'avais pas précisé l'erreur car j'avais encadré le code par une instruction Try Except End qui empêchait l'affichage de l'erreur.
Le code complet de la boucle qui doit permettre de remplir la table est :
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
| DNomBaseC := F_PromoA.Ed_NomComplet.Text ; //Chemin complet et nom de la base à traiter
Dm_Rap.ZC_synth.Connected := False ;
Dm_Rap.ZC_synth.Database := DNombaseC ;
Dm_Rap.ZC_synth.Connected:= True ;
For lgn := 1 to NbSections+2 Do
Begin
Ed_Col1.Text := SynthPromo[1, lgn] ;
Ed_Col2.Text := SynthPromo[2, lgn] ;
Ed_Col3.Text := SynthPromo[3, lgn] ;
Ed_Col4.Text := SynthPromo[4, lgn] ;
Ed_Col5.Text := SynthPromo[5, lgn] ;
Ed_Col6.Text := SynthPromo[6, lgn] ;
Dm_rap.ZT_Synth.Close ;
Dm_rap.ZT_Synth.Connection := Dm_rap.ZC_Synth ;
Dm_rap.ZT_Synth.TableName := 'Synth' ;
Dm_rap.ZT_Synth.Active := True ;
Dm_rap.ZT_Synth.append ;
// Dm_rap.ZT_Synth.FieldByName(QuotedStr('IdentSynth')).AsString := Ed_col1.Text ;
Dm_rap.ZT_Synth.FieldByName('Nb_Ind').AsString := Ed_Col2.Text ;
// Dm_rap.ZT_Synth.FieldByName('Nb_IndPDV').AsString := Ed_col3.Text ;
// Dm_rap.ZT_Synth.FieldByName('Nb_IndDCD').AsString := Ed_Col4.Text ;
// Dm_rap.ZT_Synth.FieldByName('pc_IndPDV').AsString := Ed_Col5.Text;
// Dm_rap.ZT_Synth.FieldByName('pc_IndDCD').AsString := Ed_Col6.Text ;
Dm_rap.ZT_Synth.Post ; //Sauvegarde des valeurs dans la table
Dm_rap.ZT_Synth.Close ; // Fermeture de la table
end; |
.
j'ai passé en instrucyion non exécutable tous les champs de la table sauf un pour tester le code.
L'erreur déteté est : Le champ "'Nb_Ind"' n'est pas trouvé. Pourtant il existe bel et bien et comme je l'ai indiqué lors de la création de la discussion , si je le passe en non exécutable par // la table est créée (avec des enregistrements auxquels aucune valeur n'est, bien sur, affectée.
Cordialement
R.O.
Suite - Tentative de renseigner une table depuis un STRingGRID
Bonjour,
Lors du dernier épisode de cette discussion je me suis fait “remonter les bretelles” par Jurassik Pork, certainement avec raison. Après avoir consulté les diverses discussions sur le sujet de l’ajout, modifications de données à une table à l’aide des composants Zeos ou non, j’ai essayé d’avancer .
En fait, j’ai programmé un logiciel de gestion d’une base d’anciens élèves, (SQLITE3 et ZEOS W10, Lazarus 2.24) que j’essaye de rendre plus convivial
La partie construction de la base, exploitation directe des données fonctionne bien (Zeos a été mis à contribution). Je souhaite en plus construire des rapports éditables au format PDF qui seraient mis à la disposition des personnes concernées et ce, sans passer par un serveur surtout pour des problèmes de confidentialité (et aussi parce que je connais rien dans la gestion de tels outils… et suis peut-être trop âgé pour cela).
Bref, la première partie du rapport consiste en l’édition d’une fiche de synthèse par section recensant le nombre de personnes totales concernées, le nombre de personnes perdues de vue et celles décédées (nombre et proportion).
Cette opération de synthèse faisant appel à la lecture des enregistrements de la table des élèves est programmée et fonctionne bien. Les résultats sont synthétisés dans un STRINGGRID. Le nombre de lignes du Stringgrid peut varier car la base peut être utilisée pour plusieurs promotions et c’est pour cela que je souhaite en récupérer le contenu dans une table qui sera ensuite affichée dans LazReport.
La requête libellée pour le transfert vers la table Synth de la base me semble rédigée correctement. Elle fait appel aux variable libellées en utilisant des "QuotedSTR " et par exemple pour la première ligne du Stringrid elle donne le résultat suivant :
Code:
RqtSQLSynth = 'Insert Into Synth (IdentSynth, Nb_Ind, Nb_IndPDV, Nb_IndDCD, pc_IndPDV, pc_IndDCD) Values (''BCxxx'', ''13'', ''2'', ''2'', ''15,4'', ''15,4'') '
Synth est le nom de la table à renseigner la première parenthèse contient les noms de champs et la seconde les valeurs qui leurs sont affectées.
le nom de la varaible requête esdt RqtSQLSynth.
J'ai programmé les évènements nécessaires à la mise en oeuvre de cete requête :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| DM_Rap.ZC_Synth.Connected := False ;
DM_Rap.ZC_Synth.Database := DNomBaseC ;
DM_Rap.ZC_Synth.Protocol:= 'SQLITE-3' ;
DM_Rap.ZC_Synth.Connected := True ;
// ******* Table Synth
DM_Rap.ZT_Synth.Active := False ;
DM_Rap.ZT_Synth.Connection := DM_Rap.ZC_Synth ;
DM_Rap.ZT_Synth.TableName := 'Synth' ;
DM_Rap.ZT_Synth.Active := True ;
// ****** le composant de liaison - DataSource
DM_Rap.DtS_Synth.Enabled := False ;
DM_Rap.DtS_Synth.Dataset := DM_Rap.ZT_Synth ;
DM_Rap.DtS_Synth.Enabled := True ; |
Ces composants ne provoquent aucune erreur lors de l'exécution du code (DM_RAP est le nom du DataModule qui héberge les composants Zeos ZC_Synth, ZT_Synth et ZQ_Synth ainsi que le Datasource DtS_Synth..
Par contre le code suivant provoque une erreur logique SQL :
Code:
1 2 3 4 5 6 7 8 9
| For lgn1 := 1 to NbSections + 1 Do
Begin
DM_Rap.ZQ_Synth.Active:= False ;
DM_Rap.ZQ_Synth.SQL.Clear ;
DM_Rap.ZQ_Synth.SQL.Text:= RqtSQLSynth ;
DM_Rap.ZQ_Synth.Connection := DM_Rap.ZC_Synth ;
DM_Rap.ZQ_Synth.Active:= True ;
DM_Rap.ZQ_Synth.execSQL ;
end; |
Qu'y a-t'il d'incongru dans ce code et comment créer les enregistrements à la première utilisation et les Updater lors des utilisations Suivantes ?
Merci pour vos réponses .
R.O.