Pb Set filter to et de grid !!! [Résolu]

cs_spoutnic_37 48 Messages postés mardi 7 novembre 2000Date d'inscription 20 septembre 2005 Dernière intervention - 23 juin 2005 à 08:45 - Dernière réponse : FredArmoni 154 Messages postés vendredi 2 mai 2003Date d'inscription 2 avril 2010 Dernière intervention
- 28 juin 2005 à 16:57
aloha,

voici mon code qui est placé dans la methode click d'un bouton:

****************************************************************************************
close table all
select 1
use clients
* selection du numero de client pour permetre de retrouver toutes les factures qui lui sont ratachées
LOCATE FOR societe= thisform.listcli.value
SCATTER FIELDS numero memvar


select 2
use interven
SET EXACT ON
SET FILTER TO interven.Numero = m.numero
go top


thisform.grid2.recordsource= "interven"

****************************************************************************************

mon probleme est que lorsque j'appuis sur le bouton, tout ce passe a peu pres comme il faut sauf si j'ai le malheur de cliquer dans le grid2. A ce moment la , il m'annonce une erreur , me disant qu'il ne trouve pas la variable numero alors qu'aucun code n'est mis deriere le grid2. Du coup la table perd son filtre et le grid2 affiche alors toute la table interven.

Y'aurait il quelque chose que j'aurais homis de faire, avec mon set filter to ou alors avec mon grid2 ?
Pourquoi suis je obligé de faire un go top pour que le filtre marche ?

Sinon , j'ai plusieurs fois essayé de faire une requete sql (select ... from ...where) et a chaque fois il y a une fenetre qui apparait pour me mettre le enregistrements selectionnés par la requete. C assez génant de la voir apparaitre !!!!
Afficher la suite 

Votre réponse

11 réponses

Meilleure réponse
michelatoutfox 834 Messages postés mardi 5 octobre 2004Date d'inscription 7 mai 2013 Dernière intervention - 23 juin 2005 à 11:57
3
Merci
Spoutnic,

admettons que tu gardes cette approche (je te conseille quand même de regarder du coté des indexs, et des relations, si tu ne te sens pas de créer un dbc avec des vues sur tes tables indépendantes).

1) mets un repère d'index structurel sur le champ societe (appellons le xsociete)
2) ouvre tes tables dans l'environnement de données, et donnes le controlsource de ton grid en création de formulaire (et non pas dans le click)
3) dans ton click, utilise la syntaxe suivante:
if indexseek(thisform.listcli.value,.t.,"clients","xsociete") && je me positionne sur le client, s'il existe
xnumero=societe.numero && je récupère son numéro
select interven
set filter to numero=xnumero && je prépare le filtre
go top && j'exécute le filtre en déplaçant le pointeur
if not eof ( ) && j'ai des enregistrements qui vont bien..
*!* je fais ce que j'ai à faire
endif
endif

regarde bien l'aide concernant l'étendue et la durée de vie des variables, tu auras ta réponse à ta question sur m.numero (qui n'est pas publique, donc qui n'existe pas en dehors de ton click) ; et quand tu fais un scatter name, tu ne crées pas un alias, mais un objet, attention à la confusion)

est-ce que tu peux donner les messages d'erreurs que tu obtiens (avec le numéro exact, et le message complet), c'est utile pour t'aider plus efficacement.

Merci michelatoutfox 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de michelatoutfox
Meilleure réponse
cs_spoutnic_37 48 Messages postés mardi 7 novembre 2000Date d'inscription 20 septembre 2005 Dernière intervention - 28 juin 2005 à 15:53
3
Merci
aloha !!!!

Voila g réussi a m'en tirer aevc ctte requete, du coup plus de set filter to .Vu que je suis encore moins bon en sql qu'en foxpro, ca pas ete simple, surtout que je n'ai rein trouver pour comparer deux heures et ainsi determiner le temps ecoulé entre ces deux heures.

date1=CTOd(substr(thisform.period.value,4,10)) && date de debut de periode
date2=CTOD(substr(thisform.period.value,18,10)) && date de fin de periode



select clients


if indexseek(thisform.listcli.value,.t.,"clients","societe") && je me positionne sur le client, s'il existe
public xnumero
xnumero=clients.numero && je récupère son numéro

&& tps_passe2 et tps_passe1sont de type dateheure, la somme des durées est placée dans le champ temps du cuseur test

select id_int,date_int,(alltrim(str(hour(tps_passe2)+ hour(tps_passe1)))+":"+;
alltrim(str(minute(tps_passe2)+ minute(tps_passe1)))+":"+;
alltrim(str(sec(tps_passe2)+ sec(tps_passe1))));
as temps,objet,total_h_t from interven ;
where numero=xnumero and (dtos(date_int);
between dtos(date1) and dtos(date2));
into cursor test

endif

thisform.grid2.recordsource= "test"

Merci cs_spoutnic_37 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 68 internautes ce mois-ci

Commenter la réponse de cs_spoutnic_37
cs_spoutnic_37 48 Messages postés mardi 7 novembre 2000Date d'inscription 20 septembre 2005 Dernière intervention - 23 juin 2005 à 09:27
0
Merci
re-aloha,

j'ai changé ma condition de SET FILTER TO et une autre erreur apparait lors du click sur le grid. Donc le pb doit venir du filtre.
Sinon est t'il possible de faire deux filtres sur la meme table ou de specifier un filtre qui aurait deux conditions?
Je pense sinon a utiliser un scan endscan ou je marquerais les enregistrements qui ne m'interesse pas avec un delete et ensuite faire un SET DELETE on pour ne pas les traiter dans mon grid2 . Est ce une bonne methode ?

Le probleme de filtrages multiples est deja venu a moi précedement et je l'ai contourné en faisant un COPY TO et en travaillant sur la nouvelle table (effacer les enregistrements inutiles). Mais le probleme c qu'il y a creation d'un fichier dbf, recopie des enregistrements, elimination des enregistrements, et affichage dans le grid, et je trouve que ca met du temps (clignotement du grid)du je pense à l'acces au disque dur.
La aussi est-ce une bonne methode ?

Merci de votre attention.
Commenter la réponse de cs_spoutnic_37
FredArmoni 154 Messages postés vendredi 2 mai 2003Date d'inscription 2 avril 2010 Dernière intervention - 23 juin 2005 à 10:32
0
Merci
As tu regardé du côté des vues paramètrées ou simplement des relations ?

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
Commenter la réponse de FredArmoni
michelatoutfox 834 Messages postés mardi 5 octobre 2004Date d'inscription 7 mai 2013 Dernière intervention - 23 juin 2005 à 10:41
0
Merci
bonjour Spoutnic,

quelques remarques avant de répondre exactement à tes questions, si tu permets..

pourquoi fermes-tu tes tables ouvertes dans ce click? et pourquoi celles dont tu as besoin ne sont-elles pas déjà ouvertes?
en général, les tables ou vues sont ouvertes au niveau du formulaire, en utilisant l'environnement de données, ou bien dans le load ou l'init du form (perso, je préconise l'environnement de données). tu es ainsi assuré qu'elles sont ouvertes quand tes objets sont créés, et que leur controlsource existe bien.

ta syntaxe "select1" puis "use clients" est incorrecte, même si elle ne te renvoie pas d'erreur.
USE CLIENTS IN 0 ALIAS CLIENTS ORDER SONORDRE AGAIN SHARED
USE INTERVEN IN 0 ALIAS INTERVEN ORDER SONORDRE AGIN SHARED
SELECT CLIENTS
... traitement....
SELECT INTERVEN
...traitement...
etc, etc...

concernant ta table clients, on peut supposer que tu as un repère d'index sur les champs les plus utilisés et déterminants. Donc, au lieu d'un locate for, tu pourrais uiliser un :
"if indexseek(thisform.listcli.value,"sonordre",.t.)"
c'est infiniment plus rapide, et tu dois toujours t'assurer du résultat de ta recherche (donc derrière un locate, tu mets toujours un if found(), sur un seek, tu mets un if !eof(), etc..)

pour ton grid, tu as 2 approches possibles : l'une qui utilise les relations (set relation... et set skip...) l'autre qui utilise une vue paramétrée pour le controlsource. et surtout pas le copy to !

tu regardes l'aide dans ces 2 directions, tu fais des essais avec les wizards (les assistants), et on reprend ensuite.
Commenter la réponse de michelatoutfox
cs_spoutnic_37 48 Messages postés mardi 7 novembre 2000Date d'inscription 20 septembre 2005 Dernière intervention - 23 juin 2005 à 10:48
0
Merci
Je ne comprend pas ta question ? (vues paramètrées ???)
J'utilise des tables independantes , si ca repond à ta question.

Le probleme viendrait apparement du m.numero. en effet je l'ai remplacé par un SCATTER FIELDS numero name ouou et maintenant c unn alias qui n'est pas trouvé, que se soit lorsque je click sur le grid2 ou alors lorsque je hide mon formulaire et le show apres.
A mon avis , la variable m.numero, ou l'alias ouou.numero, ne sont pas gardées en memoire, et du coups ca plante, mais je ne comprend pas pourquoi puisque elle sont normalement créées lorsque j'appuis sur le bouton. Elles n'ont occune utilité avant et rien ne les appellent.

ps: Ah oui j'oubliais de dire que je travail avec vfp 6 .
Commenter la réponse de cs_spoutnic_37
cs_spoutnic_37 48 Messages postés mardi 7 novembre 2000Date d'inscription 20 septembre 2005 Dernière intervention - 27 juin 2005 à 15:35
0
Merci
Aloha ,
j'ai suivi tes derniers conseils, Michel, en reprenant le code et en rectifiant juste quelques petites choses. J'avait encore une erreur qui apparaissait me disant qu'il ne trouvait pas la variable 'xnumero' alors j'ai tout simplement definit xnumero comme une variable public, et ainsi elle est gardée en mémoire.

......
public xnumero
xnumero=clients.numero && je récupère son numéro
.....

merci pour cette précieuse aide!!!

Pour mon autre pb, a savoir comment faire pour filtrer, j'ai commencé a voir avec une autre methode . j'ai une table clients, qui contient tous les champs le concernant, et qui contient entre autre les champs : societe,ctra_date, ctra_prix,ctra_01m,ctra_03m, ctra_06m,ctra_12m .
Les 4 dernier sont des champs logique qui determine si oui ou non le contrat est mensuel, trimestriel,.....annuel.
Je dois donc grace a un listbox determinant le mois, trouver tout les societes dont les contrats stipulent donc qu'elles doivent payer le mois indiqué par le listbox.
pourc e faire je fait la requete sql suivante :

SELECT societe,ctra_date,ctra_prix,ctra_01m,ctra_03m,ctra_06m,ctra_12m ;
FROM Clients WHERE ((month(ctra_date))=parmois) and (ctra_01m=.T.) or;
((month(ctra_date))=partrim) and (ctra_03m=.T.) or;
((month(ctra_date))=parsem) and (ctra_06m=.T.) or;
((month(ctra_date))=this.listindex) and (ctra_12m=.T.) into cursor CurseurGrid

le into cursor me permet de créer un fichier tmp mais il est en lecture seul. Or je voudrais un seul champs a la place qui indique semestiel,annuel, mensuel,trimestriel et calculer ce qu'il doivent payer

donc au final, je dois avoir la societe, le prix du contrat, le ytpe de contrat, la date du contrat, et se qu'il doivent payer dans mon grid.(grid a recordsourcetype = alias et recordsource CurseurGrid )

que me proposeriez vous?
Commenter la réponse de cs_spoutnic_37
michelatoutfox 834 Messages postés mardi 5 octobre 2004Date d'inscription 7 mai 2013 Dernière intervention - 27 juin 2005 à 16:51
0
Merci
Je referais une autre requete sur le curseur créé par la première, avec des champs calculés (des iif, probablement).

MAIS:
Je suis de très mauvais conseil sur les requetes SQL et les grids, alors attend un peu de voir si quelqu'un d'autre te répond avant de suivre ma proposition...

celà dit, ta solution pour la variable xnumero ne me plait pas: il faudrait vraiment savoir dans quelle méthode ou procédure tu la définis, et dans quelle méthode ou procédure ton erreur apparait. si c'est dans deux methode distinctes, alors, c'est normal que tu perdes sa visibilité, mais il vaudrait mieux la passer comme paramètre plutot que de la déclarer publique. Juste une piste, une idée que je te propose
Commenter la réponse de michelatoutfox
michelatoutfox 834 Messages postés mardi 5 octobre 2004Date d'inscription 7 mai 2013 Dernière intervention - 28 juin 2005 à 16:38
0
Merci
attention à la syntaxe de between:

between(valeur_à_tester, borne_inférieure, borne_supérieure)
Commenter la réponse de michelatoutfox
cs_spoutnic_37 48 Messages postés mardi 7 novembre 2000Date d'inscription 20 septembre 2005 Dernière intervention - 28 juin 2005 à 16:54
0
Merci
oui, ca marche , mais j'avais fait comme cela car j'avais vu un exemple dans la msdn pour une requete sql .

Merci encore, et maintenant je me dirige vers un serieux pb: un état. Je n'en ai jamais fait et je me demande comment faire pour recuperer les infos contenus dans mon grid2."test" etant un curseur, je ne peux pas le mettre dans l'environement de donnée. De plus, je ne sais pas comment integrer ma requete sql dans un etat, et avant tout est-ce possible ?

A c pas simple tout ca !!!
Commenter la réponse de cs_spoutnic_37
FredArmoni 154 Messages postés vendredi 2 mai 2003Date d'inscription 2 avril 2010 Dernière intervention - 28 juin 2005 à 16:57
0
Merci
Michel, le between SQL est un peu différent. en VFP on peut utiliser les deux syntaxes

[mailto:frederic.steczycki@mvps.org Fred]
membre actif d'AtoutFox
MS MVP VFP
Commenter la réponse de FredArmoni

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.