Aplicación con tabla de datos múltiples y no creará filtros de datos locales correctamenteHola a todos, estoy tratando de crear una aplicación que haga referencia a varias tablas de datos, y dentro de esa aplicación hay filtros de datos que se aplican a los gráficos de cada tabla de datos. Cuando inserto el filtro de datos local, las opciones de columna son correctas. Sin embargo, cuando ejecuto la aplicación, todos los filtros de datos locales harán referencia a la última tabla de datos que tuve abierta. Ambos dicen que están haciendo referencia a la tabla de datos correcta en el generador de aplicaciones, pero esto de alguna manera cambia durante el inicio de la aplicación.
Por ejemplo, usando dos conjuntos de datos de muestra:
JMP App(
Set Name( "Application" ),
Set Description(
"An empty workspace for creating custom applications with one or more windows and scripts"
),
Auto Launch( 1 ),
Snap To Grid( 1 ),
Show Grid( 1 ),
Show Properties( 1 ),
Show Sources( 1 ),
Group By Category( 1 ),
Dashboard Mode( 0 ),
Parameters,
Tables(
DataTable1 = GuiTable(
Set Path( "$SAMPLE_DATA/Body Fat.jmp" ),
Set Label( "Body Fat" ),
Set Location( "Full Path" ),
Set Invisible( 0 )
),
DataTable2 = GuiTable(
Set Path( "$SAMPLE_DATA/Body Measurements.jmp" ),
Set Label( "Body Measurements" ),
Set Location( "Full Path" ),
Set Invisible( 0 )
)
),
Script(JSL Quote(// This script is executed when the application is run.
// Named objects have been created for the application modules
// (for example, "Module1") and the pre-defined object
// "thisApplication" refers to the application object itself.
// Variables and functions declared here are scoped to the
// Application namespace.
) ),
Allocate(
Module1 = Plan(
PreAllocate,
Script(JSL Quote(// This script is executed when a new module instance is
// created. The pre-defined object "thisModuleInstance" refers
// to the instance object, but other objects such as boxes and
// scripts have not yet been created. Variables declared here are
// scoped to the ModuleInstance namespace.
// This special function will receive parameters passed to CreateInstance()
OnModuleLoad({},
);
thisModuleInstance << Create Objects;
// After this point your module instance objects have been created
// and can be referred to by name (for example, "Button1").
) ),
Allocate(
List1 = V List Box();
Splitter1 = H Splitter Box();
DataFilter1 = DataTable1 << Data Filter( Local );
Report3 = Platform(
DataTable1,
Bivariate(
Y( :Name( "Height (inches)" ) ),
X( :Name( "Weight (lbs)" ) )
)
);
Splitter2 = H Splitter Box();
DataFilter2 = DataTable2 << Data Filter( Local );
Report2 = Platform(
DataTable2,
Bivariate( Y( :Head ), X( :Mass ) )
);
),
Organize(
Reparent( Splitter2( Report2 ) );
Reparent( Splitter2( DataFilter2 ) );
Reparent( List1( Splitter2 ) );
Reparent( Splitter1( Report3 ) );
Reparent( Splitter1( DataFilter1 ) );
Reparent( List1( Splitter1 ) );
Relocate( List1( 160, 160 ) );
),
Initialize(
List1 << Background Color( 2147483647 );
List1 << Border( {Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )} );
List1 << Enabled( 1 );
List1 << Horizontal Alignment( "Default" );
List1 << Margin( {Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )} );
List1 << Padding( {Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )} );
List1 << Text Color( 2147483647 );
List1 << Vertical Alignment( "Default" );
List1 << Visibility( "Visible" );
List1 << set horizontal( 0 );
Splitter1 << Background Color( 2147483647 );
Splitter1 << Border(
{Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )}
);
Splitter1 << Enabled( 1 );
Splitter1 << Horizontal Alignment( "Default" );
Splitter1 << Margin(
{Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )}
);
Splitter1 << Padding(
{Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )}
);
Splitter1 << Text Color( 2147483647 );
Splitter1 << Vertical Alignment( "Default" );
Splitter1 << Visibility( "Visible" );
Splitter1 << Dockable( 0 );
Splitter1 << Set Width( 835 );
Splitter1 << Set Height( 497 );
Splitter1 << Set Sizes( {0.5, 0.5} );
Splitter1 << set horizontal( 1 );
Splitter1 << Set Min Size( 835, 497 );
Splitter1 << Set Max Size( 835, 497 );
Splitter1 << Set Auto Stretching( 1, 1 );
Splitter2 << Background Color( 2147483647 );
Splitter2 << Border(
{Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )}
);
Splitter2 << Enabled( 1 );
Splitter2 << Horizontal Alignment( "Default" );
Splitter2 << Margin(
{Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )}
);
Splitter2 << Padding(
{Left( 0 ), Top( 0 ), Right( 0 ), Bottom( 0 )}
);
Splitter2 << Text Color( 2147483647 );
Splitter2 << Vertical Alignment( "Default" );
Splitter2 << Visibility( "Visible" );
Splitter2 << Dockable( 0 );
Splitter2 << Set Width( 648 );
Splitter2 << Set Height( 338 );
Splitter2 << Set Sizes( {0.5, 0.5} );
Splitter2 << set horizontal( 1 );
Splitter2 << Set Min Size( 648, 338 );
Splitter2 << Set Max Size( 648, 338 );
Splitter2 << Set Auto Stretching( 1, 1 );
)
)
),
Initialize(
Module1 << Auto Launch( 1 );
Module1 << Set Module Type( "Report" );
Module1 << Set Window Title( "^TABLENAME - ^APPNAME" );
Module1 << Set Min Size( 0, 0 );
Module1 << Set Max Size( 30000, 30000 );
Module1 << Set Auto Stretching( ., . );
)
) << EditRe: Aplicación con tabla de datos múltiples y no creará filtros de datos locales correctamentePuedo confirmar que este problema se solucionará con JMP 15.2 y posteriores. Múltiples filtros de datos locales en una aplicación mantendrán su conexión con la tabla de datos adecuada.
Re: Aplicación con tabla de datos múltiples y no creará filtros de datos locales correctamente¡¡Esto funcionó!! ¡Muchas gracias! Estaba en un callejón sin salida para encontrar una solución alternativa, principalmente porque pensé que ya no podía ver el script que estaba creando la aplicación. Cuando mi aplicación se hizo lo suficientemente grande (más de 60 plataformas con más de 28 filtros de datos locales y los elementos de visualización para contenerlos a todos), la opción "guardar secuencia de comandos" parecía estar dándome solo la parte de la secuencia de comandos personalizada de mi aplicación. Resulta que solo estaba poniendo toda la función Asignar en una sola línea. Cuando presioné el script de reformateo, reveló cientos de líneas adicionales. Esto no es necesariamente un error, supongo, pero pensé que tal vez quieras estar al tanto.
Cuando seguí los pasos que me sugeriste, todo funciona correctamente. Sin embargo, espero que esto se solucione en futuras iteraciones, ya que tendré que crear la aplicación completa antes de volver al script para editar los filtros para que sean correctos.
Re: Aplicación con tabla de datos múltiples y no creará filtros de datos locales correctamenteHola Cameron, gracias por tu respuesta. Así es como lo tenía originalmente, pero eso crea su propio conjunto de problemas. En otra parte de la aplicación, tengo una configuración programada para aplicar a estos filtros (de los cuales hay más de una docena en mi aplicación real). No pude averiguar cómo acceder al filtro con secuencias de comandos cuando se incluyó como parte de la plataforma. Básicamente, no pude descifrar cómo escribir comandos en mis plataformas, solo los elementos de visualización para ellos. Este es un problema aparte, pero si sabe cómo resolverlo, ¡también sería útil!
Re: Aplicación con tabla de datos múltiples y no creará filtros de datos locales correctamenteHola,
Podría replicar lo que estabas viendo. Aunque esto es solo una solución alternativa, intente esto:
1. De su secuencia de comandos que proporcionó. Cambie la última línea para decir Ejecutar en lugar de Editar e intente ejecutar el script. En mis manos, su guión hace lo que yo esperaría que hiciera.
2. Cuando cree la aplicación, cambie la ubicación de la tabla de datos a Nombre, en lugar de la tabla de datos actual.
Tables(
DataTable1 = GuiTable(
Set Path( "$SAMPLE_DATA/Body Fat.jmp" ),
Set Label( "Body Fat" ),
Set Location( "name" ),
Set Invisible( 0 )
),
DataTable2 = GuiTable(
Set Path( "$SAMPLE_DATA/Body Measurements.jmp" ),
Set Label( "Body Measurements" ),
Set Location( "name" ),
Set Invisible( 0 )
)
),
La opción Ubicación está abajo en la parte inferior.
A veces, el puntero de "asignación" no es el esperado. Entonces, en la secuencia de comandos, verifique que el filtro 1 apunte a la tabla 1 y el filtro 2 apunte a la tabla 2.
Allocate(
List1 = V List Box();
Splitter1 = H Splitter Box();
DataFilter1 = DataTable1 << Data Filter( Local );
Report3 = Platform(
DataTable1,
Bivariate(
Y( :Name( "Height (inches)" ) ),
X( :Name( "Weight (lbs)" ) )
)
);Re: Aplicación con tabla de datos múltiples y no creará filtros de datos locales correctamenteHola @DopeAgonist ,
Este es un comportamiento bastante extraño y probablemente merece la atención de un desarrollador.Verifiqué lo que describiste al crear la aplicación desde cero y también cambiar la asociación del filtro de datos local en el script a la tabla correcta.Pude hacer que aparecieran los filtros de datos apropiados agregándolos manualmente en el script usando
Splitter1 << Prepend(DataTable1 << Data Filter("Local"));
Splitter2 << Prepend(DataTable2 << Data Filter("Local"));Pero esto todavía no funciona.No importa de qué manera lo haga, los filtros de datos locales no están conectados correctamente a la tabla por alguna razón.Cambiar los valores de cualquier filtro no tiene efecto en la selección de filas en las tablas.
Si crea los filtros de datos desde las plataformas de análisis que está incorporando a su aplicación, entonces los filtros funcionan.Por ejemplo:
JMP App(
Set Name( "Application" ),
Set Description(
"An empty workspace for creating custom applications with one or more windows and scripts"
),
Auto Launch( 1 ),
Snap To Grid( 1 ),
Show Grid( 1 ),
Show Properties( 1 ),
Show Sources( 1 ),
Group By Category( 1 ),
Dashboard Mode( 0 ),
Parameters,
Tables(
DataTable1 = GuiTable(
Set Path( "$SAMPLE_DATA/Body Fat.jmp" ),
Set Label( "Body Fat" ),
Set Location( "Full Path" ),
Set Invisible( 1 )
),
DataTable2 = GuiTable(
Set Path( "$SAMPLE_DATA/Body Measurements.jmp" ),
Set Label( "Body Measurements" ),
Set Location( "Full Path" ),
Set Invisible( 1 )
)
),
Script(JSL Quote(// This script is executed when the application is run.
// Named objects have been created for the application modules
// (for example, "Module1") and the pre-defined object
// "thisApplication" refers to the application object itself.
// Variables and functions declared here are scoped to the
// Application namespace.
) ),
Allocate(
Module1 = Plan(
PreAllocate,
Script(JSL Quote(// This script is executed when a new module instance is
// created. The pre-defined object "thisModuleInstance" refers
// to the instance object, but other objects such as boxes and
// scripts have not yet been created. Variables declared here are
// scoped to the ModuleInstance namespace.
// This special function will receive parameters passed to CreateInstance()
OnModuleLoad({},
);
thisModuleInstance << Create Objects;
// After this point your module instance objects have been created
// and can be referred to by name (for example, "Button1").
) ),
Allocate(
Report2 = Platform(
DataTable2,
Bivariate(
Y( :Head ),
X( :Mass ),
Automatic Recalc( 1 ),
Local Data Filter
)
);
Report1 = Platform(
DataTable1,
Bivariate(
Y( :Name( "Height (inches)" ) ),
X( :Name( "Weight (lbs)" ) ),
Automatic Recalc( 1 ),
Local Data Filter
)
);
),
Organize(
Relocate( Report1( 0, 0 ) );
Relocate( Report2( 10, 680 ) );
),
Initialize( Glue() )
)
),
Initialize(
Module1 << Auto Launch( 1 );
Module1 << Set Module Type( "Report" );
Module1 << Set Window Title( "^TABLENAME - ^APPNAME" );
Module1 << Set Min Size( 0, 0 );
Module1 << Set Max Size( 30000, 30000 );
Module1 << Set Auto Stretching( ., . );
)
) << EditDe acuerdo, esto no se ve exactamente como lo tenía, pero tal vez funcione lo suficientemente bien para usted.