Deux colonnes datées differement qui decapotent...

Résolu
Leader2000 Messages postés 184 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 28 août 2015 - 22 août 2012 à 16:51
cs_cantador Messages postés 4720 Date d'inscription dimanche 26 février 2006 Statut Modérateur Dernière intervention 31 juillet 2021 - 25 août 2012 à 17:25
Bonjour!

Mes codes expliquent un filtrage intervalé de dates dans une et une seule colonne.

procedure TData_Research_Process.BitBtn1Click(Sender: TObject);
var F,D:string;
begin
D:=datetostr(dateActivity_From_TS_QS.Date);
F:=datetostr(dateActivity_To_TS_QS.Date) ;
qryTS_QS.filter:='Date_activity>='''+D+'''and Date_activity<='''+F+'''';
qryTS_QS.filtered:=True;

Quand je differencie de dates en faisant ceci par exemple. Pas de filtrage!

procedure TData_Research_Process.BitBtn1Click(Sender: TObject);
var F,D:string;
begin
D:=datetostr(dateActivity_From_TS_QS.Date);
F:=datetostr(dateActivity_To_TS_QS.Date) ;
qryTS_QS.filter:='Date_activity>='''+D+'''and Date_contract<='''+F+'''';
qryTS_QS.filtered:=True;


Developper est une dimension pour moi.
Leader2000

16 réponses

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
24 août 2012 à 17:15
Soudain, une énorme fatigue m'envahit...

Simon
3
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
22 août 2012 à 17:54
Bonjour,

Le problème vient sûrement de tes dates sur lesquelles tu veux filtrer qui doivent être au format anglais pour que le filtre fonctionne. Au lieu d'un DateToStr(), essaie avec : D:=FormatDateTime('mm/dd/yy', dateActivity_From_TS_QS.Date);
F:=FormatDateTime('mm/dd/yy', dateActivity_To_TS_QS.Date);

Simon
0
Leader2000 Messages postés 184 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 28 août 2015
23 août 2012 à 10:35
Merci simonpelloquin,

Mais ne s'agit pas d'une seule colonne. Je parle de deux colonnes differentes.
Voilà pourquoi j'y ai mis deux modules de codes:
//ces codes marchent très bien. Mais la recherche se fait dans une seule colonne "Date_activity"

procedure TData_Research_Process.BitBtn1Click(Sender: TObject);
var F,D:string;
begin
D:=datetostr(dateActivity_From_TS_QS.Date);
F:=datetostr(dateActivity_To_TS_QS.Date) ;
qryTS_QS.filter:='Date_activity>='''+D+'''and Date_activity<='''+F+'''';
qryTS_QS.filtered:=True;

//mais les codes qui suivent ci-après, il s'agit de deux colonnes differentes "Date_activity" et "Date_contract"

procedure TData_Research_Process.BitBtn1Click(Sender: TObject);
var F,D:string;
begin
D:=datetostr(dateActivity_From_TS_QS.Date);
F:=datetostr(dateActivity_To_TS_QS.Date) ;
qryTS_QS.filter:='Date_activity>='''+D+'''and Date_contract/color<='''+F+'''';
qryTS_QS.filtered:=True;

Au final, comment faire pour qu'il fasse le filtrage de deux colonnes differentes ayant diverses dates. Et non d'une seule colonne. Voilà ma petite préoccupation.

Merci,

Developper est une dimension pour moi.
Leader2000
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
23 août 2012 à 10:37
Bonjour,

il y a effectivement peut-être un souci de format de date
mais il y aussi un problème de fond:
tu traites un intervalle en comparant du texte...

c'est dangereux..

il semble plus logique de travailler avec des TDateTime qui sont des
nombres

cantador
0

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
23 août 2012 à 10:42
dès l'instant où les deux conditions sont vraies (avec un AND)
le filtre intégrant deux critères sur deux champs doit fonctionner.

A noter que la propriété filter est équivalente à la clause
WHERE d'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
23 août 2012 à 10:51
Salut,

Que tu filtres sur la même colonne ou sur deux colonnes différentes, ce n'est pas le problème.
Fais un showmessage de ton ton filtre et tu comprendras sûrement mieux ce qu'il se passe...
D:=datetostr(dateActivity_From_TS_QS.Date);
F:=datetostr(dateActivity_To_TS_QS.Date) ;
qryTS_QS.filter:='Date_activity>='''+D+'''and Date_contract<='''+F+'''';
ShowMessage (qryTS_QS.filter);
qryTS_QS.filtered:=True;

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
23 août 2012 à 11:49
c'est vrai que dans un filtre il est difficile d'introduire une fonction..

si on prend par exemple le table "orders" du dossier Date de la démo de borland.

on peut faire :

procedure TForm1.Button22Click(Sender: TObject);
begin
  Query1.Close;
  Query1.Open;
  Query1.Filtered := false;
  Query1.Filter := 'SaleDate>=' + QuotedStr('05/06/1990') + 'and  ShipDate<=' + QuotedStr('05/08/1989');
  Query1.Filtered := true;
end;


ou

procedure TForm1.Button6Click(Sender: TObject);
begin
  with Query1.SQL do
  begin
    Clear;
    Query1.Close;
    Add('Select * from orders ');
    Add('Where (SaleDate >=:Deb) and (ShipDate <=:Fin) ');
    Add('Order by SaleDate, ShipDate ');
    Query1.ParamByName('Deb').AsDate := MCDEBUT.Date;
    Query1.ParamByName('Fin').AsDate := MCFIN.Date;
    Query1.Open;
  end;
end;


un petit souci avec le filtre dans la gestion des blancs (absence de données dans le champ)
mais l'avantage est qu'on peut le désactiver facilement avec (filtered := false)

pour la requête, il suffit de faire :
procedure TForm1.Button24Click(Sender: TObject);
begin
  with Query1.SQL do
  begin
    Clear;
    Query1.Close;
    Add('Select * from orders ');
    Query1.Open;
  end;
end;


Pour ma part, je préfère la seconde méthode permettant l'introduction
de paramètres.

cantador
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
23 août 2012 à 12:05
j'ai oublié d'introduire les parenthèses avec le filtre :

(A >=date1) and (B <=Date2)

procedure TForm1.Button22Click(Sender: TObject);
begin
  Query1.Close;
  Query1.Open;
  Query1.Filtered := false;
  Query1.Filter := '(' + 'SaleDate>=' + QuotedStr('05/06/1990') + ')'+ ' and (' + 'ShipDate<=' + QuotedStr('05/08/1989')+ ')';
  ShowMessage (Query1.filter);
  Query1.Filtered := true;
end;

mais toujours un petit souci avec les blancs qui pourraient être réglés
je pense en ajoutant :

((A>= date1) and (A <>'')) and ((B <= Date2) and (B <>''));




cantador
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
23 août 2012 à 12:13
Salut,
je deteste les filtres !
vive le SQL et les requetes parametres
sinon je suis d'accord avec les remarques pertinente de cantador !
Normalement le code devrait fonctionner pour 2 colonnes donc y a un hic...j'aurai peut-être d'autres questions,c'est quoi le type de base et le type format de colonnes?
@+
0
Leader2000 Messages postés 184 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 28 août 2015
23 août 2012 à 12:59
@Yanb

Il s'agit bien entendu d'uine base ms-Access et les deux colonnes sont de type: Date/Time.

Je vais quand même essayer les codes de simonpelloquin et de cantador. Et dire quelque chose dans les prochaines minutes qui suivent.

Merci,

Developper est une dimension pour moi.
Leader2000
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
24 août 2012 à 10:27
et avec ACCESS tout est différent des autres SGBD..
même le SQL n'est pas standard.

Microsoft oblige

cantador
0
Leader2000 Messages postés 184 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 28 août 2015
24 août 2012 à 13:10
Faudra t-il utiliser aussi le même procédé des codes ci-après pour une base Ms-Access???
Curieusement, j'utilise des composants comme TadoQuery pour ma base Access. Ca narche, mais pas comme il faut.

procedure TForm1.Button22Click(Sender: TObject);
begin
Query1.Close;
Query1.Open;
Query1.Filtered := false;
Query1.Filter := '(' + 'SaleDate>=' + QuotedStr('05/06/1990') + ')'+ ' and (' + 'ShipDate<=' + QuotedStr('05/08/1989')+ ')';
ShowMessage (Query1.filter);
Query1.Filtered := true;
end;


Developper est une dimension pour moi.
Leader2000
0
cs_yanb Messages postés 271 Date d'inscription lundi 27 octobre 2003 Statut Membre Dernière intervention 7 juillet 2022 14
24 août 2012 à 13:39
Salut,
à chaque fois,avec MSAccess il faut y laisser de la sueur...Microsoft oblige
Le truc c'est qu'il faut trouver le bon format avec MSAccess,ODBC,les composants,SQL,etc...
Pour les dates de souvenir y a :
Composants BDE + ODBC le format doit être {d 'yyyy-mm-dd'}
Composants ADO + ODBC le format doit être #yyyy-mm-dd#
Il y a aussi cette fonction
type
    ODBCDateTimeFormats = ( FormatDate, FormatHeure, FormatDateHeure);

//Fonction pour mettre date et heure au format sql
function DateTimeToODBCDatetime(DateTime: TDateTime; Format: ODBCDateTimeFormats):string;
begin
    case Format of
        FormatDate : Result := #123' d ' +QuotedStr(FormatDateTime('yyyy-mm-dd',DateTime))+'}';
        FormatHeure: Result := #123' t ' +QuotedStr(FormatDateTime('hh:nn:ss',DateTime))+'}';
        FormatDateHeure : Result := #123' ts '+QuotedStr(FormatDateTime('yyyy-mm-dd hh:nn:ss',DateTime))+'}';
    end;
end;

Bon courage
@+
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
24 août 2012 à 15:31
déjà tu peux tester à blanc en mettant simplement
le bon format en dur.
et si ça marche tu sauras comment faire..

Bill Gates est devenu milliardaire justement parce qu'il n'a pas voulu faire comme tout le monde..

cantador
0
Leader2000 Messages postés 184 Date d'inscription mercredi 24 mai 2006 Statut Membre Dernière intervention 28 août 2015
24 août 2012 à 15:46
Merci, mais je ne suis pas trop préoccupé du format.
Je parle plus du filtrage. Dès le début de mon sujet, je parlais du filtrage entre deux colonnes differentes (deux champs!)...
Comment faire le filtrage? Parce que dans une colonne le filtrage se fait sans problème. Maintenant, il s'agit d'un filtrage deux colonnes differentes d'une table Ms-Access.

Developper est une dimension pour moi.
Leader2000
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
25 août 2012 à 17:25
moi aussi
leader2000, faudrait peut-être faire un effort de lire
quelques docs..

car je ne sais pas si tu as bien observé mais les exemples que j'ai fournis concernent justement deux champs.


et d'ailleurs pourquoi 2 ?
on peut faire filtre sur n champs..

cantador
0
Rejoignez-nous