Cláusula Where en bucle gráficoTengo un código que está diseñado para crear un informe basado en algún filtrado.Se alimentará con dos listas, la primera determinará qué materiales se extraen (en este ejemplo, será Gender_List), la segunda determinará qué propiedades se graficarán (en este ejemplo, será Property_List).La idea es que habrá un ciclo a través de cada género que creará una matriz de gráficos para todas las propiedades seleccionadas.También hay un gráfico general sin filtrar en la parte superior del informe.
Hay dos maneras de hacer esto.
El primero con cláusulas where intrínsecas en los gráficos.La mayoría de las veces he logrado que esto funcione, excepto que la cláusula Where termina ocupando una posición en el cuadro de alineación. Además, por alguna razón, en la maqueta que tengo a continuación, tengo un error que no entiendo del todo (mi versión completa no tiene ese error, pero aún tendría curiosidad si alguien sabe cómo solucionarlo).Aquí está el código de la maqueta.
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>
El segundo es con cuadros de contexto de filtro de datos que envuelven cada iteración del bucle de gráficos.Ese que no he podido ponerme a trabajar.Si puedo hacer que funcione la versión de where anterior, no creo que tenga que preocuparme demasiado por el cuadro/envoltura de contexto del filtro de datos.
De todos modos, ¿alguna idea sobre cómo limpiar el código anterior para eliminar esas cláusulas Where del cuadro de alineación?
Investigación del Consumidor y del MercadoOrganización de contenidoExploración y visualización de datosDiseño de experimentosLa personalización en masaRe: Cláusula Where en bucle gráficoEn caso de que alguien supere esto en el futuro, pude resolver el problema con la versión del filtro de datos.El problema era que el cuadro de contexto del filtro de datos necesitaba tener un solo objeto que estaba envolviendo.En la forma en que lo había presentado arriba, el cuadro envolvía tanto el cuadro de alineación como el filtro de datos.Esto resultó en el comportamiento extraño.Al envolver el LineupBox y el filtro de datos en el mismo objeto (un HListBox) que parecía solucionar el problema:
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: Cláusula Where en bucle gráficoGenial gracias.Intenté ponerlo en el script y no funcionó, pero parece que estaba en la ubicación incorrecta.También estoy notando algunos problemas de rendimiento significativos con el ajuste del filtro de datos local, así que creo que esta será la ruta que queremos seguir.
Gracias a todos por la ayuda en este caso.
Re: Cláusula Where en bucle gráficosi agregas @jthi código al código que proporcioné, te dará lo que quieres

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: Cláusula Where en bucle gráficoTodavía parece que no puedo descifrar cómo deshacerse de esa cláusula "dónde" en el cuadro de alineación.Lo cambié a un objeto generador de gráficos para ver si las preferencias de encabezado/pie de página lo eliminarían, pero no pareció hacerlo.
Intenté volver a escribir esto como un filtro de datos que envuelve el LB.Eso tiene algunas ventajas de todos modos, ya que permite cierta personalización por parte del usuario.Este parece Sin embargo, para que funcione, como puede ver, se ve un poco torcido porque el filtro de datos está increíblemente colapsado.
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>
Intenté cargar el filtro de datos en la parte superior del LB, pero no pareció funcionar.
¿Alguna idea sobre cómo limpiar esto?Esto técnicamente funciona, pero parece un poco basura.
Re: Cláusula Where en bucle gráficoQué tal esto:
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: Cláusula Where en bucle gráficoPuede eliminarlos, por ejemplo, con esto al final del script:
whereTb = w << XPath("//TextBox[contains(text(), 'Where(:sex == Gender_List[j])')]");
whereTb << Delete;Pero en este caso, supongo que no ayudará porque la alineación parece esos cuadros de texto donde los elementos y la ventana se desordenan antes de eliminarlos.
Re: Cláusula Where en bucle gráficoDefinitivamente una mejora importante, pero parece que todavía tengo la cláusula colgante "where( :Sex == Gender_List[j]" que aparece en el cuadro de alineación. ¿Alguna idea de cómo matar eso?Re: Cláusula Where en bucle gráficoReelaboré un poco tu guión.Tenía algunos apéndices recursivos en su código que no funcionaban.Mira si esto te da lo que quieres
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] ) )
)
)
);
);