<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Estoy tratando de actualizar una tabla de datos con columnas de otra tabla, usando 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 para agregar (es decir, "RUTA"), mientras que todas las demás columnas se usan para hacer coincidir con dt1. Dado que dt2 está definido por el usuario, no puedo conocer estos otros nombres de columna con anticipación, de ahí la necesidad de usar una cadena formateada:
// define la cadena para la coincidencia de columnas
textoinp = "";
coincidirCols = dt2 << obtener nombres de columna (cuerda);
// eliminar "RUTA" de la lista de nombres de columna dt2
para (yo = artículos (matchCols), i > 0, i--,
si ( contiene (matchCols , "RUTA" ), eliminar de (coincidenciaCols, i));
);
// crea una cadena para la coincidencia de columnas
por (yo=1, yo<= artículos (coincidencia de columnas), i++,
mensaje de texto = concat (mensajes de texto, ":" ,matchCols , " = :" ,matchCols , ", " );
);
mensaje de texto = izquierda (mensajes de texto, longitud (textinp)-2);
impresión (mensajes de texto);
// actualizar dt1
dt1 << Actualizar (
Con (dt2),
Coincidencia de columnas (
analizar gramaticalmente (mensajes de texto)
)
);
Analizar textinp para el comando de actualización produce este error (la cadena se produce correctamente como se ve en la primera línea):
":X = :X, :Y = :Y"
Inesperado ",". Quizás falta un ";" o ",".
Línea 1 Columna 8: :X = :X►, :Y = :Y
Por lo que sé, no debería haber ningún problema para separar varias columnas con comas dentro de las columnas coincidentes (), y de hecho, cuando trato de definirlo literalmente, es decir:
// actualizar dt1
dt1 << Actualizar (
Con (dt2),
Coincidencia de 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ó!
Coincidencia de columnas() aparentemente acepta dos listas de nombres de columnas (no como cadenas) como su argumento coincidente.
Prueba esto:
// Tablas de ejemplo
dt2 = Abierto ( "$SAMPLE_DATA/Clase grande.jmp" ) ;
dt1 = dt2 << subconjunto ( columnas seleccionadas ( 0 ) , tasa de muestreo ( 0.5 )) ;
dt1 << borrar columnas ( nombre ) ;
// definir la lista para la coincidencia de columnas
coincidirCols = dt2 << obtener nombres de columna () ;
Eliminar de ( coincidirCols , Contiene ( coincidirCols , exp. ( nombre ))) ;
// actualizar dt1
dt1 << Actualizar ( Con ( dt2 ) , Coincidencia de columnas ( coincidirCols = coincidirCols )) ;
Esto debería funcionar:
actualizar_expr = Evalinsert (
"dt1 << Actualizar(
Con (dt2),
Coincidencia de columnas (^textinp^)
)" ) ;
evaluar ( analizar gramaticalmente ( actualizar_expr )) ;