Clausola Where nel ciclo del graficoHo del codice progettato per creare un report basato su alcuni filtri.Verranno alimentati due elenchi, il primo determinerà quali materiali verranno estratti (in questo esempio sarà Gender_List), il secondo determinerà quali proprietà verranno rappresentate graficamente (in questo esempio sarà Property_List).L'idea è che ci sarà un ciclo attraverso ogni genere che creerà una matrice di grafici per tutte le proprietà selezionate.Nella parte superiore del report è presente anche un grafico globale e non filtrato
Ci sono due modi per farlo.
Il primo con clausole where intrinseche nei grafici.Per lo più sono riuscito a farlo funzionare, tranne per il fatto che la clausola Where finisce per prendere una posizione nella casella di formazione. Anche per qualche motivo nel mockup che ho di seguito ho un bug che non capisco completamente (la mia versione completa non ha quel bug, ma sarei comunque curioso se qualcuno sapesse come risolverlo).Ecco il codice mockup
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>
Il secondo è con le caselle di contesto del filtro dei dati che avvolgono ogni iterazione del ciclo di grafici.Quello non sono riuscito a metterlo al lavoro.Se riesco a far funzionare la versione di cui sopra, non penso che dovrò preoccuparmi troppo della casella / wrap del contesto del filtro dei dati.
Ad ogni modo, qualche idea su come ripulire il codice sopra per rimuovere quelle clausole Where dalla casella di formazione?
ScriptingRi: clausola Where nel ciclo del graficoHo rielaborato un po 'la tua sceneggiatura.Avevi alcune aggiunte ricorsive nel tuo codice che non funzionavano.Vedi se questo ti dà quello che vuoi
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] ) )
)
)
);
);Ri: clausola Where nel ciclo del graficoSicuramente un miglioramento importante, ma sembra che abbia ancora quella clausola "where (: Sex == Gender_List [j]" in sospeso nella casella della formazione. Qualche idea su come ucciderlo?Ri: clausola Where nel ciclo del graficoPuoi rimuoverli ad esempio con questo alla fine dello script:
whereTb = w << XPath("//TextBox[contains(text(), 'Where(:sex == Gender_List[j])')]");
whereTb << Delete;Ma in questo caso immagino che non sarà d'aiuto perché Lineup sembra quelle caselle di testo Where come elementi e la finestra viene incasinata prima di eliminarli.
Ri: clausola Where nel ciclo del graficoCosa ne pensi di questo:
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]
))
);
);
);
);Ri: clausola Where nel ciclo del graficoNon riesco ancora a capire come sbarazzarsi di quella clausola "dove" nella casella di formazione.L'ho passato a un oggetto generatore di grafici per vedere se le preferenze di intestazione / piè di pagina lo avrebbero rimosso, ma non sembrava farlo.
Ho provato a riscrivere questo un filtro dati che avvolge il LB.Ciò ha comunque alcuni vantaggi in quanto consente alcune personalizzazioni da parte dell'utente.Questo sembra per funzionare, tuttavia, come puoi vedere sembra un po 'traballante perché il filtro dati è incredibilmente compresso.
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>
Ho provato a caricare il filtro dati nella parte superiore di LB ma non sembra funzionare.
Qualche idea su come ripulirlo?Funziona tecnicamente ma sembra un po 'tossico.
Ri: clausola Where nel ciclo del graficoSe aggiungi @jthi codice al codice che ho fornito, ti darà quello che vuoi

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;