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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    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 786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    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 786
    Par défaut
    Bonjour,
    L'instruction fait-elle partie d'une transaction qui reste pendante (pas de commit) ?
    --
    Philippe.

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    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
    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
    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 confirmé
    Inscrit en
    Septembre 2006
    Messages
    98
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 98
    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
    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
    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

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