Dynamische Spaltenformel<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ich erzeuge neue Spalten, indem ich einige Spalten hinzufüge. Bei den hinzuzufügenden Spalten hole ich mir die Namen aus einer Datei und baue die Namen als Array-Liste auf. Die Spaltennamen und die Anzahl der Spalten können sich ändern. Wenn sich die Anzahl der Spalten ändert, muss ich die Formel bearbeiten, um die Änderung widerzuspiegeln. Gibt es eine Möglichkeit, sie mithilfe der Array-Liste der Spaltennamen dynamisch in die Formel einzufügen, ohne jede Spalte angeben zu müssen, die ich hinzufügen möchte?
dt=aktuelle Datentabelle();
Cols=Assoziatives Array();
Cols["A1"]={ColA, ColB, ColC};
Cols["A2"]={ColE, ColF, ColG};
Cols["abc"]={"Total1", Total2};
newcolExpr = Expr (
dt << New Column(Counts["abc"][1], Numeric, Continuous, Formula( If(Expr(Cols["A1"][1]) + Expr(Cols["A1"][2]) + Expr(Cols["A1"][3]) > 0,1,0)));
dt << New Column(Counts["abc"][2], Numeric, Continuous, Formula( If(Expr(Cols["A2"][1]) + Expr(Cols["A2"][2]) + Expr(Cols["A2"][3]) > 0,1,0)));
);
Eval(Eval Expr( newColExpr));
Ich würde mich über Vorschläge zu meinem Problem freuen.
Danke!
Betreff: Dynamische SpaltenformelEs gibt einige Notationen, die Sie verwenden können und die häufig dazu beitragen, dass dynamisches JSL besser lesbar ist:
Wenn Sie Anführungszeichen in Zeichenfolgen einfügen müssen, anstatt die \!"-Notation zu verwenden, was mühsam wird, beginnen Sie die Zeichenfolge mit „\[ ... dann benötigen alle nachfolgenden Escape-Zeichen nicht das \! Notation – Sie beenden die Zeichenfolge mit ]"
Zum Beispiel:
str = "\[ "Hallo Welt" ]\";
show(str);
show(Parse(str))
Zweitens können Sie, wenn Sie einen JSL-Befehl dynamisch mithilfe von Variablen erstellen, die EvalInsert-Funktion verwenden, mit der Sie eine Variable mit der Notation ^my_variable^ einfügen können.Dadurch entfällt die Notwendigkeit der Verwendung von SubstituteInto.
Durch die Kombination der beiden Methoden können Sie dynamischen Code nach dem folgenden Muster umschließen:
Eval(Parse(EvalInsert("\[
jsl-Anweisungen verwenden hier die ^var^-Notation zur Substitution
]\")));
Zum Beispiel:
Clear Globals();
//Beispieltabelle erstellen
dt = Neue Tabelle( "test",
Zeilen hinzufügen( 3 ),
Neue Spalte( „A“, Numerisch, Fortlaufend, Format( „Best“, 1 ), Werte festlegen( [0, 1, 1] ) ),
Neue Spalte( „B“, Numerisch, Fortlaufend, Format( „Best“, 12 ), Werte festlegen( [0, 2, 2] ) ),
Neue Spalte („C“, Numerisch, Fortlaufend, Format („Best“, 12), Werte festlegen ([0, 3, 3]))
);
// Definiere das Kriterienarray
Cols = Assoziatives Array();
Cols["A1"] = {"A", "B", "C"};
Cols["abc"] = {"Total1", "Total2"};
// Teilzeichenfolgen iterativ erstellen
Eval(Parse(EvalInsert("\[
s1 = Cols["A1"][1];
]\")));
For( i = 2, i <= N Items( Cols["A1"] ), i++,
Eval(Parse(EvalInsert("\[
s1 = s1 || „+“ || Cols["A1"][^i^]
]\")));
);
Eval(Parse(EvalInsert("\[
newcol_s1 = dt << Neue Spalte( Cols["abc"][1],
numerisch, kontinuierlich,
Formel( If (^s1^ > 0, 1, 0 ) )
]\")));
Betreff: Dynamische SpaltenformelHallo MS,
Danke für das ausführliche Beispiel. Mit Strings ist viel Manipulation verbunden, aber ich kann mir keinen anderen, einfacheren Weg vorstellen, dies zu tun.
Betreff: Dynamische SpaltenformelEine Möglichkeit, Ausdrücke dynamisch aus Zeichenfolgen zu erstellen. Im Vergleich zu Ausdrücken sind Strings meiner Meinung nach einfacher zu manipulieren.
Hier ein Beispiel. Es „muss“ ein einfacherer Weg sein, aber es funktioniert.
Globale löschen () ;
//Beispieltabelle erstellen
dt = Neuer Tisch ( "prüfen" ,
Zeilen hinzufügen ( 3 ) ,
Neue Spalte ( "A" , Numerisch , Kontinuierlich , Format ( "Am besten" , 1 ) , Werte festlegen ( [ 0 , 1 , 1 ] ) ) ,
Neue Spalte ( "B" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) , Werte festlegen ( [ 0 , 2 , 2 ] ) ) ,
Neue Spalte ( "C" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) , Werte festlegen ( [ 0 , 3 , 3 ] ) ) ,
Neue Spalte ( "D" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) , Werte festlegen ( [ 4 , 0 , 4 ] ) ) ,
Neue Spalte ( „E“ , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) , Werte festlegen ( [ 5 , 0 , 5 ] ) ) ,
Neue Spalte ( "F" , Numerisch , Kontinuierlich , Format ( "Am besten" , 12 ) , Werte festlegen ( [ 6 , 0 , 6 ] ) )
) ;
//definiere das Kriterienarray
Spalten = Assoziatives Array () ;
Spalten [ „A1“ ] = { A , B , C } ;
Spalten [ „A2“ ] = { D , E , F } ;
Spalten [ "ABC" ] = { „Gesamt1“ , „Gesamt2“ } ;
// Teilzeichenfolgen iterativ erstellen
s1 = "Expr(Cols[\!"A1\!"][1])" ;
Für ( ich = 2 , ich <= N Artikel ( Spalten [ „A1“ ] ) , ich ++,
s1 = s1 || „+“ || Ersatz ( "Expr(Cols[\!"A1\!"][_i_])" , Ausdruck ( _ich_ ) , Verkohlen ( Bewertung ( ich ) ) )
) ;
s2 = "Expr(Cols[\!"A2\!"][1])" ;
Für ( ich = 2 , ich <= N Artikel ( Spalten [ „A2“ ] ) , ich ++,
s2 = s2 || „+“ || Ersatz ( "Expr(Cols[\!"A2\!"][_i_])" , Ausdruck ( _ich_ ) , Verkohlen ( Bewertung ( ich ) ) )
) ;
// Zeichenfolgen, die Ausdrücke darstellen, Teilzeichenfolgen durch _s_ ersetzen
newcol_s1 = „dt << Neue Spalte( Cols[\!"abc\!"][1], Numerisch, Kontinuierlich, Formel( If( _s_ > 0, 1, 0 ) ) )“ ;
Ersetzen in ( newcol_s1 , Ausdruck ( _S_ ) , s1 ) ;
newcol_s2 = „dt << Neue Spalte( Cols[\!"abc\!"][2], Numerisch, Kontinuierlich, Formel( If( _s_ > 0, 1, 0 ) ) )“ ;
Ersetzen in ( newcol_s2 , Ausdruck ( _S_ ) , s2 ) ;
//Komplette Strings analysieren
e1 = Analysieren ( newcol_s1 ) ;
e2 = Analysieren ( newcol_s2 ) ;
//Erstellen Sie neue Spalten, indem Sie die Teilzeichenfolge expr und dann die vollständigen Ausdrücke auswerten.
Bewertung ( Evaluierungsexpr ( e1 ) ) ;
Bewertung ( Evaluierungsexpr ( e2 ) ) ;