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

Delphi Discussion :

Enregistrer l'id de l'enregistrement sql affiché dans la combobox en delphi


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Par défaut Enregistrer l'id de l'enregistrement sql affiché dans la combobox en delphi
    Bonsoir les amis!

    Je suis en train d'essayer d'enregistrer des données dans une BDD relationnelle dans sql server. Alors la grande difficulté que j'éprouve, c'est de pouvoir enregistrer une clé étrangère correspondant au champ affiché dans la combobox. Je suis encore débutant en delphi, donc ne me tenez pas rigueur pour les choses qui m'échappent.

    Voilà, j'ai réussi à lier ma combobox à la table concernée grâce à l'objet ADOQuery que j'ai renommé QueryPromo:
    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
     
    Begin
    QueryPromo.Close;
    QueryPromo.SQL.Clear;
    QueryPromo.SQL.Text := 'SELECT * FROM Promotion';
    QueryPromo.Open;
     
    QueryPromo.First;
     
    while not QueryPromo.Eof do
    begin
    cmbPromo.Items.Add(QueryPromo['LibPromo']);
    QueryPromo.Next;
    end;
     
    End;
    Maintenant, comment récupérer l'id du champ de la table Promotion affiché dans la combobox renommée cmbPromo pour l'enregistrer comme clé étrangère dans une autre table Etudiant? Vos idées sont les bienvenues. Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Le plus simple consiste à stocker cet identifiant.
    Le principe pour remplir la combo :
    1 : Créer une classe TPromo avec les propriété qui t'intéresse (Ici, Code et Libellé).
    2 : Dans l'itération, créer une instance de cette classe et lui affecter les propriétés
    3 : Dans l'itération utiliser la méthode AddItem du combo et lui passer le libellé en premier paramètre et l'instance de la classe en second paramètre.

    Le principe pour récupérer le code :
    1 : Récupérer l'indice de l'item de la combo
    2 : Utilisé la valeur de la propriété Object[Index] sur la combo et la caster en instance de la classe TPromo
    3 : Lire la propriété Code sur cet objet.

    Dans le destructeur de la forme :
    1 : Boucler sur chaque item de la combo
    2 : Dans la boucle, récupérer l'objet lié à l'item et le libérer avec Free
    3 : Dans la boucle, affecter nil à l'objet lié à l'item.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Par défaut
    On peut aussi utiliser une DBCombobox à la place d'une Combobox.

    Il faudra alors relier l'ADOQuery à un datasource, lui-même relié à la DBCombobox.

    De cette manière, pas besoin d'alimenter la combo, et on récupère l'identifiant directement de l'ADOQuery sur l'enregistrement en cours.

    Si vraiment il n'y a pas possibilité d'utiliser autre chose qu'une Combobox, un locate sur l'ADOQuery devrait aussi permettre de se positionner sur l'enregistrement et ainsi obtenir l'identifiant.

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    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 089
    Par défaut
    Hermite, tu ne confonds pas une DBCombobox avec un DBLookupCombobox et sa propriété ListSource remplaçant les Items et la propriété DataSource remplaçant ItemIndex

    C'est tellement fréquent que je me suis des classes génériques

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    unit XXXX.GUI.Generic;
     
    interface
     
    uses System.Classes, Vcl.StdCtrls;
     
    type
      { Forward class declarations }
      TGenericCodeComboObject = class;
      TGenericIDComboObject = class;
     
      TGenericCodeComboObject = class(TObject)
      strict protected
        FGenericCode: string;
        FGenericLibelle: string;
      public
        constructor Create(const AGenericCode: string; const AGenericLibelle: string);
        procedure Assign(ASource: TGenericCodeComboObject);
        property GenericCode: string read FGenericCode;
        property GenericLibelle: string read FGenericLibelle;
      public
        class function GetSelected(ACombo: TComboBox): TGenericCodeComboObject; static;
        class function SetSelected(ACombo: TComboBox; const AGenericCode: string): Boolean; static;
        class function IndexOfCode(AGenerics: TStrings; const AGenericCode: string): Integer; inline;
      end;
     
      TGenericIDComboObject = class(TObject)
      strict protected
        FGenericID: Integer;
        FGenericLibelle: string;
      public
        constructor Create(AGenericID: Integer; const AGenericLibelle: string);
        procedure Assign(ASource: TGenericIDComboObject);
        property GenericID: Integer read FGenericID;
        property GenericLibelle: string read FGenericLibelle;
      public
        class function GetSelected(ACombo: TComboBox): TGenericIDComboObject; static;
        class function SetSelected(ACombo: TComboBox; AGenericID: Integer): Boolean; static;
        class function IndexOfID(AGenerics: TStrings; AGenericID: Integer): Integer; inline;
      end;
     
    implementation
     
    { TGenericCodeComboObject }
     
    //------------------------------------------------------------------------------
    procedure TGenericCodeComboObject.Assign(ASource: TGenericCodeComboObject);
    begin
      FGenericCode := ASource.GenericCode;
      FGenericLibelle := ASource.GenericLibelle;
    end;
     
    //------------------------------------------------------------------------------
    constructor TGenericCodeComboObject.Create(const AGenericCode: string; const AGenericLibelle: string);
    begin
      FGenericCode := AGenericCode;
      FGenericLibelle := AGenericLibelle;
    end;
     
    //------------------------------------------------------------------------------
    class function TGenericCodeComboObject.GetSelected(ACombo: TComboBox): TGenericCodeComboObject;
    begin
      if ACombo.ItemIndex >= 0 then
        Result := TGenericCodeComboObject(ACombo.Items.Objects[ACombo.ItemIndex])
      else
        Result := nil;
    end;
     
    //------------------------------------------------------------------------------
    class function TGenericCodeComboObject.IndexOfCode(AGenerics: TStrings; const AGenericCode: string): Integer;
    begin
      for Result := 0 to AGenerics.Count - 1 do
        if Assigned(AGenerics.Objects[Result]) and (TGenericCodeComboObject(AGenerics.Objects[Result]).GenericCode = AGenericCode) then
          Exit;
     
      Result := -1;
    end;
     
    //------------------------------------------------------------------------------
    class function TGenericCodeComboObject.SetSelected(ACombo: TComboBox; const AGenericCode: string): Boolean;
    var
      I: Integer;
    begin
      I := IndexOfCode(ACombo.Items, AGenericCode);
      ACombo.ItemIndex := I;
      Result := I >= 0;
    end;
     
     
    { TGenericIDComboObject }
     
    //------------------------------------------------------------------------------
    procedure TGenericIDComboObject.Assign(ASource: TGenericIDComboObject);
    begin
      FGenericID := ASource.GenericID;
      FGenericLibelle := ASource.GenericLibelle;
    end;
     
    //------------------------------------------------------------------------------
    constructor TGenericIDComboObject.Create(AGenericID: Integer; const AGenericLibelle: string);
    begin
      FGenericID := AGenericID;
      FGenericLibelle := AGenericLibelle;
    end;
     
    //------------------------------------------------------------------------------
    class function TGenericIDComboObject.GetSelected(ACombo: TComboBox): TGenericIDComboObject;
    begin
      if ACombo.ItemIndex >= 0 then
        Result := TGenericIDComboObject(ACombo.Items.Objects[ACombo.ItemIndex])
      else
        Result := nil;
    end;
     
    //------------------------------------------------------------------------------
    class function TGenericIDComboObject.IndexOfID(AGenerics: TStrings; AGenericID: Integer): Integer;
    begin
      for Result := 0 to AGenerics.Count - 1 do
        if Assigned(AGenerics.Objects[Result]) and (TGenericIDComboObject(AGenerics.Objects[Result]).GenericID = AGenericID) then
          Exit;
     
      Result := -1;
    end;
     
    //------------------------------------------------------------------------------
    class function TGenericIDComboObject.SetSelected(ACombo: TComboBox; AGenericID: Integer): Boolean;
    var
      I: Integer;
    begin
      I := IndexOfID(ACombo.Items, AGenericID);
      ACombo.ItemIndex := I;
      Result := I >= 0;
    end;
     
     
    end.

    On peut les utiliser directement mais on peut aussi les surcharger pour faciliter la lecteur du code si l'on a plusieurs combos différentes

    Par exemple

    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
      TPromotionGUIObject = class(TGenericIDComboObject)
      private
        function GetPromotionID(): Integer;
        function GetPromotionLibelle(): string;
      public
        property PromotionID: Integer read GetPromotionID;
        property PromotionLibelle: string read GetPromotionLibelle;
      end;
     
    { TPromotionGUIObject }
     
    //------------------------------------------------------------------------------
    function TPromotionGUIObject.GetPromotionID(): Integer;
    begin
      Result := GenericID;
    end;
     
    //------------------------------------------------------------------------------
    function TPromotionGUIObject.GetPromotionLibelle(): string;
    begin
      Result := GenericLibelle;
    end;
    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
    var
      obj: TPromotionGUIObject;
    begin
      QueryPromo.Close;
      QueryPromo.SQL.Clear;
      QueryPromo.SQL.Text := 'SELECT * FROM Promotion';
      QueryPromo.Open;
     
      QueryPromo.First;
     
      while not QueryPromo.Eof do
      begin
        obj := TPromotionGUIObject.Create(QueryPromo['IDPromo'], QueryPromo['LibPromo']);
        cmbPromo.Items.Add(obj.PromotionLibelle, obj );
        QueryPromo.Next();
      end;
    end;
    Dans un OnChange ou OnCloseUp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    //------------------------------------------------------------------------------
    procedure TXXXX.cmbPromoCloseUp(Sender: TObject);
    var
      obj: TPromotionGUIObject;
    begin
       obj := TPromotionGUIObject.GetSelected(cmbPromo) as TPromotionGUIObject;
      ... attention à nil 
    end;
    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 expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2004
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 86
    Par défaut
    Ah oui, c'est possible... ou alors je confond avec un autre composant que utilisé par le passé.

    J'avoue que je n'utilise pas cette méthode puisque nous avons un composant développé en interne pour gérer ce genre de cas (le stockage et l'utilisation de paire ID / Valeur dans une combobox).

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Congo-Kinshasa

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2016
    Messages : 20
    Par défaut
    Merc bcp pour vos idées. Je vais essayer la recette en passant par une classe puis je reviens à vous. Dans l'entretemps si qlqn a une idée plus simple, j'en serai plus que ravi. A très bientôt.

  7. #7
    Membre Expert
    Avatar de ALWEBER
    Homme Profil pro
    Expert Delphi
    Inscrit en
    Mars 2006
    Messages
    1 539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Expert Delphi

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 539
    Billets dans le blog
    10
    Par défaut
    TU peux utiliser la fonction AddObject

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Texte trop long pour afficher dans une combobox
    Par bavmorda1 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/02/2008, 13h42
  2. Requête SQL affichable dans état
    Par thanathz dans le forum WebDev
    Réponses: 3
    Dernier message: 06/02/2008, 15h21
  3. Réponses: 3
    Dernier message: 11/07/2007, 12h29
  4. Réponses: 7
    Dernier message: 08/01/2007, 19h18
  5. Comment afficher dans une combobox les driver des imprimante
    Par lassad dans le forum Composants VCL
    Réponses: 3
    Dernier message: 18/10/2005, 08h56

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