Juste au moment où je pensais avoir compris Eval et Expr...Je travaille sur ce problème depuis deux jours maintenant en examinant les entrées de ce groupe de discussion, en parcourant le guide de script, etc., mais je n'arrive toujours pas à comprendre ce qui ne va pas.
J'essaie d'utiliser une variable pour référencer une colonne. À partir des lignes de script 65 à 75 (juste avant For Each Row), j'essaie toutes sortes de façons d'utiliser Expr et Eval et Name Expr et As Column, etc. pour que cela fonctionne. Le script actuel montre uniquement l'itération la plus récente.
En fonction de la valeur de aggOption, je souhaite que la colonne Agg Minute (Option 1) soit remplie de trois manières différentes. Si vous remplacez le nom de colonne réel : "Agg Minute (Option 1)"n par Eval( colName3), cela fonctionne comme prévu. Cependant, quelle que soit la combinaison de Eval, Expr, etc. que j'utilise pour définir la variable ou pour l'évaluer, j'obtiens le message d'erreur suivant...

... OU le script s'exécute sans erreur mais la colonne n'est pas remplie.
Il semble donc que le côté gauche de l’affectation ne soit pas interprété comme un nom de colonne.
Je suis sûr qu'il s'agit d'un simple malentendu de ma part quant au fonctionnement d'Eval et d'Expr ou de la fonction Choose. Mais je n'arrive pas à comprendre ce que c'est.
Est-ce que quelqu'un a une idée de ce que je fais mal ?
Merci comme toujours.
Names Default To Here( 1 );
// SETUP: Create Raw Data Table
Try( Close( "Interpolated Data"));
Try( Close( "Test rt"));
rt = New Table( "Test rt",
Add Rows( 5 ),
New Column( "Timestamp", Continuous, Format( "m/d/y h:m", 19 ), set values( [3742070400, 3742070880, 3742071360, 3742071840, 3742072320] ) ),
New Column( "Data", set values( [899.084, 897.387, 898.518, 897.575, 897.387] ) )
);
t1 = column( rt,1) << Get Name;
t2 = column( rt,2) << Get Name;
timeCol = Parse(":" || t1);
dataCol = Parse(":" || t2);
Print( timeCol);
Print( dataCol);
rtRows = N Rows( rt );
startTime = rt:Timestamp[1];
endTime = rt:Timestamp[rtRows];
minDuration = (endTime - startTime) / 60;
// CREATE SECONDARY TABLE
dt = New Table( "Interpolated Data Temp" );
dt << New Column( "Timestamp", Format( "m/d/y h:m", 19 ), Set Display Width( 250 ) );
dt << Add Rows( minDuration );
For Each Row( dt, :Timestamp[] = Sequence( startTime, endTime, 60 ) );
// JOIN BOTH TABLES
dt << Join(
With( rt ),
Suppress formula evaluation( 0 ),
Select( :Timestamp ),
SelectWith( Name Expr(dataCol)),
By Matching Columns( :Timestamp = :Timestamp ),
Drop multiples( 0, 0 ),
Include Nonmatches( 1, 0 ),
Preserve main table order( 1 ),
Output Table( "Interpolated Data" )
);
dt2 = Data Table( "Interpolated Data" );
Close( dt, NoSave );
Close( rt, NoSave );
// CREATE AGG MINUTE/AGG QUADRANT COLUMNs
// These are the columns that will define which minutes are included in each quadrant and how the quadrant will be labled.
// The choice of how the columns will be filled depends on the Option chosen above.
// **************************************************************************
aggOption = 1;
colName1 = "Agg Minute (Option " || char(aggOption) || ")";
colName2 = "Agg Quadrant (Option " || char(aggOption) || ")";
Print( colName1);
Print( ColName2);
colName3 = Name Expr(":" || colName1);
colName4 = Name Expr(":" || colName2);
Print( colName3);
Print( colName4);
New Column(colName1, Numeric, "Ordinal", Format("Best", 12), Set Display Width(116)); // To Do: Add chosen agg option to column name
New Column(colName2, Numeric, "Ordinal", Format("Best", 12), Set Display Width(116)); // To Do: Add chosen agg option to column name
For Each Row(dt2,
Eval(colName3) = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);Automatisation et scriptsRe: Juste au moment où je pensais avoir compris Eval et Expr...Il n'est presque jamais nécessaire de commencer à jouer avec ":" (en ajoutant ":" en tant que chaîne) et encore moins avec Parse(). Lorsque vous définissez des valeurs dans une colonne avec For Each Row, vous pouvez faire quelque chose comme ceci par exemple
For Each Row(
dt2,
Column(dt2, colName1)[Row()] = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);
Ce n'est pas la seule option mais c'est très simple. Si vous voulez vraiment commencer à jouer avec les expressions, c'est une façon
Eval(EvalExpr(
For Each Row(
dt2,
Expr(Name Expr(AsColumn(dt2, colName1))) = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);
));
Une bonne chose avec EvalExpr (même chose avec Substitute) est que vous pouvez facilement voir l'expression qui sera évaluée si Eval est utilisé, mais en sélectionnant la partie EvalExpr() puis en l'exécutant

Re: Juste au moment où je pensais avoir compris Eval et Expr...Merci, Jarmo.
J'ai essayé les options avec analyse et avec et sans les deux points initiaux sans succès. Cependant, je n'ai pas essayé les combinaisons que vous avez montrées ci-dessus. Cela prend tout son sens une fois que vous voyez que c'est fait.
Re: Juste au moment où je pensais avoir compris Eval et Expr...Il est intéressant de constater que vous avez besoin de la fonction Row() ici alors qu'elle n'est pas nécessaire si vous utilisez le nom réel de la colonne. Je ne l'aurais pas deviné.
Re: Juste au moment où je pensais avoir compris Eval et Expr...C'est juste ma méthode préférée car j'utilise Column(dt, colname) chaque fois que je le peux (vous pouvez également supprimer Row() et simplement utiliser Column()[]). Je pense que cela devrait également fonctionner avec As Column()
For Each Row(
dt2,
As Column(dt2, colName1) = Choose(aggOption, // Substituting an actual column name (:"Agg Minute (Option 1)"n works)
If(
Minute(:Timestamp) < 15, 15, // Option 1
Minute(:Timestamp) < 30, 30,
Minute(:Timestamp) < 45, 45,
0
),
If(
Minute(:Timestamp) < 15, 0, // Option 2
Minute(:Timestamp) < 30, 15,
Minute(:Timestamp) < 45, 30,
45
),
If(
0 < Minute(:Timestamp) <= 15, 15, // Option 3
15 < Minute(:Timestamp) <= 30, 30,
30 < Minute(:Timestamp) <= 45, 45,
0
)
)
);
mais à mon avis, As Column() est beaucoup plus ennuyeux à utiliser donc je ne l'utilise pas beaucoup... Sauf quand je l'utilise avec Name Expr() et que j'essaie de construire quelque chose qui nécessite d'avoir le format :col ou qu'il est simplement plus propre d'avoir une colonne dans ce format (comme dans les formules).