Ich versuche, Werte in mehreren Spalten mithilfe einer For-Schleife und einer If-Anweisung zu ändern. Leider werden die neuen Spalten zwar ordnungsgemäß erstellt, aber aus irgendeinem Grund werden die Werte in der zweiten Spalte auch in die erste Spalte kopiert. Was übersehe ich?
New Table( "Untitled 11",
Add Rows( 4 ),
New Column( "Column_1",
Character,
"Nominal",
Set Values( {"A1000", "A2000", "A3000", "A4000"} )
),
New Column( "Column_2",
Character,
"Nominal",
Set Values( {"B5000", "B6000", "B7000", "B8000"} )
)
);
OldColNames = { "Column_1", "Column_2" };
NewColNames = { "New_Column_1", "New_Column_2" };
nCols = N Items( OldColNames );
For( i = 1, i <= nCols, i++,
oldcol = OldColNames[i];
newcol = NewColNames[i];
New Column( newcol,
Character,
"Nominal",
Formula(
If(
"A10" <= Left( As Column( oldcol ), 3 ) <= "A19", "A-One",
"A20" <= Left( As Column( oldcol ), 3 ) <= "A29", "A-Two",
"A30" <= Left( As Column( oldcol ), 3 ) <= "A39", "A-Three",
"A40" <= Left( As Column( oldcol ), 3 ) <= "A49", "A-Four",
"B50" <= Left( As Column( oldcol ), 3 ) <= "B59", "B-Five",
"B60" <= Left( As Column( oldcol ), 3 ) <= "B69", "B-Six",
"B70" <= Left( As Column( oldcol ), 3 ) <= "B79", "B-Seven",
"B80" <= Left( As Column( oldcol ), 3 ) <= "B89", "B-Eight",
)
)
);
);Danke!
Das liegt am Namen altkol innerhalb der Formeln wird nur ausgewertet (aufgelöst), wenn die Formel ausgeführt wird, und die Formel wird nicht ausgeführt, wenn die Spalte erstellt wird, sondern zu einem späteren Zeitpunkt.Auf diesen späteren Punkt beziehen sich beide Spalten altkol , die nun in dieselbe Spalte aufgelöst wird
Um dies zu beheben, müssen Sie den alten col-Wert zum Zeitpunkt der Erstellung der Spalte wie folgt festlegen:
New Table( "Untitled 11",
Add Rows( 4 ),
New Column( "Column_1",
Character,
"Nominal",
Set Values( {"A1000", "A2000", "A3000", "A4000"} )
),
New Column( "Column_2",
Character,
"Nominal",
Set Values( {"B5000", "B6000", "B7000", "B8000"} )
)
);
OldColNames = { "Column_1", "Column_2" };
NewColNames = { "New_Column_1", "New_Column_2" };
nCols = N Items( OldColNames );
For( i = 1, i <= nCols, i++,
oldcol = OldColNames[i];
newcol = NewColNames[i];
Eval( Eval Expr(
New Column( newcol,
Character,
"Nominal",
Formula(
As Constant( col = As Name( Expr( old col ) ) );
If(
"A10" <= Left( col, 3 ) <= "A19", "A-One",
"A20" <= Left( col, 3 ) <= "A29", "A-Two",
"A30" <= Left( col, 3 ) <= "A39", "A-Three",
"A40" <= Left( col, 3 ) <= "A49", "A-Four",
"B50" <= Left( col, 3 ) <= "B59", "B-Five",
"B60" <= Left( col, 3 ) <= "B69", "B-Six",
"B70" <= Left( col, 3 ) <= "B79", "B-Seven",
"B80" <= Left( col, 3 ) <= "B89", "B-Eight",
)
)
);
) );
);Hier verwende ich die Eval( Eval Ausdruck( ... Ausdruck( var ) ... ) ) Konstrukt, um einen Teil des Skripts vorab auszuwerten, und die Als Konstante() wertet nur für die erste Zeile aus und behält diesen Wert für alle folgenden Zeilen bei (es kann Formeln beschleunigen, indem es die Zeit für die Namenssuche verhindert)
Exzellent!Ich danke dir sehr.