<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Estoy intentando actualizar una tabla de datos con columnas de otra tabla, utilizando criterios de columnas coincidentes definidos por una cadena.
En el siguiente ejemplo, dt1 es mi tabla principal y dt2 es una especie de archivo de configuración que contiene la columna a agregar (es decir, "RUTA"), mientras que todas las demás columnas se utilizan para hacer coincidir dt1. Dado que dt2 está definido por el usuario, no puedo conocer estos otros nombres de columnas de antemano, de ahí la necesidad de usar una cadena formateada:
// define una cadena para la coincidencia de columnas
textinp = "";
coincidirCols = dt2 << obtener nombres de columnas (cadena);
// elimina "RUTA" de la lista de nombres de columnas dt2
para (yo = nitems (matchCols), i > 0, i--,
si ( contiene (coincidenciaCols , "RUTA" ), eliminar de (matchCols, i));
);
// crea una cadena para la coincidencia de columnas
para (yo=1, yo<= nitems (matchCols), i++,
textinp = concat (texto, ":" ,matchCols , " = :" ,matchCols , ", " );
);
textinp = izquierda (texto, longitud (textinp)-2);
imprimir (entrada de texto);
// actualiza dt1
dt1 << Actualizar (
Con( dt2 ),
Coincidir columnas(
analizar gramaticalmente (entrada de texto)
)
);
Al analizar textinp con el comando de actualización se produce este error (la cadena se genera correctamente como se ve en la primera línea):
":X = :X, :Y = :Y"
Inesperado ",". Quizás falte un ";" o ",".
Línea 1 Columna 8: :X = :X►, :Y = :Y
Hasta donde yo sé, no debería haber ningún problema al separar varias columnas con comas dentro de las columnas coincidentes() y, de hecho, cuando trato de definirlo literalmente, es decir:
// actualiza dt1
dt1 << Actualizar (
Con( dt2 ),
Coincidir columnas(
:X = :X, :Y = :Y
)
);
Funciona perfectamente bien. ¿Alguna idea de por qué no puede manejar/analizar la cadena? ¡Tu ayuda es muy apreciada!
¡Gracias a los dos! ¡Solo probé la segunda respuesta, que funcionó!
Coincidir columnas() aparentemente acepta dos listas de nombres de columnas (no como cadenas) como argumento coincidente.
Prueba esto:
// tablas de ejemplo
dt2 = Abierto ( "$SAMPLE_DATA/Gran Clase.jmp" ) ;
dt1 = dt2 << subconjunto ( columnas seleccionadas ( 0 ) , tasa de muestreo ( 0,5 )) ;
dt1 << eliminar columnas ( nombre ) ;
// define la lista para la coincidencia de columnas
partidoCols = dt2 << obtener nombres de columnas () ;
Eliminar de ( partidoCols , Contiene ( partidoCols , Expr. ( nombre ))) ;
// actualiza dt1
dt1 << Actualizar ( Con ( dt2 ) , Coincidir columnas ( partidoCols = partidoCols )) ;
Esto debería funcionar:
actualización_expr = evalinsertar (
"dt1 << Actualizar(
Con( dt2 ),
Coincidir columnas(^textinp^)
)" ) ;
evaluar ( analizar gramaticalmente ( actualización_expr )) ;