Comment effectuer élégamment une mise à jour, mais pour une seule ligne ?Bonjour - J'essaie de prendre une ligne d'une table et de la jeter dans une autre table sur une ligne spécifiée par l'utilisateur dans une zone de saisie. Cependant, la fonction de mise à jour ne semble pas avoir la capacité de spécifier des lignes, et il me reste donc une heure à taper chacune de mes 105 colonnes pour les deux tables de données en tant que telles :
dt:{"ColA"}[rownumber] = dt1:{"ColA"}[1];<BR />dt:{"ColB"}[rownumber] = dt1:{"ColB"}[1];<BR />.<BR />.<BR />.<BR />dt:{"ColDA"}[rownumber] = dt1:{"ColDA"}[1];Ce qui est bien, mais je peux imaginer mes amis codeurs se tortillant sur leur siège à cause de cela. Existe-t-il une manière plus élégante de procéder ? J'ai vu quelqu'un faire référence à des tableaux associatifs, mais j'ai du mal à les utiliser.
Je suppose que le code ci-dessus suffit, mais si cela compte, voici le code original, avec la ligne correspondante tracée en rouge :
w = New Window( "Choose Row Number for XRD Run input", // opens a window with a title and this content...
Border Box( top( 20 ), bottom( 20 ), Left( 20 ), Right( 20 ), // window dressing
V List Box( // V and H lists nest to organize the display boxes
H Center Box( Text Box( "Choose Row Number for XRD Run input" ) ), // a second title, centered
Spacer Box( size( 1, 30 ) ), // a little vertical space
H Center Box( rowtemp=Number Edit Box( ) ), // data entry
Spacer Box( size( 1, 10 ) ), // a little vertical space
H Center Box( // center the button
Button Box( "Import Data", // this script runs when the button is pressed...
rownumber = rowtemp << Get;
// Run XML Import
Include( "jmpprj://contents/Import XRD XML.jsl");
// Reference Data Tables
dt = Data Table( "Experimental Info" );
dt1 = Data Table( "XMLTempTable" );
// Move to Experimental info table
<FONT color="#FF0000">dt:{"xsi:Schema Location 1"}[rownumber] = dt1:{"xsi:Schema Location 1"}[1];</FONT>
// Close XMLTempTable
close(dt1);
// optionally, close the dialog. Or, you might want to run it again...
w << closeWindow; // just the dialog, not the report
)
)
)
)
);Automatisation et scriptsles fenêtresRe : Comment effectuer une mise à jour avec élégance, mais pour une seule ligne ?Voici une façon d’effectuer une mise à jour d’une seule ligne.Il prend une ligne spécifiée d'une table de données et la met à jour vers une ligne spécifiée dans une autre table de données.
names default to here(1);
dt=
// Open Data Table: Big Class.jmp
// → Data Table( "Big Class" )
Open( "$SAMPLE_DATA/Big Class.jmp" );
// Create a random data table with 5 rows
// Subset data table
// → Data Table( "Subset of Big Class" )
dt2 = dt << Subset( Sample Size( 5 ), Selected columns only( 0 ), output table("Selection") );
// Give new names to the subsetted table
dt2:name[1] = "PAT";
dt2:name[2] = "BRIT";
dt2:name[3] = "TERRY";
dt2:name[4] = "KRIS";
dt2:name[5] = "JEN";
wait(10);
// Below is the code that does the 1 row update
// Row in data table Big Class to be updated
outRow = 12;
// Row in data table Selection to get data from
inRow = 4;
// The Update process
// Create a row column in data table Big Class
dt << new column( "Row", formula(row()));
// Subset the inRow to a new table
dt2 << select where(row()== inRow);
dtTemp = dt2 << subset(selected rows(1), selected columns(0), invisible);
// Clear selected row in data table Selection
dt2 << clear select;
// Create a new column in the temp data table
dtTemp << new column("Row", set each value(outRow));
// Update data table Big Class
dt << Update(
With( dtTemp ),
Match Columns( :Row = :Row )
);
// Delete the temp data table
close( dtTemp, nosave );
// Delete the Row Column
dt << delete columns( :Row );
Re : Comment effectuer une mise à jour avec élégance, mais pour une seule ligne ?Si vous disposez d'identifiants uniques dans les deux tables, comme le nom et l'âge, vous pouvez les utiliser comme conditions de correspondance.
De plus, vous pouvez utiliser une colonne de transformation virtuelle sélection de ligne pour fournir une condition de correspondance supplémentaire pour sélectionner les lignes à mettre à jour :
Names Default To Here( 1 );
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
New Namespace(
"selection"
);
selection:ChangeRows = [5, 2, 7];
updateTable = dt << Subset( All rows, Selected columns only( 0 ) );
:weight << set each value( 1000 );
dt << Update(
With( updateTable ),
Match Columns(
:name = :name,
:age = :age,
transform column( "row selection", Formula( If( N Items( Loc( selection:ChangeRows, Row() ) ), 1, . ) ) ) =
transform column( "row selection", Formula( 1 ) )
),
Add Columns from Update Table( None ),
Replace Columns in Main Table( :weight )
);