DatumHallo zusammen,
Ich habe eine Datenbank wie diese (hier eine Zusammenfassung):

Diese Datenbank stammt aus einem Skript, das bisher gut funktioniert, allerdings würde die letzte Spalte die Berechnung einer letzten Dauer ermöglichen, die sich von den anderen unterscheidet.
Die Werte in dieser letzten Spalte stellen OPs dar, die Objekten entsprechen.
Beispiel für die 1. Zeile: Der Wert 60 entspricht dem Objekt 2041. Wir benötigen eine Formel, die für jede Zeile die Dauer 2041 = Enddatum 2041 – Startdatum 2041 usw. zulässt.
Wenn der Wert gleich 0 ist, könnten wir der Dauer 2041 den Wert 0 zuweisen.
Und so weiter..
Ich habe mit dem folgenden Skript begonnen:
Names Default To Here(1);
dt = current data table();
If( !Is Missing(:"valeur ST1-2"n),
For Each Row(
idx = dt[row(), :"valeur ST1-2"n]
dt[idx, durée[idx]] = dt[idx, date fin[idx]] - dt[idx, date début[idx]];
),
0
);
DatenzugriffBetreff: DatumHier ist das Skript, das ich verwenden würde, um das zu erreichen, was Sie wollen.
Names Default To Here( 1 );
dt = Current Data Table();
// Set the display format to a JMP Duration format
:"valeur ST1-2"n << format("hr:m:s");
// Loop through the rows and assign the new values
For Each Row(
If( :"valeur ST1-2"n != 0,
:"valeur ST1-2"n = :Date fin 2041 -
:Date début 2041,
:"valeur ST1-2"n = 0
)
);Betreff: Datum- Woher weiß man, dass ein Wert von 60 dem Jahr 2041 und ein Wert von 82 dem Jahr 2000 entspricht?Und was passiert mit einem valeur ST1-2-Wert von 68?
- Die bereitgestellte Beispieldatentabelle enthält keine Spalte für ein Datum aus dem Jahr 2000.
- Die JSL kann leicht geändert werden, um unterschiedliche Berechnungen für unterschiedliche Werte des Werts ST1-2 zu verwenden, wenn entweder die Regeln für die Entscheidung, welche Spalten verwendet werden sollen, erkennbar sind oder wenn eine Liste des Werts ST1-2 zusammen mit dem bereitgestellt wird Spalten, die für die verschiedenen Werte verwendet werden sollen.
Betreff: DatumDie Datenbank ist hier reduziert, aber für jeden Wert in der Spalte ST1-2 ermöglichen Wertespalten die Verknüpfung zwischen dem OP-Wert und jedem Objekt (in der reduzierten Datenbank sind dies die Spalten 711-2041-9916).
Der Wert 60 entspricht 2041, denn in der 1. Zeile:

So weiter für jede Zeile ... für 82, was 2000 entspricht, ist es nur ein weiteres Beispiel, aber das würde bedeuten, dass in der zweiten Zeile die Spalte 2000 mit dem Wert 82 gefüllt würde.
Betreff: DatumDanke für Ihre Antwort !
Dies funktioniert für die 1. Zeile, aber dann ändern sich die Werte in der Spalte „ST1-2-Wert“ und daher muss anschließend nicht mehr die gleiche Dauer neu berechnet werden.
Beispiel für die 3. Zeile: ST1-2-Wert = 82 und 82 entspricht dem Objekt 2000, daher sollten wir für die 3. Zeile Dauer 2000 = Enddatum 2000 – Startdatum 2000 festlegen
Dies ist das Ziel, hier in der Zwischendatenbank einen Überblick über die Zuordnung des OP zu jedem Objekt zu haben (Spalten 711-2041-9916 innerhalb des entsprechenden OP).
Ziel ist es, die Dauerspalten zu ersetzen. Die Spalte „ST1-2-Wert“ wird nicht geändert.
Mein Skript funktioniert nicht richtig:
Names Default To Here(1);
dt14 = current data table();
dur_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Durée" )
);
fin_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date fin" )
);
debut_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date d" )
);
// for indexing later
num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );
// Loop through the rows and assign the new values
For Each Row(
If( :"valeurs ST1-2"n != 0,
colidx = Loc(dt14[row(), num_colnr ] == :"valeurs ST1-2"n);
If( N items (colidx) > 0,
dt14[colidx,dur_cols] = Eval(dt14[colidx,fin_cols] - dt14[colidx,debut_cols]);
,
continue()
);
,
continue()
);
//show(colidx);
);
Betreff: DatumIch denke, das folgende Skript bringt Ihnen, was Sie wollen, oder zumindest nahe daran
Names Default To Here( 1 );
dt14 = Current Data Table();
Lookup = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Num( col_name ) > 0
);
dtArray = dt14 << Stack(
invisible,
columns( Lookup ),
Source Label Column( "theKeys" ),
Stacked Data Column( "valeur ST1-2" ),
Drop All Other Columns( 1 ),
Output Table( "Untitled 45.jmp" )
);
dtArray << delete rows( dtArray << get rows where( Is Missing( :"valeur ST1-2"n ) ) );
theLookup = Associative Array(
dtArray:"valeur ST1-2"n << get values,
dtArray:theKeys << get values
);
Close( dtArray, nosave );
// Loop through the rows and assign the new values
For Each Row(
row = Row();
If( :"valeur ST1-2"n != 0,
lookup = theLookup[:"valeur ST1-2"n];
If( :"valeur ST1-2"n == As Column( lookup ),
As Column( "Durée " || theLookup[:"valeur ST1-2"n] ) =
Num(
As Column( "Date fin " || theLookup[:"valeur ST1-2"n] )
-As Column( "Date début " || theLookup[:"valeur ST1-2"n] )
);
Continue();
);
,
Continue()
);
);Betreff: DatumDanke für Ihre Antwort !
Dies scheint für die ersten beiden Zeilen zu funktionieren, aber wenn sich der ST1-2-Wert ändert, tritt ein Fehler auf.
Wir stellen fest, dass für die 4. Zeile die Dauer 2231 Null ist, während es eine Differenz zwischen Enddatum 2231 und Startdatum 2231 geben sollte (da in der 4. Zeile der Wert von ST1-2 82 ist und 82 dem Objekt 2231 entspricht).

Hier ist die Fehlermeldung, die ich bekomme:

Möglicherweise liegt in der Tabelle „TheLookup“ eine Inkonsistenz vor, da Objekte unterschiedlichen OPs zugeordnet werden können.
Beispiel unten: Wir sehen, dass für „theKeys“ = 2041 der Wert „ST1-2 value“ gleich „60“ und „47“ ist.

Betreff: DatumUm die Schlüssel zu bestimmen, werden alle Spalten mit den Namen 2041, 711, 2231 zusammengeführt und ein assoziatives Array erstellt, das, wenn die Nummer 60 im Spaltenwert ST1-2 gefunden wird, im assoziativen Array nachschlägt und 2241 zurückgibt. Wenn Wurde eine 47 eingegeben, würde auch eine 2241 zurückgegeben. Wenn eine 82 gefunden wird, wird eine 2231 zurückgegeben.Ich bin davon ausgegangen, dass die in den Spalten 2041, 711, 2231 usw. gefundenen Zahlen die verschiedenen Zahlen haben, die in Valeur ST1-2 zu finden sind.
Wenn Sie die von Ihnen verwendete Beispieldatentabelle anhängen könnten, werde ich versuchen, das Problem herauszufinden, das Sie sehen.