<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Je génère de nouvelles colonnes en ajoutant quelques colonnes. Les colonnes à ajouter, j'obtiens les noms d'un fichier et je construis les noms sous forme de liste de tableaux. Les noms de colonne et le nombre de colonnes peuvent changer. Lorsque le nombre de colonnes change, je dois modifier la formule pour refléter le changement. En utilisant la liste de tableaux de noms de colonnes, existe-t-il un moyen de les ajouter dynamiquement dans la formule, sans avoir à spécifier chaque colonne que je veux ajouter,
dt=table de données actuelle();
Cols=Tableau Associatif();
Cols["A1"]={ColA, ColB, ColC} ;
Cols["A2"]={ColE, ColF, ColG} ;
Cols["abc"]={"Total1", Total2} ;
nouvelleExprcol = 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));
J'apprécierais toutes les suggestions pour mon problème.
Merci!
Il y a quelques notations que vous pouvez utiliser qui peuvent souvent rendre le jsl dynamique plus lisible :
Si vous avez besoin d'inclure des guillemets dans les chaînes, au lieu d'utiliser la notation \!" qui devient fastidieuse, vous commencez la chaîne par "\[ ... alors tous les caractères échappés suivants n'ont pas besoin du \! notation - vous terminez la chaîne avec ]"
Par exemple:
str = "\[ "Bonjour le monde" ]\" ;
afficher(str);
show(Analyser(chaîne))
Deuxièmement, si vous construisez dynamiquement une commande jsl en utilisant des variables, vous pouvez utiliser la fonction EvalInsert qui vous permet d'insérer une variable en utilisant la notation ^my_variable^.Cela évite d'avoir à utiliser SubstituteInto.
En combinant les deux méthodes, vous pouvez encapsuler du code dynamique en utilisant le modèle suivant :
Eval(Parse(EvalInsert("\[
jsl-statements ici en utilisant la notation ^ var ^ pour la substitution
]\")) );
Par exemple:
Effacer Globals();
//Créer un tableau d'exemple
dt = Nouvelle Table( "test",
Ajouter des lignes ( 3 ),
Nouvelle colonne( "A", Numérique, Continu, Format( "Meilleur", 1 ), Définir les valeurs( [0, 1, 1] ) ),
Nouvelle colonne( "B", Numérique, Continu, Format( "Meilleur", 12 ), Définir les valeurs( [0, 2, 2] ) ),
Nouvelle colonne( "C", Numérique, Continu, Format( "Meilleur", 12 ), Définir les valeurs( [0, 3, 3] ) )
);
//définit le tableau des critères
Cols = Tableau Associatif();
Cols["A1"] = {"A", "B", "C"} ;
Cols["abc"] = {"Total1", "Total2"} ;
// Créer des sous-chaînes de manière itérative
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 << Nouvelle colonne( Cols["abc"][1],
numérique, continu,
formule( Si (^s1^ > 0, 1, 0 ) )
]\")) );
Une façon de créer dynamiquement des expressions à partir de chaînes. En comparaison avec les expressions, je pense que les chaînes sont plus faciles à manipuler.
Voici un exemple. Cela "doit" être un moyen plus simple mais cela fonctionne.
Effacer les variables globales () ;
//Créer un tableau d'exemple
dt = Nouveau tableau ( "test" ,
Ajouter des lignes ( 3 ) ,
Nouvelle colonne ( "UN" , Numérique , Continu , Format ( "Meilleur" , 1 ) , Définir les valeurs ( [ 0 , 1 , 1 ] ) ) ,
Nouvelle colonne ( "B" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Définir les valeurs ( [ 0 , 2 , 2 ] ) ) ,
Nouvelle colonne ( "C" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Définir les valeurs ( [ 0 , 3 , 3 ] ) ) ,
Nouvelle colonne ( "D" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Définir les valeurs ( [ 4 , 0 , 4 ] ) ) ,
Nouvelle colonne ( "E" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Définir les valeurs ( [ 5 , 0 , 5 ] ) ) ,
Nouvelle colonne ( "F" , Numérique , Continu , Format ( "Meilleur" , 12 ) , Définir les valeurs ( [ 6 , 0 , 6 ] ) )
) ;
//définit le tableau des critères
Cols = Tableau associatif () ;
Cols [ "A1" ] = { UN , B , C } ;
Cols [ "A2" ] = { D , E , F } ;
Cols [ "abc" ] = { "Total1" , "Total2" } ;
// Créer des sous-chaînes de manière itérative
s1 = "Expr(Cols[\!"A1\!"][1])" ;
Pour ( je = 2 , je <= N articles ( Cols [ "A1" ] ) , je ++,
s1 = s1 || " + " || Remplaçant ( "Expr(Cols[\!"A1\!"][_i_])" , Expr ( _je_ ) , Carboniser ( Éval ( je ) ) )
) ;
s2 = "Expr(Cols[\!"A2\!"][1])" ;
Pour ( je = 2 , je <= N articles ( Cols [ "A2" ] ) , je ++,
s2 = s2 || " + " || Remplaçant ( "Expr(Cols[\!"A2\!"][_i_])" , Expr ( _je_ ) , Carboniser ( Éval ( je ) ) )
) ;
// Chaînes représentant des expressions, substituez _s_ aux sous-chaînes
newcol_s1 = "dt << Nouvelle Colonne( Cols[\!"abc\!"][1], Numérique, Continue, Formule( Si( _s_ > 0, 1, 0 ) ) )" ;
Remplacer dans ( newcol_s1 , Expr ( _s_ ) , s1 ) ;
newcol_s2 = "dt << Nouvelle Colonne( Cols[\!"abc\!"][2], Numérique, Continue, Formule( Si( _s_ > 0, 1, 0 ) ) )" ;
Remplacer dans ( newcol_s2 , Expr ( _s_ ) , s2 ) ;
// Analyser les chaînes complètes
e1 = Analyser ( newcol_s1 ) ;
e2 = Analyser ( newcol_s2 ) ;
// Créez de nouvelles colonnes en évaluant la sous-chaîne expr, puis les expressions complètes.
Éval ( Expr éval ( e1 ) ) ;
Éval ( Expr éval ( e2 ) ) ;