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

Bases de données Delphi Discussion :

Rafraichissement immédiat reseau


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut Rafraichissement immédiat reseau
    Bonjour,

    je doit developper une petite appli en reseau qui affiche une liste de personne et à chaque fois q'un utilisateur clic sur une personne de la liste ça doit bloquer cette ligne et l'afficher en couleur sur les autres pc du reseau......
    j'ai essayé avec Paradox avec une fermeture/ouverture de la table à chaque manipulation sur la DBGrid mais ça ne suffit pas.....

    si quelqu'un a une piste, je suis preneur.

    MERCI d'avance pour votre aide.
    jean charles

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Avec un SGBD évolué, tu pourrais simplement créer un événement qui sera dispatché au client depuis le serveur à chaque modification.

    Avec Paradox, tu devras faire ce broadcasting toi-même avec par exemple un MailSlot.

  3. #3
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Andnotor Voir le message
    Avec un SGBD évolué.
    Interbase ou FireBird par exemple
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  4. #4
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Merci pour ces reponses.

    je vais testé Interbase rapidement pour voir, par contre pour l'installer chez le client, faut il acheté des licences car comme d'habitude il ne faut pas que ça lui coute trop chére.....

    je vous tiens au courant

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par jcharles Voir le message
    Merci pour ces reponses.

    je vais testé Interbase rapidement pour voir, par contre pour l'installer chez le client, faut il acheté des licences car comme d'habitude il ne faut pas que ça lui coute trop chére.....

    je vous tiens au courant
    Si tu veux, tu peux utiliser Firebird qui est gratuit à la place de Interbase. Comme ça ton client va economiser le cout de la licence.

    A+
    On progresse .....

  6. #6
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Andry Voir le message
    Si tu veux, tu peux utiliser Firebird qui est gratuit à la place de Interbase. Comme ça ton client va economiser le cout de la licence.

    A+
    +1

    Le composant IBEvent te permettra de faire ce que tu souhaites.

    Mais tu devrais budgétiser IBExpert qui te donneras un sérieux coup de main pour tes développements.
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  7. #7
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Bonjour à Tous,

    Voilà j'ai lu vos reponse et me suis lancé dans FireBird avec les composants d'IB et j'arrive bien à me connecter, à modifier les données, sauf que j'ai toujours le même probléme à savoir que quand un utilisateur modifie la base l'autre ne le vois pas.......ci-dessous ce que j'ai fait.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Datamodule en creation
        IBDatabase1.Connected:=false;
        IBDatabase1.Params.Clear;
        IBDatabase1.DATABASENAME:=pathbaseDB;
        IBDatabase1.Params.Add('user_name='+FileIni.ReadString('chemin', 'USER', 'SYSDBA'));
        IBDatabase1.Params.Add('password='+FileIni.ReadString('chemin', 'PASS', 'masterkey'));
        IBDatabase1.Params.Add('lc_ctype=ISO8859_1');
        IBDatabase1.SQLDialect:=3;
     
        IBDatabase1.LoginPrompt:= False;
        IBDatabase1.Connected  := True;
        IBTransaction1.Active  := True;
    puis dans ma grille quand je modifie une données, je fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      IBSQL1.Text('Update '+ CH +' Set '+ ID +'='+ Notes +' Where '+Chs);
    // ou CH = ma table, ID le nom de mon champ, Notes = la nouvelle valeur et Chs = les conditions.
      IBSQL1.ExecQuery;
      IBSQL1.Close;
    // on rafraichie la table
      Rafraichie_table(Data1.IBQUtil);
    la fonction Rafraichie _Table
    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
    18
     
       With DataSet do
       begin
         Active:=True;      // au cas ou notre base est désactivé , on doit l'activée
                            //  pour mettre à jour notre table
            Try
            Bmk := GetBookmark;    // on sauvegarde le pointeur de la table (dbgrid)
            DisableControls;       // on bloque la dbgrid ,on aura pas de défilement
                                   // lors du balayage
     
             close;   //  on Désactive la table
             open;     //   on Résactive la table  , on peut voir les donnée maj
            finally
            GotoBookMark(Bmk); // on revient à la position initiale
            FreeBookmark(Bmk);  // on libère le pointeur c'est important
            EnableControls;    // on débloque la dbgrid
            end;
       end;
    j'ai mis aussi cette fonction "Rafraichie _Table" sur la grille dans OnMouseMove pour forcer la mise à jours.....

    mais quand je modifie sur un poste cela ne vois pas sur l'autre......

    si quelqu'un a une idée ce serait SUPER SIMPA.

    MERCI d'avance.
    jc

  8. #8
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Pour ça, il y a plusieurs solution. Je vais t'en donner 3 :
    1° - Utiliser un timer qui vas rafraichir les clients a raison d'une laps de temps donnée.
    2° - Dans ta base, utiliser un Trigger sur AfterUpdate/afterDelet/afterInsert pour poster un event et récupérer cette event pour se raffraichir.
    3° - Utiliser un système de messagerie inter-client pour transmettre des commandes de raffraichissement.

    Bien sur, l'utilisation et le paramétrage des transactions est de mise sinon, tes clients ne veront pas les modifs fait par les autres.

    Voilà.
    On progresse .....

  9. #9
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Bonjour Andry,

    MERCI pour ton aide, j'ai pensé mettre un timer....mais que dois je mettre dedans ?
    Je pensai qu'apres avoir executer ma requete avec IBSQL et avec rafraichie le dataset cela suffirai !!!!! mais apparement non.

    est ce que je dois forcer ma transaction avec un Commit apres ?

    je debute avec les BDE client/serveur et je ne connais pas du tout les Triggers et les messageries inter-client, c'est tu ou je pourrai trouver des tutos ou de la docs.

    MERCI encore pour votre aide.
    jc

  10. #10
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 691
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 691
    Points : 13 121
    Points
    13 121
    Par défaut
    Tu devrais créer un trigger (CREATE TRIGGER) au niveau de ta base de données et ensuite utiliser un TIBEvent côté Delphi.

    SQL Firebird

  11. #11
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Citation Envoyé par jcharles Voir le message
    MERCI pour ton aide, j'ai pensé mettre un timer....mais que dois je mettre dedans ?
    jc
    Bah normalement la procédure pour le rafraichissement. Il faut definir l'intervalle du timer et gérer l'événement onTimer.
    Citation Envoyé par jcharles Voir le message
    Je pensai qu'après avoir exécuter ma requête avec IBSQL et avec rafraichie le dataset cela suffirai !!!!! mais apparemment non.
    est ce que je dois forcer ma transaction avec un Commit après ?
    jc
    Il faudrait vérifier le niveau d'isolation de tes transactions. Ensuite faire commit après modification. Sinon CommitRetainning aussi pour garder la transaction ouverte.
    Citation Envoyé par jcharles Voir le message
    je debute avec les BDE client/serveur et je ne connais pas du tout les Triggers
    jc
    Concernant les trigers, passe dans la section Firebird, il y a des tutos qu'il faut lire. Ce sont des mecanismes au niveau de la base de donnée.
    Par exemple, tu peux créer un trigger(ou déclencheur) avant ou après la modification sur la ligne d'une table. Par exemple ce code creer un trigger after Update sur la table recette qui poste un event 'RECETTE_UPDATE' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SET TERM ^ ;
    CREATE TRIGGER TRECETTE_AFTERUPDATE_0 FOR TRECETTE
    ACTIVE AFTER UPDATE POSITION 0
    AS
    begin
      POST_EVENT 'RECETTE_UPDATE';
    end
    ^
    SET TERM ; ^
    Ici donc, chaque fois qu'une ligne de la table TRecette est modifier, le event RECETTE_UPDATE sera envoyé pas le SGBD aux clients attaché. Libre au client d'ecouter ou non. Ce se mecanisme qui sera exploité dans le 2ème soluce que je t'ai donnée. Il te faut un composant IBEvent rattaché à ton IBDatabase. Ensuite, il te faut enregistrer les event que tu veux ecouter.
    Citation Envoyé par jcharles Voir le message
    je debute avec les BDE client/serveur et je ne connais pas du tout les Triggers et les messageries inter-client, c'est tu ou je pourrai trouver des tutos ou de la doc.
    jc
    Ce site regorge beaucoup de documents et de tutoriels. La plupart des questions qui se posent sont souvent contenu dans ces documents.
    Revenons à nos moutons.
    La troisième soluce (messageries inter-client), c'est en faites, un système que tu dois implémenter au niveau de ton application pour envoyer des messages aux autres. Ceci nécessite des composant réseau tel Indy, ou Ics etc.
    Mais le principe est simple : chaque client dialogue entre eux; par exemple :
    - le client A fait une mise à jour
    -> Il envoie un message 'UPD' aux autre Client B/C/D (par broadcast ou autre)
    <- Les autres Client B/C/D à la réception du message 'UPD' lance la procédure de rafraichissement.

    Voilà
    On progresse .....

  12. #12
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    WOUHA beaucoup de chose en même temps pour ma p'tite tête.....je suis chez un client toute la journée et je ne pas tester.....

    bon je vais commencer par mettre le commit apres l'update, essayer de faire le Trigger et puis je reviens apres pour vous dire.

    MERCI encore pour votre aide. je le dirai jamais assez.
    jc

  13. #13
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Bon .... je patoge completement.
    j'ai enfin compris le principe avec les Triggers et les Events mais ou dois je ecrire mes Triggers correspondant à une table...est ce dans un composant ? est ce directement dans la BDE par le biais de mon administrateur (IBAccess) là je ne vois pas du tous et je rame et je rame

    MERCI pour votre aide...je vais bientot couler !!!!!
    jc

  14. #14
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    Les triggers font partie intégrante de la BDD. Le plus simple est de les créer avec ton outil d'administration préféré, IBAccess dans ton cas.

    Andry t'a donné un DDL exemple pour la création d'un trigger.

    @+ Claudius

  15. #15
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    Tous d'abord merci à tous pour votre aide.....

    bon j'en suis au stade ou je n'arrive pas avec le composent IBEvent et Firebird, si je le met en Registred = True par defaut ça plante "Le nom de la base de donnée est manquant" et si je le retire par defaut et que je le rajoute au lancement et bien j'ai aucun retour d'events....j'ai créé mes Triggers sur ma table dans la BDD, j'ai créé mes actions au event et rien ne se passe......

    si quelqu'un a une idée..

  16. #16
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 14
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    Au démarrage du programme tu signale les alerte (ou message) que tu souhaites intercepter

    Extrait du DFM

    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
    18
    19
    20
    21
    22
    23
     
      object DBTest: TDatabase
        AliasName = 'DBTest'
        DatabaseName = '_DBTest_'
        LoginPrompt = False
        Params.Strings = (
          'USER NAME=SYSDBA'
          'PASSWORD=masterkey')
        SessionName = 'Default'
        TransIsolation = tiRepeatableRead
        Left = 244
        Top = 60
      end
     
     
      object IBEventAlert: TSIBbdeEventAlerter
        Events.Strings = (
          'TEST')
        OnEventAlert = IBEventAlertEventAlert
        Database = DBTest
        Left = 368
        Top = 8
      end

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
          DBTest.connected := true;
          MSG_ATTENDU_1 := 'TABLE_TOTO';
          MSG_ATTENDU_2 := 'TABLE_TITI';
          MSG_ATTENDU_3 := 'TABLE_TATA';
          MSG_ATTENDU_4 := 'TABLE_TUTU';
          IBEventAlert.Registered := False;
          IBEventAlert.Events.Add(MSG_ATTENDU_1);
          IBEventAlert.Events.Add(MSG_ATTENDU_2);
          IBEventAlert.Events.Add(MSG_ATTENDU_3);
          IBEventAlert.Events.Add(MSG_ATTENDU_4);
          IBEventAlert.Registered := true;
    Le Traitement de l'alerte

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure TDataModuleXXX.IBEventAlertEventAlert(Sender: TObject;
      EventName: String; EventCount: Integer);
    begin
      if (EventName = MSG_ATTENDU_1) or (EventName = MSG_ATTENDU_2) or
         (EventName = MSG_ATTENDU_3) or (EventName = MSG_ATTENDU_4) then
      begin
        // 
      end;
    end;


    Difficile d'en dire plus
    Dans le vocabulaire des couturiers seulement, patron est synonyme de modèle.
    Aymond d'Alost

  17. #17
    Membre du Club Avatar de jcharles
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 82
    Points : 52
    Points
    52
    Par défaut
    YES j'avance...... à petit pas......

    MERCI à Yurck pour ces exemples.

    donc j'ai reussi avec mes Events et mes Triggers, et ça fonctionnes bien à chaque fois que la table est modifiée sur un autre PC j'ai bien le retour sur mon PC....la je fais un rafraichissement de ma table

    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
    18
    19
     
    procedure TData1.Rafraichie_table(DataSet: TDataSet);
    Var Bmk : TBookMark;
    begin
       With DataSet do
       begin
         Active:=True;
            Try
            Bmk := GetBookmark;    
            DisableControls;
             close;
             open;
            finally
            GotoBookMark(Bmk);
            FreeBookmark(Bmk);
            EnableControls;
            end;
       end;
    end;
    jusque la pas de probleme....mais je n'arrive pas à raffraichir ma DBGrid automatiquement....elle se rafraichie quand je clic dessus et qui lance la mise à jour de la table pour cette ligne......j'ai essayé un refresh un repaint de la table de la grille du datasource.....mais rien nada...

    si quelqu'un à une piste.....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Rafraichissement Immédiat d'un JLabel
    Par TiLs1 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 16/04/2007, 15h08
  2. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  3. Creer un reseau local via l adsl
    Par loki dans le forum Développement
    Réponses: 11
    Dernier message: 12/08/2002, 00h14
  4. reseau de neuronnes
    Par mumu2001 dans le forum Méthodes prédictives
    Réponses: 3
    Dernier message: 25/07/2002, 09h33

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