Mise à jour des tableaux de données JMP<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />J'ai un tableau Excel que j'utilise pour mettre à jour un tableau de données JMP 2 à 3 fois par semaine.Cependant, après avoir récupéré le fichier Excel, le script source est modifié lorsque j'utilise la plateforme Tables pour effectuer la mise à jour.Le script source change selon les étapes effectuées dans la plateforme de mise à jour des tables.Pourquoi cela arrive-t-il?Est-ce que j'ai raté une étape ?
Re : Mise à jour des tables de données JMPJ'ai compris le problème avec la boucle pour automatiser le processus d'extraction des noms de script de la liste et elle créera désormais dynamiquement la table mise à jour et déplacera tout script contenu dans la table d'origine vers la nouvelle table.
J'ai commenté la version finale et l'ai incluse ci-dessous si quelqu'un d'autre a besoin d'utiliser cette solution.
Merci pour votre aide.
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 : Mise à jour des tables de données JMPD'ACCORD,
Merci pour les réponses rapides. Mon problème est un peu différent du concept des exemples que vous avez fournis, mais vous m'avez donné les informations dont j'avais besoin pour avancer de manière significative.
Dans votre solution ci-dessus, je peux maintenant AJOUTER le contenu complet du nouveau fichier de données à l'ancien fichier de données, MAIS mon problème est lié au "passage" vers une version plus récente des données mises à jour dans la mesure où mon NOUVEAU fichier contient simplement des lignes de données supplémentaires au-delà la première. Il ne s’agit pas de connexion/corrélation de deux ensembles de données distincts.
Votre exemple m'a fait comprendre que lorsque j'exécute le script "Source" dans la table d'origine (qui pointe en fait vers le fichier de données source nouveau/mis à jour du même nom et du même emplacement que les données d'origine), j'obtiens une nouvelle table de données. avec seulement le script "Source" présent. J'étais perdu lorsque j'avais maintenant une nouvelle table avec les données actuelles/mises à jour comme souhaité, mais aucun de mes autres scripts.
Dans votre exemple, vous avez terminé la fusion des données avec "copiez maintenant vos scripts de l'ancienne table vers la nouvelle table".
Moment d'ampoule... tu peux faire ça ?
Ainsi, en parcourant les forums, j'ai trouvé quelques exemples de liste de scripts dans un tableau et de leur insertion dans un autre. À un moment donné, je trouverai comment créer un lien vers d'autres discussions afin de pouvoir pointer vers des références telles que celle-ci, mais pour l'instant, voici le code de l'exemple :
pour un seul script :
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^ )
"
)
)
);
pour tous les scripts d'une table :
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^ )" )
)
);
);
Maintenant, j'ai fait une copie du script "Source", ajouté des affectations des tables aux variables dt, puis essayé de suivre la commande open avec la boucle pour copier tous les scripts. Je n’ai pas réussi à charger correctement les valeurs scriptName et scriptDef. scriptName semble charger la liste correcte des scripts dans la table actuelle, mais l'appel scriptDef n'extrait pas les définitions.
J'ai donc ajouté manuellement chacun de mes scripts de test avec des copies uniques manuelles répétées qui ont fonctionné à merveille. Voici mon code résultant :
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^ )
"
)
)
);
Avec mon fichier de table JMP d'origine ouvert (créé avec la dernière version du fichier de données source), je peux maintenant exécuter ce script qui crée une NOUVELLE TABLE à partir du fichier de données source mis à jour, puis copie tous les scripts dans la nouvelle table. J'ai alors DEUX tables JMP ouvertes, toutes deux avec les mêmes titres, toutes deux avec les mêmes scripts, mais une avec les anciennes données et une avec les nouvelles données (plus de données). Je ferme maintenant l'ancienne table et ENREGISTRE la nouvelle table juste au-dessus, au même endroit.
BOOM! Données mises à jour avec tous les scripts disponibles pour l'exécution. Même emplacement et même nom de fichier afin que le processus puisse se répéter à chaque mise à jour de rapport hebdomadaire ou mensuelle, selon les besoins.
J'aimerais vraiment que la boucle automatisée permettant de charger tous les scripts fonctionne de manière dynamique afin de pouvoir utiliser le même script sur d'autres ensembles de données sans avoir à gérer les noms de script dans le code réel. Pour le moment, j'avance avec la version manuelle jusqu'à ce que je résolve le problème avec la boucle.
Merci beaucoup pour votre réponse rapide et vos échantillons qui m'ont finalement conduit à une solution.
Re : Mise à jour des tables de données JMPPuisque vous disposez de JMP 13, vous pouvez également procéder comme ceci :
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 : Mise à jour des tables de données JMPDave,
Selon vos besoins spécifiques, la plateforme Update peut être la solution. Cependant, JSL vous permettra de faire à peu près tout ce dont vous avez besoin, puis de vous retrouver avec ces scripts originaux dans votre table de données réformée. Ce serait un morceau de code assez simple, qui copie les scripts intégrés de votre table d'origine dans votre table nouvellement formée.
Re : Mise à jour des tables de données JMPJe vois qu'il s'agit d'un vieux fil de discussion, mais il semble que ce soit le seul que je puisse trouver en rapport avec le problème que je rencontre.
Je suis un nouvel utilisateur de JMP et j'ai 13.1. Au fur et à mesure que j'apprends à utiliser JMP, j'importe des ensembles de données que j'utilise pour le suivi des métriques et la création de rapports.Je peux importer les fichiers Excel et créer des scripts pour effectuer l'analyse.Fonctionne très bien!
Maintenant le problème :
Les données sources de cet effort sont mises à jour de manière hebdomadaire à mensuelle.Mon objectif est de configurer JMP de manière à effectuer la même analyse initiale des données chaque mois, mais après avoir mis à jour la table JMP avec les dernières données Excel.J'ai essayé d'utiliser le script "source", mais cela crée simplement une nouvelle table JMP qui ne contient pas les scripts que j'enregistre dans la table JMP d'origine.
J'ai entendu parler de la fonction "mettre à jour", mais cela semble être une fonction permettant de mettre à jour la table si les données de la table ont changé.La fonction « mettre à jour » est-elle la seule méthode disponible pour « resynchroniser » ou « importer » et mettre à jour/augmenter au fil du temps l'ensemble de données source ?
Toute aide serait grandement appréciée.
Dave
Re : Mise à jour des tables de données JMPD'après vos deux premiers messages dans ce fil, je ne savais pas que vous faisiez référence à la fonctionnalité de mise à jour des tables dans JMP. En fait, j'utilise pas mal Update récemment et je n'ai jamais eu l'impression que cela fonctionnerait avec autre chose que les tables de données JMP ; on y accède en effet soit via la barre d'outils Table (Données) soit via le menu Table (Données). De plus, vos messages originaux ne fournissaient pas de description détaillée de ce que vous faisiez, d'où la raison pour laquelle personne n'a répondu.
Dans votre situation où vous mettez régulièrement à jour un tableau dans JMP avec de nouvelles données d'Excel, j'écrirais un script qui importe les données du classeur Excel dans JMP, puis je mettrais à jour votre tableau de données géré avec le tableau de données créé à partir du classeur Excel. Cela dit, avoir la possibilité d'effectuer des jointures (ce que font les fonctions Joindre, Mettre à jour et Concaténer) avec des sources de données externes peut être une fonctionnalité intéressante à ajouter. JMP dispose déjà de cette fonctionnalité avec les bases de données externes grâce à son support SQL, mais cela ne fonctionne qu'avec les bases de données SQL. Excel n'est pas une base de données, encore moins une base de données SQL, les requêtes SQL ne peuvent donc pas être exploitées dans votre cas. JMP ne dispose actuellement d'aucune fonctionnalité en un clic permettant d'interroger directement des feuilles de calcul dans un classeur Excel pour une jointure de données.
Re : Mise à jour des tables de données JMPsaitcopuroglu, j'ai fini par appeler le support technique JMP.Il s'avère que la « solution de contournement » que j'ai décrite ci-dessus est actuellement la seule solution pour la situation de mise à jour à partir d'une feuille de calcul Excel.On m'a dit que la fonction de mise à jour est conçue pour la mise à jour d'une table de données JMP à une autre.Cependant, le problème sera soumis comme idée pour une future version de JMP.
Re : Mise à jour des tables de données JMPPourriez-vous fournir des fichiers Excel/jmp/jsl pour mieux comprendre ? je suis aussi curieux
Re : Mise à jour des tables de données JMPN'importe qui... n'importe qui... n'importe qui ?
J'ai fait quelques expériences avec la fonction de mise à jour.Il semble que JMP écrase le script enregistré comme « Source » dans la table de données.Lors de la PREMIÈRE mise à jour, tout fonctionne correctement.CEPENDANT, lorsque la mise à jour est invoquée, le script enregistré en tant que "Source" est immédiatement remplacé par JMP par le script permettant de mettre à jour la table d'origine à partir de la nouvelle table.La prochaine fois que vous tenterez de mettre à jour à partir du script "Source", rien ne se passera.J'ai donc essayé ceci : j'ai renommé le script "Source" dans la table de données en "Mise à jour" et j'ai réessayé.Cette fois, le script "Mise à jour" n'a pas été modifié, mais un nouveau script appelé "Source" a été ajouté à la table de données.Cette « solution de contournement » n’est évidemment PAS efficace et ne devrait pas être nécessaire.