Filtre et tables

Résolu
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 - 14 mars 2013 à 23:54
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 29 mars 2013 à 16:34
Salut tous le monde

mon pb, est que je veux filtrer ma table Tdate en utilisons le mois récupéré sur du système, pour connaitre la première date enregistré du mois;
l'ai essaie avec ce code mais sa ne marche pas:

// M c'est le num du mois
Filter :'Date' + QuotedStr('*'+'/'+ M + '/' + FormatDateTime('yyyy',Date));
Filtered := True;

Le message reçu "is not a valid date"

merci pour tout l'aide que vous pouvez m’apporte

18 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 mars 2013 à 11:40
Salut,

Ça n'a pas l'air de marcher sur les dates...
En revanche, tu peux faire une requete :
Select Champ1, Champ2, ChampDate
from Table
Where (Extract(Month from ChampDate) = '+ M +')'
And (Extract(Year from ChampDate) = '+ FormatDateTime('yyyy',Date) + ')'


Simon
1
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 1
15 mars 2013 à 22:00
Salut a toi simon
merci pour ton idée, mais voila je ne veux pas utilisé de requête, ce que je veux c'est de travailler direct sur le table.
1
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
15 mars 2013 à 23:31
Dans ce cas, désolé mais je ne sais pas comment faire...


Simon
1
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 mars 2013 à 08:09
Salut,

Le "problème" c'est que tu vas être obligé de parcourir toute ta table à chaque fois que tu voudras appliquer un filtre. Ça peut te poser des problèmes de lenteur si ta table pèse lourd (en terme de Mo) ou si tu fonctionne en réseau (i.e. si ta base de données est sur un serveur...)
Et c'est là que le SQL peut t'être utile...

J'ai ça à te proposer (à tester... Donne moi les messages d'erreur si tu en as) :

procedure TForm1.eSelect(Sender: TObject);
var
   sNumMs  : string; // N° du mois sélectionné
   sSep    : string; // Séparateur pour le filtre
   sFiltre : string; // Filtre à appliquer à la table
begin
     // On récupère le n° du mois
     sNumMs := IntToStr(e.ItemIndex);
     // Création de la requête pour la composition du filtre
     With TQuery.Create(nil) do begin
          DatabaseName := '[Emplacement de ton fichier de base de donnée]';
          With SQL do begin
               // On prend toutes les dates qui ont le n° de mois recherché
               Add('Select distinct DT');
               Add('From [Nom de ta table]');
               Add('Where Extract(Month from DT) = '+ sNumMS);
          end;
          Open;
          // Premier filtre
          sSep    := '';
          sFiltre := '';
          While not eof do begin
                // Composition du filtre
                sFiltre :sFiltre + sSep +'(DT '+ QuotedStr(Fields[0].AsString) +')';
                // En cas de filtre multiple, on crée un séparateur pour les valeurs
                if sSep = ''
                   then sSep := ' Or ';
                Next;
          end;
          free;
     end;
     // Finalement, on applique le filtre
     With D1.DataSet do begin
          if not filtred
             then Filtred := True;
          Filter := sFiltre;
     end;
end;



Simon
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
18 mars 2013 à 12:55
Bonjour,

Les filtres ne s'appliquent que sur les champs de la table
(sauf ceux calculés..)
solution:
stocker l'information du mois dans un champ (très simple, avec un UPDATE)
et ensuite mettre en place le filtre.
ou utiliser directement une requête SQL.

cantador
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
18 mars 2013 à 14:38
Oui bonne idée, même si quand même une requête s'avèrera plus propre en fin de compte.

Petite remarque aussi : le mot Date est un "mot réservé" du langage SQL. Il vaut mieux éviter d'appeler ton champ "Date", préfère "Date_Enregistrement" ou un truc du genre...


Simon
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
18 mars 2013 à 17:14
une requête s'avèrera plus propre
oui, mais le demandeur n'en veut pas..

mais il finira quand même par s'en servir
tôt ou tard..

cantador
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
18 mars 2013 à 17:51
J'espère pour lui, moi, je ne peux plus m'en passer !!!

Simon
0
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 1
27 mars 2013 à 11:22
salut tlm,
je vois que tous; veulent que j'utilise le SQL, or je le réserve pour autre chose qui a un rapport avec ce tri car; j'explique:
- j'ai une table de date qui contiens toutes les dates des événements
- je ne peut pas savoir si tel ou tel date est enregistré car si je fait un simple tris, il se peut que le résultat ne soit pas satisfaisant.
- aussi j'ai besoin de faire une regroupement des événements par dates, par mois, et par an.
- Une fois le tri effectuer là; je peut utilisé le SQL.

j’espère que je me suis bien exprimer pour que vous m’aidaient.

merci pour vos efforts.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
27 mars 2013 à 12:25
- aussi j'ai besoin de faire une regroupement des événements par dates, par mois, et par an.


Peux-tu décrire le but de ces regroupements plus précisément ?

Une fois le tri effectuer là; je peut utilisé le SQL.


Je pense que c'est lié à ma première question, mais que veux tu faire avec le SQL ?

Simon
0
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 13
27 mars 2013 à 12:35
@AsNiPeR:

j'ai besoin de faire une regroupement des événements par dates, par mois, et par an.

Les écritures ne sont pas toujours aisées, c'est vrai, mais,
on peut réaliser absolument TOUTES LES OPERATIONS sur les données des tables.
[b]
on peut TOUT FAIRE en SQL !/b


et bien entendu avec un traitement des plus rapides possibles..

cantador
0
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 1
28 mars 2013 à 13:11
salut simon,
en repense a ta question :

- j'ai des produits qui entrent et sortent chaque jour, le but est de trouver les quantités entrées et/ou sorties par jour, par mois, par an
- j'ai aussi des mouvements de caisse (encaissement, acompte, charge, ect...)
- le SQL moi je l'utilise pour spécifier plus de détails une fois le champ temporelle détermine(source, destination, opérant, ect...)
0
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 1
28 mars 2013 à 18:30
Salut
Merci Simon et contador pour votre aide, je crois que je vient de trouver ce que je cherche; voila je balance mon code :

procedure TForm1.eSelect(Sender: TObject);
Var
NumMs,M,dt,Filtre: String;
i: Integer;
begin
NumMs := IntToStr(e.ItemIndex);
with D1.DataSet do
begin
Open();
Filtered := False;
If RecordCount > 0 then
begin
i:= 0;
First;
dt := fieldByName('Dt').AsString;
Filtre :'Dt'+QuotedStr('01/'+NumMs+'/'+FormatDateTime('yyyy',Date));// pour commencer la formule du filtre
Repeat
begin
M := NumMois(fieldByName('Dt').AsString);
If StrToInt(NumMs) = StrToInt(M) then
begin
dt := fieldByName('Dt').AsString;
Filtre :Filtre + ' or Dt' + QuotedStr(dt);
end;
Next;
i := i +1;
end;
Until i = RecordCount;
end;
Filter := Filtre;
Filtered := True;
end;
end;
sa marche pour mois; si c'est possible de l’optimisé "le code bien sure"
et un très grand merci a vous

@+

NB: "M" est le num du mois extrais de la date enregistrée.
"e" est le ComboBox.
"D1" est une DataSource.
"NumMs" est le ItemIndex d'un TComboBox qui contient les mois de janv. à Dec. avec comme première valeur soit index "0" 'Choix du mois'.
0
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 1
28 mars 2013 à 18:33
désole, cantador pour l'erreur de frappe.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 mars 2013 à 08:28
NB : J'insiste, mais il va de soit qu'il serait quand même nettement plus efficace d'afficher directement une requête...
Ce n'est pas la solution que je viens de te proposer que je choisirais. Je ne comprends pas bien pourquoi tu t'entête à utiliser un dataset. Tu peux parfaitement utiliser un premier query pour l'affichage, et faire d'autres requêtes sur les champs de ce query pour retrouver des infos (et tu pourrais même faire des requêtes sur ces infos pour en avoir d'autres... ).
Enfin, c'est toi qui voit, mais l'optimisation que je te propose n'optimise que le code que tu as posté, pas le fonctionnement global de ton application... C'est dommage, parce que comme le dit Cantador, on peut vraiment tout faire avec du SQL... (enfin sur paradox, un peu moins... )


Simon
0
cs_AsNiPeR Messages postés 14 Date d'inscription mardi 31 janvier 2006 Statut Membre Dernière intervention 19 mai 2015 1
29 mars 2013 à 16:06
Salut simon
j’ai tester ton code il marche très bien et aucun message n'est apparue.

Mon chois de ne pas trop utilisé le SQl viens du faite que c'est une solution mono-poste, donc je travail directe sur les tables, pas besoin de SQL pour le moment sauf pour les états de sorties qui demandent des combinaisons de données sur plusieurs tables

@+
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 mars 2013 à 16:33
Content que ça te plaise !

Au risque d'être lourd... même si on est en config monoposte et que les ressources matérielles ne sont pas une contrainte, il peut arriver qu'un client te demande une version réseau de ton appli (ton client embauche une autre personne suite à une augmentation d'activité grâce à l'efficacité de ton logiciel ). Du coup, je te dis pas le boulot que tu auras à faire si tu n'as pas essayé d'optimiser ton soft dès le départ (c'est du vécu), et comment ce sera easy si tu t'en es occupé...
Enfin, bon, tu vois...

Simon
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
29 mars 2013 à 16:34
comment ce sera easy si tu t'en es occupé...


C'est du vécu aussi... mais quand j'étais plus grand...

Simon
0
Rejoignez-nous