banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

#1 Tue 19 March 2013 11:35

martin.baussier
Participant actif
Lieu: Montpellier
Date d'inscription: 22 Sep 2007
Messages: 69

Une simple boucle ?

Bonjour,

Je cherche comment réaliser une boucle des plus simple :
J'ai une table A et une table B. Une fois positionné sur le premier enregistrement de la table A, je souhaiterais le comparer avec un TESTER a l'ensemble des enregistrements de la table B. Puis ainsi de suite pour les autres enregistrements de la table A...

Je viens de tenter de créer une liste dans chaque enregistrent de A (sur une jointure bidon avec FeatureMerger) et une boucle contenant:
=>un LISTEXTRACTOR, basé sur une valeur i qui s'incrémente jusqu'à ce que le stest soit bon
=>un TESTER, qui compare une valeur de A avec B (si test=ok on sort de la boucle sinon on incrémente i)
=>un EXPRESSIONEVALUATOR (pour incrémenter i)
Mais le traitement est beaucoup trop lourd, non optimisé et compliqué !

Peut être suis je obligé de réaliser ce projet en passant par un script TCL ?

Mes chers amis auriez vous une idée à me proposer qui révolutionnerait mon projet ???

Merci d'avance aux âmes qui voudront bien m’apporter pierres à mon édifice.


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Martin Baussier
Institut national de l'origine et de la qualité (INAO)
Chargé de mission géomatique (Service Délimitation - BDDC)

Hors ligne

 

#2 Tue 19 March 2013 12:04

pyjoubert
Participant assidu
Lieu: Lyon
Date d'inscription: 21 Mar 2006
Messages: 347

Re: Une simple boucle ?

Bonjour,

Réponse en live (sans trop réfléchir)

-Essayer de faire une liste avec les élement de B

-Ensuite de faire un LISTEXPLODER dans la branche des A

Hors ligne

 

#3 Tue 19 March 2013 22:56

lefred
Participant occasionnel
Lieu: Sophia Antipolis
Date d'inscription: 3 Jul 2008
Messages: 42

Re: Une simple boucle ?

Bonjour,

Tenter d'appliquer dans FME un algorithme à base de boucle n'est effectivement pas simple, et aboutit souvent à un traitement peu efficace.

En fait, si vos tables proviennent d'une base de données, il serait surement préférable dans votre cas d'utiliser un transformer SQLEXECUTOR avec une requête "SELECT ... FROM ... WHERE ..." directement sur les tables d'origine, ou avec un transformer JOINER si seule l'une des tables provient d'une base de données.

Si aucune des 2 tables ne provient d'une base de données, il me semble que le transformer INLINEQUERIER devrait être bien adapté.

Sinon (et j'arrête là :-)), il devrait être possible de bidouiller directement un transformer FEATUREMERGER avec un attribut de jointure de valeur constante sur toutes les features en spécifiant "process duplicate supplier" à True (ce qui devrait créer toutes les combinaisons de features de A et B) puis de sélectionner les bonnes via un tester. Attention, cette dernière solution, pour le moins rustique, risque de donner des performances catastrophiques si le nombre de features dans les tables A et B est élevé.

Courage ! :-)
Frederic


--
Frédéric Eichelbrenner
Ellipso Facto - Sophia Antipolis

Hors ligne

 

#4 Wed 20 March 2013 09:50

lefred
Participant occasionnel
Lieu: Sophia Antipolis
Date d'inscription: 3 Jul 2008
Messages: 42

Re: Une simple boucle ?

Bonjour,

Le transformer INLINEQUERIER n'étant pas d'un abord très intuitif, je me suis dit qu'un petit exemple serait plus parlant.
Je joins un ZIP contenant deux dataset excel en entrée (list-date devant être comparé à test-date), le workbench et un fichier excel de sortie.
Ça devrait être assez simple à adapter à votre contexte.

Cordialement,
Frédéric


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

--
Frédéric Eichelbrenner
Ellipso Facto - Sophia Antipolis

Hors ligne

 

#5 Wed 20 March 2013 11:24

martin.baussier
Participant actif
Lieu: Montpellier
Date d'inscription: 22 Sep 2007
Messages: 69

Re: Une simple boucle ?

Merci pour ces infos Frédéric. Je vais regarder cela ce week-end et je tiendrais informer du résultat.


Martin Baussier
Institut national de l'origine et de la qualité (INAO)
Chargé de mission géomatique (Service Délimitation - BDDC)

Hors ligne

 

#6 Wed 20 March 2013 14:19

cbredel
Participant actif
Lieu: Agape Lorraine Nord
Date d'inscription: 20 Feb 2006
Messages: 99
Site web

Re: Une simple boucle ?

Sinon, il y a aussi l'option de créer un transformer personnalisé qui, je pense, peut effectuer un traitement par ligne en entrée.

Par ailleurs au sein de transformer personnalisé, il y a la possibilité de boucler le transformer sur lui-même.

Cordialement

Hors ligne

 

#7 Wed 27 March 2013 09:22

martin.baussier
Participant actif
Lieu: Montpellier
Date d'inscription: 22 Sep 2007
Messages: 69

Re: Une simple boucle ?

La solution qui m'a été proposée par lefred est une merveille !  Je la recommande vivement, je n'ai pas eu à utiliser ce transformer auparavant (INLINEQUERIER), et je découvre alors un outil très puissant qui permet du requetage SQL sur n'importe quel type d'entrée.
Pour vous donner une idée mon histoire de boucle fonctionnait correctement mais le temps de traitement était d'une bonne douzaine d'heure... avec les conseils de Fred je suis passé à un petit quart d'heure de traitement pour arriver au même résultat.

Merci encore et bonne journée


Martin Baussier
Institut national de l'origine et de la qualité (INAO)
Chargé de mission géomatique (Service Délimitation - BDDC)

Hors ligne

 

#8 Wed 27 March 2013 21:52

lefred
Participant occasionnel
Lieu: Sophia Antipolis
Date d'inscription: 3 Jul 2008
Messages: 42

Re: Une simple boucle ?

Bonsoir,

Content de constater que les quelques minutes que j'ai consacrées à proposer une solution ont été utiles...
Merci et à charge de revanche :-)

Frederic


--
Frédéric Eichelbrenner
Ellipso Facto - Sophia Antipolis

Hors ligne

 

Pied de page des forums

Powered by FluxBB