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 :

Inserer des informations à partir d'un DBGRID?


Sujet :

Bases de données Delphi

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut Inserer des informations à partir d'un DBGRID?
    Bonsoir à tous.
    J'ai une idée que je ne sais pas comment l’interpréter sur delphi:
    Je cherche à insérer des articles dans ma base de donnée ARTICLE à partir d'un DBGrid où j'ai un DBGrid vide editable qui me permet d'inserer les informations d'article, et quand je clique sur enregistrer, ses informations seront stockées dans la table via une requete sql.

    J'espere que l'idée est claire.

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par scholes Voir le message
    J'ai une idée que je ne sais pas comment l’interpréter sur delphi:
    Je cherche à insérer des articles dans ma base de donnée ARTICLE à partir d'un DBGrid où j'ai un DBGrid vide editable qui me permet d'inserer les informations d'article, et quand je clique sur enregistrer, ses informations seront stockées dans la table via une requete sql.
    Un TDBGrid est relié via un TDatasource à un ensemble de données (TDataSet ou un de ses descendants : TTable, TQuery, etc).
    Pour peu que l'ensemble de données ne soit pas en lecture seule, un TDBGrid contient tous les mécanismes adaptés pour réaliser de la saisie... Encore faudrait-il savoir quel est l'ensemble de données envisagé, le moteur de bases de donnée ciblé ?

    Enfin, les démos fournies avec Delphi seront très utiles...
    --
    Philippe.
    Philippe.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    C'est sa le problème Monsieur, quand je relie un TDBGrid avec TDatasource, il va m'afficher le contenu de la ma BDD, alors que oi je désire avoir un TDBGrid vide qui contient seulement l’entête des éléments de la table, je fais la saisir, et je sauvegarde les données.

  4. #4
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Non pas forcément ! Mais il faut utiliser un SQLQuery tel que celui ci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select CHAMP1, CHAMP2, CHAMP2 from MATABLE
    where CHAMP1 is null
    Bien sûr, à toi de voir ce que sont CHAMP1, CHAMP2 etc. Tu peux aussi utiliser un select * pour avoir tous les champs.

    Quant au code
    [code]CHAMP1 is null[/CODE

    tu peux le remplacer par une autre condition qui n'est pas satisfaite. Ainsi lorsque tu ouvriras la table, il n'y aura rien et donc ton DBGrid sera vide. Mais le DBGRID gère bien les appends. J'ai mis dans l'évènement onKeyDown un ordre Post si l'utilisateur passe à la ligne suivante et le tour est joué

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
        if Key = key_Down then
           begin
              SQLQuery1.post;
           end;
     
    end;
    et voilà la query

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select ID_BADGE, ID_CLIENT, NOM,  ETAT, BADGE
     from badges where badge = ''
    Chez moi, la condition BADGE = '' me garantie que je n'ai aucun enregistrement

    J'ai relié mon DataSource au SQLQuery et le DBGrid au DataSource. Je précise que je travaille avec des composants ZEOS, mais avec un TClientDataSet, cela fonctionne aussi. Faut deux composants de plus !

    J'ai fait ce bout de code en 5 minutes : il doit certainement être complété dans ton cas
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    Oh merci beaucoup, tu m'as donné des idées, vraiment sa m'a éclaircis les choses.
    Je ne sais pas si le SQLQUERY et la meme chose que TQuery, mais de mon coté j'utilise un TQuery et TDataset que je vais relier avec DBGrid.

    Reste une autre chose que je ne sais pas faire encore:
    Es-ce que dans un DBGrid on peut personnaliser les cellules, c'est à dire mettre des cellules fixe, des cellules editable, des cellules avec des fonctions de calcule,...

    Et merci beaucoup.

  6. #6
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Première réponse : SQLQuery ou TQuery même combat . Tu ne devrais pas avoir de pb avec ça.

    Réponse 2 : hum, hum, hum ! Un DBGrid n'est rien d'autre qu'une chaine de caractères, alors mettre des calcul, cela me surprendrait. Editable ou pas, oui, cela est possible : c'est la propriété ReadOnly : si tu la mets à true, aucune valeur ne peut être saisie dans la colonne. Propriété modifiable par programme. Cellule fixe : si tu veux dire que l'on ne peut pas l'agrandir ou la diminuer la réponse est oui.

    Maintenant, il faut se souvenir qu'un DBgrid est associé à une table et que cette table a des évèrements. Ainsi, l'évènement Oncalc peut faire bien des choses !

    Petit question : avec quel gestionaire de base travailles-tu ? Paradox, Firebird ..... ?
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  7. #7
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    J'utilise paradox.

    Bon pour le probleme d'insertion, c'est bon j'ai reussi à ajouter des enregistrements via DBGrid, mais je n'ai pas compris une chose:
    ce que je cherche c'est quand je tape sur la touche entrer le dbgrid ajoute un ligne vierge pour me permettre d'ajouter un autre enregistrement, alors que dans mon cas, il me supprime la ligne inserer ! c'est possible sa??

  8. #8
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Oui, et cela dépend de ce que tu as (ou n'as pas) écrit dans l'évènement OnKeyDown. Si, par exemple, le fait d'appuyer sur la touche Entré provoque un refresh, la query va être relancée et () tu récupères les enregistrements vides. Dans l'exemple que je t'ai envoyé, je passais d'une ligne à l'autre par la touche Flèche vers le bas laissant ainsi le DBGrid gérer la création de la nouvelle ligne. Je reconnais que ce n'est pas la solution disons la plus "normale" : nous avons tous tendance à faire Entrée. Regarde bien ce que tu fais dans ton OnkeyDown : un append bien placé doit répondre à ton pb

    Enfin, pour revenir sur les cellules calculées : tu peux (toujours dans le OnKeyDown) programmer que en passant d'une colonne à l'autre (SelectedIndex) un calcul soit fait sur un champ de la table, lequel champ est affiché dans ton DBGrid et tu auras pris la précaution de rendre la cellule contenant ce champ readonly pour éviter que l'utilisateur ce vienne modifier ton calcul)
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  9. #9
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    Merci pour vos Reponse Monsieur.
    Bon je vais reexpliquer mon probleme d'une autre maniere:
    J'ai une base de donnée que je veux remplir à partir d'un DBGrid directement, et j'ai aussi 2 Tedit, 1 pour la date et un autre pour identifiant, ce que je veux c'est quand j'insert un enregistrement dans le DBGrid, je veux qu'il soit enregistrer avec les 2 Edit, c à dire que je tape une seul fois le numero et la date, et à chaque fois que j'insert un enregistrement et je tape entré il va etre enregistrer à la BDD avec la date et l'identifiant.

    Es-ce possible?

  10. #10
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Bien sûr que c'est possible : sinon à quoi servirait Delphi ?

    Mais tu dois programmrt quelque chose avant le Post ! Voici un petit bout de code pour t'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.DBGrid1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
       if Key = 13 then
          begin
             MaQuery1.FieldByName('LA_DATE').AsDateTime := StrToDate(Edit1.text);
             MaQuery1.FieldByName('IDENTIFIANT').AsString := Edit2.Text;
             MaQuery1.Post;
             MaQuery1.Append;
             DBGrid1.SelectedIndex := 0;
          end;
    end;
    Les champs LA_DATE et IDENTIFIANT font partie de la table paradoxe

    Lorsque l'on appuie sur la touche Entrée, l'enregistrement est complété, le post est exécuté, un nouvel enregistrement est prêt et le curseur revient en début de grille, une ligne en dessous.

    Cela te convient ?
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  11. #11
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    Mais moi je ne veux pas afficher la date et l'identifiant dans mon DBGrid, car cette solution me donne l'erreur suivante: MaQuery1 ne trouve pas l'element DATE.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par JP.NUAGE Voir le message
    Mais tu dois programmer quelque chose avant le Post ![/code]
    Ou quelque chose pour initialiser l'enregistrement .

    Bizarrement , il existe des évènements BeforePost ou OnNewrecord
    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

  13. #13
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    Mais le problème se pose toujours avec ses deux champs (date et Id), parceque dans MaQuery1, j'ai une requete sans ses deux champs, comme sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Reference, Rayon, Produit, Type, Modele, Quantite, Prix_Achat, Prix_Vente FROM Article WHERE ....
    donc quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    MaQuery1.FieldByName('Date').asDatetime:=StrToDate(edit1.text)
    MaQuery1.FieldByName('Id').asString:=edit2.text
    Il ne trouvera automatiquement pas les 2 champs.

  14. #14
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    Oui c'est normal : dans ton select, tu n'as pas mis la date ni l'identifiant. Mais tu dois les mettre (Attention DATE est un mot réservé : remarque que j'ai utilisé LA_DATE).

    Le fait d'inclure deux champs dans un SELECT ne veut pas dire que tu les verras dans le DBGRID. Il y a une propriété Columns qui te permet de limiter les champs du DBgrid. Donc ajoute les noms des deux champs (celui pour la date et celui pour l'identifiant) et ensuite reprends le code que je t'ai donné

    Et si tu te sens en confiance, en effet,....... utilise le BeforePost. Mais si tu ne sais pas ce que c'est ce n'est pas grave.
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

  15. #15
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    173
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 173
    Points : 39
    Points
    39
    Par défaut
    Merci beaucoup Monsieur, vraiment tu m'as bien aidé.
    Reste un petit simple detail, dans le dbgrid j'ai mis un evenement sur le keydown pour effectuer l'enregistrement avec la touche entré; quand je tape entré, la derniere valeur saisie dans le tableau n'est pas enregistrer dans la BDD vu qu'elle n'est pas valider, y a-t-il un moyen de la valider avant l'enregistrement?

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 038
    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 038
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Alors , là , je ne suis pas convaincu de la solution !

    si ceci est demandé
    et quand je clique sur enregistrer, ses informations seront stockées dans la table
    Alors le mieux serait de passer par une transaction .

    voici un rapide squelette sans prétention (d3 + BDE )

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      Grids, DBGrids, StdCtrls, DBTables, Db;
     
    type
      TForm1 = class(TForm)
        Database1: TDatabase;
        Query1: TQuery;
        DataSource1: TDataSource;
        UpdateSQL1: TUpdateSQL;
        DebuterSaisie: TButton;
        Enregistrer: TButton;
        DBGrid1: TDBGrid;
        Edit1: TEdit;
        DateModif: TDateTimePicker;
        procedure EnregistrerClick(Sender: TObject);
        procedure DebuterSaisieClick(Sender: TObject);
        procedure Query1NewRecord(DataSet: TDataSet);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.DFM}
     
    procedure TForm1.DebuterSaisieClick(Sender: TObject);
    begin
    Query1.Active:=True;
    Query1.Append;                      // ajoute la première ligne 
    DBGrid1.SetFocus;                   // passe sur la grille
    end;
     
    procedure TForm1.EnregistrerClick(Sender: TObject);
    begin
    with Query1 do
     begin
       if State in [dsEdit,dsInsert] then Post; // Au cas ou il y aurait une saisie non validée
       try
         DataBase1.StartTransaction;
         ApplyUpdates;    {essayer d'écrire les mises à jour dans la base};
         DataBase1.Commit;    {en cas de réussite, valider les modifications};
       except
          Database1.RollBack; {en cas d'échec, annuler les modifications};
          Raise; {déclencher l'exception pour empêcher l'appel de CommitUpdates!}
       end;
       CommitUpdates; {en cas de réussite, effacer le cache}
       Query1.Close;
    end;
     
    procedure TForm1.Query1NewRecord(DataSet: TDataSet);
    begin
    // ici Initialiser les valeurs du record
    // DateModif est un dateTimePicker
    // plus joli et plus fiable que de transformer un Edit en Date
    Query1.FieldByName('LA_DATE').asDateTime:=DateModif.Date
    Query1.FieldByName('id').asString:=Edit1.Text;
    end;
     
    end.
    aucune gestion de Keydown nécessaire
    Bien remplir le TUpDateSQL (via le wizard, clic droit) est la seule chose un peu délicate
    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

  17. #17
    Membre confirmé
    Avatar de JP.NUAGE
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    769
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 769
    Points : 542
    Points
    542
    Par défaut
    la derniere valeur saisie dans le tableau n'est pas enregistrer dans la BDD vu qu'elle n'est pas valider, y a-t-il un moyen de la valider avant l'enregistrement?
    Oui, j'ai aussi rencontré ce pb. Un petit peu énervant

    J'ai une autre solution (peut être moins 'jolie), mais elle fonctionne chez moi. Dans l'évènement OnKeyDown, je déplace le curseur d'une colonne et revient dans la colonne de départ

    Je suppose que je suis en colonne 4 quand je valide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure TMon_APPLI.Ma_GrilleKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin
        Ma_Grille.SelectedIndex := 0;
        Ma_Grille.SelectedIndex := 3;
    // suite du code
    end;
    Cette opération valide la dernière saisie. Ensuite j'enregistre !
    Ce qui se conçoit bien s'énonce clairement
    Et les mots pour le dire viennent aisément (Boileau)

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

Discussions similaires

  1. [E-07] Valider des informations à partir d'une zone de liste.
    Par Blinis dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 27/11/2008, 13h26
  2. Récuperation des informations à partir d'une conf Cisco
    Par francois3004 dans le forum Programmation et administration système
    Réponses: 0
    Dernier message: 07/08/2007, 20h18
  3. Réponses: 3
    Dernier message: 27/04/2007, 16h31
  4. Réponses: 1
    Dernier message: 10/04/2007, 23h53
  5. Réponses: 4
    Dernier message: 19/03/2006, 15h20

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