Hola comunidad JMP,
Esta es la primera vez que publico y mi primer gran proyecto de secuencias de comandos JMP, así que tengan paciencia conmigo. Este foro ha sido muy útil para llegar a donde estoy hasta ahora.
Objetivo: Tenga un tablero JMP que abra y analice todos los archivos de Excel ubicados en un directorio que muestre gráficos IR para cada número de activo. Live en el sentido de que cada vez que se abre el panel/secuencia de comandos, se ejecuta y actualiza los gráficos.
Restricciones: No se puede cambiar el diseño de los informes de Excel.
A continuación se muestran fragmentos de código que funcionan bien de forma independiente. Cuando lo puse todo junto, JMP se estrelló contra mí.
Podría estar abordando todo esto incorrectamente. Puede ser más fácil abrir cada archivo y agregar las columnas a una nueva tabla de datos. Basado en cuántas columnas podría generar X número de gráficos.
Cualquier ayuda sería muy apreciada.
Código para crear gráfico de control con línea de referencia . Me gustaría extraer el valor de la línea de referencia de la hoja de cálculo adjunta requisito de fuerza campo y título de número de activo campo.
Ver más... Código para abrir todos los archivos en el directorio , pero los archivos o datos deben tener encabezados en la fila 1 y datos que comiencen en la fila 2 para que funcionen.
Ver más...dirpath = Pick Directory();
TheFileList = Files In Directory( dirpath );
For( i = 1, i < 100, i++,
dt = Open( "F:\IPC\IPC PULL TEST RECORD LOGS\" || TheFileList[i], worksheet( "Sheet1" ) );
dt << Control Chart(
Sample Label( :Date ),
Group Size( 1 ),
KSigma( 3 ),
Chart Col( :Pull Force Reading, Individual Measurement ),
SendToReport(
Dispatch(
{"Individual Measurement of Pull Force Reading"},
"2",
ScaleBox,
{Min( 5 ), Max( 18 ), Inc( 2 ), Minor Ticks( 1 ), Add Ref Line( 8, "Solid", "Black", "LSL", 4 )}
),
Dispatch(
{"Individual Measurement of Pull Force Reading"},
"1",
ScaleBox,
{Min( 0 ), Max( 50 ), Inc( 8 ), Minor Ticks( 0 )}
),
Dispatch( {"Individual Measurement of Pull Force Reading"}, "IR Chart of IM", FrameBox, {Frame Size( 820, 420 )} ),
Dispatch( {"Individual Measurement of Pull Force Reading"}, "IR Chart of IM", FrameBox( 2 ), {Frame Size( 65, 405 )} )
)
);
);dirpath = Seleccionar directorio(); TheFileList = Archivos en el directorio (dirpath); For( i = 1, i < 100, i++, dt = Open( "F:\IPC\IPC PULL TEST RECORD LOGS\" || TheFileList[i], worksheet( "Sheet1" ) ); dt << Control Chart( Etiqueta de muestra( :Fecha ), Tamaño de grupo( 1 ), KSigma( 3 ), Columna de gráfico( :Lectura de fuerza de tracción, Medición individual), SendToReport( Dispatch( {"Lectura de medición de fuerza de tracción individual"}, "2", ScaleBox , {Min( 5 ), Max( 18 ), Inc( 2 ), Minor Ticks( 1 ), Add Ref Line( 8, "Solid", "Black", "LSL", 4 )} ), Dispatch( {" Lectura de medición individual de la fuerza de tracción"}, "1", ScaleBox, {Min( 0 ), Max( 50 ), Inc( 8 ), Minor Ticks( 0 )} ), Dispatch( {"Lectura de medición individual de la fuerza de tracción" }, "Gráfico IR de IM", FrameBox, {Tamaño del marco (820, 420)}), Dispatch ({"Lectura de medición individual de la fuerza de tracción"}, "Gráfico IR de IM", FrameBox (2), {Tamaño del marco ( 65, 405 )} ) ) ); );
Código para formatear un archivo reorganizando encabezados y datos .
Ver más...dt = Open("F:\IPC\IPC PULL TEST RECORD LOGS\Asset# 3042.xlsx", worksheets("sheet1"));
dt << Delete rows (1::13);
var = dt:column 11[2];
dt:column 11[8] = var; //data
var = dt:column 11[1];
dt:column 11[7] = var; //heading
var = dt:column 3[1];
dt:column 12[7] = var; //heading
var = dt:column 3[2];
dt:column 12 [8] = var; //asset #
dt << delete rows (1::6);
dt << delete columns(1,3,5,7,9,13::25);
colNames = dt << get column names;
For( i = 1, i <= N Items( colNames ), i++,
Column( i ) << set name( Column( i )[1] )
);
dt << delete rows(1);dt = Open("F:\IPC\IPC PULL TEST RECORD LOGS\Asset# 3042.xlsx", worksheets("hoja1")); dt << Eliminar filas (1::13); var = dt:columna 11[2]; dt:columna 11[8] = var; //datos var = dt:columna 11[1]; dt:columna 11[7] = var; //título var = dt:columna 3[1]; dt:columna 12[7] = var; //título var = dt:columna 3[2]; dt:columna 12 [8] = var; //activo # dt << eliminar filas (1::6); dt << eliminar columnas (1,3,5,7,9,13::25); colNames = dt << obtener nombres de columnas; For( i = 1, i <= N Items( colNames ), i++, Column( i ) << set name( Column( i )[1] ) ); dt << eliminar filas (1);
Jim,
Te he visto contribuir en muchas discusiones durante mi investigación y resolución de problemas. Me siento verdaderamente honrado de que contribuyas a mi discusión aquí.
Al principio tuve algunos problemas al ejecutar el script. Después de revisar el registro y el depurador, descubrí que se estaba deteniendo en un archivo determinado. El siguiente archivo era un archivo de prueba que había formateado de manera diferente. Eliminé ese archivo, no cambié el script y funcionó maravillosamente . Más tarde tuve un archivo abierto cuando ejecuté el script y recibí otro error, pero eso fue una solución fácil (cierre el archivo).
Tengo la intención de comprender la totalidad de su código, pero tengo algunas personalizaciones adicionales con las que espero que también pueda ayudar:
- ¿Es posible agregar el valor LSL al gráfico e incluso moverse al mismo lado (derecha) que UCL/LCL?
- Algunos conjuntos de datos tienen un LSL de 50+. Esto no encaja en el gráfico actual, así que modifiqué el rango de 1 a 100. ¿Hay alguna manera de tomar el requisito de fuerza de tracción y usarlo en +/- 10 o 20 para el rango?
- Algunas hojas de Excel están vacías. ¿Hay alguna manera de omitir gráficos?
Editar : Me tomé un tiempo hoy para agregar las personalizaciones anteriores y aquí está el código modificado para lo anterior. Parece que es bastante difícil cambiar la etiqueta de referencia. La única pista que encontré fue crear un nuevo cuadro de texto y usar ese código, aunque no estoy seguro de cómo vincular la altura Y de la línea de referencia.
Names Default To Here( 1 );
// Delete the old Dashboard
Try( NW << close window );
dirpath = Pick Directory();
TheFileList = Files In Directory( dirpath );
// Create the Dashboard window to place the charts into
NW = New Window( "Asset Dashboard", <<JOURNAL>col=Column( Current Data Table(), "Pull Force Reading");
tableVal = col[22];
if (tableVal == "", i++);
// Capture the Force Requirement value and add it to the graph if it is valid
dt:Pull Force Reading << data type( numeric ) << modeling type( continuous );
theForceRequirement = Num( Word( 1, dt:Force Requirement[1], " " ) );
If( Is Missing( theForceRequirement ) == 0,
<STRONG>range = theForceRequirement;</STRONG>
theForceRequirement = ",Add Ref Line(" || Char( theForceRequirement ) || ", \!"Dashed\!", \!"Black\!", \!"LSL\!", 4 )";,
theForceRequirement = " "
);
// Capture the Asset number
If( dt:Name( "Asset#" )[1] == "",
theAsset = "Unknown",
theAsset = dt:Name( "Asset#" )[1]
);
// Generate the code to produce the chart along with the LSL value
theExpr =
"cc = Control Chart(invisible,
Sample Label( :Date ),
Group Size( 2 ),
KSigma( 3 ),
Chart Col( :Pull Force Reading, Individual Measurement(Show Zones( 1 ), Shade Zones( 1 ),Test 1( 1 ), Test 3( 1 ))),
SendToReport(
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"2\!",
ScaleBox,
{Min( <STRONG>if( (range - 20) <= 0 , 0, range - 20)</STRONG> ), Max( <STRONG>range + 20</STRONG> ), Inc( 2 ), Minor Ticks( 1 )"
|| theForceRequirement ||
" }
),
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"1\!",
ScaleBox,
{Min( 0 ), Max( 50 ), Inc( 8 ), Minor Ticks( 0 )}
),
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"IR Chart of IM\!",
FrameBox,
{Frame Size( 820, 420 )}
),
Dispatch(
{\!"Individual Measurement of Pull Force Reading\!"},
\!"IR Chart of IM\!",
FrameBox( 2 ),
{Frame Size( 65, 405 )}
)
)
);";
// Run the generated code
Eval( Parse( theExpr ) );
// Close the outline box of the output and set the title based upon the asset value
Report( cc )[Outline Box( 1 )] << Close( 1 ) << set title( "Asset# " || theAsset );
// Append the display output to the display window
VLB << Append( Report( cc ) );
// Clean up the environment by closing the display window and the data table
//cc << close window;
//Close( dt, nosave );
); // End of For Loop</JOURNAL>
Creo que esto se acerca a lo que quieres.Es posible que necesite algunos ajustes, pero como mínimo debería darle un buen comienzo sobre cómo poner todo esto junto
Names Default To Here( 1 );
// Delete the old Dashboard
Try( NW << close window );
dirpath = Pick Directory();
TheFileList = Files In Directory( dirpath );
// Create the Dashboard window to place the charts into
NW = New Window( "Asset Dashboard", <<JOURNAL></JOURNAL>