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 :

[x10-sqlite]Detruire un enregistrement avec un listview


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 394
    Par défaut [x10-sqlite]Detruire un enregistrement avec un listview
    Bonjour

    J'essais de detruire un enrégistrement dans ma table a partir d'un listview , depuis quelque jours apres plusieurs essais qui ne fonctionne pas je viens vous demander de l'aide.

    voici une partie de mon code tiré de l'exemple embarcadero

    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
     
    begin
      ListView1.BeginUpdate;
      try
     for I in ListView1.Items.CheckedIndexes(True) do
         BEGIN
          champ:=i;
            if ListView1.Items.Checked[i] = True then
               begin
                  showmessage(inttostr(champ));    // ok = le numero de l'index selectionné  ex (3)
                  ListView1.Items.Delete(I);           // ca fonctionne pour le listview il disparait de la liste 
     
               //....   comment récuperer l'information du listview en cours et aller détruire l'enregistrement correspondant dans une table SqLite
     
               end;
     
         END;
      finally
      ListView1.EndUpdate;
      end;
    Ma question est que je suis incapable de récuperer l'information du listview qui contient 4 champs (Id integer , date, detail et un montant)

    Merci de votre aide

    Mario

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 094
    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 094
    Par défaut
    deux solutions,

    faire un record stocké dans Data permettant de retrouver l'Identifiant unique de l'enregistrement
    ce pointeur de record doit être instancié par New et libérer par Dispose (OnDeletion est parfait pour cela)

    la seconde solution : hériter de TListItem et fournir la classe via OnCreateItemClass

    Exemple pour l'info bulle
    le paramètre Item c'est ListView1.Items[I] dans ton code
    Cela permet d'avoir quelque chose de très poussée (et l'on a pas besoin de gérer la libération)

    AObjet est un objet métier du type Txxx.TScanObjet, disons qu'il ressemble au TTreatedObjet mais orienté DB, alors que TTreatedObjet est orienté graphique
    Txxx est une classe connecté à la DB et se charge de la gestion de données
    TxxxForm contient une instance de Txxx

    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
    //------------------------------------------------------------------------------
    procedure TxxxForm.lvObjetsTraitesCreateItemClass(Sender: TCustomListView; var ItemClass: TListItemClass);
    begin
      ItemClass := TTreatedObjet;
    end;
     
    //------------------------------------------------------------------------------
    procedure TxxxForm.lvObjetsTraitesInfoTip(Sender: TObject; Item: TListItem; var InfoTip: string);
    begin
      if Item is TTreatedObjet then
      begin
        with TTreatedObjet(Item) do
        begin
          InfoTip := 'Objet n°' + IntToStr(NumeroObjet);
     
          if ContenantEntree.TypeContenant <> ctNone then
            InfoTip := InfoTip + sLineBreak + Format('reçu depuis le contenant %s n°%d', [ContenantEntree.TypeContenantText, ContenantEntree.NumeroContenant])
          else
            InfoTip := InfoTip + sLineBreak + 'Reception libre';
     
          if ContenantSortie.TypeContenant <> ctNone then
            InfoTip := InfoTip + sLineBreak + Format('déplacé vers le contenant %s n°%d', [ContenantSortie.TypeContenantText, ContenantSortie.NumeroContenant])
          else
            InfoTip := InfoTip + sLineBreak + 'Erreur de traitement';
     
          InfoTip := InfoTip + sLineBreak + 'Référence : ' + Reference
            + sLineBreak + 'Réf. Four : ' + ReferenceFournisseur
            + sLineBreak + 'Descriptif : ' + Descriptif;
        end;
      end;
    end;
    évidemment l'ajout est fait ainsi (j'ai un peu élagué mon code)
    On peut fournir ainsi l'identifiant, dans mon cas NumeroObjet
    Mais aussi un tas d'autres informations pour faciliter leur affichage
    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
     
        with lvObjetsTraites.Items.Add() as TTreatedObjet do
        begin
          NumeroObjet := AObjet.NumeroObjet; // c'est ma clé unique
          Reference := AObjet.Reference;
          ReferenceFournisseur := AObjet.Produit.ReferenceFournisseur;
          Descriptif := AObjet.Produit.Descriptif;
     
          ContenantEntree.NumeroContenant := FScan.Contenant.Actif.NumeroContenant;
     
          if FScan.Contenant.Actif.NumeroContenant = AObjet.DernierHistorique.NumeroColis then
            ContenantEntree.TypeContenant := ctColis
          else if FScan.Contenant.Actif.NumeroContenant = AObjet.DernierHistorique.NumeroInventaire then
            ContenantEntree.TypeContenant := ctInventaire;
     
          ContenantSortie.NumeroContenant := FScan.ObjetTreatResult.ContenantSortieNumero;
     
          if FScan.ObjetTreatResult.ContenantSortieType = toctColis then
            ContenantSortie.TypeContenant := ctColis
          else if FScan.ObjetTreatResult.ContenantSortieType = toctInventaire then
            ContenantSortie.TypeContenant := ctInventaire;
     
          if FScan.ObjetTreatResult.TreatState = Txxx.TTreatObjetResultState.torsWarning then
            TxxxMessageDlg.Show(FScan.ObjetTreatResult.TreatMessage, mtWarning, [mbOK], mbCancel);
        end;
    le type hérité (c'est un sous-type de la TForm, et il contient lui même des sous-types)
    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
     
      private
        type
          TTreatedObjet = class(TListItem)
            type
              TContenantType = (ctNone, ctxxx);
              TContenant = class(TObject)
              private
                const
                  CONTENANT_TYPE_TEXT: array[TContenantType] of string = ('', 'xxx');
              private
                FNumeroContenant: Integer;
                FTypeContenant: TContenantType;
                FOnChange: TNotifyEvent;
                procedure DoChange();
                procedure SetNumeroContenant(const Value: Integer);
                procedure SetTypeContenant(const Value: TContenantType);
                function GetTypeContenantText(): string;
              public
                property NumeroContenant: Integer read FNumeroContenant write SetNumeroContenant;
                property TypeContenant: TContenantType read FTypeContenant write SetTypeContenant; 
                property TypeContenantText: string read GetTypeContenantText;      
                property OnChange: TNotifyEvent read FOnChange write FOnChange;          
              end;
            const
              IDX_SUB_CNT_ENTREE = 0;
              IDX_SUB_CNT_SORTIE = 1;           
          private
            FNumeroObjet: Integer;
            FContenantEntree: TContenant;
            FContenantSortie: TContenant;
            FReference: string;
            FReferenceFournisseur: string;
            FDescriptif: string;
            procedure ContenantChange(Sender: TObject);
            procedure SetNumeroObjet(const Value: Integer);
            procedure ChangeSubItems(ASubItemIndex: Integer; const Value: string);
          public
            constructor Create(AOwner: TListItems); override;
            destructor Destroy(); override;
     
            property NumeroObjet: Integer read FNumeroObjet write SetNumeroObjet;
            property Reference: string read FReference write FReference;
            property ReferenceFournisseur: string read FReferenceFournisseur write FReferenceFournisseur;
            property Descriptif: string read FDescriptif write FDescriptif;
     
            property ContenantEntree: TContenant read FContenantEntree;
            property ContenantSortie: TContenant read FContenantSortie;
          end;
    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 657
    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 657
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    je croyais avoir posté une réponse ce matin, mais j'ai du zapper le [envoyer]
    en gros je demandais
    - si il s'agissait de VCL ou de FMX
    - de comment était rempli la liste (livebindings ou manuellement)
    et dans le cas où il s'agissait de FMX+Livebindings quelles étaient les liaisons et le style ItemEditStyle ?

    pour donner un exemple dans le cas cité au dessus
    si la liste est liée (livebidings) correctement (Synch de ListView à * de la Table/Query) un simple code devrait pouvoir le faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For i in in ListView1.Items.CheckedIndexes(True) 
     do begin
        ListView1.ItemIndex:=i; //  me reste un doute je ne sais pas si le fait de faire la boucle exécute le déplacement dans la liste , je n'ai pas encore vérifié, donc je force 
    <s>    Table.Delete;</s>
     end;
    sinon, si la clé est numérique il existe toujours la solution de lier le Tag de l'item à celle-ci (dommage le TagString n'existe pas pour un Item)

    [Edit]
    // me reste un doute je ne sais pas si le fait de faire la boucle exécute le déplacement dans la liste ,
    Doute légitime, après essai cela ne fonctionne pas

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 657
    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 657
    Billets dans le blog
    65
    Par défaut
    Bonjour,

    je suis revenu sur ce truc qui me trainait dans la tête, je ne sais toujours pas s'il s'agit de FMX ou non mais je pars sur ce principe

    ma proposition au dessus ne fonctionne pas car le positionnement dans la table ne se fait pas, je n'ai pas trouver le moyen de me déplacer dans la table en me déplaçant dans la liste (sauf bien sur en sélectionnant l'item par un clic)

    à partir du moment où une valeur de clé est stockée dans l'item la solution était simple : il suffit de faire une requête paramétrée le challenge semble plutôt être lorsque la clé n'est pas stockée. j'ai pris alors le problème à rebours en me déplaçant dans le Dataset et en vérifiant si l'item correspondant était coché

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    // je rappelle au besoin que j'ai lié (livebinding) Synch de listview à FDQuery
    FdQuery1.First;
    while not FDQUery1.EOF do
      begin
       if ListView1.Items.GetChecked(ListView1.ItemIndex) then fdQuery1.Delete;
       FdQuery1.Next;
      end;
    Seul bémol les rafraichissements de la listView , ce n'est pas qu'ils se fassent pas au contraire ils se font tous (positionnement et delete)

    j'ai aussi voulu tenter l'utilisation de l'évènement OnDeletingItem mais, il doit me manquer quelque chose car jamais je ne rentre dedans
    à moins que ce ne soit déclencher par le bouton Delete selon les styles ?

    je recherche toujours quand même le moyen de me déplacer dans le datasource via la listview

Discussions similaires

  1. Récupérer tous les enregistrements avec SQLite
    Par 304bl dans le forum Android
    Réponses: 4
    Dernier message: 04/02/2012, 12h52
  2. insertion d'enregistrement avec MySQL Administrator
    Par Lady_jade dans le forum Outils
    Réponses: 1
    Dernier message: 08/09/2005, 16h04
  3. Réponses: 4
    Dernier message: 20/06/2005, 14h57
  4. Comparer l'enregistrement avec le suivant ...
    Par psyco2604 dans le forum ASP
    Réponses: 3
    Dernier message: 01/06/2004, 17h40
  5. [VB6] Supprimer un enregistrement dans une ListView ??
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/11/2002, 09h37

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