Page 1 sur 1

[Résolu] Filtrage résultats @dbLookup

MessagePublié: 04 Nov 2012 à 15:32
par camilleB
Bonjour,
j'ai créé une vue permettant de faire une recherche par clé:
Type | codeType | Nature |colonne composite masquée|

je récupère le résultat d'un @dbLookup de la forme:
libélléNatureA~option1 Détail LibélléA
libélléNateureA~option2 Détail LibélléA
libélléNatureA~option3 Détail LibélléA etc....

Je voudrais par la suite filtrer cette liste en fonction de la sélection du champ nature et récupérer uniquement les éléments correspondants dans une autre champ Détails nature.
Je sèche un peu en formula!
Je teste avec @keyword en ce moment, mais sans résultat.
Merci pour vos lumières.
cdt
camille

Re: Filtrage résultats @dbLookup

MessagePublié: 04 Nov 2012 à 18:21
par Michael DELIQUE
salut,

si je comprend bien tu veux faire une sorte de @dblookup sur le résultat d'un @dblookup ?

Re: Filtrage résultats @dbLookup

MessagePublié: 04 Nov 2012 à 19:17
par Smicky
Tu peux iterer sur les résultats de ton @DBLookup avec un @For

par ex

tmp := @DBLookup...
@If(@IsError(tmp) ; @Return(""); "");

@For(i:=1 ; i<=@Elements(tmp) ; i:=i+1 ;
@Do(..la tu testes , tu filtres... tmp[i]...)
)

Re: Filtrage résultats @dbLookup

MessagePublié: 04 Nov 2012 à 19:40
par roubech
Tu parles de 2 champs Type et Nature ?
Le 1er, Type, avec liste de choix
Le 2nd, Nature, avec liste de choix dépendant du 1er champ
Si c'est ça en général, pour ce genre de chose, on fait le 2ème DbLookup après que la valeur du 1er champ a été sélectionnée ...

Re: Filtrage résultats @dbLookup

MessagePublié: 05 Nov 2012 à 11:27
par camilleB
Salut roubech,
Oui c'est bien çà! La clé de lookup est bien le type! Elle renvoie bien toutes les lignes associées.
Après je récupère la nature par un @word.
En fait je e voulais pas créer une vue et un masque pour chaque recherche mais la vue à évoluée et je n'ai pas envie de tout casser! Je maintiens une vue et un masque!
Michael : oui dans l'idéal si on pouvait faire ce genre de filtre sur un liste!!!

cdt
camille
roubech a écrit:Tu parles de 2 champs Type et Nature ?
Le 1er, Type, avec liste de choix
Le 2nd, Nature, avec liste de choix dépendant du 1er champ
Si c'est ça en général, pour ce genre de chose, on fait le 2ème DbLookup après que la valeur du 1er champ a été sélectionnée ...

Re: Filtrage résultats @dbLookup

MessagePublié: 05 Nov 2012 à 12:07
par Michael DELIQUE
j'avais en tete la meme réponse que Smicky

Re: Filtrage résultats @dbLookup

MessagePublié: 05 Nov 2012 à 15:09
par camilleB
Michael DELIQUE a écrit:j'avais en tete la meme réponse que Smicky


Salut,
Smicky?
ok je vais tenter la boucle sur le résultat renvoyé par le 1er @dbLookup!
cdt
camille

Re: Filtrage résultats @dbLookup

MessagePublié: 05 Nov 2012 à 21:16
par roubech
tLkp := @DbColum() retourne une liste du genre
Type1#Nature1
Type1#Nature2
Type2#Nature3
Type2#Nature4
La liste de choix pour le champ Type : @Trim(@Unique(@Left(tLkp; "#")))
La liste de choix pour le champ Nature (à actualiser à chaque choix du Type : @Trim(@Right(tLkp; Type+"#"))

Mais je ne suis pas sur de bien voir ce que tu veux

Re: Filtrage résultats @dbLookup

MessagePublié: 05 Nov 2012 à 23:52
par camilleB
salut, fonctionne avec ce code:
Code : Tout sélectionner
source:="Notes":"noCache";
vue:="vwQualification";
cle:=type;
numcol:=4;
v:=@DbLookup(source;@DbName;vue;cle;numcol;[FailSilent]);
@If(@IsError(v);"Aucune données trouvées";v);
valeurs:=@If(@IsError(v);@Return(@Text(v));@Unique(@Sort(v)));
nature:=@Word(valeurs;"~";1);
@For(n:=1;n<@Elements(valeurs);n:=n+1;@Do(
@If(@Word(valeurs[n];"~";1)=natureselect;valtmp:=valtmp:@Word(valeurs[n];"~";2);"")));
@Trim(@Unique(nature)); 'on retourne ici la nature dans le champ nature
valtmp:=@Trim(valtmp); 'je supprime les valeurs à blancs
FIELD detailnaturetmp:=valtmp; 'j'alimente ici un item avec les valeurs triés


Ensuite le champ Detailnature affiche le contenu de l'item par formule!
C'était bien la bonne piste Roubech!
En fonction du Type sélectionné j'obtiens la nature. Puis en fonction de la nature j'obtiens les détails associés!
D'habitude je fais ce genre de chose avec une vue pour le type (dbcolumn) et la nature (dblookup clé = type sélectionné) puis une vue pour la recherche Nature - details (dblookup clé= nature sélectionnée) et autant de masque pour la création des docs...
Peut être qu'on peut encore optimisé ce code?

cdt
camille

Re: Filtrage résultats @dbLookup

MessagePublié: 06 Nov 2012 à 20:28
par roubech
Si tu passes [FailSilent] en argument de ton @DbLookup, le test @IsError(v) ne sert à rien, car il est fait dans le lookup ...
Code : Tout sélectionner
v:=@DbLookup(source;@DbName;vue;cle;numcol;[FailSilent]);
@If(@IsError(v);"Aucune données trouvées";v);
valeurs:=@If(@IsError(v);@Return(@Text(v));@Unique(@Sort(v)));

doit pouvoir s'écrire plus simplement
Code : Tout sélectionner
v:=@DbLookup(source;@DbName;vue;cle;numcol;[FailSilent]);
valeurs:=@Unique(@Sort(v)));


Tu déclares une variable locale "nature",
tu ne t'en sert pas dans la boucle @For
et après tu fais une opération dessus mais tu ne récupères pas le résultat de l'opération
Code : Tout sélectionner
nature:=@Word(valeurs;"~";1);
...
@Trim(@Unique(nature)); 'on retourne ici la nature dans le champ nature

Si tu veux modifier le champ nature, il faut un
Code : Tout sélectionner
FIELD Nature := @Trim(@Unique(@Left(valeurs; "~")));


J'ai toujours fait sans @For ... mais il me semble que tu peux le remplacer par
Code : Tout sélectionner
@Trim(@Right(valeurs; natureselect+"~"))

sauf que je ne vois pas où est initialisée la variable natureselect, donc je suppose que c'est un champ

et sinon, tu le mets où ce code ?

Re: Filtrage résultats @dbLookup

MessagePublié: 08 Nov 2012 à 20:49
par camilleB
Salut,
le code est dans le champ NatureSelect - via Formule
Je vais suivre ton conseil et supprimé ce qui est en trop!
Pas facile quand on n'abuse pas des formules... :?
Merci
cdt
camille