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

Composants VCL Delphi Discussion :

DBCtrlGrids : en Synchroniser 2 (ou plus)


Sujet :

Composants VCL Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut DBCtrlGrids : en Synchroniser 2 (ou plus)
    Bonjour,
    sur une forme j'ai deux DbCtrlGrids liées a 2 Datasets différents .
    Pour les besoins de mon exemple , je vais utiliser les tables Suivantes
    MAITRE
    • SAISON
    • PRIXBASE

    DETAIL
    • REPRESENTANT
    • SAISON
    • PRIX
    la première Grille est liée a MAITRE
    la seconde a une Query
    Code Query : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COALESCE(D.SAISON,M.SAISON) AS SAISONREP,
               COALESCE(PRIX,M.PRIX_BASE) AS PRIXREP 
    FROM MAITRE M LEFT JOIN DETAIL D ON M.SAISON=D.SAISON AND D.REPRESENTANT=:Representant
    ce qui fait que : a tout enregistrement de la dbctrlgrid1 correspond un enregistrement de dbctrlgrid2 . Les deux grilles sont disposées horizontalement, et le panneau actif est mis en couleur (selectedcolor:=clActiveCaption);

    Voilà , la situation est posée
    pour synchroniser les tables , je passe par les events afterScroll et me positionne donc sur le Champ SAISON via un locate (rassurez-vous , il y a au maximum 12 'SAISONS')

    mon problème : les deux grilles , malgré une taille de panneau identiques ne sont pas toujours Synchrones .
    Quelques fois je me retrouve avec un décalage (bien visible hélas) entre les deux grilles (ce sont les bons enregistrements) , le locate ayant tendance a positionner le panneau de l'enregistrement en colonne 1 .

    Comment faire pour que les panneaux concordent ?
    j'ai essayé :
    - DBCtrlGrid2.Panel:=DBCtrlGrid1.Panel // ne fonctionne pas panel seul les panels visibles sont numérotés
    - de dériver un DBCtrlGrid en Stringgrid // échec lamentable leftcol et col ne bougent pas

    Je patauge lamentablement , sur les scrollby et il y a certainement des pistes que j'ai encore ignorées
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    :Representant c'est un paramètre fourni avec le système de MasterSource\Field ?

    Sinon, forcer la position d'un DBGrid, c'est déjà tordu à coup de ScrollBy et bidouille mais pour un TDBCtrlGrid, je ne suis jamais allé aussi loin, en général, si j'ai une relation Maitre\Detail avec deux Grilles, la selection dans l'un provoque un "filtre" dans l'autre
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    :Representant c'est un paramètre fourni avec le système de MasterSource\Field ?
    Oui
    Sinon, forcer la position d'un DBGrid, c'est déjà tordu à coup de ScrollBy et bidouille
    je confirme
    en fait , tant que ça 'monte' (grille1) alors je me débrouille synchroniser la grille2 (en fait je fais une boucle depuis le 1°enrg de détail jusqu'au recno de master) , par contre , quand ça 'descend' c'est là ou ça déconne ! tant que la grille de départ affiche le record n°1 pas de soucis , c'est ensuite que cela se corse (aurait dit Napoléon).

    [edit] Après bien des tâtonnements ai-je trouvé une solution si simple qu'elle crève les yeux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm.MaitreAfterScroll(DataSet: TDataSet);
    begin
    if Detail.Active then
    begin
     Detail.DisableControls; 
     case Sign(Detail.RecNo-Maitre.RecNo) of
      -1 : while Detail.RecNo<>Maitre.RecNo do Detail.Next;
      1  : while Detail.RecNo<>Maitre.RecNo do Detail.Prior;
     end;
     Detail.EnableControls;
    end;
    end;
    Bon , je le ferais pas avec une grosse table , mais comme dit au début avec 12 records maxi ça a l'air de passer nickel . Je vais faire un peu plus d'essais pour valider ça
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Salut Serge,

    Si ton deuxieme DbCtrlGrid doit avoir une correspondance avec ton premier systématiquement, tu pourrais utiliser des Listbox ?

    Dans la listbox 1 tu affiche la table maitre
    dans la listbox 2 tu affiche le résultat du scroll (ou même du clique) de la listbox 1.

    Je l'ai fais avec 3 listbox, évidement qu'avec de faible enregistrement.

    bye

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Pour bien saisir ce qu'est mon objectif , une image vaudra mieux que de long discours , le problème posé était simplifié à l’extrême

    Comme l'a dit Shailetroll , dans mon second post (DbCtrlGrid : Cacher les scrollbars
    Citation Envoyé par Shailetroll
    tout ça parce que le client habitué à DBase+TTable voulait pareil en MySQL+TQuery)
    bon moi c'est plutôt : "Tout ça parce que le 'client' est habitué (n' a jamais connu autre chose) à Excel" bien qu'il soit conscient des limites (sinon je ne ferais rien )

    ceci étant , j'ai avancé (voir dernier Edit) , encore quelques cas particuliers genre delete/insert et la saisie d'un jeu d'essai plus important pour confirmer et je passerais à d'autres fonctions du programme plus ou moins aussi
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

Discussions similaires

  1. [WD16] la synchronisation des données ne se fait plus !
    Par alaclef dans le forum WinDev
    Réponses: 3
    Dernier message: 28/08/2012, 08h41
  2. Les PC sont de plus en plus bruyants que faire
    Par plichtal dans le forum Ordinateurs
    Réponses: 260
    Dernier message: 23/12/2011, 12h28
  3. Réponses: 0
    Dernier message: 30/08/2010, 14h36
  4. DBCtrlGrid qui ne fonctionne plus
    Par gandf dans le forum C++Builder
    Réponses: 1
    Dernier message: 22/03/2009, 16h17
  5. [Datareport] Etat plus large que le papier
    Par SpaceFrog dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 09/09/2002, 11h45

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