Actualización de tablas de datos JMP<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Tengo una tabla de Excel que uso para actualizar una tabla de datos JMP 2 o 3 veces por semana.Sin embargo, después de recuperar el archivo de Excel, el script fuente cambia cuando uso la plataforma Tables para realizar la actualización.El script fuente cambia a los pasos realizados en la plataforma de actualización de Tablas.¿Por qué está pasando esto?¿Me estoy perdiendo un paso?
Re: Actualizar tablas de datos JMPDescubrí el problema con el bucle para automatizar el proceso de extraer los nombres de los scripts de la lista y ahora creará dinámicamente la tabla actualizada y moverá cualquier script contenido en la tabla original a la nueva tabla.
Comenté la versión final y la incluí a continuación si alguien más necesita usar esta solución.
Gracias por toda tu ayuda.
dave
//
// The purpose of this script is to create an updated JMP data table based on the same source
// data file used to create the JMP data table currently open.
//
// This script is used when you have created a JMP data table from a source data file that is
// updated over time and will continue to "grow" with new data as time progresses. Examples of
// this type of file is a monthly time accounting record or a periodic production report.
//
// This script is focused on source data that is "added to" as time progresses and is not intended
// for source data that contains only data for the given period with no historical data retained.
//
// The script utilzes the original "Open" command found within the "Source" script of the JMP data table
// and then copies over all of the scripts from the original data table into the new "updated" data table.
dtCurrent = Current Data Table();
// copy the Open command from the "Source" script of the main data table
// this is only required once as long as the name and location of the source data file remains unchanged
dtUpdate = Open(
"Z:\JMP Data Analysis\SLOC Metrics\Data Update Testing\Project_Metrics.xlsx",
Worksheets( "Code_Change_Metrics" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
// end of the Open command from the "Source" script of the main data table
// don't forget to add the semicolon after the closing ")" above since we are added more commands below
// Get the list of scripts that are contained within the main data table
lstScriptNames = dtCurrent << Get Table Script Names;
// Loop through all the script names and move them to the updated dat table
For( i = 1, i <= N Items( lstScriptNames ), i++,
// pull each script name from the list of scripts
scriptName = lstScriptNames[ i ];
// By opening the updated data file with the copied Open command, we already created the "Source" script
IF(scriptName != "Source",
// Get the "contents" of this script from the main data table
scriptDef = dtCurrent << get table variable( scriptName );
// Insert this script into the updated data table
Eval(
Parse(
Eval Insert( "dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )" )
) // end Parse statement
); // end Eval statement
) // end IF statement
); // continue For Loop until all scripts in the main data table have been copied
// At the completion of this script, you will have two data tables open with exactly the same name.
//
// The first table is the "main" table that contains the old data and all the source scripts.
// When you attempt to close this table you will NOT be prompted to "save" the table since we made
// no changes to it. The "main" table must be closed prior to closing and saving the "updated" table since
// we are going to save the "updated" table in the same location with the same name as the original "main"
// table since we are "replacing" the old table with the update version.
//
// The second table is the "updated" table which we created with the above script.
// This table has been loaded with the "updated" data file found in the "Source" script. It now also
// contains all of the scripts that were contained in the "main" data table for continued use with the
// updated source data. You will note that is has exactly the same table name as the "main" table, but if you
// inspect the rows of data you will find the only difference between the two table is that the "updated" table
// contains the additional rows of data from the updated source data file.
//
// The objective is to close the "main" table which should not prompt for a save, then close the "updated" table
// save it at the prompt over the original "main" table. When closing the "updated" table, you do have the option
// save it to any location you desire with any name you desire. My goal for creating this script was to replace
// the original table with the updated table.
//
// I will note here that I assumed I could not add the close of the main table and the save
// of the updated table to this script since by closing the main table (which must be done first)
// I would be closing the table in which this executing script is located. As such I assume the close action
// would stop the script.Re: Actualizar tablas de datos JMPDE ACUERDO,
Gracias por las prontas respuestas. Mi problema es un poco diferente al concepto de los ejemplos que me proporcionó, pero me ha brindado la información que necesitaba para avanzar significativamente.
En su solución anterior, ahora puedo AGREGAR el contenido completo del nuevo archivo de datos al archivo de datos anterior, PERO, mi problema está relacionado con "mover" a una versión más reciente de los datos actualizados en el sentido de que mi NUEVO archivo simplemente tiene filas de datos adicionales más allá la primera. No se trata de conectar o correlacionar dos conjuntos de datos separados.
Su muestra me dio a entender que cuando ejecuto el script "Fuente" en la tabla original (que en realidad apunta al archivo de datos de origen nuevo/actualizado con el mismo nombre y ubicación que los datos originales) obtengo una nueva tabla de datos. con sólo el script "Fuente" presente. Me perdí cuando ahora tenía una nueva tabla con los datos actuales/actualizados como deseaba, pero ninguno de mis otros scripts.
En su ejemplo, finalizó la combinación de datos con "ahora copie sus scripts de la tabla anterior a la tabla nueva".
Momento de la bombilla... ¿puedes hacer eso?
Entonces, buscando en los foros encontré algunos ejemplos de cómo enumerar los scripts en una tabla e insertarlos en otra. En algún momento descubriré cómo vincularme a otra discusión para poder señalar referencias como esta, pero por ahora, aquí está el código de ejemplo:
para un solo guión:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
scriptName = "Oneway";
scriptDef = dt << get table variable( scriptName );
dt2 = New Table( "little class" );
Eval(
Parse(
Eval Insert(
"
dt2 << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
para todos los scripts en una tabla:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
dt2 = New Table( "little class" );
Wait( 3 );
lstScriptNames = dt << Get Table Script Names;
Wait( 3 );
j = N Items( lstScriptNames );
For( i = 1, i <= N Items( lstScriptNames ), i++,
// scriptName = lstScriptNames;
scriptName = lstScriptNames( i );
scriptDef = dt << get table variable( scriptName );
Eval(
Parse(
Eval Insert( "dt2 << New Script( \!"^scriptName^\!", ^scriptDef^ )" )
)
);
);
Ahora, hice una copia del script "Fuente", agregué asignaciones de las tablas a las variables dt y luego intenté seguir el comando de apertura con el bucle para copiar todos los scripts. No pude hacer que los valores scriptName y scriptDef se cargaran correctamente. scriptName parece cargar la lista correcta de scripts en la tabla actual, pero la llamada scriptDef no obtiene las definiciones.
Por lo tanto, agregué manualmente cada uno de mis scripts de prueba con copias individuales manuales repetidas que funcionaron de maravilla. Aquí está mi código resultante:
dtCurrent = Current Data Table();
dtUpdate = Open(
"Z:\JMP Data Analysis\SLOC Metrics\Data Update Testing\Project_Metrics.xlsx",
Worksheets( "Code_Change_Metrics" ),
Use for all sheets( 1 ),
Concatenate Worksheets( 0 ),
Create Concatenation Column( 0 ),
Worksheet Settings(
1,
Has Column Headers( 1 ),
Number of Rows in Headers( 1 ),
Headers Start on Row( 1 ),
Data Starts on Row( 2 ),
Data Starts on Column( 1 ),
Data Ends on Row( 0 ),
Data Ends on Column( 0 ),
Replicated Spanned Rows( 1 ),
Replicated Spanned Headers( 0 ),
Suppress Hidden Rows( 1 ),
Suppress Hidden Columns( 1 ),
Suppress Empty Columns( 1 ),
Treat as Hierarchy( 0 ),
Multiple Series Stack( 0 ),
Import Cell Colors( 0 ),
Limit Column Detect( 0 ),
Column Separator String( "-" )
)
);
scriptName = "Mod vs Unmod Code Change Sample";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "Individual & Moving Range chart of % Code Change";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "Total Lines vs. Asset / Code Analyzed";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "% Code Change vs. Asset / Code Analyzed";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "UpdateDataTable";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "TestingTableUpdateScript";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "CopySingleScriptFromOldTable";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
scriptName = "CopyAllScriptsFromOldTable";
scriptDef = dtCurrent << get table variable( scriptName );
Eval(
Parse(
Eval Insert(
"
dtUpdate << New Script( \!"^scriptName^\!", ^scriptDef^ )
"
)
)
);
Con mi archivo de tabla JMP original abierto (creado con la última versión del archivo de datos de origen), ahora puedo ejecutar este script que crea una NUEVA TABLA a partir del archivo de datos de origen actualizado y luego copia todos los scripts en la nueva tabla. Luego tengo DOS tablas JMP abiertas, ambas con los mismos títulos, ambas con los mismos scripts, pero una con los datos antiguos y otra con los datos nuevos (más datos). Ahora cierro la tabla anterior y GUARDO la tabla nueva justo encima de ella en la misma ubicación.
¡AUGE! Datos actualizados con todos los scripts disponibles para su ejecución. Misma ubicación y nombre de archivo para que el proceso pueda repetirse con cada actualización de informe semanal o mensual según sea necesario.
Realmente me gustaría que el bucle automatizado para cargar todos los scripts funcione dinámicamente para poder usar el mismo script en otros conjuntos de datos sin tener que administrar los nombres de los scripts en el código real. Por ahora sigo adelante con la versión manual hasta que resuelva el problema con el bucle.
Muchas gracias por su rápida respuesta y muestras que al final me llevaron a una solución.
Re: Actualizar tablas de datos JMPComo tienes JMP 13, también puedes hacerlo así:
NamesDefaultToHere(1);
// Make some 'new data' (imported from Excel)
dt2 = New Table( "New Data",
Add Rows( 10 ),
New Column( "x",
Numeric,
"Continuous",
Formula( Random Normal() )
),
New Column( "y",
Numeric,
"Continuous",
Formula( Random Integer(10, 20 ) )
)
);
dt2 << runFormulas;
Column(dt2, "x") << deleteFormula;
Column(dt2, "y") << deleteFormula;
// Make some 'old data' containing a saved script (stored as a JMP table)
dt1 = New Table( "Old Data",
Add Rows( 20 ),
New Script(
"y vs. x",
Graph Builder(
Variables( X( :x ), Y( :y ) ),
Elements( Points( X, Y, Legend( 5 ) ), Smoother( X, Y, Legend( 6 ) ) )
)
),
New Column( "x",
Numeric,
"Continuous",
Formula( Random Normal() )
),
New Column( "y",
Numeric,
"Continuous",
Formula( Random Integer(1, 10 ) )
)
);
dt1 << runFormulas;
Column(dt1, "x") << deleteFormula;
Column(dt1, "y") << deleteFormula;
// Update dt1 from dt2 using data table subscripting (requires JMP 13 or later)
Wait(3);
firstNewRow = NRows(dt1) + 1;
dt1 << addRows(NRows(dt2));
dt1[firstNewRow::NRow(dt1), 0] = dt2[0, 0];
Re: Actualizar tablas de datos JMPdave,
Dependiendo de cuáles sean sus necesidades específicas, la plataforma Update puede ser la solución. Sin embargo, JSL le permitirá hacer casi cualquier cosa que necesite y luego terminar con esos scripts originales en su tabla de datos reformada. Sería un fragmento de código bastante simple, que copia los scripts incrustados de su tabla original en su tabla recién formada.
Re: Actualizar tablas de datos JMPVeo que este es un hilo antiguo, pero parece ser el único que puedo encontrar relacionado con el problema que estoy encontrando.
Soy un nuevo uso de JMP y tengo 13.1. A medida que aprendo a usar JMP, he estado importando conjuntos de datos que uso para el seguimiento y la generación de informes de métricas.Puedo importar los archivos de Excel y crear scripts para realizar el análisis.¡Funciona genial!
Ahora el problema:
Los datos fuente para este esfuerzo se actualizan semanalmente o mensualmente.Mi objetivo es configurar JMP para realizar el mismo análisis inicial de los datos cada mes, pero después de actualizar la tabla JMP a los últimos datos de Excel.Intenté usar el script "fuente", pero eso solo crea una nueva tabla JMP que no contiene los scripts que guardo en la tabla JMP original.
He leído sobre la función "actualizar", pero parece ser una función para actualizar la tabla si los datos dentro de la tabla han cambiado.¿Es la función "actualizar" el único método disponible para "volver a sincronizar" o "importar" y actualizar/crecer con el tiempo el conjunto de datos de origen?
Cualquier ayuda sería muy apreciada.
dave
Re: Actualizar tablas de datos JMPSegún tus dos primeras publicaciones en este hilo, no tenía idea de que te referías a la función de actualización de tablas en JMP. De hecho, he estado usando Update bastante recientemente y nunca tuve la impresión de que funcionaría con otra cosa que no sean tablas de datos JMP; de hecho, se accede a él a través de la barra de herramientas Tabla (Datos) o del menú Tabla (Datos). Además, sus publicaciones originales no proporcionaban una descripción detallada de lo que estaba haciendo, de ahí la razón por la que nadie respondió.
En su situación en la que actualiza habitualmente una tabla en JMP con nuevos datos de Excel, escribiría un script que importe datos del libro de Excel a JMP y luego actualizaría su tabla de datos mantenida con la tabla de datos creada a partir del libro de Excel. Dicho esto, tener la capacidad de realizar uniones (que es lo que realizan las funciones Unir, Actualizar y Concatenar) con fuentes de datos externas puede ser una característica interesante para agregar. JMP ya tiene esta capacidad con bases de datos externas con su soporte SQL, pero solo funciona con bases de datos SQL. Excel no es una base de datos, y mucho menos una base de datos SQL, por lo que las consultas SQL no se pueden explotar en su caso. JMP definitivamente no tiene una función actual de un solo clic para consultar directamente hojas de trabajo en un libro de Excel para una combinación de datos.
Re: Actualizar tablas de datos JMPsaitcopuroglu, terminé llamando al soporte técnico de JMP.Resulta que la "solución alternativa" que describí anteriormente es la única solución en este momento para la situación de actualización desde una hoja de cálculo de Excel.Me dijeron que la función de actualización está diseñada para actualizar de una tabla de datos JMP a otra.Sin embargo, el problema se presentará como una idea para una versión futura de JMP.
Re: Actualizar tablas de datos JMP¿Podría proporcionarnos archivos Excel/jmp/jsl para comprender mejor? yo tambien tengo curiosidad
Re: Actualizar tablas de datos JMP¿Alguien... alguien... alguien?
Experimenté un poco con la función de actualización.Parece que JMP sobrescribe el script guardado como "Fuente" en la tabla de datos.La PRIMERA vez que actualizas, todo funciona bien.SIN EMBARGO, cuando se invoca la actualización, JMP sobrescribe inmediatamente el script guardado como "Fuente" con el script para actualizar la tabla original a partir de la nueva tabla.La próxima vez que intente actualizar desde el script "Fuente", no sucede nada.Entonces, intenté esto: cambié el nombre del script "Fuente" en la tabla de datos a "Actualizar" y lo intenté nuevamente.Esta vez, el script "Actualizar" no se cambió, pero se agregó un nuevo script llamado "Fuente" a la tabla de datos.Esta "solución alternativa" obviamente NO es eficiente y no debería ser necesaria.