begin process at 2010 02 10 03:39:28
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Base de Donnees

 > CRÉATION D'INDEXES À LA VOLÉE

CRÉATION D'INDEXES À LA VOLÉE


 Information sur la source

Note :
9,5 / 10 - par 2 personnes
9,50 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Base de Donnees Niveau :Initié Date de création :10/08/2002 Date de mise à jour :08/09/2004 23:18:40 Vu / téléchargé :6 050 / 906

Auteur : Delphiprog

Ecrire un message privé
Site perso
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
- création d'index secondaire à la volée en cliquant
   sur le titre de colonne d'un TDbGrid
- suppression des index créés par l'application à la fermeture
- visualisation de la colonne indexée par coloration
   des caractères du titre

Source

  • //
  • // Auteur : Delphiprog
  • // Email : delphiprog@fr.fm
  • // Web : http://www.delphiprog.fr.fm
  • // Date création : 09/08/2002
  • // Date révision :
  • { Objet :
  • - création d'index secondaire à la volée en cliquant
  • sur le titre de colonne d'un TDbGrid
  • - suppression des index créés par l'application à la fermeture
  • - visualisation de la colonne indexée par coloration
  • des caractères du titre
  • }
  • { remarques :
  • }
  • unit UDbase;
  • interface
  • uses
  • Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  • StdCtrls, Grids, DBGrids, Db, DBTables;
  • type
  • TForm1 = class(TForm)
  • Table1: TTable;
  • Table1LAST_NAME: TStringField;
  • Table1FIRST_NAME: TStringField;
  • Table1ACCT_NBR: TFloatField;
  • Table1ADDRESS_1: TStringField;
  • Table1CITY: TStringField;
  • Table1STATE: TStringField;
  • Table1ZIP: TStringField;
  • Table1TELEPHONE: TStringField;
  • Table1DATE_OPEN: TDateField;
  • Table1SS_NUMBER: TFloatField;
  • Table1PICTURE: TStringField;
  • Table1BIRTH_DATE: TDateField;
  • Table1RISK_LEVEL: TStringField;
  • Table1OCCUPATION: TStringField;
  • Table1OBJECTIVES: TStringField;
  • Table1INTERESTS: TStringField;
  • Table1IMAGE: TBlobField;
  • DataSource1: TDataSource;
  • DBGrid1: TDBGrid;
  • ListBox1: TListBox;
  • Label1: TLabel;
  • procedure FormCreate(Sender: TObject);
  • procedure DBGrid1TitleClick(Column: TColumn);
  • procedure FormDestroy(Sender: TObject);
  • procedure ListBox1Click(Sender: TObject);
  • procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  • DataCol: Integer; Column: TColumn; State: TGridDrawState);
  • private
  • { Déclarations privées }
  • public
  • { Déclarations publiques }
  • end;
  • var
  • Form1: TForm1;
  • //Liste des index secondaires disponibles
  • IndexList: TStrings;
  • //Liste des index secondaires créés à la volée
  • CreatedIndexList: TStrings;
  • implementation
  • {$R *.DFM}
  • procedure TForm1.FormCreate(Sender: TObject);
  • begin
  • Table1.Open;
  • //Récupérer la liste des index déclarés
  • //avant le lancement du programme
  • Table1.GetIndexNames(IndexList);
  • //En faire une copie pour l'afficher et
  • //permettre une sélection par l'utilisateur
  • ListBox1.Items.Assign(IndexList);
  • end;
  • procedure TForm1.DBGrid1TitleClick(Column: TColumn);
  • begin
  • //Vérifie que la colonne affiche des données de la
  • //table et non un champ calculé
  • if DBGrid1.ValidFieldIndex(Column.Index) then
  • begin
  • //Un index correspondant à la colonne cliquée existe-t-il ?
  • if IndexList.IndexOf(Column.FieldName) <> -1 then
  • //Si oui, l'activer
  • with TTable(DbGrid1.DataSource.DataSet) do
  • IndexFieldNames := Column.FieldName
  • else
  • //L'index n'existe pas :
  • with TTable(DbGrid1.DataSource.DataSet) do
  • begin
  • Close;
  • Exclusive := True;
  • //créer un index secondaire correspondant
  • //à la colonne cliquée
  • try
  • AddIndex(Column.FieldName, Column.FieldName, []);
  • //rendre actif l'index créé
  • IndexFieldNames := Column.FieldName;
  • Exclusive := False;
  • Open;
  • //Réactualiser la liste des index de la table
  • GetIndexNames(IndexList);
  • //et l'afficher
  • ListBox1.Items.Assign(IndexList);
  • CreatedIndexList.Assign(IndexList);
  • except
  • on EDatabaseError do
  • begin
  • ShowMessageFmt('Impossible de créer un index'#13'sur le champ %s.',
  • [Column.FieldName]);
  • IndexFieldNames := '';
  • Exclusive := False;
  • if not Active then
  • Open;
  • end;
  • end;
  • end;
  • end;
  • end;
  • procedure TForm1.FormDestroy(Sender: TObject);
  • var
  • i: integer;
  • begin
  • with Table1 do
  • begin
  • Close;
  • Exclusive := True;
  • for i := 0 to CreatedIndexList.Count - 1 do
  • try
  • Table1.DeleteIndex(CreatedIndexList.Strings[i]);
  • except
  • //
  • end;
  • Exclusive := False;
  • Close;
  • end;
  • end;
  • procedure TForm1.ListBox1Click(Sender: TObject);
  • begin
  • //S'il y a au moins un élément dans la liste
  • with ListBox1 do
  • if Items.Count > 0 then
  • //Rendre actif l'index correspondant à
  • //l'élément sélectionné
  • Table1.IndexFieldNames := Items[ItemIndex];
  • end;
  • procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  • DataCol: Integer; Column: TColumn; State: TGridDrawState);
  • begin
  • if Column.FieldName = Table1.IndexFieldNames then
  • //Colorer en bleu le titre cliqué
  • Column.Title.Font.Color := clBlue
  • else
  • Column.Title.Font.Color := clWindowText;
  • end;
  • initialization
  • IndexList := TStringList.Create;
  • CreatedIndexList := TStringList.Create;
  • finalization
  • IndexList.Free;
  • CreatedIndexList.Free;
  • end.
//
// Auteur        : Delphiprog
// Email         : delphiprog@fr.fm
// Web           : http://www.delphiprog.fr.fm
// Date création : 09/08/2002
// Date révision :
{  Objet         :
           - création d'index secondaire à la volée en cliquant
             sur le titre de colonne d'un TDbGrid
           - suppression des index créés par l'application à la fermeture
           - visualisation de la colonne indexée par coloration
             des caractères du titre
}
{  remarques     :
}
unit UDbase;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, Grids, DBGrids, Db, DBTables;

type
  TForm1 = class(TForm)
    Table1: TTable;
    Table1LAST_NAME: TStringField;
    Table1FIRST_NAME: TStringField;
    Table1ACCT_NBR: TFloatField;
    Table1ADDRESS_1: TStringField;
    Table1CITY: TStringField;
    Table1STATE: TStringField;
    Table1ZIP: TStringField;
    Table1TELEPHONE: TStringField;
    Table1DATE_OPEN: TDateField;
    Table1SS_NUMBER: TFloatField;
    Table1PICTURE: TStringField;
    Table1BIRTH_DATE: TDateField;
    Table1RISK_LEVEL: TStringField;
    Table1OCCUPATION: TStringField;
    Table1OBJECTIVES: TStringField;
    Table1INTERESTS: TStringField;
    Table1IMAGE: TBlobField;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    ListBox1: TListBox;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure FormDestroy(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
  private
    { Déclarations privées }
  public
    { Déclarations publiques }
  end;

var
  Form1: TForm1;
  //Liste des index secondaires disponibles
  IndexList: TStrings;
  //Liste des index secondaires créés à la volée
  CreatedIndexList: TStrings;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
  Table1.Open;
  //Récupérer la liste des index déclarés
  //avant le lancement du programme
  Table1.GetIndexNames(IndexList);
  //En faire une copie pour l'afficher et
  //permettre une sélection par l'utilisateur
  ListBox1.Items.Assign(IndexList);
end;

procedure TForm1.DBGrid1TitleClick(Column: TColumn);
begin
  //Vérifie que la colonne affiche des données de la
  //table et non un champ calculé
  if DBGrid1.ValidFieldIndex(Column.Index) then
  begin
    //Un index correspondant à la colonne cliquée existe-t-il ?
    if IndexList.IndexOf(Column.FieldName) <> -1 then
      //Si oui, l'activer
      with TTable(DbGrid1.DataSource.DataSet) do
        IndexFieldNames := Column.FieldName
    else
      //L'index n'existe pas :
      with TTable(DbGrid1.DataSource.DataSet) do
      begin
        Close;
        Exclusive := True;
        //créer un index secondaire correspondant
        //à la colonne cliquée
        try
          AddIndex(Column.FieldName, Column.FieldName, []);
          //rendre actif l'index créé
          IndexFieldNames := Column.FieldName;
          Exclusive := False;
          Open;
          //Réactualiser la liste des index de la table
          GetIndexNames(IndexList);
          //et l'afficher
          ListBox1.Items.Assign(IndexList);
          CreatedIndexList.Assign(IndexList);
        except
          on EDatabaseError do
          begin
            ShowMessageFmt('Impossible de créer un index'#13'sur le champ %s.',
              [Column.FieldName]);
            IndexFieldNames := '';
            Exclusive := False;
            if not Active then
              Open;
          end;
        end;
      end;
  end;

end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  with Table1 do
  begin
    Close;
    Exclusive := True;
    for i := 0 to CreatedIndexList.Count - 1 do
    try
      Table1.DeleteIndex(CreatedIndexList.Strings[i]);
    except
      //
    end;
    Exclusive := False;
    Close;
  end;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
  //S'il y a au moins un élément dans la liste
  with ListBox1 do
    if Items.Count > 0 then
      //Rendre actif l'index correspondant à
      //l'élément sélectionné
      Table1.IndexFieldNames := Items[ItemIndex];
end;

procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if Column.FieldName = Table1.IndexFieldNames then
    //Colorer en bleu le titre cliqué
    Column.Title.Font.Color := clBlue
  else
    Column.Title.Font.Color := clWindowText;

end;

initialization
  IndexList := TStringList.Create;
  CreatedIndexList := TStringList.Create;

finalization
  IndexList.Free;
  CreatedIndexList.Free;

end.

 Conclusion

Cette source est utile à ceux qui souhaitent afficher les données d'une table dans l'ordre de la colonne cliquée sans avoir à créer, au préalable, autant d'index secondaires qu'il y a de champs dans la table visualisée.

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

08 septembre 2004 23:18:40 :
Précisions importantes: 1- la table ne doit pas être ouverte au démarrage de l'application sinon on a effectivement la message 'La table est occupée'. 2- Le composant TDbGrid doit avoir des colonnes persistantes sinon Colum.FieldName est vide et provoque le message d'erreur "Impossible de créer un index...". Pour cela, il suffit d'appeler l'éditeur de propriétés pour la propriété Columns et de cliquer sur "ajouter toutes les colonnes". 3- J'ai testé avec des tables Paradox et cela fonctionne tout aussi bien qu'avec des tables DBase comme cela avait été livré à l'origine. Je pense que, cette fois, il ne devrait rien manquer pour que cela fonctionne correctement.

 Sources du même auteur

Source avec Zip TABLE DE CORRESPONDANCE TYPES DE DONNÉES API/PASCAL OBJET
Source avec Zip Source avec une capture GÉNÉRER DES PDF AVEC DELPHI ET PDF CREATOR
Source avec Zip Source avec une capture DESIGN PATTERN OBSERVER : IMPLÉMENTATION RÉUTILISABLE
Source avec Zip DESIGN PATTERN STRATÉGIE APPLIQUÉ AU CODE "JOURNAL DE DÉBUGG...
Source avec Zip Source avec une capture DESSINER UN RECTANGLE DE SÉLECTION AU DESSUS D'AUTRES COMPOS...

 Sources de la même categorie

Source avec Zip INTERBASE FIREBIRD IBEXPERT par opgiat
Source avec Zip CREE ALIAS AUTOMATIQUEMENT CREATION REPERTOIRE ET TABLE AUSI par opgiat
Source avec Zip CRÉE UN RÉPERTOIRE ET CRÉE CES TABLES PAR PROGRAMME par opgiat
Source avec Zip Source avec une capture CONNEXION MYSQL ET RECUPERATION DANS BASE ACCESS par eli42
Source avec Zip Source avec une capture LIER DEUX TDBGRID par cantador

Commentaires et avis

Commentaire de ManChesTer le 10/08/2002 15:18:23 administrateur CS

Super cool, vraiment tres partique pour les recherches....

j'aime bien ;o))

Manchi.

Commentaire de zmc le 10/08/2002 22:22:55

qq'un pourrait m'expliquer de quoi il s'agit ?;o)

Commentaire de jado le 16/08/2002 23:36:08

zmc il s'agit de la base de donnees :D

Commentaire de haklia le 02/07/2003 10:55:21

Le projet Project_stat.exe a provoqué une classe d'exception EDBEngineError avec le message 'Descripteur d'index incorrect.'.  Processus stoppé. Utilisez Pas-à-pas ou Exécuter pour continuer.

ben moi voila ce que j'obtiens

Commentaire de Delphiprog le 08/09/2004 23:21:02 administrateur CS

Haklia : voir les remarques faites avec la mise à jour du 08/09/2004

Commentaire de fmicros le 31/10/2004 22:53:12

  GetIndexNames(IndexList);
  CreatedIndexList.Assign(IndexList);
les deux listes sont identiques et
si tu effaces CreatedIndex , ceux d'avant y passent aussi

Commentaire de zerargui le 24/10/2008 17:32:42 10/10

bravo

Commentaire de youhibadelphi le 10/08/2009 15:27:23

salut
h'éspère que ça marche avec moi.
merci

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,655 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales