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 :

[BDE + PARADOX] Date système en SQL


Sujet :

Delphi

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut [BDE + PARADOX] Date système en SQL
    Bjr à tous,
    Alors Delphi 7 base de donnée paradox (je sais que bcp d'entre vous me dirons "mais pourquoi restez vous accroché à ce paradox ?!!!)
    rep: l'appli à été développée ainsi et je dois m'y adapter !

    je bloque sur comment récupérer la date du système (la date d'aujourd'hui) pour l'utiliser dans une requête en BDE ?!!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab, (datef_abm-{c'est ici ou je doit placer la date du systeme}currentDATE) as reste from abonnement, abonne
    where abonne.num_ab=abonnement.num_ab and validite_abm='true'
    en realité c'est pour calculer le nombre de jours qui restent dans chaque abonnement...

    pour ceux qui me diront il faut passer à autre chose....
    oui je suis passé à MySQL et SQL Server
    mais sur cette application le mal a été fait !!!
    donc help me please !

  2. #2
    Fxg
    Fxg est déconnecté
    Membre éclairé
    Homme Profil pro
    ingénieur financier
    Inscrit en
    Septembre 2003
    Messages
    510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : ingénieur financier

    Informations forums :
    Inscription : Septembre 2003
    Messages : 510
    Points : 837
    Points
    837
    Par défaut
    En utilisant la function : Now : TDateTime;

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    j'ai déja essayé avec Now ça ne veut pas marcher !!!
    j'ai meme essayer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strtodate(formatdatetime('dd/mm/yyyy',now)
    rien aussi
    meme en essayant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strtodate(formatdatetime('dd/mm/yyyy',date))

  4. #4
    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,

    A ma connaissance Paradox ou plutôt le local SQL de BDE n'a pas accès aux dates systèmes.
    Pour vous en sortir utilisez une requête paramétrée

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab, 
    (datef_abm-:CURRENTDATE) as reste 
    FROM abonnement JOIN  abonne ON abonne.num_ab=abonnement.num_ab 
    WHERE  abonnement.validite_abm='true'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Query.Close;
    Query.ParamByName('CURRENTDATE').asString:=FormatDateTime('mm/dd/yyyy',date);   // attention le format de la date est important
    ou 
    //Query.ParamByName('CURRENTDATE').asDateTime:=now;
    Query.Open;
    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

  5. #5
    Membre actif
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 105
    Points : 235
    Points
    235
    Par défaut
    Bonjour,
    Oui il faut utiliser un param, la soluton c'est ce que dit SergioMaster sauf un détail: la fonction date au lieu de now pour éviter les prob d'heure qui pourraient fausser ta requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Query.ParamByName('CURRENTDATE').asDateTime:=date;
    - Evite de reconstruire ta date avec des formatdatetime(...) on est jamais sûr de l'ordre des jours, qui peut dépendre de ton windows, de Paradox, ...
    - pense à mettre ftDate dans la propriété DataType de ton paramètre
    et prend SQL proposé par Sergio.
    solilog

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    j'ai eu une errur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Access violation at adress 4C5F2D6F in module 'idsql32.DLL'. Read of adress 0000000D.

  7. #7
    Membre actif
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 105
    Points : 235
    Points
    235
    Par défaut
    J'ai fait le test ci-dessous pour initialiser un paramètre avec un tDateTimePicker
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     procedure TForm1.Button1Click(Sender: TObject);
    begin
      qySQL.Close;                 
      qySQL.SQL.Text := 'select * from OPE where OPDATE > :PKDATE';
      qySQL.Params[0].DataType := ftDate;
      qySQL.Params[0].AsDate := pkdat.date;    // pkDat : tDateTimePicker
      qySQL.Open();
    end;
    Ca fonctionne bien.
    solilog

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    tjrs le meme message :

    Access violation at adress 4C5F2D6F in module 'idsql32.DLL'. Read of adress 0000000D.

  9. #9
    Membre actif
    Homme Profil pro
    Consultant fonctionnel
    Inscrit en
    Décembre 2014
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant fonctionnel

    Informations forums :
    Inscription : Décembre 2014
    Messages : 105
    Points : 235
    Points
    235
    Par défaut
    Salut,
    Si tu ne publies pas ton code, on y arrivera pas.
    solilog

  10. #10
    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,

    je solilog car sans code

    pour reprendre aussi le SQL, je trouve aussi que l'utilisation d'alias de table et un peu plus de précisions dans le SQL ne serait pas malvenue ceci afin de distinguer quel num_ab il faut renvoyer ce qui peut être la cause de l'erreur. J'ai bien écrit : "peut être" car c'est la première fois que je suis confronté à une erreur sur la bibliothèque idsql32
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT a.dated_abm, a.datef_abm, a.dure_abm, b.num_ab, b.nom_ab, b.prenom_ab, b.photo_ab, 
    (a.datef_abm-:CURRENTDATE) as reste 
    FROM abonnement a JOIN  abonne c ON a.num_ab=c.num_ab 
    WHERE  a.validite_abm='true'

    une piste possible est également d'utiliser des cast dans la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.datef_abm-CAST(:CURRENTDATE AS DATE)
    en tout cas, ce test rapide avec un jeu d'essai tout aussi rapide, confirme la piste du CAST, sans ce dernier j'obtiens l'erreur sur idSQL32
    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
     
    unit UnitQDate;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ComCtrls, Grids, DBGrids, DB, DBTables;
     
    type
      TForm1 = class(TForm)
        Database1: TDatabase;
        Query1: TQuery;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        DateTimePicker1: TDateTimePicker;
        procedure DateTimePicker1Change(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
     
    procedure TForm1.DateTimePicker1Change(Sender: TObject);
    begin
    Query1.Active:=False;
    Query1.ParamByName('CDATE').asDate:=DateTimePicker1.Date;
    Query1.active:=True;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    // SELECT N,ADATE,ADATE-CAST(:CDATE AS DATE) AS RESTE from test2.db
    Query1.Active:=False;
    Query1.ParamByName('CDATE').asDate:=Date;
    Query1.Active:=True;
    end;
     
    end.
    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

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Merci sergio tu as eu raison... ta piste était la bonne
    mais ceci dit, le BDE ne prend pas bien en charge les opérations arithmétique avant un paramétré sql
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...(datef_abm-:CURRENTDATE)
    ici l'erreur pointe.
    après avoir fouiné dans d'ancienne publications j'ai trouvé que le BDE ne gère pas bien les opérations dans les requêtes paramétrées
    donc j'ai essayé d'inverser en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...(:CURRENTDATE-datef_abm)
    et là ça a marché mais bien entendu ce n’était pas le resultat attendu (juste pour confirmer ma thèse !!)
    du coups ton idée de placer un CAST au bon endroit afin de séparer les ( : ) du paramétre de l’opération ( - , + , * , / , < , > ) car c'est ici ou réside l'erreur !!!!

    Merci à tous

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Ce problème résolu, je suis confronté à un sous problème.
    lorsque la date de fin d'un abonnement est dépassé (datef_abm<la date en cour) le (a.datef_abm-CAST(:CURRENTDATE AS DATE)) as rest me renvoi biensure un integer <0 (exp : -6) et là c'est moche à afficher !
    le resultat attendu est au min un 0 ou bien un 'EXP' (string)
    j'affiche le resultat dans un DBCtrlGrid...
    Please help !

  13. #13
    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
    Citation Envoyé par lotfi.lahcene Voir le message
    mais ceci dit, le BDE ne prend pas bien en charge les opérations arithmétique avant un paramétré sql
    après avoir fouiné dans d'ancienne publications j'ai trouvé que le BDE ne gère pas bien les opérations dans les requêtes paramétrées
    je ne suis pas sûr de valider cette explication mais cela en vaut une autre
    lorsque la date de fin d'un abonnement est dépassé (datef_abm<la date en cour) le (a.datef_abm-CAST(:CURRENTDATE AS DATE)) as rest me renvoi biensure un integer <0 (exp : -6) et là c'est moche à afficher !
    bon, faut pas trop demander de "cosmétique" au SQL encore moins lorsqu'il s'agit du LocalSQL de BDE qui n'a pas beaucoup de fonctions internes

    Ceci écrit il y a moyen en utilisant l'ensemble de deux requêtes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT a.dated_abm, a.datef_abm, a.dure_abm, b.num_ab, b.nom_ab, b.prenom_ab, b.photo_ab, 
    'EXP' as reste 
    FROM abonnement a JOIN  abonne c ON a.num_ab=c.num_ab 
    WHERE  a.validite_abm='true' AND (a.datef_abm-:CURRENTDATE)<0 
    UNION
    SELECT a.dated_abm, a.datef_abm, a.dure_abm, b.num_ab, b.nom_ab, b.prenom_ab, b.photo_ab, 
    (a.datef_abm-:CURRENTDATE) as reste 
    FROM abonnement a JOIN  abonne c ON a.num_ab=c.num_ab 
    WHERE  a.validite_abm='true' AND (a.datef_abm-:CURRENTDATE) >=0
    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

  14. #14
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Sinon gérer OnGetText du TField lié à "reste"
    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

  15. #15
    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
    J'avais aussi zappé la possibilité toute simple de gérer aussi bien le calcul que le rendu en utilisant un champ calculé et le OnCalcFields de la query
    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

  16. #16
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    je vous remercie les gars j'ai eu le resutat attendu en utilisant l'UNION des deux select mais j'ai du apporté qlqs retouches pour les faire accepter par Mr BDE

    SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab, 0 as reste FROM abonnement, abonne
    WHERE abonnement.num_ab=abonne.num_ab AND abonnement.validite_abm='true' AND ( datef_abm- CAST(:CURRENTDATE AS DATE)) <0
    UNION
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab,
    (datef_abm- CAST(:CURRENTDATE AS DATE)) as reste
    FROM abonnement,abonne 
    WHERE  abonnement.num_ab=abonne.num_ab AND abonnement.validite_abm='true' AND (datef_abm- CAST(:CURRENTDATE AS DATE)) >=0
    le
    FROM abonnement a JOIN abonne c ON a.num_ab=c.num_ab
    me renvoyait un message de non concordance de type sur le Field num_ab float : nteger

    Code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Query1.Close;
    Query1.Params[0].DataType := ftDate;
    Query1.Params[0].AsDate :=date;
    Query1.Params[1].DataType := ftDate;
    Query1.Params[1].AsDate :=date;
    Query1.Params[2].DataType := ftDate;
    Query1.Params[2].AsDate :=date;
    Query1.Open;
     
     
    end;
    mais ceci dit j'aimerai bien explorer la piste du
    OnGetText du TField lié à "reste"
    et

    J'avais aussi zappé la possibilité toute simple de gérer aussi bien le calcul que le rendu en utilisant un champ calculé et le OnCalcFields de la query
    quoi coder dans ces deux ou dirai-je l'un des deux événements ?
    please HELP


    je tiens à vous remercier

  17. #17
    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,
    Citation Envoyé par lotfi.lahcene Voir le message
    le JOIN me renvoyait un message de non concordance de type sur le Field num_ab float : integer
    C'est une erreur de la personne qui a créé les tables pas une erreur de SQL ! un CAST de l'un des deux num_ab aurait permis de s'en sortir
    comme il n'est pas indiqué quel est le num_ab qui est un float ci-dessous je l'applique pour les deux !
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab, (datef_abm- CAST(:CURRENTDATE AS DATE)) as reste as reste 
    FROM abonnement JOIN  abonne ON CAST(abonnement.num_ab AS INTEGER)=CAST(abonne.num_ab as INTEGER)
    WHERE abonnement.validite_abm='true'

    En ce qui concerne le code, pour moi il n'y en a qu'un seul paramètre et comme la requête ne semble pas changer je l'aurais déclaré dans le dfm (propriété de la requête), je me serais par contre peut-être fendu d'un Query1.Prepare dans le FormCreate avant l'ouverture de celle-ci !

    Quelque soit la piste : OnGetText ou onCalcField la première chose à faire est de créer les champs (clic droit sur la requête+Editeur de champ)

    dans le cas de ongettext la requête sera
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab, (datef_abm- CAST(:CURRENTDATE AS DATE)) as reste as reste 
    FROM abonnement, abonne
    WHERE abonnement.num_ab=abonne.num_ab AND abonnement.validite_abm='true'
    dans le second juste
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab FROM abonnement, abonne
    WHERE abonnement.num_ab=abonne.num_ab AND abonnement.validite_abm='true'
    mais il faudra ajouter un nouveau champ calculé 'reste' via l'éditeur de champ

    le onCalcField donnerait alors quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.Query1CdsCalcFields(DataSet: TDataSet);
    var d : integer;  // calculer d permet d'avoir un champ reste de type string pour mettre 'EXP' si < 0 
                          // dans le cas ou le champ à calculer est un entier on peut s'en passer  
    begin
    d:=Dataset['datef_abm'].asDateTime-Date;
    if d<0 then Dataset['reste'].asInteger:=0 
             else Dataset['reste'].asInteger:=d;
     
    // j'ai toujours un doute en écrivant à la volée sur l'utilisation de DataSet
    // on peut écrire aussi de cette manière
    // d:=Query1Datef_Abm.asDateTime-Date;
    // if d<0 then Query1Reste.asInteger:=0 
    //          else Query1Reste.asInteger:=d; 
    end;
    j'ai moins l'habitude du OnGetText, je pense que ceci devrait fonctionner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Query1ResteGetText(Sender: TField; var Text: string;
      DisplayText: Boolean);
    begin
    if TField(Sender).asInteger<0 then Text:='0'; // ou text:='expiré' ou ....
    end;
    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

  18. #18
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mars 2018
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2018
    Messages : 59
    Points : 30
    Points
    30
    Par défaut
    Merci bcp pour vos aides si précieuses les gars,

    je vous fais part des légères modifs que j'ai apporté

    le code SQL est le même pour les deux pistes "OnGetText" et "OnCalculField"
    et c'est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT dated_abm, datef_abm, dure_abm, num_ab, nom_ab, prenom_ab, photo_ab, (datef_abm- CAST(:CURRENTDATE AS DATE)) as reste 
    FROM abonnement, abonne
    WHERE abonnement.num_ab=abonne.num_ab AND abonnement.validite_abm=true
    dans le cas de l'évenement OnGetText j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    procedure TForm1.Query1resteGetText(Sender: TField; var Text: String;
      DisplayText: Boolean);
    begin
    if TField(Sender).asInteger<0 then Text:='EXP'else text:=TField(Sender).asstring // ou text:='expiré' ou ....
    end;
    dans le cas du OnCalucluField j'ai fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure TForm1.Query1CalcFields(DataSet: TDataSet);
    var d : real; 
     
    begin
    d:=Query1datef_abm.asdatetime-date;
     
    if d<0 then Query1Reste.asInteger:=0
             else Query1Reste.AsFloat:=d;
     
     
     
    end;
    seule différence c'est que dans le cas du OnGetText il ne faut pas déclarer le champ 'reste' comme champ calculé dans l'editeur de champs...
    ceci dit je vous remercie bcp pour votre aide si précieuse

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/04/2014, 13h29
  2. Récupérer et utiliser la date système du jour sous SQL
    Par fossolivier dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 02/07/2010, 11h09
  3. Date système SQL
    Par go_OM dans le forum Langage SQL
    Réponses: 11
    Dernier message: 23/05/2008, 16h16
  4. Réponses: 4
    Dernier message: 02/05/2007, 10h22
  5. [Sybase] Récupération de la date système
    Par atos dans le forum Sybase
    Réponses: 2
    Dernier message: 03/03/2004, 14h29

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