Filtre et tables [Résolu]

cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 14 mars 2013 à 23:54 - Dernière réponse : sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention
- 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
Afficher la suite 

Votre réponse

18 réponses

sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 15 mars 2013 à 11:40
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 mars 2013 à 08:09
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de sp40
cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 15 mars 2013 à 22:00
0
Utile
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.
Commenter la réponse de cs_AsNiPeR
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 15 mars 2013 à 23:31
0
Utile
Dans ce cas, désolé mais je ne sais pas comment faire...


Simon
Commenter la réponse de sp40
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 18 mars 2013 à 12:55
0
Utile
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
Commenter la réponse de cs_cantador
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 18 mars 2013 à 14:38
0
Utile
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
Commenter la réponse de sp40
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 18 mars 2013 à 17:14
0
Utile
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
Commenter la réponse de cs_cantador
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 18 mars 2013 à 17:51
0
Utile
J'espère pour lui, moi, je ne peux plus m'en passer !!!

Simon
Commenter la réponse de sp40
cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 27 mars 2013 à 11:22
0
Utile
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.
Commenter la réponse de cs_AsNiPeR
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 27 mars 2013 à 12:25
0
Utile
- 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
Commenter la réponse de sp40
cs_cantador 4996 Messages postés dimanche 26 février 2006Date d'inscription 27 mars 2018 Dernière intervention - 27 mars 2013 à 12:35
0
Utile
@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
Commenter la réponse de cs_cantador
cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 28 mars 2013 à 13:11
0
Utile
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...)
Commenter la réponse de cs_AsNiPeR
cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 28 mars 2013 à 18:30
0
Utile
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'.
Commenter la réponse de cs_AsNiPeR
cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 28 mars 2013 à 18:33
0
Utile
désole, cantador pour l'erreur de frappe.
Commenter la réponse de cs_AsNiPeR
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 mars 2013 à 08:28
0
Utile
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
Commenter la réponse de sp40
cs_AsNiPeR 14 Messages postés mardi 31 janvier 2006Date d'inscription 19 mai 2015 Dernière intervention - 29 mars 2013 à 16:06
0
Utile
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

@+
Commenter la réponse de cs_AsNiPeR
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 mars 2013 à 16:33
0
Utile
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
Commenter la réponse de sp40
sp40 1293 Messages postés mardi 28 octobre 2003Date d'inscriptionContributeurStatut 3 juillet 2015 Dernière intervention - 29 mars 2013 à 16:34
0
Utile
comment ce sera easy si tu t'en es occupé...


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

Simon
Commenter la réponse de sp40

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.