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 :

[SQlite] [Firedac]ajout de fonctions


Sujet :

Bases de données Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 460
    Points : 33 621
    Points
    33 621
    Billets dans le blog
    42
    Par défaut [SQlite] [Firedac]ajout de fonctions
    Bonjour,

    Il y a quelques temps, je découvrais la possibilité d'ajouter des fonctions au moteur SQLite (voir ici).
    Ajourd'hui j'ai voulu faire le malin pour éviter des champs calculés et
    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
     
    procedure TDM.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance;
      AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);
    begin
      // vient du sample de l'aide 
      // nom de fonction mult 2 parametres currency, integer
      AOutput.AsCurrency := AInputs[0].AsCurrency * AInputs[1].AsInteger;
    end;
     
    procedure TDM.FDSQLiteFunctionAAAAMMJJ2DateCalculate(
      AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs;
      AOutput: TSQLiteOutput; var AUserData: TObject);
    var vSDate : String;
        vDate : TDate;
    begin
    // nom de la fonction AAAAMMJJ2DATE paramètre String sous la forme yyyymmdd (patrick reconnaitra son idée, dernière session twitch) 
    vsDate:=AInputs[0].AsString;
    vDate:=EncodeDate(StrToInt(Copy(vsdate,1,4)),
                      StrToInt(Copy(vsdate,5,2)),
                      StrToInt(Copy(vsdate,7,2)));
    AOutput.AsDate:=vDate;
    end;
     
    procedure TDM.FDSQLiteFunctionMontantCalculate(
      AFunc: TSQLiteFunctionInstance; AInputs: TSQLiteInputs;
      AOutput: TSQLiteOutput; var AUserData: TObject);
    var vMontant : Currency;
        IMontant : String;
    begin
     // nom de la fonction montantreel paramètres numeric(10,2), char (patrick reconnaitra son idée, dernière session twitch) 
     IMontant:=AInputs[0].AsString;
     Vmontant:=StrToFloat(IMontant);
     if Ainputs[1].AsString='-'
        then vMontant:=Vmontant * -1;
     AOutput.AsCurrency:=vMontant;
    end;
    J'espérai obtenir respectivement une colonne Currency, Date et Currency mais je me retrouve à chaque fois avec une string
    Nom : Capture.PNG
Affichages : 36
Taille : 12,0 Ko

    Je doit oublier quelque chose mais
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    juillet 2006
    Messages
    11 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : juillet 2006
    Messages : 11 909
    Points : 20 842
    Points
    20 842
    Par défaut
    Essaye AOutput.ExtDataType := etCurrency si le AsCurrency ne le fait pas
    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

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 460
    Points : 33 621
    Points
    33 621
    Billets dans le blog
    42
    Par défaut
    J'y avais pensé, pas sous cette forme plus simple, mais avec Output.SetData(@valeur,0,TSQLiteExtDataType.etCurrency);Mais non
    Je crains que la réalité soit plus complexe.

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure TDM.FDSQLiteFunction1Calculate(AFunc: TSQLiteFunctionInstance;
      AInputs: TSQLiteInputs; AOutput: TSQLiteOutput; var AUserData: TObject);
    var montant : integer;
        aFormatSettings: TFormatSettings;
    begin
      montant:=Ainputs[1].AsInteger*Ainputs[1].AsInteger;
      AOutput.asinteger := montant;
    end;
    le passage d'un entier fonctionne
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    12 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : janvier 2007
    Messages : 12 460
    Points : 33 621
    Points
    33 621
    Billets dans le blog
    42
    Par défaut
    Alors cela m'apprendra à lire la documentation. Heureusement Dmitri Arefiev est encore là pour me le rappeler
    SQLite est une base de données vraiment sans type. Lorsque vous utilisez AOutput.AsCurrency, FireDAC le mappe à SQLITE_TEXT (pour conserver la précision) et AOutput.AsFloat à SQLITE_FLOAT. Pour 'remapper' une expression dans la liste SELECT vers un type spécifique Delphi, vous devez utiliser une construction spéciale dans la liste SELECT:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <expression> AS "<alias>::<type>"
    voir http://docwiki.embarcadero.com/RADSt...ireDAC_Mapping
    J'ai donc changé ma requête en conséquence, pour l'instant un test avec le montant
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select id,montant,sens,
           testmnt(sens,montant) as "MNT::CURRENCY", 
           asIntvalue(sens) as "IntSens::INT",
           montant*asIntvalue(sens) as "MNTBIS::CURRENCY" 
    from ecritures
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein

    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Tokyo, Rio, Sidney) et peut être quelques autres
    SGBD : Firebird 2.5, 3, SQLite
    générateurs Etats : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Ubuntu, Androïd

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

Discussions similaires

  1. Publication d'un billet sur SQLite et l'ajout de fonction
    Par SergioMaster dans le forum Delphi
    Réponses: 0
    Dernier message: 24/01/2021, 13h10
  2. [QtSql] Ajout de fonctions au pilote sqlite?
    Par tyrtamos dans le forum PyQt
    Réponses: 7
    Dernier message: 23/07/2012, 20h26
  3. requete ajout en fonction de la valeur d'un champ ?
    Par mat75019 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/06/2006, 11h17
  4. Réponses: 13
    Dernier message: 06/02/2006, 11h12
  5. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 02h18

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