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 :

vidage de table, aucune reponse claire ??


Sujet :

Bases de données Delphi

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut vidage de table, aucune reponse claire ??
    Salut a tous !!!

    Alors voila, je souleve un sujet assez redondant dans ce forum a propos du vidage de tables. En effet, plusieurs personnes dont moi ont posé la meme question : comment vider physiquement une base de données ? Ehhh oui, lorsque l'on fait une requete SQL du type DELETE FROM matable, si on regarde la taille du fichier de la base, on se rend compte qu'il y a toujours les enregistrements. Idem, Si on regarde les champs auto increments, ils ne repartiront pas de 1. Idem pour la méthode Emptytable d'apres certains (perso, ca m'effacait bien physiquement mais ca marche plus j'ai une exception que je ne comprend pas). Enfin, la methode de compactage mais je n'ai jamais trouvé comment faire...

    Donc pour resumer tout ce tintouin, comment faire pour effacer tous les enregistrements d'une table proprement sachant que la table est active, en autorefresh et qu'elle n'est pas en mode exclusif.

    Désolé pour la redondance mais c'est un truc qui a besoin d'etre mis au point une bonne fois pour toute car les reponses sont parfois peu claires et n'aident pas.

    Merci d'avance

  2. #2
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Question claire = Réponse claire

    Quelle est la BDD utilisée ?
    Quel middleware utilisé ? ( BDE, DBExpress,... )
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    oups desolé

    J'utilise une base dbase (*.dbf)
    avec les composants Ttable, Tquery, Tdatasource

    voila voila

    Merci

    ps : je parlais de reponse claire non pas pour descendre les réponses mais plutot dans le but de faire un topic qui répond pile poil à la question pour les futures personnes qui en auraient besoin. Je dis ça pour eviter tout malentendu

  4. #4
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    La meilleure méthode dans ce cas, est d'utiliser TTable.EmptyTable. Cette méthode permet de réduire la taille du fichier contrairement aux autres. Tu dis que tu obtiens une erreur dans ce cas, quelle est cette erreur ?
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Il me dit qu la table ne peut pas etre ouverte en mode exclusif.... Je pense que comme elle est utilisée par certains composants comme des DBGrid ou autres dblookuplistbox il n'arrive pas a avoir l'exclu mais bon...

    Sinon j'ai essayé de suivre un peu les messages d'erreur et mis le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    datamodule1.Formules.active:=false;
    datamodule1.Formules.Close;
    datamodule1.Formules.exclusive:=true;
    datamodule1.Formules.EmptyTable;
    datamodule1.Formules.exclusive:=false;
    datamodule1.Formules.Open;
    datamodule1.Formules.active:=true;
    il me dit que la table est occupée...mis a part des controles comme je viens de citer au dessus et eventuellement quelques Query... je ne vois pas ou elle pourrait etre occupée

    donc voila un peu pourquoi je relance ce sujet. C'est tellement la misère à comprendre !!!!

    merci de prendre du temps pour ça en tout cas

  6. #6
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Active a False ou True devant ou après Close/Open est inutile, c'est redondant.

    Pour ton problème, les TQuery peuvent te géner s'ils sont ouverts sur la table en question. Il faut que la table ne soit ouverte pas aucun autre composant ni aucune autre application.
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  7. #7
    Membre éclairé
    Inscrit en
    Mai 2002
    Messages
    275
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 275
    Par défaut
    Bonjour,

    tu peux aussi utiliser la fonction DbiPackTable.

    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 TForm1.DbiPackTable_Click(Sender: TObject);
    var l_dbi: Integer;
    begin
      with Form1 do
      begin
        Table.Close;
        Table.Exclusive:= True;
        Table.Open;
        l_dbi:= DbiPackTable(Table.dbHandle, Table.Handle, nil, nil, True);
        if l_dbi<> 0
          then affiche('pb pack '+ f_erreur_dbi(l_dbi));
      end;
    end;
    a+
    Cyril

  8. #8
    Membre confirmé
    Inscrit en
    Août 2003
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Août 2003
    Messages : 100
    Par défaut Réponse au vidage de Table
    Tu peux essayer ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with Table1 do
    begin
      Active := False;
      DatabaseName := 'nom_de_la base';
      TableName := 'nom_de_la_table';
      TableType := ttDBASE;
      EmptyTable;
    end;

  9. #9
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut
    Si vous permettez que je joins ma voix.
    EmptyTable Efface tous les enregistrements et vous donne une table vide.
    DbiPackTable ne fonctionne que sous Dbase à ma connaissance.
    N'oubliez pas de mettre résolu !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Salut

    Bon, je viens de tester tout ça.......sans succès car je suis face à un problème a cause des composants qui utilisent cette base de données.
    En fait mon programme doit lire les infos de ma base grace a des dblabel, dblookuplistbox et combo... Donc évidemment, mes datasources pointent toutes vers ma base. Comme le disais NoNo40, ce sont ces composants qui gènent le Emptytable. Mais alors, comment faire pour que je puisse vider ma table physiquement sans etre embeté avec ces composants ? et surtout sans avoir à les désactiver car ca ferai beaucoup !!!!!

    Merci d'avance
    @++

  11. #11
    Teo
    Teo est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Par défaut
    ...Mais alors, comment faire pour que je puisse vider ma table physiquement sans etre embeté avec ces composants ? et surtout sans avoir à les désactiver car ca ferai beaucoup !!!!!
    Dans ce cas, essais ceci
    - Arretes Delphi (ferme le)
    - Arretes ton/tes applications (ferme les)
    - Passe par le BDE (Module Base de Donnée)
    : Menu Outils/Utilitaire/Vider

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Hum moui Teo mais le principe et but de cette manoeuvre c'est que l'utlisateur de l'appli puisse vider les tables.

    Par contre j'ai trouvé un procédé qui peut aider....certes ce n'est pas terrible car l'utilisation des DBgrid n'est plus possible mais bon...
    Il suffit juste de désactiver les bases (TTable.active:=false) et ensuite l'acces peut toujours se faire via les dblookuplistbox... Enfin pour effacer physiquement les tables, il suffit de les rendre actives puis d'utiliser la methode emptytable.

    Pas top mais ca marche et ca evite de desactiver tous les composants attachés a la base....


  13. #13
    Teo
    Teo est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2002
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 110
    Par défaut
    Il me semble qu'en te demandant de desactiver les compos
    attaché à ta table c'était bien un
    "TTable.Close <===> TTable.Active := False" que l'on te "suggérait".
    Il m'a semblé que tu avais des tas de TTable
    que tu ne voulais pas passer a false (car trop fastidieux...)

    Ok, si t'as trouvé une solution...ca roule.
    N'oublie pas de mettre "résolu"

    @+

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    non non teo justement !!! c'est la que c'etait genant, ce n'est pas les ttables qu'il fallait rendre inactif mais tous les autres composants du style dblookupcombobox et autres composants qui accedent directement aux données de ce ttable j'ai une trentaine de composants qui accedent a ma base dont 23 qui sont des DBText...tu imagines la liste à desactiver ??

    Et justement en passant par ma methode, je n'ai pas besoin de desactiver mes 30 composants

  15. #15
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut
    Je ne peux pas accepter ton explication. Il suffit de fermer toutes les tables. Les composants n'ont jamais posé de problème dans ce sens. Sinon ton problème est ailleurs. Nous utilisons tous des dbtext et je confirme pas la peine de les désactiver.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Justement c'est la le soucis !!! c'est que je ne vois pas d'ou ca peut provenir.....
    Si j'essaye de fermer mes tables et des faire un emptytable soit il me sors le message ne peut utiliser la table en mode exclusif ou alors il me dit que la table est occupée. Mis à part des composants types dbtext, dblookupcombo... et une requete sur un Tquery y'a rien d'autre de connecté a mes tables.

    Si tu as une reponse par rapport à ça et qui serait un peu moins mystique que la mienne je serais ravi de l'apprendre car je n'aime pas comprendre pourquoi ca ne marche pas comme je voudrais.

    Merci

  17. #17
    Expert confirmé

    Avatar de Nono40
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2002
    Messages
    8 640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2002
    Messages : 8 640
    Par défaut
    Et la requète sur le TQuery, elle ne serait pas active par hasard ?
    Delphi :
    La F.A.Q. , 877 réponses à vos questions !
    264 sources à consulter/télécharger !

  18. #18
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut
    Pour faire un EmptyTable il faut que la Table soit ouverte en modeExclusif et c'est normal si des fois d'autres utilistateurs y sont connectés.
    Peut être ton problème provient du DblookupComboBox qui lui met en relation deux Tables. Fait un essai en désactivant les propriétés DataSet ou DataSource.
    Quant au Query si Active est à True met le à False.

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2003
    Messages
    837
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Février 2003
    Messages : 837
    Par défaut
    Eh voila le problème...
    Je m'explique pourquoi ma solution n'est pas si mauvaise que ça :

    Comme je le disais j'ai plusieurs composants types dblookupcombo, dbedit... apparement ca ne viendrai pas de la d'apres les reponses plus haut. Par contre les query peuvent gener en effet. Le soucis c'est que je ne peux pas m'amuser à les desactiver tous sinon j'aurais un sacrée liste ce qui ne facilite pas le code.

    donc en passant ma table en active=false des le depart, mes composants accèdent bien aux données (ce que j'ai d'ailleurs trouvé un peu bizarre mais bon) et je peux faier mon emptytable tranquillement sans rien désactiver.

    Donc si jamais quelqu'un est dans le meme cas c'est à dire utilise pas mal de compoasnts reliés a une table et qu'il n'a pas envie de tout desactiver lors d'un emptytable, il faut :

    mettre la table en exclusif=true, active=false et le reste on l'utilise normalement (p.e. les query peuvent etre actifs sans probleme)
    il n'y aura plus qu'a faire un emptytable comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    base.open;
    base.EmptyTable;
    base.close;
    Ce n'est pas très conventionnel je l'avoue mais ca aide bien.
    Voila voila !!!
    Je suis ouvert à toute remarque
    @++

  20. #20
    Membre confirmé
    Inscrit en
    Avril 2002
    Messages
    103
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 103
    Par défaut
    N'oublie pas de mettre le TAG résolu!

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

Discussions similaires

  1. [PostgreSQL] Problème avec pg_connect, aucune reponse.
    Par diabli73 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 31/12/2008, 11h57
  2. Vidage de table MySQL en Perl
    Par Chicard dans le forum SGBD
    Réponses: 5
    Dernier message: 07/11/2008, 17h08
  3. [Oracle 10g] Vidage des tables
    Par LP-mpascolo dans le forum Administration
    Réponses: 7
    Dernier message: 06/12/2007, 12h19
  4. table.delete vidage des tables
    Par lallem dans le forum Delphi
    Réponses: 2
    Dernier message: 22/06/2006, 12h11
  5. Vidage de table
    Par zax-tfh dans le forum Bases de données
    Réponses: 3
    Dernier message: 20/02/2004, 17h44

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