Aktualisieren Sie die Tabelle entsprechend dem Datum, das kleiner oder gleich dem Datum der Referenzdatei istHallo zusammen,
Ich habe zwei Tabellen, in denen dtA meine Originaldatei und dtB meine Referenzdatei ist. Was ich tun möchte, ist, dass dtA entsprechend dem Datum aktualisiert wird, das kleiner oder gleich dem Datum der Referenzdatei ist.
Zum Beispiel,
Tabelle dtA
| Datum | Modell | Menge |
| 24.06.2023 | A | 23 |
| 30.06.2023 | A | 25 |
| 01.07.2023 | A | 34 |
| 05.07.2023 | A | 50 |
Tabelle dtB
| Datum | Modell | Ref |
| 01.06.2023 | A | 100 |
| 01.07.2023 | A | 150 |
Nach der Aktualisierung von dtA sollte die Tabelle so aussehen
| Datum | Modell | Menge | Ref |
| 24.06.2023 | A | 23 | 100 |
| 30.06.2023 | A | 25 | 100 |
| 01.07.2023 | A | 34 | 150 |
| 05.07.2023 | A | 50 | |
Ist das möglich? Bitte helfen Sie
Automatisierung und SkripterstellungBetreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istHier ist ein Skript, das funktioniert.Es wird nicht sehr effizient sein, wenn an den Tischen sehr hohe Einsätze getätigt werden.
Angesichts Ihrer beiden Datentabellen stellt das Skript das Update bereit

Bitte beachten Sie, dass Zeile 4 einen Aktualisierungswert hat, während Ihre Tabelle keinen hatte.Sofern ich Ihre Anforderung nicht falsch interpretiere, enthält die letzte Zeile einen Wert in der Referenztabelle, der den Auswahlkriterien entspricht
Names Default To Here( 1 );
New Table( "Original",
Add Rows( 4 ),
New Column( "Date",
Format( "m/d/y", 10 ),
Input Format( "m/d/y" ),
Set Values( [3770409600, 3770928000, 3771014400, 3771360000] )
),
New Column( "Model", Character( 16 ), Set Values( {"A", "A", "A", "A"} ) ),
New Column( "Qty", Set Values( [23, 25, 34, 50] ) )
);
New Table( "Reference",
Add Rows( 2 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "m/d/y", 10 ),
Input Format( "m/d/y" ),
Set Values( [3768422400, 3771014400] )
),
New Column( "Model", Character( 16 ), Set Values( {"A", "A"} ) ),
New Column( "Ref", Set Values( [100, 150] ) )
);
// This is the code that does the actual update
dtA = Data Table( "Original" );
dtB = Data Table( "Reference" );
dtA << New Column( "Ref" );
For Each( {row}, Index( 1, N Rows( dtA ) ),
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)]
);Betreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istDafür gibt es nur wenige unterschiedliche Methoden, JMP bietet einen solchen Join jedoch (zumindest noch) nicht direkt an.
Zuerst können Sie eine Referenz zu Ihrer Originaltabelle erstellen (die leer sein wird) (dieser Schritt ist höchstwahrscheinlich unnötig, da JMP beim Verketten fehlende Spalten hinzufügt).

Verketten Sie die Tabellen

Sortieren Sie nach Gruppen und Zeit. Wählen Sie alle Werte in der Ref-Spalte aus und klicken Sie mit der rechten Maustaste, um „Füllung fehlt“ auszuwählen

Wählen Sie alle Zeilen aus, in denen QTY fehlt, und löschen Sie diese


Es gibt auch einige Add-Ins (und Skripte), die dies tun können, um der Community beizutreten. Sie können SQL auch in JMP verwenden
Betreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istHallo txnelson, es wird ein Fehler wie dieser angezeigt.

Betreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istSie verwenden höchstwahrscheinlich eine ältere JMP-Version als 16 (For Each wurde in JMP16 hinzugefügt). Sie können es ziemlich einfach ändern und in eine For-Schleife umwandeln
Betreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istIch vermute, dass Sie eine Version von JMP haben, die nicht unterstützt wird
For Each()
Wenn Sie also den Abschnitt „Für jeden“ in ändern
For(row=1, row<= N Rows( dtA ), row++,
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)]
);
es sollte funktionieren.
Betreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istDas Skript funktioniert jetzt einwandfrei, aber ich habe noch eine letzte Frage: Gibt es eine Möglichkeit, die Aktualisierung auf ein bestimmtes Datum zu beschränken, da die Tabellen täglich aktualisiert werden? Zum Beispiel,
Tabelle dtA
| Datum | Modell | Menge |
| 24.06.2023 | A | 23 |
| 30.06.2023 | A | 25 |
| 01.07.2023 | A | 34 |
| 05.07.2023 | A | 50 |
| 10.07.2023 | A | 65 |
| 27.07.2023 | A | 68 |
Tabelle dtB
| Datum | Modell | Ref |
| 01.06.2023 | A | 100 |
| 01.07.2023 | A | 150 |
| 20.07.2023 | A | 300 |
| 01.08.2023 | A | 250 |
Nach der Aktualisierung von dtA sollte die Tabelle so aussehen
| Datum | Modell | Menge | Ref |
| 24.06.2023 | A | 23 | 100 |
| 30.06.2023 | A | 25 | 100 |
| 01.07.2023 | A | 34 | 150 |
| 05.07.2023 | A | 50 | 300 |
| 10.07.2023 | A | 65 | 300 |
| 27.07.2023 | A | 65 | 250 |
Ich habe versucht, das Skript zu verwenden, aber es überschreibt den Ref-Wert der vergangenen Daten mit dem neuesten Wert, der 250 ist. Es sieht aus wie das
| Datum | Modell | Menge | Ref |
| 24.06.2023 | A | 23 | 250 |
| 30.06.2023 | A | 25 | 250 |
| 01.07.2023 | A | 34 | 250 |
| 05.07.2023 | A | 50 | 250 |
| 10.07.2023 | A | 65 | 250 |
| 27.07.2023 | A | 65 | 250 |
Betreff: Tabelle entsprechend dem Datum aktualisieren, das kleiner oder gleich dem Datum der Referenzdatei istDer Zweck der Diskussions-Community im Hinblick auf Hilfe bei Skripten besteht nicht darin, eine Quelle für die Generierung von Skripten auf Abruf zu sein.Es soll Einzelpersonen dabei helfen, Probleme mit Skripten, die sie entwickeln, zu überwinden und ihre Fähigkeit zu verbessern, ihre eigenen Skripte zu verbessern.
Wenn Sie sich nicht die Zeit genommen haben, den Scripting Guide zu lesen, empfehle ich Ihnen dringend, dies zu tun.Es zeigt Ihnen die Details der Skriptsprache und Sie werden daraus erkennen, dass JSL eine vollständige Skriptsprache ist, die praktisch alles verarbeiten kann, was Sie ihr in den Weg stellen.Was Ihre aktuelle Frage betrifft, können Sie jedoch problemlos bedingte „IF()“-Anweisungen platzieren, um zu definieren, wann das Update ausgeführt werden soll oder nicht.Unten finden Sie eine Illustration davon
For( row = 1, row <= N Rows( dtA ), row++,
If( dtb:Date == Today(),
If( dtA:date[row] <= Col Max( dtB:date ),
dtA:Ref[row] = dtB:ref[Max(
dtB << get rows where( dtB:date <= dtA:date[row] )
)],
dtA:Ref[row] = .
)
)
);