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

Delphi Discussion :

Supprimer une ligne d'un DBGrid tout en le supprimant aussi dans DataSourceXML


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Technicien réseau
    Inscrit en
    Septembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2021
    Messages : 10
    Par défaut Supprimer une ligne d'un DBGrid tout en le supprimant aussi dans DataSourceXML
    Bonjour à toutes et à tous,

    Je débute dans Delphi (version 10.4)

    J'arrive à supprimer une ligne dans mon DBGrid mais je galère pour la supprimer aussi dans mon DataSourceXML
    Si je ferme l'application que je développe, la ligne en question est toujours présente

    Voici mon code :

    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
    procedure TFrmTableauIncident.BtnCloturerIncidentClick(Sender: TObject);
    Begin
        FrmIncident.DateTimePicker1.Date:=StrToDate(ClientDataset1.Fields[0].AsString);
        FrmIncident.DateTimePicker3.Time:=StrToTime(ClientDataset1.Fields[1].AsString);
        FrmIncident.ComBoBoxSite.Text := ClientDataset1.Fields[2].AsString;
        FrmIncident.ComboBoxService.text := ClientDataset1.Fields[3].AsString;
        FrmIncident.ComboBoxApplications.Text := ClientDataset1.Fields[4].AsString;
        FrmIncident.EditAutre.text := ClientDataset1.Fields[5].AsString;
        FrmIncident.EditIntervenantNom.text := ClientDataset1.Fields[6].AsString;
        FrmIncident.EditIntervenantPrenom.text := ClientDataset1.Fields[7].AsString;
        FrmIncident.EditTrigramme.text := ClientDataset1.Fields[8].AsString;
        FrmIncident.EditAutreIntervenant.text := ClientDataset1.Fields[9].AsString;
        FrmIncident.MemoEntreeCalendrier.text := ClientDataset1.Fields[10].AsString;
        FrmIncident.ShowModal;
     end;
     
    procedure TFrmTableauIncident.BtnSupprimerClick(Sender: TObject);
    begin
      if DbGrid1.Datasource.Dataset.RecNo >= 0 then
        if MessageDlg('Voulez-vous vraiment supprimer cet incident ?',
                           MtConfirmation, MbOkCancel, 0) = mrOk then
          DbGrid1.Datasource.DataSet.Delete;
          ClientDataSet1.Delete;
    end;
    Quelqu'un peut-il m'aider ? Un grand merci par avance ;-)

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    Le DBGrid n'est qu'une vue du DataSet, supprimer dans le DataSet est l'unique approche, cela sera refléter dans la grille

    Vous n'oubliez pas un SaveToFile pour changer le XML du TClientDataSet ?
    A vous de voir si le SaveToFile est à chaque transaction ou uniquement à la fermeture de l'application


    Attention qu'affiche ceci ShowMessage(BoolToStr( DbGrid1.Datasource.DataSet = ClientDataSet1, True)); ?

    votre code dans l'état, fait deux suppressions et l'imbrication des if sans begin end, c'est foireux !




    L'utilisation de TDBEdit ... serait aussi a privilégié, car là avec le code que vous montrez, il vous faudra actualiser manuellement tous les edit, peut-être dans un AfterScroll par exemple
    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
    Membre habitué
    Femme Profil pro
    Technicien réseau
    Inscrit en
    Septembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2021
    Messages : 10
    Par défaut
    J'ai testé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TFrmTableauIncident.BtnSupprimerClick(Sender: TObject);
    begin
      if DbGrid1.Datasource.Dataset.RecNo >= 0 then
              ClientDataSet1.Delete;
    end;
    mais j'ai le meme souci
    Ma ligne se supprime mais à la réouverture de l'appli elle est toujours présente

    Je dois faire un SaveToFile juste apres pour enregistrer les changement du XML du TClientDataSet ?

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 658
    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 658
    Billets dans le blog
    65
    Par défaut
    A mon avis seul ClientDataSet1.Delete; suffit

    Je dois faire un SaveToFile juste apres pour enregistrer les changement du XML du TClientDataSet ?
    pas forcément après, mais avant la fermeture de la forme ou du programme OUI.
    Cette mésaventure m'est déjà arrivé, à lire quelque part sur le forum

  5. #5
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    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 : 14 096
    Par défaut
    Soyez cohérent dans votre code même si DbGrid1.Datasource.Dataset et ClientDataSet1 sont surement le même objet, autant manipuler tout l'un ou l'autre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if DbGrid1.Datasource.Dataset.RecNo >= 0 then
      if MessageDlg('Voulez-vous vraiment supprimer cet incident ?', mtConfirmation, MbOkCancel, 0) = mrOk then
        DbGrid1.Datasource.Datase.Delete;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ClientDataSet1.RecNo >= 0 then
      if MessageDlg('Voulez-vous vraiment supprimer cet incident ?', mtConfirmation, MbOkCancel, 0) = mrOk then
        ClientDataSet1.Delete;
    De plus le test à RecNo ne semble pas le plus opportun, IsEmpty serait plus logique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if not ClientDataSet1.IsEmpty then
      if MessageDlg('Voulez-vous vraiment supprimer cet incident ?', mtConfirmation, MbOkCancel, 0) = mrOk then
        ClientDataSet1.Delete;
    Si vous avez utilisé un LoadFromFile
    Le SaveToFile doit être fait, à vous de choisir le meilleur moment, comme je l'ai écrit soit à chaque transaction (delete, update, insert) soit à la fermeture
    La première approche est plus fiable mais plus lourde si le fichier XML est gros.

    Si vous avez utilisé la propriété FileName, normalement, le Close devrait mettre à jour le fichier automatiquement.

    Si vous n'utilisez le XML que pour le stockage et non plus une mise à jour ultérieure d'une base déconnecté, passer LogChanges à False pour réduire la taille du fichier.
    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

  6. #6
    Membre Expert Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Par défaut
    XMl+cliendataset, un peut compliquer si tu veux ajouter une colone

  7. #7
    Membre habitué
    Femme Profil pro
    Technicien réseau
    Inscrit en
    Septembre 2021
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Septembre 2021
    Messages : 10
    Par défaut
    J ai tenté de suivre vos conseils mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TFrmTableauIncident.BtnSupprimerClick(Sender: TObject);
    begin
        if ClientDataSet1.RecNo >= 0 then
      if MessageDlg('Voulez-vous vraiment supprimer cet incident ?', mtConfirmation, MbOkCancel, 0) = mrOk then
        ClientDataSet1.Delete;
        FrmIncident.xmldoc.xml.SaveToFile(SaveDialog1.FileName);
    end;
    La ligne prise en exemple dans mon DBGrid se supprime Je ferme l'appli mais lorsque je la réouvre, j ai un message d'erreur

    "Exception EOleException dans le module ... Erreur analyse XML...Raison : Le document XML doit contenir un élément au niveau supérieur"

    En allant voir mon xlm, il est vide (Je l ai restauré)
    Images attachées Images attachées  

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

Discussions similaires

  1. Faire clignoter une ligne d'un dbGrid
    Par franck SEFIC dans le forum Composants VCL
    Réponses: 11
    Dernier message: 01/04/2009, 19h46
  2. Récupérer une ligne d'un DBGrid
    Par lila23 dans le forum Débuter
    Réponses: 9
    Dernier message: 10/03/2009, 11h02
  3. changer la couleur d'une ligne d'un dbgrid
    Par kroma23 dans le forum Débuter
    Réponses: 4
    Dernier message: 04/03/2009, 13h02
  4. Rendre une ligne d'un dbgrid non modifiable
    Par rxseac dans le forum Composants VCL
    Réponses: 3
    Dernier message: 22/11/2007, 09h38
  5. Comment mettre invisible une LIGNE d'un DBGrid ???
    Par EssaiEncore dans le forum Composants VCL
    Réponses: 16
    Dernier message: 07/01/2006, 02h05

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