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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    janvier 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : janvier 2019
    Messages : 38
    Points : 15
    Points
    15

    Par défaut [SQLite] Nombre d'enregistrements d'une table entre deux dates

    Bonjour à tous,
    Me revoilà avec un autre problème. Je cherche le nombre d'enregistrements d'une table entre 2 dates. Le code ci-dessous fonctionne très bien avec Delphi 10.2 mais pas avec Lazarus 2.0.2. Ma BDD est sous SQlite avec les composants ZEOSLib. Tout fonctionne bien sauf cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    var d1,d2 : String;
    begin
    with Dm.ZQuery1 do
      begin
        SQL.Clear;
        d1:=FormatDateTime('mm/dd/yyyy', DatePicker1.Date);
        d2:=FormatDateTime('mm/dd/yyyy', DatePicker2.Date);
        SQL.Add ('SELECT * FROM tblContacts WHERE Jour between #' + d1 + '# AND #' + d2 + '#');
        SQL.Add ('ORDER BY Numero ASC');
        Open;
        NbContacts.Caption := Format('%d', [Dm.ZQuery1.RecordCount]);
      end;
    J'ai le message suivant :

    Nom : message.jpg
Affichages : 68
Taille : 18,7 Ko

    Merci beaucoup pour votre aide éclairée.
    Merci et bon WE à tous.

  2. #2
    Membre extrêmement actif Avatar de Jon Shannow
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    avril 2011
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : avril 2011
    Messages : 3 096
    Points : 5 377
    Points
    5 377

    Par défaut

    Bonjour,

    Je ne sais pas si ça peut venir de là, mais tu es encore dans le With dm.zquery1 quand tu fais ton affectation au contrôle en utilisant dm.zquery1.recordcount.
    Soit tu mets uniquement recordcount, soit tu places l'instruction en dehors du With.

    Selon moi

    JS
    Au nom du pèze, du fisc et du St Estephe
    Au nom du fric, on baisse son froc...

  3. #3
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    janvier 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : janvier 2019
    Messages : 38
    Points : 15
    Points
    15

    Par défaut

    Non, j'ai tout essayé, j'ai mis la ligne RecordCount après le with, je l'ai même mise en commentaire, même problème. J'ai l'intuition que ce sont les 2 DatePicker qui ne sont pas compatibles avec ceux de Delphi. Et je ne vois pas d'autre composant dans la palette Lazarus.
    En tout cas merci de vous être intéressé à ce cas.
    Et j'ai aussi ailleurs dans le code un problème de non-reconnaissance du type de variable TBookMark, reconnu par Delphi.
    A suivre donc...
    BD

  4. #4
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    janvier 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : janvier 2019
    Messages : 38
    Points : 15
    Points
    15

    Par défaut

    Pour info, le problème de TbookMark est résolu : il suffisait de déclarer Db dans les uses de l'unité. Pour le reste, status quo...
    Bon WE à tous.
    BD

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    mars 2005
    Messages
    3 311
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : mars 2005
    Messages : 3 311
    Points : 9 559
    Points
    9 559
    Billets dans le blog
    6

    Par défaut

    N'y aurait-il pas une différence dans la façon de traiter le format date entre les 2 univers ?
    SQLite ne possède pas de format spécifique de stockage des dates : le type de colonne choisi ne pourrait-il pas jouer ?
    Ceci expliquerait pê le message d'erreur logique dans la requête.
    Delphi 5 Pro - Delphi 10.2 Tokyo Community Edition - CodeTyphon 6.50 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    janvier 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : janvier 2019
    Messages : 38
    Points : 15
    Points
    15

    Par défaut

    Bonjour Tourlourou,
    Votre remarque est très intéressante. Je viens de regarder la structure de ma BDD Sqlite. Le champ Jour est en VARCHAR(10) (c-à-d DD/MM/AAAA), car effectivement le type DATE n'est pas proposé. Je précise que j'utilise le composant TDateTimePicker. J'ai essayé aussi le TMaskEdit. Rien à faire. Mais tout cela ne m'avance pas car je ne suis pas assez calé (si tant est que je le sois un peu !) pour trouver la solution. Si vous en avez une, je suis bien sûr preneur.
    Bon WE.
    BD

  7. #7
    Membre éclairé
    Homme Profil pro
    Chef de projets retraité
    Inscrit en
    juillet 2011
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projets retraité
    Secteur : Transports

    Informations forums :
    Inscription : juillet 2011
    Messages : 259
    Points : 669
    Points
    669

    Par défaut

    Bonjour,

    Citation Envoyé par f5jcg_Lulu Voir le message
    Bonjour Tourlourou,
    Je viens de regarder la structure de ma BDD Sqlite. Le champ Jour est en VARCHAR(10) (c-à-d DD/MM/AAAA), car effectivement le type DATE n'est pas proposé.
    Non, il n'est pas proposé par défaut (pas plus que varchar d'ailleurs) puisque les colonnes n'ont pas de type dans SQLITE (bien que l'on puisse leur assigner des affinités).
    Cependant SQLITE propose des fonctions de traitement des dates https://www.sqlite.org/lang_datefunc.html qui travaillent en mode ISO et permettent des traitements d'intervalles (betwwen datemin and datemax).
    Le format utilisé (DD/MM/AAAA) ne devrait pas l'être car avec lui impossible de tester les intervalles de dates ou de faire des calculs.

    Cordialement

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    juin 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2005
    Messages : 61
    Points : 93
    Points
    93

    Par défaut

    Bonjour.

    J'ai des programmes utilisant des bdd sqlite avec des dates mais uniquement comme information et je n'avais jusqu'à aujourd'hui jamais fait de sélection ni de calcul avec ces dates ...

    J'ai donc fait des tests et je n'ai pas réussi à utiliser des conditions dans le select sur ces dates (quelle que soit la syntaxe). Divers tests m'ont permis de constater que la "référence dates" de sqlite est 31/12/1899 = Jour 1.

    Si je mets dans la clause sql select * from matable where madate= 43471, j'obtiens tous les enregistrements du 06/01/2019.

    avec sql : select * from matable where madate between 43471 and 43480, ceux entre les 6 et 15/1/19.

    pour obtenir la date à partir d'un datetimepicker : DaysBetween(DateTimePicker1.Date, StrToDate('30/12/1899')) .

    Christian

  9. #9
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    janvier 2019
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : janvier 2019
    Messages : 38
    Points : 15
    Points
    15

    Par défaut

    Bonjour,
    Votre piste thewolf est intéressante et je vais l'exploiter pour voir où elle me mène.
    De toute façon, j'ai constaté d'autres dysfonctionnements et ce projet sous Lazarus n'est pas encore mûr mais il le sera bientôt. J'avance pas-à-pas en essayant d'éliminer les erreurs les unes après les autres. Pour le moment le projet sous Delphi ADO+Access tourne sans aucune faille. Donc à voir.
    Je vous remercie tous pour votre aide. Je reviendrai probablement. En attendant je mets la discussion en résolu.
    Cordialement

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 22/02/2016, 16h33
  2. [WB17] Filtrer une table entre deux dates
    Par LaGhyoute dans le forum WebDev
    Réponses: 1
    Dernier message: 16/06/2014, 10h35
  3. Réponses: 6
    Dernier message: 24/05/2014, 14h48
  4. [DB] Nombre d'enregistrements d'une table
    Par Mister Nono dans le forum Bases de données
    Réponses: 26
    Dernier message: 09/05/2006, 09h51
  5. Nombre d'enregistrement dans une table MySQL
    Par tom06440 dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 21/10/2005, 19h07

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