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 :

Champs de type Memo interdit en IndexFieldname ?


Sujet :

Bases de données Delphi

  1. #1
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut Champs de type Memo interdit en IndexFieldname ?
    Bonjour à tous,

    J'ai fait cette procédure qui fonctionne bien sauf pour mon champs de type mémo.
    J'ai un table Access 97, j'utilise ADO, j'ai un DBRGrig lié à une une ADOTAble

    Le but.
    Je clique sur le titre de la colonne et cela classe par ordre de cette colonne

    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
    procedure TFListeDevis.DBGridDevisTitleClick(Column: TColumn);
    begin
      JvEdit1.Text := ''; // On vide le champs de recherche
      With ModuleDeDonneeSecondaire.ADODevis Do
      Begin
        if (FieldByName(Column.FieldName) is TMemoField) then
        Begin
    // ICI cela ne fonctionne pas
          showmessage(Column.Field.AsString);
          JvEdit1.Visible := True;
          JvDateEdit1.Visible := False;
          Label1.Caption := Column.Title.Caption + ' :';
    // 
        end
        else
        Begin
          Close;
          IndexFieldNames := Column.FieldName;
          if (FieldByName(Column.FieldName) is TStringField) then
          Begin
            JvEdit1.Visible := True;
            JvDateEdit1.Visible := False;
            Label1.Caption := Column.Title.Caption + ' :';
          end;
    
          if (FieldByName(Column.FieldName) is TIntegerField) then
          Begin
            JvEdit1.Visible := True;
            JvDateEdit1.Visible := False;
            Label1.Caption := Column.Title.Caption + ' = ';
          end;
          if (FieldByName(Column.FieldName) is TFloatField) then
          Begin
            JvEdit1.Visible := True;
            JvDateEdit1.Visible := False;
            Label1.Caption := Column.Title.Caption + ' >= ';
          end;
    
          if (FieldByName(Column.FieldName) is TDateField) Then
          Begin
            JvEdit1.Visible := False;
            JvDateEdit1.Left := JvEdit1.Left;
            JvDateEdit1.Visible := True;
            Label1.Caption := Column.Title.Caption + ' >= ';
          end;
          Open;
        end;
      end;
    end;
    En rouge où cela me pose problème.
    A l'issu du clique donc, Open; ou plutot delphi m'envoi un message 'Le tri ne peut pas être réalisé' patati patata, j'ai essayé de contourner le problème je n'y arrive pas.

    Précision le champs de Type Mémo subi un traitement avant affichage pour n'afficher que la première ligne du mémo.
    Voici le traitement : (le adotable c'est ADODevis)
    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
     
    Procedure TModuleDeDonneeSecondaire.MemoGetText(Sender: TField; var Text: String; DisplayText: Boolean);
    var
      i : integer;
    begin
      try
        Text := sender.AsString;
        if displayText then
        begin
          i := pos(#13,Text); // On récupère la position du retour à la ligne
          if i > 0 then
            Text := copy(Text,1,i-1) + '...'; // Text étant la valeur à afficher pour un TMemo on aura 1 ligne si il y a plusieur ligne dans le Tmemo
        end;
      except
        on e: Exception do
          Text := e.message;
      end;
    end;
     
    procedure TModuleDeDonneeSecondaire.ADODevisAfterOpen(DataSet: TDataSet);
    var
      i : integer;
    begin
      // on redirige les zones memo vers memoGetText
      for i := 0 to DataSet.FieldCount - 1 do
        if (DataSet.Fields[i] is TMemoField) then
          DataSet.Fields[i].OnGetText := memoGetText;
    end;

    MErci de vos remarques et suggestion.

  2. #2
    Membre confirmé Avatar de JustMe
    Inscrit en
    Juillet 2002
    Messages
    479
    Détails du profil
    Informations forums :
    Inscription : Juillet 2002
    Messages : 479
    Points : 593
    Points
    593
    Par défaut
    Juste une suggestion bidon : tu crée un champs ou tu stock la première ligne du mémo cela t'évitera le traitement et te permettra de trier ta table sur ce champ.
    <On fait la science avec des faits, comme on fait une maison avec des pierres : mais une accumulation de faits n'est pas plus une science qu'un tas de pierres n'est une maison> **Poincaré**

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonjour justeMe,

    Je ne peux pas faire cela je ne uis pas le créateur de cette table, je la lie uniquement.

    Merci.

  4. #4
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    J'ai résolu mon probleme en passant par un Tquery et des procédures totalement différentes.

  5. #5
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 043
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 043
    Points : 40 957
    Points
    40 957
    Billets dans le blog
    62
    Par défaut
    Bonjour, j'arrive un peu tard puisque tu as résolu ton problème , mais je peux au moins fournir des explications . Je ne connais pas Access mais le principe doit être le même que pour Firebird.

    Le système de BDD ne stocke pas dans la table la valeur du mémo mais un indice unique pointant sur le mémo (en remarque subsidiaire cela veux également dire que pour lire un mémo il y a deux lectures dans la BDD) .
    Tu remarqueras que j'ai mis unique en gras . En effet pour deux enregistrement ayant la même valeur dans le mémo si tu compare ceux-ci , par égalité, surprise les deux enregistrements seront considéré différents
    (du moins est-ce le cas sous Firebird) . Implication : Faire un index sur u mémo c'est comme indiquer un index UNIQUE.

    Comment contourner le problème, en créant une colonne fantôme en varchar(n) contenant la valeur du mémo (dans ton cas tout ou partie de la première ligne) et en lui mettant une valeur via un trigger .Ainsi pas de problème pour faire un index
    Dans le cas d'une requête plus besoin de colonne fantôme un 'simple CAST' en VARCHAR suffira , c'est également une astuce pour ne faire qu'une lecture au lieu de 2 dans la BDD . A noter cependant qu'une erreur type 'string troncation' peut arriver , la taille du mémo peut être supérieure à celle de la varchar utilisée . On pourra en venir a bout via un SUBSTR ou un équivalent

    @+
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 22/08/2006, 03h36
  2. Réponses: 4
    Dernier message: 02/08/2006, 22h47
  3. manipulation d'un champ de type Memo
    Par ivanleterrible dans le forum Bases de données
    Réponses: 6
    Dernier message: 29/05/2006, 21h53
  4. [SQL] Faire un Distinct en incluant un champ de type Memo
    Par Pedro dans le forum Bases de données
    Réponses: 30
    Dernier message: 23/03/2006, 19h08
  5. Champs de type Memo
    Par talere dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/02/2006, 14h42

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