Datenaktualisierung startenHallo
Ich habe eine Tabelle und möchte, dass das Leervolumen auf 0 aktualisiert wird

Ich habe das Skript zum Aktualisieren der Spalte „19-04-2024“ geschrieben.
das Problem ist, dass der Name der Spalte geändert werden kann und ich bevorzuge die Verwendung von Spalte (3) oder Spalte (4)
aber es funktioniert nicht.
können Sie bitte das Skript korrigieren?
dt << Datenaktualisierung beginnen;
dt << Spalte neu kodieren (
dt << Spalte (3),
{Map-Wert( _rcOrig, {., 0}, Nicht übereinstimmend( _rcNow ) )},
Eigenschaften aktualisieren( 1 ),
Zielspalte(Spalte (3) ) );
dt << Datenaktualisierung beenden;
Automatisierung und SkriptingWindowsBetreff: Datenaktualisierung beginnenAsColumn scheint hier zu funktionieren
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt[1::10, 4] = .;
dt << Recode Column(
AsColumn(dt, 4),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(AsColumn(dt, 4))
);
Dies ist ein einfacher Fall, in dem ich höchstwahrscheinlich die Datentabellen-Subskription verwenden würde.
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt[1::10, 4] = .;
missing_rows = Loc(dt[0, 4], .);
dt[missing_rows, 4] = 0;
Betreff: Datenaktualisierung beginnenEs stimmt etwas nicht
Ich habe versucht, das einfache Skript zu verwenden, um das leere Volumen in der Spalte „19-04-2024“ auf 0 zu ändern.
dt[1::10, 3] = .;
fehlende_Zeilen = Loc(dt[0, 3], .);
dt[fehlende_Zeilen, 3] = 0;

aber ich sehe, dass das Skript nicht nur den leeren Wert auf 0 ändert, das Skript ändert auch 14,3% und 21,3% auf 0

eigentlich funktioniert mein Skript gut, aber ich weiß nicht, wie ich dt: „19-04-2024“ in „Spalte 3“ ändern kann.
dt << Datenaktualisierung beginnen;
dt << Spalte neu kodieren (dt :"19-04-2024",
{Map-Wert( _rcOrig, {., 0}, Nicht übereinstimmend( _rcNow ) )},
Eigenschaften aktualisieren( 1 ),
Zielspalte (: "19-04-2024"));
dt << Datenaktualisierung beenden;
Betreff: Datenaktualisierung beginnenDieser Teil
dt[1::10, 4] = .;
war nur dazu da, zu Demonstrationszwecken einige fehlende Werte hinzuzufügen (erste zehn Zeilen der Spalte 4), damit Sie sie entfernen können.
Betreff: Datenaktualisierung beginnenja, die Kommandozeile
dt[1::10, 3] = .;
Setzen Sie alle Werte in den Zeilen 1 bis 10 in dieser dritten Spalte auf leer. Der Rest des Skripts ersetzt die leeren Werte durch 0. Entfernen Sie also einfach die Zeile, wie @jthi erklärt hat.
Betreff: Datenaktualisierung beginnenEs gibt zwei bis drei Tricks, um solche Probleme zu beheben:
- Name Ausdruck (Als Spalte(...))
- Eval(Ersetzen(Ausdr(),... , ...)))
- falls es noch eine dritte gibt, finden Sie diese hier: Expression Handling in JMP: Tipps and Trapdoors
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
my col = Name Expr( As Column( dt, 2 ) );
Eval(
Substitute(
Expr(
dt << Recode Column(
_col_,
{Map Value( _rcOrig, {14, 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( _col_ )
)
),
Expr( _col_ ), Name Expr( my col )
)
);
Betreff: Datenaktualisierung beginnenHallo
Wenn ich Ihren Vorschlag richtig verstanden habe, besteht er darin, in Ihrem Skript „19-04-2024“ zu ändern.
aber ich habe den Fehler erhalten. Können Sie überprüfen, wo ich falsch lag?
dt << Datenaktualisierung beginnen;
dt << Spalte neu kodieren (dt
( meine Spalte = Name Ausdruck(Als Spalte(Spalte(dt, 3)));
Eval( Ersetzen( Ausdr( dt << Spalte neu kodieren( _col_,
{Map-Wert( _rcOrig, {14, 0}, Nicht übereinstimmend( _rcNow ) )},
Eigenschaften aktualisieren( 1 ),
Zielspalte( _col_ ))),
Ausdruck( _col_ ), Name Ausdruck( meine Spalte ))) ),
{Map-Wert( _rcOrig, {., 0}, Nicht übereinstimmend( _rcNow ) )},
Eigenschaften aktualisieren( 1 ),
Zielspalte (: "19-04-2024"));
dt << Datenaktualisierung beenden;
Betreff: Datenaktualisierung beginnenDie Idee ist:
Holen Sie sich ein Modul, das flexibel eingesetzt werden kann, der Handle ist meine Spalte:
dt = Open( "$SAMPLE_DATA/Big Class.jmp" );
my col = Name Expr( As Column( XXX) );
Eval(
Substitute(
Expr(
dt << Recode Column(
_col_,
{Map Value( _rcOrig, {14, 0}, Unmatched( _rcNow ) )},
Update Properties( 1 ),
Target Column( _col_ )
)
),
Expr( _col_ ), Name Expr( my col )
)
);wobei As Column(XXX) ersetzt werden kann durch
- Als Spalte (Spalte ("Geschlecht"))
- Als Spalte(dt, "Geschlecht")
- Als Spalte("Geschlecht")
- Als Spalte(3)
- Als Spalte (dt, 3)
- in Ihrem Fall:
Als Spalte(dt, "19-04-2024")
oder einfach als Spalte("19-04-2024")
bearbeiten:
wie Jarmo in einem früheren Beitrag zeigt: https://community.jmp.com/t5/Discussions/Begin-Data-Update/mp/752334/highlight/true#M93383 , für Recode Column , eigentlich
- man braucht nicht einmal das Eval(Substitute(...))
- noch der Name Expr(As Column(xxx))
... Recode Column(AsColumn(xxx)...) reicht aus.
Wow!
Betreff: Datenaktualisierung beginnenSie sollten nur diesen Teil benötigen
dt << Recode Column(
AsColumn(dt, 4),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(AsColumn(dt, 4))
);
wo Sie Ihren Spaltenindex innerhalb von AsColumn definieren.
Wenn ich einen Tisch wie diesen habe

und ich möchte fehlende Werte der Spaltenindexe 1 und 3 ersetzen, dann würde ich verwenden
dt << Recode Column(
As Column(dt, 1),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(As Column(dt, 1))
);
Und
dt << Recode Column(
As Column(dt, 3),
{Map Value(_rcOrig, {., 0}, Unmatched(_rcNow))},
Update Properties(1),
Target Column(As Column(dt, 3))
);
(Zahl in der Spalte „As“ hat sich geändert)

Betreff: Datenaktualisierung beginnen
dt = Open("$SAMPLE_DATA/Big Class.jmp"); <BR />dt << Recode Column(
/*Print(.);*/AsColumn(dt, Print(1);2),
Print(2);{Print(3);Map Value(_rcOrig, {12, Print(4);0}, Unmatched(_rcNow))},
/*Print(0);*/Update Properties(Print(5);1),
/*Print(0);*/Target Column(/*Print(.);*/AsColumn(dt, Print(6);4))
);gibt
2
5
6
1
1
3
3
3
3
3
3
1
:height
- Print(0) : hier wurde kein Befehl erwartet → Fehlermeldung → /* Ich habe sie in Kommentare eingefügt */
- Drucken 2 : Das 2. Argument wird ausgewertet; die Liste bleibt wie sie ist (Liste wird nicht ausgewertet)
- Print(5) & Print (6) → Argumente der benannten Argumente werden ausgewertet
- Print(1) : jetzt wird das erste Argument ausgewertet – warum zweimal?
- Print(3) : 6 mal (!) ( unabhängig von den zu ersetzenden Werten )
- Drucken(1) : nochmal?
- [Print(.) : werden ausgewertet, verhindern aber, dass Jmp die Spalteninfos korrekt abruft → /* Ich habe sie in Kommentare eingefügt */]
- Print(4) : wird nicht angezeigt → wird hier nicht erwartet → Fehler → Werte werden durch "." ersetzt (statt 0)
- :Höhe : Rückgabewert: Zielspalte
Betreff: Datenaktualisierung beginnen(A) In
dt = Open("$SAMPLE_DATA/Big Class.jmp");
dt[1,"age"]=4;
row()=1;
AsColumn(dt, tmp=As Column(2);print(tmp);tmp /*=4*/); // column #4 , row #1= 59<BR />Sum(As Column(2) ,7) // 4 + 7 = 11<BR />Das Ergebnis von „Da Spalte (2)“ nicht Spalte 2 ist, ist es der Wert von Spalte 2 (in Zeile 1).
(B) Andererseits wird das erste Argument von Recode Column() nur bis zu einer Ebene ausgewertet, bei der As Column() die Spaltenreferenz zurückgibt.
... und NICHT der Wert der aktuellen Zeile (wie im ersten Beispiel).
Dasselbe gilt für das Argument des Target Column()- Arguments.
@joseph_morgan spricht in „Verwenden von JSL zur Entwicklung effizienter, robuster Anwendungen“ über Ausdrücke, die „zweimal ausgewertet werden“
= (EIN)
wenn dieser „Standard“ verhindert wird (B), fühlt es sich wie Magie an:)
Betreff: Datenaktualisierung beginnenAlso, was die erweiterte Syntaxhervorhebung im JSL-Editor betrifft – wertet die Funktion ihr Argument aus? Vielleicht brauchen wir eine dritte Farbe?
Betreff: Datenaktualisierung beginnenHallo
Ich habe versucht , dt: "19-04-2024" in dt [1::10, 4] zu ändern, aber das ändert das leere Volumen nicht auf 0
können Sie überprüfen, wo ich falsch lag?
dt << Datenaktualisierung beginnen;
dt << Spalte neu kodieren ( dt [1::10, 4] ,
{Map-Wert( _rcOrig, {., 0}, Nicht übereinstimmend( _rcNow ) )},
Eigenschaften aktualisieren( 1 ),
Zielspalte ( dt [1::10, 4] ));
dt << Datenaktualisierung beenden;