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 dans DBase


Sujet :

Bases de données Delphi

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut Suppression dans DBase
    Bonjour,
    Je rencontre un sérieux problème
    J’ai une application sous COBOLE
    Elle est un peut lourde
    Pour cela j’ai développé une application sous windows avec delphi et des tables DBase ‘DBF’
    Mais le problème et que a chaque suppression d’enregistrement sous delphi une fois mes tables sous dos DBU ‘DBase’ je me retrouve avec des enregistrement en double donc pas de suppression physique sous delphi par exemple si je veux vider une table avec Emptytable ça marche toute la table est vide est a la prochaine insertion sous delphi le premier enregistrement est a 1
    Par contre avec delete la taille n’est pas réduite si avant la suppression le nombre d’enregistrement est 400 donc après la suppression le premier a le numéro 401
    Comment faire c’est très urgent aide moi.
    Merci d’avance.

  2. #2
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Salut,

    Si je comprend bien, ce numéro que tu mentionnes est une clé primaire; il n'indique par forcément "le nombre d'élément" de ta table, mais est un pointeur unique vers un enregistrement.

    En fonction des bases de données, tu as des outils pour optimiser l'espace utilisé par les tables, mais tes clés primaires ne changeront pas; c'est fait exprès, ça permet de conserver l'intégrité référentielle.

    A+

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut urgent
    merci pou ta reponce
    ce numéro que je mentionnes n'est pas une clé primaire; il indique le nombre d'enregistrement de ma table generer automatiquement sous delphi ds le module base de donnée c'est un numero incrementable se n'est pas un champ.

    donc comment faire pour optimiser l'espace utilisé par les tables,apres la suppression d'un enregistrement pour ne plus le trouve sous dos.
    merci

  4. #4
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    De rien,

    Le numéro auto-incrementable est "en général" utilisé comme clé primaire car il permet justement de conserver l'intégrité référentielle. Le comportement est normal, tout ce que tu peux faire c'est optimiser l'espace disque utilisé, et pour ça il faut regarder du coté de la doc de ta base de données.

    Pour bien comprendre pourquoi ça fait cela, c'est simple : imaginons ton enreg 400, sur lequel pointe une autre table.

    400 represente ta commande

    et sur une autre table, ligne de commande pointe dessus.

    ligne de commande 1 -> 400
    ligne de commande 2 -> 400

    Maintenant, tu décides de supprimer ton enreg 400. Tes lignes ne commande continuent à pointer sur l'enreg 400 même si il n'existe plus, ce qui est normal; Imagine tu insères un nouvel enregistrement, totalement différent, dans la même position ( 400 ) et bien tu auras un problème, car tes lignes de commandes pointeront dessus alors qu'elles ne doivent pas.

    A+

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut dbase
    avec delete les enregistrement sont supprimer ds delphi mais une fois mes tables sous DBU sous dos je retrouve tout les enregistrement supprimer sous delphi.

  6. #6
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    Je crois que les tables de base de données DBase permettent une suppression des enregistrements en deux étapes, a la première étape l'enregistrement est simplement occulté puis en 2eme étape il est supprimé physiquement de la table.
    Peut-être que ton problème viens de la.

  7. #7
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Citation Envoyé par colombe
    avec delete les enregistrement sont supprimer ds delphi mais une fois mes tables sous DBU sous dos je retrouve tout les enregistrement supprimer sous delphi.
    Je ne comprend pas bien ce que tu dis, peux-tu être plus précis ?

    La commande SQL DELETE FROM efface des enregistrements.
    La commande SQL DROP TABLE efface la table et les enregistrements.

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut Delete
    je m'explique encore mieux
    Je souhaite supprimer des enregistrements dans une table : l'instruction Delete fonctionne bien, pas de souci, et visuellement le résultat est correct. Mais en observant la table à l'aide du bloc-notes de Windows, j'observe que les enregistrements "deleted" sont toujours présents, simplement marqués d'un astérisque. Or je voudrais les détruire réellement (sous DOS et Clipper5, j'utilisais pour cela l'instruction PACK : l'équivalent existe-t-il sous Delphi ?) merci,

  9. #9
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    C'est beaucoup plus clair
    En effet sous DBase, tes enregistrements sont seulement "marqués" prêt à l'effacement. IL FAUT faire un PACK pour les enlever "physiquement".

    Sous Delphi, tu dois utiliser la méthode Regarde la doc pour savoir comment l'utiliser

    A+

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut Index endomager apres suppréssion
    merci beacoup
    ca marche maintenent mais il reste un petit probleme
    une fois un enregistrement supprimer je ne peut plus acceder a la table car l'index est endomagé.
    le code est le suivant

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    table1.DatabaseName := 'Paie';
    table1.TableName := 'Navette';
    table1.TableType := ttDBase ;
    dbgrid1.DataSource:=datasource1;
    table1.Active := true;
    end;

    procedure TForm1.Button1Click(Sender: TObject);
    var l_dbi: Integer;
    begin
    table1.Delete;
    table1.Active:=false;
    Table1.Close;
    Table1.Exclusive:= True;
    Table1.Open;
    l_dbi:= BDE.DbiPackTable(Table1.dbHandle, Table1.Handle, nil, nil, True);
    end;
    comment faire pour regler le probleme
    merci

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut Svp
    SVP une reponse c'est trés urgent
    merci

  12. #12
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 890
    Par défaut
    Salut,

    Tu as une doc pour tes développements ? J'ai trouvé cette fonction dans la liste des fonctions de l'api bde, trouvable ici : http://info.borland.com/devsupport/b...iex/index.html

    A+

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut merci
    ok merci je vais voir

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut table occupee
    Comment je peut eviter le message de la table est occupee

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut table occupée
    Comment travailler avec emptytable
    sans etre interempue par le message table occupée.
    voici mon code source:

    DM.tab_nav.Active:=False;
    DM.tab_nav.DatabaseName:='';
    DM.tab_nav.TableName:='';
    DM.tab_nav.DatabaseName:='PAIE';
    DM.tab_nav.TableName:='Navette.dbf';
    DM.tnav.Active:=false;
    DM.Tnav.Exclusive:= True;
    DM.tnav.EmptyTable;
    DM.batchmove1.Execute;
    DM.tab_nav.Active:=false;
    DM.tab_nav.Exclusive:= True;
    DM.tab_nav.EmptyTable;
    l_dbi:= BDE.DbiPackTable(DM.tab_nav.dbHandle, DM.tab_nav.Handle, nil, nil, True);
    DM.tnav.Active:=false;
    DM.Tnav.Exclusive:= True;
    l_dbi:= BDE.DbiPackTable(DM.Tnav.dbHandle, DM.Tnav.Handle, nil, nil, True);
    DM.batchmove2.Execute;
    tab_nav occupée.
    merci

  16. #16
    Membre chevronné Avatar de Bejaia-In
    Inscrit en
    Avril 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 365
    Par défaut
    Je me suis permis de refaire votre 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
    41
     
    with DM do
    begin
     with tab_nav do
     begin
      //Active:=False;//inutile
      //DatabaseName:='';// inutile
      //TableName:='';   // inutile
      DatabaseName:='PAIE';
      TableName:='Navette.dbf';
     end;
     with tnav do
     begin
      Active:=false;
      //Exclusive:= True;// inutile
      EmptyTable;
     end;
     // Il n'est pas nécessaire de vider la table "tnav" pour y copier une autre table,
     // utilise le mode "batCopy" de TBatchMove.
     batchmove1.Execute;
     
     with tab_nav do
     begin
      Active:=false;
      //Exclusive:= True; // inutile
      EmptyTable;       // même remarque qu'auparavant. (pas nécessaire)
      //l_dbi:=BDE.DbiPackTable(dbHandle,Handle, nil, nil, True);
      // inutile de forcer la mise à jour.
     end;
     with tnav do
     begin
      Active:=false;
      //Exclusive:= True; // inutile
      //l_dbi:=BDE.DbiPackTable(dbHandle,Handle, nil, nil, True);// cette fonction restructure la table.
      DbiSaveChanges((tnav as TTable).Handle);//force la mise a jour sur disque.  
      // Cette fonction ne doit être utilisé qu'après un "POST" ou un "DELETE" sur une table.
      // dans le cas présent c'est inutile.
     end;
     
     batchmove2.Execute;
    end;
    Si tab_nav est occupée, c'est qu'elle est utilisée autre part.
    Et dans votre cas c'est inévitablement par DELPHI lui-même !
    Vous ne devrez pas ouvrir la base de données dans DELPHI, mais dans votre application en LIVE.

  17. #17
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Par défaut
    Mes amis;
    Pour éviter tout ce genre de problème, il faut que les tables soient activés par l'application elle même à son démarage et non pas manuellement à la conception.
    Ensuite, si on veut vider la table, il suffit d'écrir :
    ma_table.active:=false;
    ma_table.emptytable;
    ma_table.active:=true;
    et tout va bien.
    Alors que si les tables sont activés manuellement à la conception, cela ne marche pas car "ma_table.active:=false" n'est pas permise.
    J'espère que c'est clair.

  18. #18
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut merci pour la reponse
    merci oui c'est tres claire
    mais ma table elle est active par programmation et pas manuelement
    mais des fois le message sort et des fois non
    je ne comprend rien du tout.
    merci

  19. #19
    Membre confirmé
    Inscrit en
    Mai 2006
    Messages
    249
    Détails du profil
    Informations personnelles :
    Âge : 53

    Informations forums :
    Inscription : Mai 2006
    Messages : 249
    Par défaut
    Je t'assure que :
    1- Si la table est activer par programmation
    2- La table n'est pas ouverte par une atre application
    3- Pas de bug durant l'exécution
    Le message n'apparaitera jamais.

  20. #20
    Membre confirmé
    Inscrit en
    Janvier 2003
    Messages
    118
    Détails du profil
    Informations forums :
    Inscription : Janvier 2003
    Messages : 118
    Par défaut
    La table est active par programmation, elle n'est pas ouverte par une autre application
    mais le message apparait toujours.
    es que je ne doit meme pas lie les dbedit et les dbgrid et les lie par programmation?
    svp une reponse et merci

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de suppression dans une table
    Par Splinter dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/10/2005, 10h55
  2. [Debutant]Suppression dans des tables avec contraintes
    Par Roming22 dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 26/10/2004, 17h23
  3. Combler les trous lors d'une suppression dans une table
    Par Billybongjoe dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 08/04/2004, 14h02
  4. [LG]suppression dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 9
    Dernier message: 16/12/2003, 21h20
  5. [LG]suppression dans un fichier
    Par cedrick essale dans le forum Langage
    Réponses: 5
    Dernier message: 10/08/2003, 15h22

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