Bonjour à tous et merci d'avance à ceux qui me liront jusqu'au bout.


Configuration utlisée

Windows XP,
lazarus version #0.9.26.2 beta
Date : 2009-03-13
Version FPC : 2.2.2

Je vous expose mon souci,
j'essaye de comprendre comment utiliser l'objet TSQLQuey pour mettre à jour mes données. J'utilise Firebird.
Bien sûr cela ne fonctionne pas, sinon je ne vous imposerais pas ma prose.
Cependant je pênse être sur la bonne voie.

Je souhaite gérer une table toute simple, via les accès natifs de lazarus.

en voici la description.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
 
 
/* Domain definitions */
CREATE DOMAIN "D_PLN_JOUR_SEMAINE" AS SMALLINT	 CHECK (VALUE >= 1 AND VALUE <= 7) NOT NULL;
CREATE DOMAIN "D_PLN_LIB_COURT" AS CHAR(32) CHARACTER SET UTF8 NOT NULL;
 
/* Table: TR_PLN_JOUR_SEMAINE_PJS, Owner: SYSDBA */
CREATE TABLE "TR_PLN_JOUR_SEMAINE_PJS"
(
  "PJS_ID"	"D_PLN_JOUR_SEMAINE" NOT NULL,
  "PJS_LIBELLE"	"D_PLN_LIB_COURT",
 PRIMARY KEY ("PJS_ID")
)
Que je remplis de la manière suivante:

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
 
/*  -- Remplissage de TR_PLN_JOUR_SEMAINE_PJS --  */
 
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (1,'lundi');
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (2,'mardi');
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (3,'mercredi');
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (4,'jeudi');
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (5,'vendredi');
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (6,'samedi');
INSERT INTO "TR_PLN_JOUR_SEMAINE_PJS" ("PJS_ID", "PJS_LIBELLE")
VALUES (7,'dimanche');
Vous le voyez rien de bien compliqué , une simple table toute bête , pas de relation compliquée, pas de liaison ou quoi que ce soit

d'autre.


Voici la page wiki intitulée "WORKING WITH TSQLQUERY"

http://wiki.lazarus.freepascal.org/W...#Updating_data

J'y ai trouvé une, à priori bonne, description de l'utilisation de ce composant, pour accéder à une table de base de données.

Le paragraphe suivant :
Cached Updates

The TSQLQuery component caches all updates. That is, the updates are not sent immediately to the database, but are kept in memory till the

APPLYUPDATES method is called. At that point, the updates will be transformed to SQL update statements, and will be applied to the

database. If you do not call ApplyUpdates, the database will not be updated with the local changes.
Que je traduis de la façon suivante :
Mises à jour cachées

Le composant TSQLQuery cache toutes les mises à jour.
Ainsi, les mises à jour ne sont pas envoyées immédiatement à la base de données, mais sont conservées en mémoire tant que la méthode APPLYUPDATES n'est pas appelée.

À cet instant les mises à jours seront tranformées en requêtes SQL de mise à jour, et appliquées à la base de données.

Si vous n'appelez pas la méthode APPLYUPDATES la base de données ne sera pas mise à jour avec les changements locaux.
indique donc la manière de valider les modifications locales sur la base de données.


Cela me paraît clair.
j'en déduis que les mises à jour sont conservées en mémoire pour être transformées AUTOMATIQUEMENT par la méthode APPLYUPDATES en requêtes
SQL, peut-être dans INSERTSQL, DELETESQL, UPDATESQL, puis appliquées à la base de données, pour prendre en compte les changements locaux.

Cela semble être un fonctionnement adapté à une utilisation nomade des bases de données.

Reste à savoir où placer cet appel à la méthode APPLYUPDATES, il me semble que TSQLQuery.AfterPOST soit le meilleur endroit (évènement) pour cela.

Cet avis semble confirmé par chris37 dans l'article suivant :
http://lazarus-fr.espace-malin.fr/in...ses-de-donnees&Itemid=4


Bon, après essai il s'avère que cela ne fonctionne pas. sûrement dû à une incopréhension de ma part.

Rappel de mes actions.

Je place sur ma fenêtre ou datamodule,

1. 1 composant TSQLQuery sur le datamodule, et remplis les propriétés Database, Transaction et SQL.
2. 1 composant TDatasource, remplis sa propriété Dataset à TSQLQuery.
3. 1 composant TDBGrid sur la fenêtre et remplis sa propriété Datasource avec le nom de l'instance TDatasource.
4. 1 composant TDBNavigator sur la fenêtre et remplis sa propriété Datasource avec le nom du composant TDatasource.

À ce moment en mode développement le TDBGrid affiche correctement les données de la table, les 7 jours de la semaine.

Après compilation (sans APPLYUPADTES) tout semble réagir correctement, les changements sont pris en compte en local, et à chaque

rafraîchissement des données je me retrouve avec les données non modifieés.
Normal, c'est ce qu'indique le Wiki officiel, les mises à jour cachées ne sont prises en compte qu'au moment de l'appel à APPLYUPDATES.

donc je place la commande APPYUPDATES dans l'évènement AfterPost du composant TSQLQuery.

le code est donc :

procedure TDataModule1.SQLQuery1_lecture_AfterPost(DataSet: TDataSet);
begin
SQLQuery1_lecture_.ApplyUpdates;
end;

Compilation ok.

Test de modif d'un libéllé de donnée.

j'obtiens l'erreur suivante:

Project raised Exception class 'EIBDataBaseError' with message :
IBConnection1 : Execute :
-arithmetic exception, numeric overflow, or string truncation.


A savoir j'ai tout de même pour éliminer tout risque de mauvaise conception (de ma part) de ma base de données, créé quelques boutons

éxécutants des effaceemnts, modifications, et cerations, et tout se passe nickel.
Les modifications sont prises en compte lorsque j'écris "en dur" les commandes SQL de modification.


Aurais-je mal compris l'utilisation des composants TSQLQuery?
Comment utiliser leurs fonctionnalités permettant d'utiliser leur code intrinsèque et m'évitant ainsi de retaper des fonctionnalités

censées être incluses dans cet objet?
L'un d'entre vous aurait-il essayé un exemple aussi simple que le mien et celui-ci serait-il fonctionnel?

Espèrant recevoir un peu de vos lumières, je vous remercie encore de m'avoir lu jusqu'au bout, et pour ceux qui reviennent de vacances ,

courage! les prochaines seront bientôt de retour.

Autres liens consultés:
http://forum.lazarus.freepascal.org/...p?topic=6167.0
http://www.mail-archive.com/lazarus@.../msg05297.html

Cordialement
fabrice94

Win Xp, fireBird, laz 0.9.26.2