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 :

Suppression multiple dans DBGrid en Interbase


Sujet :

Bases de données Delphi

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Suppression multiple dans DBGrid en Interbase
    Salut à tous, mon problème est que j'arrive à supprimer une ligne d'un dbgrid mais pas plusieurs.
    Alors je suis sur INTERBASE
    Delphi 2010 FR
    Voici ma procédure de suppression

    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
     
    procedure TForm1.btn1Click(Sender: TObject);
      Var
        i,K : Integer;
        N_Fact, Num_Bord, S  : string;
    begin
      if Dialogs.MessageDlg('Confirmer la suppréssion des factures séléctioners ?',
        mtConfirmation, [mbAbort, mbYes], 0, mbYes) = mrYes then
      begin
        with dbgrd1 do
        begin
          I:= 1;
          while i<= SelectedRows.Count -1 do
            begin
              N_Fact := '';
              DataSource.DataSet.GotoBookmark(pointer(SelectedRows.Items[i])); // à cette ligne après de deuxième passage de la boucle erreur violation d'accès.
              N_Fact := DataSource.DataSet.FieldByName('N_Facture').Value;
              Try
                IBQuery1.SQL.Clear;
                IBQuery1.SQL.Add('Delete From ENTETEFACT where N_Facture = :N1');
                IBQuery1.Params.ParamByName('N1').Value := N_Fact;
                if not IbTransaction1.InTransaction
                  then IbTransaction1.StartTransaction;
                IBQuery1.ExecSql;
                IbTransaction1.Commit;
                IBTransaction1.Active := True;
              except
              end;
              I := I + 1;
            end;
        end;
      end;
    Merci

  2. #2
    Membre actif
    Inscrit en
    Décembre 2004
    Messages
    390
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 390
    Points : 288
    Points
    288
    Par défaut
    Voici une solution :

    Je récupère d'abord les n° de facture à supprimer dans un tableau dynamique et ensuite je le parcours et supprime les factures grâce aux n° qu'il contient. A la fin en exécute un refresh pour actualiser la table.

    Pour les transactions, je ne travaille pas avec IB donc j'ignore comment il faut les appliquer.


    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
     
    procedure TForm1.btn1Click(Sender: TObject);
    Var
      i,K : Integer;
      N_Fact, Num_Bord, S : string;
      aNoFact : Array of string;
    begin
      if Dialogs.MessageDlg('Confirmer la suppression des factures sélectionnées ?',
                  mtConfirmation, [mbAbort, mbYes], 0, mbYes) = mrYes then begin
        with DbGrid1.DataSource.DataSet do begin
          I := 0;
          while i <= SelectedRows.Count -1 do begin
            GotoBookmark(pointer(SelectedRows.Items[i]));
            SetLength(aNoFact, (i + 1) );
            aNoFact[i] := FieldByName('N_Facture').AsString;
            I := I + 1;
          end;
        end;
     
        if not IbTransaction1.InTransaction  then IbTransaction1.StartTransaction;
        IBQuery1.SQL.Text := 'DELETE FROM ENTETEFACT WHERE N_FACTURE=:N_FACTURE');
        for i := low(aNoFact] to High(aNoFact] do begin
          IBQuery1.Params.ParamByName('N_FACTURE').Value := aNoFact[i];
          IBQuery1.ExecSql;
        end;
        IbTransaction1.Commit;
        IBTransaction1.Active := True;
        DbGrid1.DataSource.DataSet.Refresh;
      end;
    end;

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Suppression multiple dans DBGrid en Interbase
    Salut et merci à akli agha pour sa réponse et son aide précieuse

    le code que vous m'avais envoyer ne marche pas parfaitement, mais portait quelque modification et après test ça marche à merveille.
    S'il y'a quelqu'un d'autre qui peut apporté des améliorations et plus de pour rendre le code plus simple et pratique sa sera bien
    alors voici le 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    procedure TForm1.btn1Click(Sender: TObject);
    Var
      i : Integer;
      N_Fact,Num_Bord,S : string;
      aNoFact : Array of string;
    begin
      if Dialogs.MessageDlg('Confirmer la suppression des factures sélectionnées ?',
                  mtConfirmation, [mbAbort, mbYes], 0, mbYes) = mrYes then begin
        with DbGrd1 do begin
          I := 0;
          while i <= SelectedRows.Count -1 do begin
            DataSource.DataSet.GotoBookmark(pointer(SelectedRows.Items[i]));
            SetLength(aNoFact, (i + 1) );
            aNoFact[i] := DataSource.DataSet.FieldByName('N_Facture').AsString;
            I := I + 1;
          end;
        end;
     
        if not IbTransaction1.InTransaction  then IbTransaction1.StartTransaction;
        IBQuery1.SQL.Text := 'DELETE FROM ENTETEFACT WHERE N_FACTURE=:N_FACT';
        for i := low(aNoFact) to High(aNoFact) do begin
          IBQuery1.Params.ParamByName('N_FACT').Value := aNoFact[i];
          IBQuery1.ExecSql;
        end;
        IbTransaction1.Commit;
        IBTransaction1.Active := True;
      end;
      IBQuery1.Close;
      IBQuery1.SQL.Clear;
      Mmo1.Clear;
      Num_Bord := ComboBox1.Text;
      Try
        S:='Select N_Facture,Date_Facture,Mont_OFF,Mont_Ass,Mont_Fact,N_Assure,Centre,(Mont_OFF+Mont_Ass+Mont_Fact) AS Total From ENTETEFACT where N_Bourdereau= :Num_Bord order By N_Facture';
        IBQuery1.SQL.Add(S);
        IBQuery1.Params.ParamByName('Num_bord').Value := ComboBox1.Text;
        IBQuery1.Open;
      Except;
      End;
    end;

  4. #4
    Membre émérite 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
    Points : 2 771
    Points
    2 771
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBGrid2.SelectedRows.Delete;
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  5. #5
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Suppression multiple dans DBGrid en Interbase
    Salut et merci pour votre participation, Es que sa supprime de la base ou du dbgrid uniquement, plus de précision S.V.P.

  6. #6
    Membre émérite 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
    Points : 2 771
    Points
    2 771
    Par défaut

    laide en ligne:
    Supprime tous les enregistrements spécifiés par les signets de la liste de l'ensemble de données du DBGrid associé.

    procedure Delete;

    Description

    Appelez Delete pour supprimer l'ensemble d'enregistrements représenté par la liste de signets de l'ensemble de données du DBGrid associé. Pour supprimer tous les signets de la liste sans changer l'ensemble de données, utilisez plutôt la méthode Clear
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par edam Voir le message
    DBGrid2.SelectedRows.Delete
    Attention cela dépend beaucoup des composants utilisés .
    Par exemple :
    - Avec un UIBQuery , le delete sera ignoré
    - Avec un TTable BDE pas de soucis
    - Avec un TQuery BDE cela va dépendre du SQL (c'est a proscrire dans des cas de Jointures de Tables par exemple)
    etc ....
    Pour en revenir au problème de chemirikmohamed
    Avec un TIBSQLUpdate (bien fait), lié au TIBQuery cela pourrait fonctionner
    (à tester)
    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

  8. #8
    Membre émérite 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
    Points : 2 771
    Points
    2 771
    Par défaut
    je préfère de loin TIBdataset que ibquery+ibupdate ou ibtable
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    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 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par edam Voir le message
    je préfère de loin TIBdataset que ibquery+ibupdate ou ibtable
    tout dépend de l'environnement de travail . Personnellement je préfère de loin envoyer le moins de datas possibles (donc des querys ciblées) plutôt que toute une table , question de performance en VPN , il n'y a pas photo
    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

  10. #10
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Suppression multiple dans DBGrid en Interbase
    Salut, je suis d’accord avec sergiomaster tous dépends du composant que vous utilisé, avec UIBQuery rien ne se passe, avec TTable c'est OK, avec TQuery il faut une manipulation précises alors voila.
    le code que j'ai écrit dans le poste #3 après quelque modification d’après la solution donner par Akli agha et après test sa marche très bien.

    vous pouvez l'utilisé et le changé a vos fins.

    je suis toujours d'accord pour plus d'amélioration sur le code afin de le rendre plus rerformant

  11. #11
    Membre émérite 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
    Points : 2 771
    Points
    2 771
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    tout dépend de l'environnement de travail . Personnellement je préfère de loin envoyer le moins de datas possibles (donc des querys ciblées) plutôt que toute une table , question de performance en VPN , il n'y a pas photo
    ??
    normalement TIbdataset est mieux adapté que tibquery pour ciblage, si en veux une dataset en lecture, on a que renseigné sauf select , si le résultat n'est pas visible sur dans composant DB, c'est TIBsql la meilleur


    normalement j'ai pris cette décision selon les conseille donnée par paul dans son livre
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  12. #12
    Membre régulier
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2010
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2010
    Messages : 192
    Points : 71
    Points
    71
    Par défaut Suppression multiple dans DBGrid en Interbase
    Salut tous le monde, je pense que c'est la méthode la juste à utiliser puisque aucune autre solution n'a était proposer.

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

Discussions similaires

  1. suppression multiple dans form
    Par evevev dans le forum Langage
    Réponses: 2
    Dernier message: 15/10/2011, 06h48
  2. suppression multiple dans un StringGrid
    Par ludojojo dans le forum C++Builder
    Réponses: 26
    Dernier message: 31/05/2008, 12h35
  3. Récupérer des valeurs multiples dans un DBGrid
    Par Antjac dans le forum Bases de données
    Réponses: 7
    Dernier message: 17/12/2007, 20h44
  4. suppression multiple dans un treeview
    Par tomkiki dans le forum Delphi
    Réponses: 6
    Dernier message: 09/05/2007, 15h30
  5. Réponses: 2
    Dernier message: 08/01/2007, 20h26

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