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 :

Récupérer un enregistrement effacé


Sujet :

Bases de données Delphi

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 31
    Points : 24
    Points
    24
    Par défaut Récupérer un enregistrement effacé
    Table.Delete efface logiquement l'enregistrement pointé, lequels restera toujours présent dans ma base au format .DBF

    D'après l'aide Delphi DbiUndeleteRecord permet de récupérer un enregistrement dBASE effacé avac Table.delete
    Voici ce qu'il est précisé sur l'exemple de l'aide:

    Undeletes a dBASE record if it is supported.
    This example uses the following input:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      fDbiUndeleteRecord(AnimalTbl);
    The procedure is:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure fDbiUndeleteRecord(dBASETbl: TTable);
    var
      CProps: CurProps;
    begin
      Check(DbiGetCursorProps(dBASETbl.Handle, CProps));
      // Raise an EDBEngineError exception if the table is not dBASE
      if (StrIComp(CProps.szTableType, szDBASE) <> 0) then
        raise EDBEngineError.Create(DBIERR_NOTSUPPORTED);
      // Raise an EDatabaseError exception if the cursor does not have soft deletes on
      if (CProps.bDeletedOn = False) then
        raise EDatabaseError.Create('Soft deletes is not on');
     
      Check(DbiUndeleteRecord(dBASETbl.Handle));
    end;
    Mon problème est de savoir comment afficher et pointer sur un enregistrment effacé qui n'est pas visible dans le DBGRID

    Voici ce qu'il est précisé dans l'aide:
    The cursor must be positioned on a record. The cursor must have the property bDeletedOn set to TRUE.

    Mais je ne vois pas comment faire ....

  2. #2
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Bonjour,

    Je penses que les composants orientés donnés ne peuvent pas afficher les enregistrements effacés logiquement. Dès que le support sous-jascent ne "contient" plus logiquement l'enregistrement en question et que la grille (par exemple) est raffraîchie, tu ne le verras plus à mon avis.

    Il y'a beaucoup de questions que je me pose par rapport à cette façon de fonctionner. Et la première est : "Est-ce que dBase supporte les transactions ?" Si non, cà pourrait expliquer ce comportement.

    Par contre, tu pourrais peut être utiliser une grille non connectée et voir si tu peux rapatrier et afficher tous les enregistrements : effacés ou non.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 31
    Points : 24
    Points
    24
    Par défaut
    Dbase supporte bien cette possibilité de récupérer un ou des enregistrements effacés logiquementet et qui sont encore présent dans la base.

    D'après l'aide Delphi DbiUndeleteRecord permettrait de récupérer un enregistrement dBASE effacé avec Table.delete.

    Il est précisé que le cursor doit être positionné sur l'enregistrement et que la propriété bDeletedOn du cursor doit être à TRUE

    J'ai trouvé comment modifier cette propriété
    CProps.bDeletedOn:=true;

    Mon problème est de savoir comment pointer sur un enregistrement effacé et qui n'est pas visible dans le DBGRID même après rafraichissement....

  4. #4
    Rédacteur
    Avatar de Giovanny Temgoua
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    3 830
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 3 830
    Points : 4 006
    Points
    4 006
    Par défaut
    Citation Envoyé par karinya
    Mon problème est de savoir comment pointer sur un enregistrement effacé et qui n'est pas visible dans le DBGRID même après rafraichissement....
    Perso, comme je l'ai dit plus haut, je ne pense pas qu'avec le DBGrid "classique" tu puisses le faire. C'est pourquoi je t'ai proposé un stringgrid que tu chargerais toi même...

    Enfin, si tu trouves, ce pourrait être une excellente entrée pour la FAQ

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    529
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 529
    Points : 464
    Points
    464
    Par défaut
    Salut
    Je crois que s'il n'y a pas de solution, on doit détourner plutôt jouer le même jeu que delete de DBASE, comment?
    simplement en ajoutant un champs à votre enregistrement qui prendra le nom de etat detype boolean et quand vous cliquez sur le boutton que vous avez placer pour effacer l'enregistrement le champs etat prendra la valeur TRUE.
    Comme ça vous allez pouvoir le contrôler.
    ce n'est qu'une idée et à vous de voir.
    Bonne chance.
    Merci.
    Deux, n'apprendront pas; le timide et l'arrogant

  6. #6
    Membre averti

    Homme Profil pro
    ingénieur, retraité
    Inscrit en
    Février 2007
    Messages
    230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur, retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 230
    Points : 332
    Points
    332
    Par défaut Delphi Dbase Enregistrement effacé
    Bonjour,
    j'ai trouvé sous Borland.com un document "delsec06.faq" qui donne, entre autre, la possibilité d'afficher les enreg. effacé.
    ci dessous lun extrait :

    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
     
     Doc Borland : "delsec06.faq" 08/1995
     
    Q:   "How can I view dBASE records marked for deletion?"
     
    A:   Call the following function on the AfterOpen event of the table. You Must
         include DBITYPES, DBIERRS, DBIPROCS in the uses clause (maintenant BDE).  To call, send as
         arguments name of TTable and TRUE/FALSE depending to show/not show deleted
         records. Ex:
     
         procedure TForm1.Table1AfterOpen(DataSet: TDataset);
         begin
           SetDelete(Table1, TRUE);
         end;
     
         procedure SetDelete(oTable:TTable; Value: Boolean);
         var
           rslt: DBIResult;
           szErrMsg: DBIMSG;
         begin
           try
             oTable.DisableControls;
               try
                 rslt := DbiSetProp(hDBIObj(oTable.Handle), curSOFTDELETEON,
                 LongInt(Value));
                 if rslt <> DBIERR_NONE then
                   begin
                     DbiGetErrorString(rslt, szErrMsg);
                     raise Exception.Create(StrPas(szErrMsg));
                   end;
               except
                 on E: EDBEngineError do ShowMessage(E.Message);
                 on E: Exception do ShowMessage(E.Message);
               end;
           finally
             oTable.Refresh;
             oTable.EnableControls;
           end;
         end;
     
    --------------------------------------------------------------------------------
    Q:   "How can I create a column in the grid to which records in a dBASE table
         are marked for deletion?"
     
    A:   Create a calculated field, then for the OnCalcField event of the table
         replace the calculated field you've created like so:
     
         procedure TForm1.Table1CalcFields(DataSet: TDataset);
         var
           RCProps : RecProps;
           Result : DBIResult;
         begin
           Result := DbiGetRecord(Table1.Handle, dbiNoLock, Nil, @RCProps);
           If RCProps.bDeleteFlag then Table1Del.Value := 'X' else
           Table1Del.Value := '';
         end;
     
         Note: You must first call the SetDelete(TTable,TRUE) function from the
         previous FAQ:
    La 1° FAQ que j'ai essayée donne la liste de tous les enreg., mais sans possibilités de distinguer effacé et pas.

    La seconde permet d'afficher le premier octet d'un enreg. DBase qui est blanc ou 'X' pour un enreg. effacé. Je ne l'ai pas essayée.


  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 107
    Points : 115
    Points
    115
    Par défaut
    Je vous conseil de crée une base de donnée Image qui comporte la mêm structure que la première que vous nomeré Corbeille.
    Puis après chaque suppression de la première la seconde récupère l'enregistrement.
    cela te permetera de récuperer tous les enregistrement déja supprimer tout ons les affichant sur un DbGrid par exemple.

Discussions similaires

  1. Comment récupérer le nombre d'enregistrements effacés ?
    Par Jérôme Lambert dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/10/2006, 09h22
  2. Récupérer 2 enregistrements en 1
    Par linou dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/06/2005, 10h05
  3. insertion : comment récupérer l'enregistrement ?
    Par farmer dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/04/2005, 18h57
  4. [Envoi mails]Récupérer les enregistrements MX d'un domaine
    Par streetpc dans le forum Développement
    Réponses: 7
    Dernier message: 09/06/2004, 20h00
  5. Récupérer dernier enregistrement d'une table?
    Par Invité dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 19/01/2004, 11h38

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