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 :

Paradox 7 Comment trier et marquer données dans une DBgrid


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut Paradox 7 Comment trier et marquer données dans une DBgrid
    Bonjour,
    J’ai une question pour moi très difficile.
    J’ai une application BD Paradox 7. J’ai deux bases : sur la Form1 Base1 et sur la Form2 Base2. (DBgrid1 et DBgrid2)
    Base1 sert à enregistrer le matériel d’un parc informatique, PC, imprimantes, etc…
    Base2 sert à enregistrer le matériel défalqué.
    Base1 et Base2 possèdent un champ nommé « Sérial ». Il s’agit du No de série d’un PC.
    Lorsque j’enlève un PC du service, je note son No « sérial » dans la Base2.
    Maintenant, la question :
    Je voudrais que, sur le click d’un bouton, mon logiciel vérifie si dans la Base1 ce « sérial » existe (normalement oui !) et que cet enregistrement soit en gras, ou en rouge par ex .
    Si vous arrivez au bout de ce problème, je vous promet que je vais rêver de vous ! !
    Merci d’avance pour tout essai.


  2. #2
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    897
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 897
    Points : 1 561
    Points
    1 561
    Par défaut
    A priori et sans vouloir t'offenser, je pense que tu confonds base et table.

    Pour vérifier que le numéro de série existe dans la table de ton choix tu as deux possibilités :

    1) Utiliser la méthode Locate
    Fais une recherche dans l'aide de Delphi sur locate

    2) Procéder par requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      select count(nom_du_champ_serial) from table_à_vérifier where nom_du_champ_serial = numéro_à_vérifier
    Si la requête te renvoit un nombre supérieur à zéro cela signifiera que ton numéro de série est déjà employé et combien de fois.

    La seconde méthode te demandera un peu plus de travail si tu ne connais pas bien la manipulation des requêtes SQL avec delphi.

    Bon code
    Cordialement
    Pensez à utiliser les tags dans le titre.
    Avant de poser une question reportez-vous à la FAQ Delphi
    Respectez les règles du forum.

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Tout à fait Pascal, il s'agit de Table!
    Maintenant, j'arrive à éffaçer par ex. un enregistrement, 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
     
    procedure TForm1.Efface1Click(Sender: TObject);
    begin
    Form2.Table2.First;
    while not Form2.Table2.EOF Do
    begin
    Table1.First;
    while not Table1.EOF Do
     
       begin
       if (Table1.Locate('Serial',Form2.Table2Serial.value,[])) then
          Form1.Table1.Delete;
       Table1.Next;
       end; Form2.Table2.Next;
    end;
    end;
    Mais, au lieu de l'éffaçer, je veut qu'il soit en gras, ou en rouge par ex.
    Merci encore.

  4. #4
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Hello,
    il me semble que tu devrais passer par un query pour afficher la table 1 du style :
    select A.serial, B.coltable2
    from table1 A,
    table2 B
    where B.serial(+) = A.Serial

    Cette requête (je ne suis pas sûr de la syntaxe en paradox, c'est peut être avec un left outer join) permet de voir tous les enregistrements de la table 1 et en plus de savoir si elles ont une référence dans la table 2 (lien optionnel) avec l'aide d'une des colonnes de la table 2 (appelé coltable2 ici).
    Ensuite, dans l'évènement OnDrawDataCell de ta grille, le code suivant permet d'afficher en rouge la ligne où une référence à la table 2 existe :

    procedure TForm1.wwDBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
    Field: TField; State: TGridDrawState);
    begin
    if Query1.FieldByName('Coltable2').asstring > ' '
    then DBGrid1.canvas.font.Color := clred;
    DBGrid1.DefaultDrawDataCell(Rect, Field, State);

    end;

    Voilà, j'espère avoir été assez claire...Bon courage
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Salut Iper,
    Mon code est bon, il fonctionne, seule chose qu'il faut modifier est l'action:
    , mais ca marche pas!!

  6. #6
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Ok, tu veux mettre en rouge l'enregistrement de table 1 dès que tu cliques sur le bouton d'effacement. Mais ensuite, lors d'un affichage ultérieur, tu veux qu'il redevienne de couleur standard ou qu'il reste affiché en rouge ?
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Qu'il reste en rouge...!

  8. #8
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Avec ma méthode, lorsque tu cliques sur le bouton, il suffirait de rafraichire les données de la table1 (avec un close open par exemple) ce qui déclencherait l'évènement Ondrawdatacell et marquerait en rouge la ligne :
    affichage en rouge des enregistrements de table1 qui ont une référence dans table2 par le lien Sérial et en normal les autres enregistrements.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Merci Iper de ta gentillesse,
    mais je suis débutant et je ne sais pas utiliser SQL. C'est pour ça que je voudrais juste modifier la ligne
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.Table1."cette-ligne-en-rouge"
    Mais, ça ne marche toujours pas!

  10. #10
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Tu as alors la solution de créer une nouvelle colonne (ex:flag_en rouge) dans ta table que tu met à jour (au lieu du delete) et tu peux toujours utiliser l'évènement Ondrawdatacell.
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Alors, j'ai crée un champ "Rouge" dans ma première table. Donc, si j'ai bien compris, la valeur trouvée sera copiée dans ce champ.
    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
    procedure TForm1.Efface1Click(Sender: TObject); 
    begin 
    Form2.Table2.First; 
    while not Form2.Table2.EOF Do 
    begin 
    Table1.First; 
    while not Table1.EOF Do 
       begin 
       if (Table1.Locate('Serial',Form2.Table2Serial.value,[])) then 
     
          DBgrid1.OnDrawDataCell...???
     
       Table1.Next; 
       end; Form2.Table2.Next; 
    end; 
    end;
    Comment terminer?
    Merci encore.

  12. #12
    Membre confirmé Avatar de lper
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 396
    Points : 641
    Points
    641
    Par défaut
    Utilise l'évènement sur ta DBgrid OnDrawDataCell et le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure TForm1.DBGrid1DrawDataCell(Sender: TObject; const Rect: TRect;
      Field: TField; State: TGridDrawState);
    begin
       if Table1.FieldByName('Rouge').asstring = 'O'
         then DBGrid1.canvas.font.Color := clred;
       DBGrid1.DefaultDrawDataCell(Rect, Field, State);
    end;
    Ensuite au lieu du Table1.Delete tu fais la mise à jour du champs rouge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
       Table1.Edit;
       Table1.FieldByName('Rouge').asstring := 'O';
       Table1.Post;
    Bon courage...
    La faiblesse humaine est d'avoir des curiosités d'apprendre ce qu'on ne voudrait pas savoir

  13. #13
    Futur Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 12
    Points : 6
    Points
    6
    Par défaut
    Bonjour tous,
    J'ai tout essayé, mais l'application se bloque toujours, on dirait dans une boucle...

    Voilà ce que je trouve bizarre:
    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
     
    procedure TForm1.Efface1Click(Sender: TObject); 
    begin 
    Form2.Table2.First; 
    while not Form2.Table2.EOF Do 
    begin 
    Table1.First; 
    while not Table1.EOF Do 
       begin 
       if (Table1.Locate('Serial',Form2.Table2Serial.value,[])) then 
     
    begin
         Table1.Edit; 
       Table1.FieldByName('Rouge').asstring := 'O'; 
       Table1.Post; 
    end;
     
       Table1.Next; 
       end; Form2.Table2.Next; 
    end; 
    end;
    Ceci bloque l'application.

    Ici j'obtiens le message d'érreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Table1: L'ensemble de données n'est pas en mode d'insertion ou edition
    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
     
    procedure TForm1.Efface1Click(Sender: TObject); 
    begin 
    Form2.Table2.First; 
    while not Form2.Table2.EOF Do 
    begin 
    Table1.First; 
    while not Table1.EOF Do 
       begin 
       if (Table1.Locate('Serial',Form2.Table2Serial.value,[])) then 
     
       Table1.FieldByName('Rouge').asstring := 'O'; 
     
       Table1.Next; 
       end; Form2.Table2.Next; 
    end; 
    end;
    Alors que ceci:
    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
     
    procedure TForm1.Efface1Click(Sender: TObject); 
    begin 
    Form2.Table2.First; 
    while not Form2.Table2.EOF Do 
    begin 
    Table1.First; 
    while not Table1.EOF Do 
       begin 
       if (Table1.Locate('Serial',Form2.Table2Serial.value,[])) then 
     
       Table1.Delete;
     
       Table1.Next; 
       end; Form2.Table2.Next; 
    end; 
    end;
    ...ceci marche impec!!!!

    On dirait qu'il n'y a pas de solution...!

Discussions similaires

  1. Trier des des données dans une colone.
    Par bernardleger dans le forum Excel
    Réponses: 2
    Dernier message: 15/07/2010, 11h31
  2. [Toutes versions] Comment stocker beaucoup de données dans une variable?
    Par remy.sanlaville dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/04/2009, 13h23
  3. Comment faire apparaitre des données dans une listbox
    Par nuans dans le forum Interfaces Graphiques
    Réponses: 3
    Dernier message: 14/05/2007, 15h04
  4. Insertion de données dans une DBGrid!
    Par scorpion37 dans le forum C++Builder
    Réponses: 12
    Dernier message: 09/06/2006, 07h54
  5. Données dans une DBgrid
    Par camino dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/02/2004, 03h40

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