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 :

[0.9.26.2/Win XP] TSQLQuery & ApplyUpdates


Sujet :

Lazarus Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut [0.9.26.2/Win XP] TSQLQuery & ApplyUpdates
    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

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 680
    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 680
    Billets dans le blog
    65
    Par défaut
    Bienvenu sur le forum

    Perso je n'utilise pas les TSQLQuery (mais ZEOSDBO) cependant je vais faire un effort parce que je reviens de vacances et encore plein d'énergie créatrice


    Citation Envoyé par fabrice94
    et pour ceux qui reviennent de vacances ,
    courage! les prochaines seront bientôt de retour.
    heureusement

    @+ Serge

    [Edit] mais déjà , ne manque t-'il point un SQLTransaction ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut
    @Serge

    Bienvenue sur le forum

    Perso je n'utilise pas les TSQLQuery (mais ZEOSDBO) cependant je vais faire un effort parce que je reviens de vacances et encore plein d'énergie créatrice
    Merci pour le message de bienvenue

    @Serge
    [Edit] mais déjà , ne manque t-'il point un SQLTransaction ?
    désolé pour l'oubli dans mon message
    Je confirme avoir installé un objet TSQLTransaction dans ma fenêtre.
    et avoir initié les propriétés.
    Database avec le nom de l'objet TIBconnection
    Action : caCommit
    Active : True.

    Enfin bref, je continue à jouer avec ce petit programme pour essayer d'utiliser les accès natifs de Lazarus aux bases de données.
    J'essaye d'apprendre, alors je persévère.

    Cordialement
    fabrice94

  4. #4
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    Bonjour Fabrice et bienvenue sur cet espace d'échange

    Tu n'aurais pas oublier de préciser une clé primaire dans tes tables car le composant natif se mélange un peu les pinceaux sinon....

    As tu un sqlite ou un mysql pour faire également des essais histoire de chercher d'autre pistes quant a ton petit problème ?

    Essaye cela :
    Supprime l'applyUpdate du after post et place le dans un bouton pour vérifier ce résultat

    Bon courage...
    Chris

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 4
    Par défaut
    @Chris37

    merci de te réponse

    Voici la description de ma table de test. Elle contient une clef primaire qui est aussi un champ "PJS_ID".

    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")
    )
    Autrement, je vais suivre ton idée et essayer de télécharger un mysql ou sqllite ( gratuit si possible ) afin de vérifier ton hypothèse , mais je ne voispaspourquoi un composant natif aurait un comportement different suivant le gestionnaire de SGBD.
    bref je continue de "jouer" avec ce petit problème.

  6. #6
    Membre émérite
    Avatar de chris37
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Juillet 2007
    Messages
    378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 378
    Par défaut
    En effet c'est curieux,

    je réinstalle tout mon bazar en ce moment pour redevenir plus actif à la rentrée (Forum et le French Wiki) sur Lazarus car j'avais un peu lâché l'affaire.

    Tiens nous au courant te tes découvertes
    @+
    chris

Discussions similaires

  1. Problème montage partition Win sous RedHat ??
    Par baba dans le forum Administration système
    Réponses: 6
    Dernier message: 18/01/2003, 11h26
  2. Quel outil pour du développement Client/Serveur (Win XP) ?
    Par jey_bonnet dans le forum Débats sur le développement - Le Best Of
    Réponses: 5
    Dernier message: 02/11/2002, 14h57
  3. Réseau Win/Linux
    Par ben91 dans le forum Développement
    Réponses: 2
    Dernier message: 08/09/2002, 22h59
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24

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