Ich habe eine beliebige Anzahl von Spalten, die die Eingaben für einen Prozess definieren, und eine Reihe anderer Spalten, die die Ausgaben darstellen, und für jeden Satz von Eingaben gibt es eine Reihe von Ausgabezeilen, die zeitlich verschlüsselt sind.
Ist es mit .jsl möglich, eine neue „setid“-Spalte zu erstellen, die mit „1“ in Zeile 1 beginnt, dann die vom Benutzer ausgewählten Spalten (1 oder mehr) übernimmt und sich jedes Mal, wenn sich einer der Werte in einer dieser Spalten ändert, erhöht der Wert in der Spalte „setid“ – andernfalls bleibt die setid gleich.Wir können davon ausgehen, dass die Zeilen vernünftig nach Satz sortiert sind.
Hier ist ein kleines Beispiel, mit dem Sie beginnen können.Ich habe einen alten Code ausgegraben, den ich vor vielen, vielen Jahren erstellt habe, und ihn geändert.Es öffnet sich zunächst ein Dialogfenster

Und nachdem Sie die Spalten ausgewählt haben, klicken Sie auf OK und die neue Spalte wird erstellt.
Wenn Sie den Scripting Guide noch nicht gelesen haben, sollten Sie dies jetzt tun.Um dieses einfache Skript zu erweitern, müssen Sie JSL verstehen und wissen, was Sie damit machen können.Hier ist das Skript
Clear Symbols();
Names Default To Here( 1 );
dt = Current Data Table();
allcolumnslist = dt << get column names( "string" );
nw = New Window( "Generate SETID Column",
Border Box( Left( 3 ), top( 2 ),
V List Box(
Text Box( "Create a SETID Column" ),
H List Box(
V List Box(
// Generate the master display box for the columns in the data table
Panel Box( "Select Columns",
colListData = Col List Box( width( 180 ), nLines( Min( N Cols( dt ), 15 ) ) ),
colListData << append( dt << get column names( "string" ) ),
// At startup, sselect the columns in the selection box for
// the columns that are selected in the data table
For( II = 1, II <= N Items( All Columns list ), II++,
If( Column( ii ) << get selected == 1,
colListData << set selected( II )
)
);
)
),
// Setup the selection buttons and the selection boxes
Panel Box( "Selected Columns to Create SETID from",
Lineup Box( N Col( 2 ), Spacing( 3 ),
Button Box( "Add Column(s)", colListY << Append( colListData << GetSelected ) ),
colListY = Col List Box( width( 180 ), nLines( 10 ), min col( 1 ), max col( 0 ) ),
)
),
// Setup the action buttons that control the window processing
V List Box(
Panel Box( "Action",
Lineup Box( N Col( 1 ),
Button Box( "OK",
// Check to see if the required data has been input
If( N Items( colListY << GetItems ) == 0,
Dialog( "No Y Columns Specified", Button( "OK" ) ),
// Process the Y Columns
thecols = {};
thecols = colListY << GetItems;
nw << close window;
runit();
)
),
Button Box( "Cancel", Stop() ),
Text Box( " " ),
Button Box( "Remove", colListY << RemoveSelected ),
Button Box( "Help", notImplemented )
)
)
),
)
)
)
);
// Here is the function that calculates the new column.
runit = Function( {},
If( Try( dt:SetID << get name, "" ) != "",
dt << delete columns( {"SetID"} )
);
dt << New Column( "SetID", numeric );
// Set the value for row 1
mySetID = 1;
dt:SetID[1] = mySetID;
// Loop across the remaining rows, checking for a change from the previous row
For( i = 2, i <= N Rows( dt ), i++,
thesame = "Yes";
For( k = 1, k <= N Items( thecols ), k++,
If( Column( dt, thecols[k] )[i] != Column( dt, thecols[k] )[i - 1],
thesame = "No"
)
);
// If a change is found, increase the counter
If( thesame == "No",
mySetID
++);
// Set the value of the new column
dt:SetID[i] = mySetID;
);
);