¿Puedo usar una cadena concatenada como argumento de una función?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Considere este sencillo ejemplo:
dt2 = tabla de datos actual();
b = 140;
antes de Cristo = carbón(b);
imprimir(b);
imprimir(antes de Cristo);
dt2 << Nueva columna("rango"||bc||"v1",
Numérico,
Fórmula (b)
);
// dt2 = tabla de datos actual();
dt2 << Nueva columna("Rango",
Numérico,
Fórmula(Máximo(:Nombre("AA"||bc), :Nombre("BB"||bc), :Nombre("CC"||bc)) - Mínimo(:Nombre("AA"||bc) , :Nombre("BB"||bc), :Nombre("CC"||bc)))
);
Esta es la tabla:

Mensaje de error devuelto:

Hago muy poca programación JSL, ¡así que por favor ayuda!Me encantaría que esto funcionara.
Re: ¿Puedo usar una cadena concatenada como argumento de una función?Ups, ¡lo siento! Codificación JSL nocturna Parece que Craige detectó el error de paréntesis que causaba ese problema y también simplificó las cosas (gracias). Craige !).
Julian
Re: ¿Puedo usar una cadena concatenada como argumento de una función?Hola Craige,
Probaré eso.Creo que la razón por la que terminé con Nombre() en el script es que lo copié directamente del editor de fórmulas para una fórmula diferente.Y ahora creo que veo el problema con los paréntesis.
¡gracias!
Re: ¿Puedo usar una cadena concatenada como argumento de una función?Hola julián,
Probé tu script y parece funcionar parcialmente.Cuando lo ejecuté, obtuve esto:

el valor bajo la columna Rango debe ser 5, no 15.
y el registro decía esto (que no entiendo):

Parece que el máximo se evalúa correctamente y luego se detiene ahí.¿Algunas ideas?Gracias por tu ayuda
guion:
dt2 = tabla de datos actual();
b = 140;
antes de Cristo = carbón(b);
imprimir(b);
imprimir(antes de Cristo);
dt2 << Nueva columna("sesgo"||bc||"v1",
Numérico,
Fórmula (b)
);
// dt2 = tabla de datos actual();
dt2 << Nueva columna("Rango",
Numérico,
);
eval(analizar(EvalInsert(
"\[
:Rango << Establecer fórmula( Máximo(:Nombre("^"AA_"||bc^"), :Nombre("^"BB_"||bc^"), :Nombre("^"CC_"||bc )^") -
Mínimo(:Nombre("^"AA_"||bc^"), :Nombre("^"BB_"||bc^"), :Nombre("^"CC_"||bc^"))
)
]\")));
Re: ¿Puedo usar una cadena concatenada como argumento de una función?Un poco más de información para dar seguimiento a la respuesta de Julián.
Sí, puedes usar la concatenación para construir un argumento para la mayoría de las funciones.El nombre es una de las excepciones realmente extrañas; Name() es una ayuda en tiempo de análisis, no una función en tiempo de ejecución.
La mayoría de los nombres de variables JSL están bien formados, una secuencia de letras, números, guiones bajos y espacios que el analizador de JMP entiende fácilmente.Sus nombres, AA_140 , etc, están bien formados.A veces los nombres de las variables resultan confusos.Normalmente esto sucede con comas incrustadas o signos menos: radiografía o manzanas, peras .No se puede escribir una expresión JSL con estos nombres de variables sin citarla, de alguna manera. El contenedor Name() hace precisamente eso:
nombre("rayos X") + nombre("manzanas,peras")
sumará las dos variables.El nombre se procesa (no se ejecuta) cuando se analiza el código fuente JSL, no cuando se ejecuta.El argumento de Nombre debe ser una cadena simple en el momento del análisis.El código de Julian utiliza las funciones de caracteres de JMP para crear previamente la cadena concatenada y enviarla a la función de análisis.
Debido a que los nombres de las variables están bien formados (siempre es una buena idea), el contenedor de nombres no es necesario y la idea de Julian se puede simplificar aún más.(Esto también corrige un paréntesis mal colocado).
eval(analizar(EvalInsert(
"\[
:Rango << Establecer fórmula(
Máximo(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) -
Mínimo(^":AA_" || bc^, ^":BB_" || bc^, ^":CC_" || bc^) )
]\")));

Existen otras funciones JSL para manipular fórmulas directamente, sin crear ni analizar cadenas de caracteres, pero la idea de EvalInsert de Julian le permite utilizar la manipulación amigable de caracteres en JSL.
Re: ¿Puedo usar una cadena concatenada como argumento de una función?Hola shehzaad.kaka ,
Pude hacer que esto funcionara construyendo una expresión con eval, parse y eval insert. Como dijiste que eres nuevo en JSL, imagino que esto parecerá bastante críptico, así que déjame repasar dos partes importantes de esto.
Lo primero que hice fue mover la fórmula y establecerla en su propia parte, aparte de crear la columna. Esto es para que podamos concentrarnos en crear una expresión solo para configurar la fórmula de la columna. La mayor parte de esto es lo que Eval(Parse(EvalInsert( ))); está haciendo.EvalInsert es una excelente herramienta para tomar una cadena y sustituirla por variables o funciones de variables. La forma de indicar que desea una sustitución es envolviendo ^ ^ alrededor de la función o variable. Por ejemplo:
g = "Mundo";
h = EvalInsert("Hola ^g^ ");
Título (h);
h en este caso sería igual a "hola mundo", que es lo que se mostrará en un cuadro de título con el código anterior.
En su situación, utilicé evalInsert para los nombres de las columnas:
:Nombre("^"AA_"||bc^")
Si separamos esto será más claro.
:Nombre(" ^ "AA_" || antes de Cristo ^ ")
La función :Name() requiere texto entre comillas, por lo que hay comillas al principio y al final de los paréntesis. A continuación, tenemos el ^ ^ envuelto alrededor de su concatenación. Evalinsert procesa eso y la función :Name() queda con una cadena entrecomillada de AA_140. EvalInsert sustituirá en todos los lugares donde haya algo envuelto ^ ^. Hay una complicación especial y es que nuestra expresión que estamos construyendo necesita tener comillas, pero tenemos que usar comillas para designar la cadena en sí. Para manejar esto, podemos decirle a JMP que cada comilla en realidad debe ser el carácter de comilla (en lugar de una parte de la sintaxis de JMP) anteponiendo cada comilla con \! (barra-bang) o haga lo que he hecho a continuación y coloque \[ después de la cita inicial y ]\ antes de la cita final. Esto "escapa" de todas las comillas en la expresión que estamos construyendo.
A continuación, Parse() convierte la cadena de caracteres en una expresión JSL y, finalmente, Eval() ejecuta la expresión JSL y asigna la fórmula a la columna.
¡Espero que esto ayude!
Julian
PD: su código no tenía guiones bajos para los nombres de las columnas, así que los agregué.
dt2 = tabla de datos actual () ;
b = 140 ;
antes de Cristo = carbonizarse ( b ) ;
imprimir ( b ) ;
imprimir ( antes de Cristo ) ;
dt2 << Nueva columna ( "rango" || antes de Cristo || "v1" ,
Numérico ,
Fórmula ( b )
) ;
// dt2 = tabla de datos actual();
dt2 << Nueva columna ( "Rango" ,
Numérico ,
) ;
evaluar ( analizar gramaticalmente ( EvaluaciónInsertar (
"\[
:Rango << Establecer fórmula( Máximo(:Nombre("^"AA_"||bc^"), :Nombre("^"BB_"||bc^"), :Nombre("^"CC_"||bc )^") - Mínimo(:Nombre("^"AA_"||bc^"), :Nombre("^"BB_"||bc^"), :Nombre("^"CC_"||bc^" ))
)
]\" ))) ;