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 :

Epurer Base SQLite à partir date


Sujet :

Bases de données Delphi

  1. #1
    Membre habitué
    Epurer Base SQLite à partir date
    Bonjour à tous

    Je galère depuis plusieurs jours pour faire l'épuration d'une table dans une base Sqlite

    Je crée dans mon DataModule un TDFQuery relié au datasource de ma table à épurer.
    j'y implémente cette requête :
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    DELETE FROM DetailsCpt WHERE DateEnregistre < <img src="images/smilies/icon_biggrin.gif" border="0" alt="" title=":D" class="inlineimg" />ateEpur AND IdCpt = :IdxCpt


    Je crée cette Procedure :

    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
    if (DateEpur <> 01 / 01 / 1900) and (IdxCpt > 0) then
      begin
     
        try
     
          DataModule2.FDQueryEpure.ParamByName('DateEpur').AsDateTime := DateEpur;
          DataModule2.FDQueryEpure.ParamByName('IdxCpt').AsDateTime := IdxCpt;
     
         if Not DataModule2.FDQueryEpure.Active then
            DataModule2.FDQueryEpure.Active := True;
     
          DataModule2.FDQueryEpure.ExecSQL;
        except
            ShowMessage('Epuration Impossible');
        end;
     
      end
      else
        Exit


    Voici le message d'erreur que j'obtiens :



    Merci pour votre Aide

  2. #2
    Membre émérite
    Pour info lorsque j'insère une date dans sqlLite j'utilise ce type de commande
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    insert into facture (numfacture,datefacture, numclient) values (1,date('2014-09-07'),2012) ,

    donc peut être utiliser la fonction date avec une date au format Annee-Mois-Jour
    exemple
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
     
    select * from facture where datefacture > date('2014-09-07')

    note : le code suivant ne sert à rien
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
         if Not DataModule2.FDQueryEpure.Active then
            DataModule2.FDQueryEpure.Active := True;

  3. #3
    Membre habitué
    Merci pour ta réponse

    J'avait bien sûr essayé ta solution, et voici le message envoyé

  4. #4
    Membre habitué
    Et il en est de même si je formate la Date ainsi: '2020-06-01' avec des tirets

  5. #5
    Membre émérite
    Peux tu nous redonner le code ainsi que le create de la table pour isoler le pb

  6. #6
    Membre habitué
    Voici le Create le ma Table

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TABLE DetailsCpt (
      IdDetails INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
      IdCpt INTEGER NULL,
      DateEnregistre DATE NOT NULL,
      Types VARCHAR(50) NOT NULL,
      NumChq VARCHAR(7) NULL,
      Tiers VARCHAR(80) NOT NULL,
      Categories VARCHAR(50) NOT NULL,
      Debit NUMERIC(7,2) NULL DEFAULT 0,
      Credit NUMERIC(7,2) NULL DEFAULT 0,
      CONSTRAINT Comptes_DetailsCpt FOREIGN KEY (IdCpt) REFERENCES Comptes (IdCpt) ON DELETE RESTRICT ON UPDATE RESTRICT
    );

  7. #7
    Rédacteur/Modérateur

    Query.Active := TRUE égale Query.Open ce qui n'est pas possible s'il n'y a pas de SELECT.

    Supprime ces deux lignes et ne conserve que ExecSQL.

    ps: le paramètre IdxCpt est un entier pas une date.

  8. #8
    Membre émérite
    Voici un exemple sur la date
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    var
      d1 : TDateTime ;
      st1 : string ;
    begin
      d1 := StrToDate ('07/09/2014') ; //  '01/06/2020' dans ton cas
      st1 := formatdatetime('yyyy-mm-dd', d1);
      FDQuery1.SQL.Text := 'select * from facture where datefacture > date('''+st1+''')'   ;
    ...

  9. #9
    Membre habitué
    Merci pour vos réponses

    Voici mon code pour avoir le format date souhaité:
    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
     if (DateEpur <> 01 / 01 / 1900) and (IdxCpt > 0) then
      begin
     
        try
          DateTampon := FormatDateTime('yyyy-mm-dd', dateEpur);
          dateEpur := StrToDate(DateTampon);
     
          DataModule2.FDQueryEpure.ParamByName('DateEpur').AsDateTime := dateEpur;
          DataModule2.FDQueryEpure.ParamByName('IdxCpt').AsInteger := IdxCpt;
     
          if Not DataModule2.FDQueryEpure.Active then
            DataModule2.FDQueryEpure.Active := True;
     
          DataModule2.FDQueryEpure.ExecSQL;
        except
          // Glups
            ShowMessage('Epuration Impossible');
        end;
     
      end
      else
        Exit

    Donc c'est idem

    Par contre Adonor, c'est vraiment un Entier et je m'était planté. J'ai corrigé.
    J'ai aussi Supprimer le FDQuery. Active et conserver uniquement le ExecSQL
    Mais mon message reste toujours sur la date NON Valide

  10. #10
    Rédacteur/Modérateur

    C'est très étrange que AsDateTime ne fonctionne pas puisque c'est justement utilisé pour s'affranchir des différences de formatage.

    Si tu convertis cette date en string, change le type de paramètre :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    DataModule2.FDQueryEpure.ParamByName('DateEpur').AsString := FormatDateTime('yyyy-mm-dd', dateEpur);


    Et ça (DateEpur <> 01 / 01 / 1900) n'est clairement pas juste. Une date est un réel et zéro correspond au 30.12.1899. 1/1/1900 (math) équivaut à 30.12.1899 00:00:45.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    (DateEpur <> EncodeDate(1900, 1, 1)

  11. #11
    Rédacteur/Modérateur

    Bonsoir il faut supprimer les lignes

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
          if Not DataModule2.FDQueryEpure.Active then
            DataModule2.FDQueryEpure.Active := True;
    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

  12. #12
    Membre émérite
    L'erreur est ici :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
          dateEpur := StrToDate(DateTampon);
          DataModule2.FDQueryEpure.ParamByName('DateEpur').AsDateTime := dateEpur

    Reprends le code que je t'ai envoyé ...

  13. #13
    Membre habitué
    Merci beaucoup à tous les deux

    Avec vos solutions j'obtiens ce que je voulais.

###raw>template_hook.ano_emploi###