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

Lazarus Pascal Discussion :

TField alias in TSQLQuery


Sujet :

Lazarus Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut TField alias in TSQLQuery
    Bonjour à tous,
    J'utilise un TSQLQuery pour charger les données depuis un serveur postgresql.
    J'utilise des alias de colonnes dans la chaine SQL pour pouvoir générer des libellés et visuels sur la fenêtre pour afficher les données. Le souci est que je n'arrive pas à récupérer le nom original des champs de la table.
    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
     
    var
      MainForm: TMainForm;
      FCon  : TPQConnection;
      FTrs  : TSQLTransaction;
      Libelles: array [0..100] of TLabel;
      Champs  : array [0..100] of TWinControl;
      sqlSRPList: string = 'select srpnum as "ID", srpnam as "Designation" from salesrep order by "ID";';
      sqlSRPForm: String ='select srpnum as "&Identifiant", srpnam as "&Nom",'+
                         'datein as "Date entrée", dateout as "Date de sortie",'+
                         'isactive as "Actif" from salesrep;';
     
    procedure TMainForm.FormCreate(Sender: TObject);
    begin
      FCon := TPQConnection.Create(self);
      FCon.DatabaseName:= '********';
      FCon.UserName    := 'postgres';
      FCon.HostName    := '**********';
      FCon.Password    := '*********';
     
      FTrs := TSQLTransaction.Create(MainForm);
      FTrs.DataBase := FCon;
    end;
     
    function TMainForm.GetQuery : TSQLQuery;
      var AQuery : TSQLQuery;
    begin
      AQuery := TSQLQuery.Create(MainForm);
      AQuery.Database    := FCon;
      AQuery.Transaction := FTrs;
      Result             := AQuery;
    end;
     
    procedure TMainForm.BuildForm(panel: TGroupBox; sql: string);
    var
      i, ColCount, LabelWidth : integer;
      dataset                 : TSQLQuery;
    begin
      LabelWidth:=0;
      if panel.ComponentCount>0 then exit;;
      //Initialiser la requete
      dataset     := GetQuery;
      dataset.SQL.Text := sql;
      dataset.Open;
     
      colcount :=dataset.Fields.Count;     //Le nombre de colonnes
     
      //Loop 1:
      //Calculer la largeur des libélles
      For i:=0 to colcount-1 do begin
        if LabelWidth < Canvas.TextWidth(dataset.Fields[i].FieldName) then
           LabelWidth:= Canvas.TextWidth(dataset.Fields[i].FieldName)+10;
      end;
     
      //Loop 2:
      for i:=0 to colcount-1 do begin
        //Création des champs
        case dataset.FieldByName(dataset.Fields[i].FieldName).DataType of
          ftString:begin
              Champs[i] := TmzEdit.Create(panel);            //Crée champ
              Champs[i].width := dataset.Fields[i].Size*11;  //Fixe largeur
              TmzEdit(Champs[i]).MaxLength:=dataset.Fields[i].Size;//Fixe taille saisie
            end;
          ftBoolean     :Champs[i] := TCheckBox.Create(panel);//Crée champ à cocher
          ftdate        :Champs[i] := TmzDateTime.Create(panel);//Crée champ date
        end;
     
        with Champs[i] do
        begin
          Parent := panel;
          Top    := 5+(20*i);
          Left   := LabelWidth;
        end;
     
        //Création des libéllés
        Libelles[i] := TLabel.Create(panel);//Créer les libellés
        with Libelles[i] do
        begin
          Parent := panel;
          Top    := 5+(20*i);
          Left   := 5;
          Width  := LabelWidth;
          Caption:=dataset.Fields[i].FieldName;
          FocusControl:=Champs[i];      //Affecte raccourci clavier au champ adequat
        end;
      end;
      panel.Height:=((panel.ComponentCount div 2)+1)*20;
     
      dataset.Close;
      dataset.Free;
    end;
    J'ai besoin d'une fonction genre dataset.Fields'[i]'.FieldOriginalName qui retourne srpnam ou srpnum (nom de colonne dans la base de données).
    Toute aide est la bienvenue .

    Merci à tous.

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Salut

    (je me base sur Delphi donc à vérifier sur Lazarus)
    Il me semble que la propriété Origin est faite pour cela.

    A défaut, si tu élimines les alias dans le texte de la requête, tu peux ensuite les reprendre dans la propriété DisplayLabel des objets TField correspondant si tes champs sont persistants.
    La propriété DisplayLabel est reprise automatiquement dans les noms de colonne des grilles. Tu préserves ainsi les noms originaux des champs dans la colonne. Cette méthode est sans doute préférable car tu disposes ainsi des "vrais" noms de champs pour, par exemple, composer dynamiquement des requêtes de mise à jour.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2009
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2009
    Messages : 34
    Points : 59
    Points
    59
    Par défaut
    Bonjour,
    Après contrôle, il apparait que la propriété origin n'est remplie qu'en mode Design Time (conception).

    Malheureusement ceci n'est pas mon cas. Néanmoins, j'utilise une astuce grossière qui a le mérite de fonctionner. J’intègre le DisplayLabel et Origin dans la requête SQL comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select srpnum as "srpnum:ID", srpnam as "srpnam:Designation" from salesrep order by "srpnum:ID"
    Je parse ensuite la requête à la création des champs et libelles.

    Ce n'est pas très propre mais ça marche.

    Merci pour tout.

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 920
    Points
    3 920
    Par défaut
    Salut

    C'est effectivement une astuce mais je ne l'emploierai pas.
    Utilises-tu des champs persistants ? Ta réponse sur le Design Time me le laisse penser. Dans ce cas, tu définis la propriété DisplayLabel des objets TField et il n'est alors plus besoin de créer des alias "exotiques" qui peuvent poser des problèmes en termes de maintenance car il deviennent des valeurs de FieldName. Vu l'emploi des ":", c'est peut-être risqué, je ne suis pas sûr que tous les SGBD acceptent de tels nom d'alias.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

Discussions similaires

  1. [BDE]Création alias
    Par patblt dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/06/2004, 10h07
  2. Création d'un alias via mon application
    Par Neilos dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/10/2003, 23h29
  3. création d'alias via le fichier metabase.bin
    Par Sandrine75 dans le forum Windows
    Réponses: 7
    Dernier message: 23/09/2003, 17h44
  4. alias application xmlrad
    Par pram dans le forum XMLRAD
    Réponses: 6
    Dernier message: 22/09/2003, 09h48
  5. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50

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