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 :

Problème Index Secondaire Interbase 6.5


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut Problème Index Secondaire Interbase 6.5
    Bonjour

    Je supprime un index secondaire IDX_NOM de ma base avec le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      IBQUERY1.SQL.Clear;
      IBQUERY1.SQL.Add('DROP INDEX IDX_NOM');
      IBQUERY1.ExecSQL;
      SHOWMESSAGE('Index secondaire supprimé ........ relancer le programme');
    Mon probléme est le suivant :

    Cet index reste toujours actif , pourquoi ? il sera réellement supprimé quand je relance de nouveau l'application.

    Meme si je fais IBTABLEX.CLOSE ; IBTABLEX.OPEN ca ne marche pas.

    j ' attend vos réponses ................................................... cordialement

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    L'instruction fait-elle partie d'une transaction qui reste pendante (pas de commit) ?
    --
    Philippe.
    Philippe.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Quand j'enregistre j'utilise IBTABLEX.POST.

    Je ne fais pas recours à COMMIT dans une transaction. Effectivement c'est le
    fameux commit qui manque, mais comment utiliser l'instruction commit je ne vois pas ...... donnez moi l'instruction delphi à ajouter pour forcer l'écriture.

    Merci .

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Faudrait un peu lire l'aide quand même : TIBQuery.Transaction et TIBTransaction.Commit

    Ensuite, est-ce que le DROP a-t-il vraiment effet ?
    Qu'indique SQL Explorer ou IB Expert ?
    As-tu fermé TOUS les DataSet sur cette Table ?
    As-tu essayé un UpdateIndexDefs ?

    Maintenant si il n'y a pas de StartTransaction explicite, est-il nécessaire d'avoir un Commit explicite ?
    Existe-t-il un mode "AutoCommit" ?
    Vérifie si Commit est utile avec InTransaction !
    C'est selon si tu utilises un objet TIBTransaction que tu as lié au TIBQuery, il y a AutoStartTransaction qui rend StartTransaction implicite mais doit être suivi d'un Commit ou d'un RollBack explicite
    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

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    Je me suis documenté sur les IBTransaction ... et j'ai amélioré mon code et ça a l'air de marcher quand même.

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
     
    procedure TForm8.Panel15Click(Sender: TObject);
    VAR I : WORD;
        wpassomar : string ;
    begin
     InputQuery('boite dialogue sécurité', 'Mot de passe', wpassomar);
     if UPPERCASE(wpassomar) <> 'HMD2015' THEN
     BEGIN
       SHOWMESSAGE('Mot de passe invalide ............ byb bye');
       exit;
     END;
     with form8.IBQuery1 do
     begin
      close;
      //
      FOR I := 0 to DM1.IBTable7.IndexDefs.Count - 1 do
      if DM1.IBTable7.IndexDefs[I].Name = 'IDX_NOM' then
      BEGIN // FOR
      WITH SQL DO
      begin
       SHOWMESSAGE(DM1.IBTable7.IndexDefs[I].Name);
       IBQUERY1.SQL.Clear;
       IBQUERY1.SQL.Add('DROP INDEX IDX_NOM');
      END;
      TRY
        if not IBTransaction1.InTransaction THEN IBTransaction1.StartTransaction;
         IBQUERY1.ExecSQL;
         IBTransaction1.Commit;
         SHOWMESSAGE('Index secondaire supprimé .......OK..... relancer le programme');
         IBTransaction1.StartTransaction;
         Dm1.IBTable1.Open;
         Dm1.IBTable2.OPEN;
         Dm1.IBTable3.OPEN;
         Dm1.IBTable4.OPEN;
         Dm1.IBTable5.OPEN;
         Dm1.IBTable6.OPEN;
         Dm1.IBTable7.OPEN;
         Dm1.IBTable8.OPEN;
         Dm1.IBTable9.OPEN;
         Dm1.IBTable10.OPEN;
         Dm1.IBTable11.OPEN;
         Dm1.IBTable12.OPEN;
         Dm1.IBTable13.Open;
         Dm1.IBTable14.Open;
         Dm1.IBTable15.Open;
         Dm1.IBTable16.Open;
         Dm1.IBTable17.Open;
         Dm1.IBTable18.Open;
         Dm1.IBTable19.Open;
         Dm1.IBTable20.Open;
         //DM1.IBTable7.Open;
         EXIT; // POUR EVITER PBM INDICE INDEX
       except
        on e:Exception do
        BEGIN
         SHOWMESSAGE('pbm ' + e.Message);
         IBTransaction1.StartTransaction;
         //DM1.IBTable7.Open;
         EXIT;
        END;
      END; // TRY
      END; // FOR
     end;
     SHOWMESSAGE('Index secondaire inexistant ......... pas de suppression');
    end;
    Je trouve ce code trés long .... j'aimerais bien l'optimiser en le réduisant
    à un minimum de ligne.

    Je tiens à remercier Mr PHILIPPE qui m'a orienté vers le COMMIT.

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Pour ton problème d'indice

    souvent lorsqu'on supprime on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for I := Obj.Count - 1 downto 0 do
    Comme tu ne souhaite que supprimer un seul élément, le Exit est aussi une solution

    sinon, tu pouvais simplifier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FOR I := 0 to DM1.IBTable7.IndexDefs.Count - 1 do
      if DM1.IBTable7.IndexDefs[I].Name = 'IDX_NOM' then
      BEGIN // FOR
    en tout simplement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if DM1.IBTable7.IndexDefs.IndexOf('IDX_NOM') >= 0 then
    begin
    ou encore Find plus pénible car déclenchent une Exception

    Pourquoi utilise WITH si tu n'exploites pas ses possibilité !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      WITH SQL DO
      begin
       SHOWMESSAGE(DM1.IBTable7.IndexDefs[I].Name);
       IBQUERY1.SQL.Clear;
       IBQUERY1.SQL.Add('DROP INDEX IDX_NOM');
      END;
    devrait être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      WITH SQL DO
      begin
       SHOWMESSAGE(DM1.IBTable7.IndexDefs[I].Name);
       Clear;
       Add('DROP INDEX IDX_NOM');
      END;


    Tu as 20 Tables ouvertes qui utilisent l'index ou juste IBTable7 ?

    Je n'utilise plus le TTable ou TIBTable depuis au moins 8 ans, avec les bases de données distantes mieux vaut des SQL les plus restreints que possible avec des TQuery ou TIBQuery

    Sinon, change ton mot de passe d'opération admin "HMD2015", maintenant, tout le monde le connait !

    Fait attention à tous ces StartTransaction, tu risques d'avoir des transactions très longues, je ne sais pas si c'est une bonne pratique !

    En tout, je plains celui qui devra reprendre le code, TForm8, Panel15, IBTable1 à IBTable20, des noms tellement clair, utile et explicite !
    Une indentation douteuse aussi !

    C'est pour moi un code qui sera inmaintenable,
    si tu es amateur, c'est excusable, mais comme tu dois travailler ponctuellement sur ton projet, te replonger dedans doit être difficile,
    si tu es un professionnel, comment dire sans être méchant ... euh c'est pas possible !
    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

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    j'ai seulement 2 tables où j'ai besoin d'index secondaire sur le nom .
    IBTABLE7 et IBTABLE12. je suis obligé de réouvrir les 20 tables parce que
    quand je fais le COMMIT toutes les tables se ferment.

    Quand à être professionnel ou amateur tout dépend de l'environnement où on
    vit ............ et moi je ne suis ni l'un ni l'autre.

    Mais reconnaissons que cette porte du forum de DELPHI nous a beaucoup donné ............................................................. et Dieu merci pour tous.

  8. #8
    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
    moi , ce que je ne comprends pas , c'est pourquoi un index secondaire doit être supprimé , surtout dans une BDD Interbase . Sous paradox/Dbase j'aurais compris , mais sous Interbase/Firebird je trouve ça bizarre autant qu'étrange.
    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

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    Points : 50
    Points
    50
    Par défaut
    L'index secondaire est utile pour afficher ou éditer des etas triés . Quand à sa
    suppression c'est pour alleger la base et pour avoir des index plus vivants.
    ç'est une façon de maintenir sa base de données. c'est comme apré l'opération du BACKUP et le RESTORE ,toutes les saletés qui se trouvent sur la base de données disparaitrons (enregistrement supprimés par exemple, meilleur intégrité, gain d'espace, etc) .

    C'est comme si vous avez de la poussiére sur tous vos habits, il suffit de faire
    quelques mouvements et vous deviendrer BLANCHE NEIGE !

    A Bientôt.

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Tu recalcules les index au moment de l'affichage ou à l'impression d'un état puis tu les supprimes ?
    C'est ce que tu es train de nous expliquer ?

    J'imagine bien certains de mes anciens projets avec 2 millions d'enregistrements avec une DB d'un Go (en MyISAM\MySQL, je sais une petite base rikiki, j'ai fréquenté des DBA Oracle qui s'amusait avec leur DB frolant les 120Go réparti en cluster)
    Il ne s'amusait pas à supprimer les index pour le fun !

    le temps de suppression et de création de l'index pouvait prendre une bonne minute, disons que ce n'est pas crédible pour que cela soit fréquent !
    Les seules fois où il était nécessaire de réparer les index de MySQL4 était après les coupures de courants, et tout pouvait être fait avec des SQL CHECK, REPARE, OPTIMIZE ...

    Tu sais les index sont maintenus lors des INSERT et UPDATE ... ils sont vivant en général ! ça leur suffit !

    J'ignore comment fonctionne Interbase, mais certains SGBD de plus haute catégorie comme Oracle ou SQL Server gèrent une sorte de défragmenteur intégré, les opérations de package ou de reconstruction d'index sont nettement moins significatives que sur DBase ou Paradox

    IB ne fourni pas des API ou des commandes SQL pour les opérations d'optimisations ?
    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

  11. #11
    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 HASSIOMAR Voir le message
    L'index secondaire est utile pour afficher ou éditer des etas triés .
    dans ce cas il suffit de faire un SQL avec tri ORDER BY (l'index améliore juste la vitesse) mais il faut peut être pour cela apprendre a ne pas utiliser que des IBTables ! mais aussi de IBQuery
    Quand à sa
    suppression c'est pour alleger la base et pour avoir des index plus vivants.
    ç'est une façon de maintenir sa base de données. c'est comme aprés l'opération du BACKUP et le RESTORE ,toutes les saletés qui se trouvent sur la base de données disparaitrons (enregistrement supprimés par exemple, meilleur intégrité, gain d'espace, etc) .
    là , faut pas exagérer
    1 - supprimer cet index ne diminuera pas la taille de la base (sauf après opération backup/restore
    2- au contraire créer un nouvel index secondaire AUGMENTERA la taille de la base

    ce n'est pas PARADOX !!!
    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

Discussions similaires

  1. problème avec index secondaire
    Par sam83 dans le forum Débuter
    Réponses: 14
    Dernier message: 04/04/2009, 16h22
  2. Problème d'index secondaire
    Par LuckyLuke56 dans le forum Bases de données
    Réponses: 6
    Dernier message: 14/10/2008, 13h25
  3. problème crash serveur Interbase
    Par lio33 dans le forum InterBase
    Réponses: 2
    Dernier message: 15/03/2006, 18h12
  4. Problème avec accents Interbase
    Par koolkris dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/08/2005, 16h46
  5. pb avec un index sur interbase
    Par kivoch dans le forum InterBase
    Réponses: 2
    Dernier message: 18/12/2004, 21h48

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