Clause Where dans la boucle graphiqueJ'ai du code conçu pour créer un rapport basé sur un filtrage.Il sera alimenté par deux listes, la première déterminera quels matériaux seront extraits (dans cet exemple, ce sera Gender_List), la seconde déterminant quelles propriétés seront représentées graphiquement (dans cet exemple, ce sera Property_List).L'idée étant qu'il y aura une boucle à travers chaque sexe qui créera une matrice de graphiques pour toutes les propriétés sélectionnées.Il existe également un graphique global non filtré en haut du rapport
Il y a deux façons de faire ça.
Le premier avec des clauses where intrinsèques dans les graphes.J'ai surtout réussi à faire fonctionner cela, sauf que la clause Where finit par occuper une position dans la zone d'alignement. De plus, pour une raison quelconque, dans la maquette que j'ai ci-dessous, j'ai un bogue que je ne comprends pas entièrement (ma version complète n'a pas ce bogue, mais je serais toujours curieux si quelqu'un sait comment le corriger).Voici le code de la maquette
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M","F"};
age_list = {12,13,14,15};
Property_List = {"Age", "Height", "Weight"};
w= new window("test",
VLB = V List Box ("A",
dt<<DISTRIBUTION></DISTRIBUTION>
La seconde est avec des boîtes de contexte de filtre de données qui enveloppent chaque itération de la boucle de graphiques.Celui-là, je n'ai pas pu le faire travailler.Si je peux faire fonctionner la version where ci-dessus, je ne pense pas que je devrai trop m'inquiéter de la boîte/enveloppe du contexte du filtre de données.
Quoi qu'il en soit, avez-vous des idées sur la façon de nettoyer le code ci-dessus pour supprimer ces clauses Where de la boîte de dialogue ?
Études de consommation et de marchéOrganisation du contenuExploration et visualisation des donnéesConception d'expériencesPersonnalisation de masseRe : Clause Where dans une boucle graphiqueAu cas où quelqu'un passerait par là à l'avenir, j'ai pu résoudre le problème avec la version du filtre de données.Le problème était que la boîte de contexte du filtre de données devait avoir un seul objet qu'elle encapsulait.De la manière dont je l'avais présenté au-dessus de la boîte, enveloppait à la fois la boîte de programmation et le filtre de données.Cela a entraîné un comportement étrange.En enveloppant le LineupBox et le filtre Data dans le même objet (un HListBox) qui semblait résoudre le problème :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ),
dt << Graph Builder(Size( 534, 450 ),
Show Control Panel( 0 ),
Variables( X( :age ) ),
Elements( Histogram( X, Legend( 6 ) ) )
)
)
);
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
data filter context box(
HLB = HlistBox(
LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Graph Builder(
Size( 534, 450 ),
Show Control Panel(0 ),
Show Legend(0),
Variables( X(Column( Property_List[i] ) )),
Elements( Histogram( X, Legend( 6 ) ) ),
/*Where( :Sex == Gender_List[j] ) ),*/
SendToReport(
Dispatch(
{},
"Graph Builder",
OutlineBox,
{Set Title( Property_List[i] ), Image Export Display( Normal )}
)
)
),
)
),
dt<<DATA filter=""></DATA>Re : Clause Where dans une boucle graphiqueBien, merci.J'ai essayé de le mettre dans le script et je n'ai pas réussi à le faire fonctionner, mais il semble qu'il était au mauvais endroit.Je remarque également des problèmes de performances importants avec l'encapsulation du filtre de données local, donc je pense que ce sera la voie que nous voulons emprunter.
Merci à tous pour l'aide sur celui-ci.
Re : Clause Where dans une boucle graphiqueSi vous ajoutez @jthi code au code que j'ai fourni, il vous donnera ce que vous voulez

Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ), dt << Distribution( Nominal Distribution( Column( :age ) ) ) ) );
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
LB = LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Distribution( Continuous Distribution( Column( Property_List[i] ) ), where( :Sex == Gender_List[j] ) )
)
)
);
);
whereTb = w << XPath("//TextBox[contains(text(), 'Where(:sex == Gender_List[j])')]");
whereTb << Delete;Re : Clause Where dans une boucle graphiqueJe n'arrive toujours pas à comprendre comment se débarrasser de cette clause "où" dans la boîte de programmation.Je l'ai basculé sur un objet de création de graphique pour voir si les préférences d'en-tête/pied de page le supprimeraient, mais je n'ai pas semblé le faire.
J'ai essayé de réécrire ce filtre de données enveloppant le LB.Cela présente quand même certains avantages car cela permet une certaine personnalisation par l'utilisateur.Ce semble pour fonctionner, cependant, comme vous pouvez le voir, cela semble un peu bancal car le filtre de données est incroyablement effondré.
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ),
dt << Graph Builder(Size( 534, 450 ),
Show Control Panel( 0 ),
Variables( X( :age ) ),
Elements( Histogram( X, Legend( 6 ) ) )
)
)
);
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
data filter context box(
LB = LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Graph Builder(
Size( 534, 450 ),
Show Control Panel(0 ),
Variables( X(Column( Property_List[i] ) )),
Elements( Histogram( X, Legend( 6 ) ) ),
/*Where( :Sex == Gender_List[j] ) ),*/
),
)
),
dt<<DATA filter=""></DATA>
J'ai essayé de charger le filtre de données en haut du LB mais cela n'a pas semblé fonctionner.
Des idées sur la façon de nettoyer cela?Cela fonctionne techniquement mais semble un peu junky.
Re : Clause Where dans une boucle graphiqueQue dis-tu de ça:
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ), dt << Distribution( Nominal Distribution( Column( :age ) ) ) ) );
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
eval(substitute(
expr(dt << Distribution( Continuous Distribution( Column( _col_ ) ), where( :Sex == _select_) )),
expr(_col_),Property_List[i],
expr(_select_), Gender_List[j]
))
);
);
);
);Re : Clause Where dans une boucle graphiqueVous pouvez les supprimer par exemple avec ceci en fin de script :
whereTb = w << XPath("//TextBox[contains(text(), 'Where(:sex == Gender_List[j])')]");
whereTb << Delete;Mais dans ce cas, je suppose que cela n'aidera pas car Lineup semble ces zones de texte Where comme des éléments et la fenêtre est gâchée avant que vous ne les supprimiez.
Re : Clause Where dans une boucle graphiqueCertainement une amélioration majeure, mais il semble que j'ai toujours cette clause suspendue "where( :Sex == Gender_List[j]" qui apparaît dans la boîte de programmation. Une idée de comment tuer ça ?Re : Clause Where dans une boucle graphiqueJ'ai un peu retravaillé votre script.Vous aviez des ajouts récursifs dans votre code qui ne fonctionnaient pas.Voyez si cela vous donne ce que vous voulez
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
Gender_List = {"M", "F"};
age_list = {12, 13, 14, 15};
Property_List = {"Age", "Height", "Weight"};
w = New Window( "test", VLB = V List Box( Text Box( "A" ), dt << Distribution( Nominal Distribution( Column( :age ) ) ) ) );
For( j = 1, j <= N Items( Gender_List ), j++,
VLB << Append( Text Box( Gender_List[j] ) );
VLB << Append(
LB = LB = Lineup Box( N Col( 2 ), spacing( 10 ),
For( i = 1, i <= N Items( Property_List ), i++,
gb = dt << Distribution( Continuous Distribution( Column( Property_List[i] ) ), where( :Sex == Gender_List[j] ) )
)
)
);
);