IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)



Comment gérer simplement un champ auto-incrément ?
auteur : Didier Largange
Toutes les bases de données ne fournissent pas forcément de champs de type auto incrément, et surtout la possibilité de connaître la prochaine valeur de ces champs. Dans le cas d'Interbase, il faut créer un générateur et un trigger pour chaque table de la base, plus une requête pour récupérer la valeur courante dans Delphi.
La méthode présentée ci-dessous vous permettra de générer un identifiant numérique valide pour n'importe quelle table de votre base.
Les avantages sont les suivants :
    - très peu de code
    - aucune modification de la base
    - utilisable pour tout type de base supportant SQL
Mais elle a de sérieux inconvénients :
    - utilisable uniquement en mode mono-utilisateur à cause des possibilités de violation de clef
    - coûteuse en performances pour les tables volumineuses
Si vous êtes néanmoins intéressé, voici la méthode :
Etape 1 : Créer le composant requête
Commencez par placer un composant requête dans un DataModule ou sur une fiche accessible par l'ensemble de l'application si nécessaire.
Name := SQLRequeteID DataBaseName := ...
Etape 2 : Créer la fonction

         function NouvelID(Table, Clef: String): Integer;
         begin
                 with SQLRequeteID do
                 begin
                         Close;
                         SQL.Clear;
                         SQL.Add('select max(' + Clef + ') from ' + Table);
                         ExecQuery;
                         Result := Fields[0].AsInteger + 1;
                         Close;
                 end;
                
         end;
Etape 3 : Utilisation de la fonction
prochain_numero := NouvelID('CLIENT', 'NO_CLI');
Aller plus loin :
Pour des solutions plus efficaces, veuillez consulter le tutoriel Gérer les Compteurs Auto-Incrémentés avec Interbase par Pascal Barnouin et Sylvain James.
lien :  Gérer les Compteurs Auto-Incrémentés avec Interbase

Comment rélier des requêtes en maître/détail ?
auteur : Didier Largange
Prenons l'exemple d'une relation entre les tables CLIENT et FACTURE.
Requête maître (associée à un composant DSClient : TDataSource)
SQLClient.SQL.Add := 'SELECT cli_no, cli_nom, cli_prenom, cli_telephone, ville';
SQLClient.SQL.Add := 'FROM client';
Requête détail (associée à un composant DSFacture : TDataSource)
SQLFacture.SQL.Add := 'SELECT cli_no, fac_no, fac_date, fac_montant_ttc';
SQLFacture.SQL.Add := 'FROM facture';
SQLFacture.SQL.Add := 'WHERE cli_no = :cli_no';
Méthode 1 : Propriété DataSource
Selon le jeu de composants que vous utilisez (BDE, IBX ,dbExpress...), vos requêtes disposent ou non d'une propriété DataSource. Dans l'inspecteur d'objets, mettez DSClient dans la propriété DataSource de SQLFacture.
Méthode 2 : Evènement OnAfterScroll
L'évènement OnAfterScroll d'un ensemble de données se déclenche après chaque changement d'enregistrement. L'expression :cli_no présente dans la requête de SQLFacture correspond à un paramètre dynamique de cette requête, nous allons donc devoir lui affecter manuellement ses valeurs.

         procedure TMyForm.SQLClient.AfterScroll(Sender: TDataSet);
         begin
                 SQLFacture.Close;
                 SQLFacture.ParamByName('cli_no').AsInteger := SQLClient.FieldByName('cli_no').AsInteger;
                 SQLFacture.Open;
         end;
        


Ce document issu de www.developpez.com est soumis à la licence GNU FDL traduit en français ici
Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement.