Wie kann man ein Update elegant durchführen, aber für eine einzelne Zeile?Hallo, ich versuche, eine Zeile aus einer Tabelle zu übernehmen und sie in einer Zeile, die der Benutzer in einem Eingabefeld angibt, in eine andere Tabelle zu übertragen. Allerdings scheint die Aktualisierungsfunktion nicht in der Lage zu sein, Zeilen anzugeben, und so muss ich mir eine Stunde Zeit nehmen und jede meiner 105 Spalten für beide Datentabellen als solche eintippen:
dt:{"ColA"}[rownumber] = dt1:{"ColA"}[1];<BR />dt:{"ColB"}[rownumber] = dt1:{"ColB"}[1];<BR />.<BR />.<BR />.<BR />dt:{"ColDA"}[rownumber] = dt1:{"ColDA"}[1];Das ist in Ordnung, aber ich kann mir vorstellen, dass meine Coding-Freunde dabei auf ihren Plätzen herumzappeln. Gibt es eine elegantere Möglichkeit, dies zu tun? Ich habe gesehen, dass jemand auf assoziative Arrays verweist, aber ich habe Probleme bei der Verwendung.
Ich gehe davon aus, dass der obige Code ausreicht, aber wenn es darauf ankommt, hier ist der Originalcode, mit der entsprechenden Linie in Rot:
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
)
)
)
)
);Automatisierung und SkripterstellungWindowsBetreff: Wie kann man ein Update elegant durchführen, aber für eine einzelne Zeile?Hier ist eine Möglichkeit, eine einzelne Zeilenaktualisierung durchzuführen.Es übernimmt eine bestimmte Zeile aus einer Datentabelle und aktualisiert sie in einer bestimmten Zeile in einer anderen Datentabelle.
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 );
Betreff: Wie kann man ein Update elegant durchführen, aber für eine einzelne Zeile?Wenn Sie in beiden Tabellen eindeutige Bezeichner wie Name und Alter haben, können Sie diese als Übereinstimmungsbedingungen verwenden.
Darüber hinaus können Sie eine virtuelle Transformationsspalte verwenden Zeilenauswahl um eine zusätzliche Übereinstimmungsbedingung bereitzustellen, um die zu aktualisierenden Zeilen auszuwählen:
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 )
);