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 :

Problème de filtre avec SQLQuery et numérique [Lazarus]


Sujet :

Lazarus Pascal

  1. #1
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut Problème de filtre avec SQLQuery et numérique
    Bonjour à tous
    Je passe une application de Delphi à Lazarus et je rencontre un problème avec le filtrage d'une table avec les valeurs numériques, c'est pas la première fois que je fais des filtres.
    J'utilise SQLQuery. Mis à part le filtrage pas de soucis pour gérer les données, ça va bien. Voici le bout de code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    UnitBase1.Data.SQLQuery1.Filtered := false;
    UnitBase1.Data.SQLQuery1.Filter:= 'ART_QTE <= 2';
    UnitBase1.Data.SQLQuery1.FilterOptions:= [];
    UnitBase1.Data.SQLQuery1.Filtered := true;
    J'ai beau chercher sur le net ou ici même, personne parait être ennuyé avec le filtrage, je n'ai pas de réponse.

    Voici le message affiché, suite à l'erreur.
    Nom : Erreur.JPG
Affichages : 361
Taille : 17,7 Ko

    Si vous pouvez aussi m'expliquer pour les dates éventuellement.

    Merci de vos réponses.

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 950
    Points : 9 279
    Points
    9 279
    Par défaut
    hello,
    tu as du tomber sur le problème qu'avait FOCUS77 le 1er Septembre :

    J'ai tenté de définir un filtre pour une SqlQuery, basé sur un champ de type BCD,
    défini au niveau de serveur de base de données :NUMERIC(10,2).
    mais un message d'erreur apparait 'field "QTE_STK" has an invalid field type (BCD) to index on'
    Le ClientDataset traduit automatiquement NUMERIC en FMTBcd (formatted BCD) c'est pour cette raison qu'il peut l'utilisé comme filtre,
    cependant le sqlquery le traduit en BCD(forme brute)
    ya-t-il pas un moyen de le transformer en FMTBcd?

    Enfin, j'ai réglé ça avec une SQL , il ma fallut procéder ainsi dès le début.
    Ami calmant, J.P

    EDIT : C'est ici que l'exception se déclenche :

    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 TBufDatasetParser.HandleUnknownVariable(VarName: string);
    var
      FieldInfo: TField;
      TempFieldVar: TFieldVar;
    begin
      // is this variable a fieldname?
      FieldInfo := GetVariableInfo(VarName);
      if FieldInfo = nil then
        raise EDatabaseError.CreateFmt(SErrIndexBasedOnUnkField, [VarName]);
     
      // define field in parser
      case FieldInfo.DataType of
        ftString, ftFixedChar:
          begin
          TempFieldVar := TStringFieldVar.Create(FieldInfo);
          TempFieldVar.FExprWord := DefineStringVariable(VarName, TempFieldVar.FieldVal);
          TempFieldVar.FExprWord.fixedlen := Fieldinfo.Size;
          end;
        ftBoolean:
          begin
            TempFieldVar := TBooleanFieldVar.Create(FieldInfo);
            TempFieldVar.FExprWord := DefineBooleanVariable(VarName, TempFieldVar.FieldVal);
          end;
        ftFloat:
          begin
            TempFieldVar := TFloatFieldVar.Create(FieldInfo);
            TempFieldVar.FExprWord := DefineFloatVariable(VarName, TempFieldVar.FieldVal);
          end;
        ftAutoInc, ftInteger, ftSmallInt:
          begin
            TempFieldVar := TIntegerFieldVar.Create(FieldInfo);
            TempFieldVar.FExprWord := DefineIntegerVariable(VarName, TempFieldVar.FieldVal);
          end;
        ftLargeInt:
          begin
            TempFieldVar := TLargeIntFieldVar.Create(FieldInfo);
            TempFieldVar.FExprWord := DefineLargeIntVariable(VarName, TempFieldVar.FieldVal);
          end;
        ftDate, ftDateTime:
          begin
            TempFieldVar := TDateTimeFieldVar.Create(FieldInfo);
            TempFieldVar.FExprWord := DefineDateTimeVariable(VarName, TempFieldVar.FieldVal);
          end;
      else
        raise EDatabaseError.CreateFmt(SErrIndexBasedOnInvField, [VarName,Fieldtypenames[FieldInfo.DataType]]);
      end;
     
      // add to our own list
      FFieldVarList.AddObject(VarName, TempFieldVar);
    end;
    fichier fpc\2.6.4\source\packages\fcl-db\src\base\bufdataset_parser.pp

    pas de ftBCD prévu
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    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 918
    Points
    3 918
    Par défaut
    Salut à tous

    (Sans pouvoir le tester moi-même) peux-tu remplacer l'expression de filtre par un gestionnaire OnFilterRecord, comme cela tu pourras réaliser la condition de filtrage avec du code Pascal. L'inconvénient de cette approche est qu'elle exprime la condition en dur.

    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."

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 950
    Points : 9 279
    Points
    9 279
    Par défaut
    hello,
    e-ric, je viens d'essayer ce que tu as suggéré : Le filtre est bien effectif et je n'ai plus d'erreur invalid field type (BCD) ...

    code qui génére l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure TForm1.bt_filtrerClick(Sender: TObject);
    begin
    SQLQuery1.Filtered := false;
    SQLQuery1.Filter:= 'SALARY <=  2100';
    SQLQuery1.FilterOptions:= [];
    SQLQuery1.Filtered := true;
    end;
    utilisation de l'événement OnFilterRecord :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    procedure TForm1.SQLQuery1FilterRecord(DataSet: TDataSet; var Accept: Boolean);
    begin
      Accept := SQLQuery1.FieldByName('SALARY').AsFloat <= 2100;
    end;
    Le filtre est mis en route par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure TForm1.bt_filtrerClick(Sender: TObject);
    begin
    SQLQuery1.Filtered := false;
    SQLQuery1.FilterOptions:= [];
    SQLQuery1.Filtered := true;
    end;
    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre habitué Avatar de Patrick25300
    Homme Profil pro
    Retraité en technicien de maintenance et méthodes
    Inscrit en
    Février 2007
    Messages
    153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Retraité en technicien de maintenance et méthodes
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 153
    Points : 134
    Points
    134
    Par défaut
    Bonjour et merci à vous tous

    Je vais me résigner à programmer mes filtres avec OnFilterRecord ou des requêtes SQL, c'est dommage, les filtres étaient très suffisant pour mes besoins.

  6. #6
    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 918
    Points
    3 918
    Par défaut
    Encore moi...

    Petite observation: pas besoin de résignation dans cela, les filtres par OnFilterRecord ont de grandes chances d'être plus rapides que par les filtres par expression (propriété filter) car le code est compilé et ne passe pas par l'évaluation de l'expression.

    Le seul blocage réside dans des expressions de filtres personnalisables par l'utilisateur. L'événement OnFilterRecord peut sembler être alors un blocage que l'on peut contourner par des filtres prédéfinis (souvent suffisants) implémentés sous forme de gestionnaires d'événement affectés dynamiquement.

    Bon dév.

    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."

  7. #7
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 950
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 950
    Points : 9 279
    Points
    9 279
    Par défaut
    hello,
    LacaK dans le forum officiel Free Pascal Lazarus a fabriqué un patch pour traiter le cas des ftBCD. Le patch concerne le fichier bufdataset_parser.pp.
    En pièce jointe le patch, le fichier modifié pour le fpc 2.6.4. J'ai aussi mis l'unité compilée pour i386-win32.

    Ami calmant, J.P
    Fichiers attachés Fichiers attachés
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

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

Discussions similaires

  1. [QtGui] Problème de filtres avec QFileDialog
    Par Renoct dans le forum PyQt
    Réponses: 1
    Dernier message: 22/12/2011, 19h45
  2. Réponses: 1
    Dernier message: 08/05/2008, 23h00
  3. probléme filtre avec deux critéres?
    Par dj_techno dans le forum Bases de données
    Réponses: 9
    Dernier message: 31/05/2007, 09h57
  4. Problème de filtre sur date avec ADOQuery
    Par lingli dans le forum Bases de données
    Réponses: 12
    Dernier message: 30/04/2006, 15h40

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