<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Estoy generando nuevas columnas agregando algunas columnas. Las columnas para agregar, obtengo los nombres de un archivo y construyo los nombres como una lista de matriz. Los nombres de las columnas y el número de columnas podrían cambiar. Cuando cambia el número de columnas, tengo que editar la fórmula para reflejar el cambio. Usando la lista de matrices de nombres de columna, ¿hay alguna forma de agregarlos dinámicamente en la fórmula, sin tener que especificar cada columna que quiero agregar?
dt=tabla de datos actual();
Cols=Arreglo Asociativo();
Columnas["A1"]={ColA, ColB, ColC};
Cols["A2"]={ColE, ColF, ColG};
Columnas["abc"]={"Total1", Total2};
newcolExpr = Expr (
dt << Nueva columna (Recuentos ["abc"] [1], Numérico, Continuo, Fórmula (Si (Expr (Cols ["A1"] [1]) + Expr (Cols ["A1"] [2]) + Expr(Columnas["A1"][3]) > 0,1,0)));
dt << Nueva columna (Recuentos ["abc"] [2], Numérico, Continuo, Fórmula (Si (Expr (Cols ["A2"] [1]) + Expr (Cols ["A2"] [2]) + Expr(Columnas["A2"][3]) > 0,1,0)));
);
Eval(Eval Expr( newColExpr));
Agradecería cualquier sugerencia para mi problema.
¡Gracias!
Hay un par de notaciones que puede usar que a menudo pueden ayudar a que jsl dinámico sea más legible:
Si necesita incluir comillas en las cadenas, en lugar de usar la notación \!", que se vuelve tediosa, comience la cadena con "\[ ... entonces todos los caracteres escapados subsiguientes no necesitan la \! notación - terminas la cadena con ]"
Por ejemplo:
str = "\[ "Hola Mundo" ]\";
mostrar (cadena);
mostrar (Analizar (str))
En segundo lugar, si está construyendo un comando jsl dinámicamente usando variables, puede usar la función EvalInsert que le permite insertar una variable usando la notación ^my_variable^.Esto evita la necesidad de usar SubstituteInto.
Combinando los dos métodos, puede envolver el código dinámico usando el siguiente patrón:
Eval(Analizar(EvalInsert("\[
jsl-declaraciones aquí usando la notación ^var^ para la sustitución
]\")));
Por ejemplo:
Borrar Globales();
//Hacer una tabla de ejemplo
dt = Nueva Tabla ("prueba",
Agregar filas (3),
Nueva columna ("A", Numérico, Continuo, Formato ("Mejor", 1), Establecer valores ([0, 1, 1])),
Nueva columna ("B", Numérico, Continuo, Formato ("Mejor", 12), Establecer valores ([0, 2, 2])),
Nueva columna ("C", Numérico, Continuo, Formato ("Mejor", 12), Establecer valores ([0, 3, 3]))
);
//definir la matriz de criterios
Cols = Matriz Asociativa();
Columnas["A1"] = {"A", "B", "C"};
Columnas["abc"] = {"Total1", "Total2"};
//Hacer subcadenas iterativamente
Eval(Analizar(EvalInsert("\[
s1 = Columnas["A1"][1];
]\")));
Para( i = 2, i <= N Elementos( Cols["A1"] ), i++,
Eval(Analizar(EvalInsert("\[
s1 = s1 || "+" || Columnas["A1"][^i^]
]\")));
);
Eval(Analizar(EvalInsert("\[
newcol_s1 = dt << Nueva Columna( Cols["abc"][1],
numérico, continuo,
fórmula (Si (^s1^ > 0, 1, 0))
]\")));
Una forma de construir dinámicamente expresiones a partir de cadenas. En comparación con las expresiones, creo que las cadenas son más fáciles de manipular.
Aquí un ejemplo. "Debe" ser una forma más simple, pero funciona.
Borrar Globales () ;
//Hacer una tabla de ejemplo
dt = Nueva tabla ( "prueba" ,
Agregar filas ( 3 ) ,
Nueva columna ( "A" , Numérico , Continuo , Formato ( "Mejor" , 1 ) , Establecer valores ( [ 0 , 1 , 1 ] ) ) ,
Nueva columna ( "B" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Establecer valores ( [ 0 , 2 , 2 ] ) ) ,
Nueva columna ( "C" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Establecer valores ( [ 0 , 3 , 3 ] ) ) ,
Nueva columna ( "D" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Establecer valores ( [ 4 , 0 , 4 ] ) ) ,
Nueva columna ( "MI" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Establecer valores ( [ 5 , 0 , 5 ] ) ) ,
Nueva columna ( "F" , Numérico , Continuo , Formato ( "Mejor" , 12 ) , Establecer valores ( [ 6 , 0 , 6 ] ) )
) ;
//definir la matriz de criterios
columnas = matriz asociativa () ;
columnas [ "A1" ] = { A , B , C } ;
columnas [ "A2" ] = { D , mi , F } ;
columnas [ "a B C" ] = { "Total1" , "Total2" } ;
//Hacer subcadenas iterativamente
s1 = "Expr(Columnas[\!"A1\!"][1])" ;
Para ( i = 2 , i <= N artículos ( columnas [ "A1" ] ) , i ++,
s1 = s1 || " + " || Sustituto ( "Expr(Columnas[\!"A1\!"][_i_])" , exp. ( _i_ ) , Carbonizarse ( evaluar ( i ) ) )
) ;
s2 = "Expr(Columnas[\!"A2\!"][1])" ;
Para ( i = 2 , i <= N elementos ( columnas [ "A2" ] ) , i ++,
s2 = s2 || " + " || Sustituto ( "Expr(Columnas[\!"A2\!"][_i_])" , exp. ( _i_ ) , Carbonizarse ( evaluar ( i ) ) )
) ;
// Cadenas que representan expresiones, sustituya _s_ por subcadenas
nuevocol_s1 = "dt << Nueva Columna( Cols[\!"abc\!"][1], Numeric, Continuous, Formula( If( _s_ > 0, 1, 0 ) ) )" ;
Sustituir en ( nuevocol_s1 , exp. ( _s_ ) , s1 ) ;
nuevocol_s2 = "dt << Nueva Columna( Cols[\!"abc\!"][2], Numérico, Continuo, Fórmula( If( _s_ > 0, 1, 0 ) ) )" ;
Sustituir en ( nuevocol_s2 , exp. ( _s_ ) , s2 ) ;
// Analizar cadenas completas
e1 = Analizar gramaticalmente ( nuevocol_s1 ) ;
e2 = Analizar gramaticalmente ( nuevocol_s2 ) ;
//Cree nuevas columnas evaluando la subcadena expr y luego las expresiones completas.
evaluar ( Expr evaluación ( e1 ) ) ;
evaluar ( Expr evaluación ( e2 ) ) ;