<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao,
Sto cercando di aggiornare una tabella di dati con colonne di un'altra tabella, utilizzando criteri di colonne corrispondenti definiti da una stringa.
Nell'esempio seguente, dt1 è la mia tabella principale e dt2 è una sorta di file di configurazione contenente la colonna da aggiungere (cioè "ROUTE"), mentre tutte le altre colonne vengono utilizzate per la corrispondenza con dt1. Poiché dt2 è definito dall'utente, non posso conoscere questi altri nomi di colonna in anticipo, da qui la necessità di utilizzare una stringa formattata:
// definisce la stringa per la corrispondenza delle colonne
testoinp = "";
matchCols = dt2 << ottenere i nomi delle colonne (corda);
// rimuove "ROUTE" dall'elenco dei nomi delle colonne dt2
per (io = articoli (matchCols), i > 0, i--,
Se ( contiene (match Cols , "PERCORSO" ), rimuovere da (matchCols, i));
);
// crea una stringa per la corrispondenza delle colonne
per (io=1, io<= articoli (matchCols), i++,
testo inp = concat (testo, ":" , matchCols , " = :" , matchCols , ", " );
);
testo inp = sinistra (testo, lunghezza (testo)-2);
Stampa (testo);
// aggiorna dt1
dt1 << Aggiornare (
Con(dt2),
Abbina colonne(
analizzare (testo)
)
);
L'analisi di textinp al comando update produce questo errore (la stringa viene prodotta correttamente come si vede nella prima riga):
":X = :X, :Y = :Y"
Inaspettato ",". Forse manca un ";" o ",".
Riga 1 Colonna 8: :X = :X►, :Y = :Y
Per quanto ne so non dovrebbero esserci problemi a separare più colonne con virgole all'interno di match columns(), e infatti quando provo a definirlo letteralmente, cioè:
// aggiorna dt1
dt1 << Aggiornare (
Con(dt2),
Abbina colonne(
:X = :X, :Y = :Y
)
);
Funziona perfettamente bene. Qualche idea sul perché non può gestire / analizzare la stringa? Il tuo aiuto è molto apprezzato!
Grazie ad entrambi! Ho provato solo la seconda risposta, che ha funzionato!
Abbina colonne() apparentemente accetta due elenchi di nomi di colonna (non come stringhe) come argomento corrispondente.
Prova questo:
// Tabelle di esempio
dt2 = Aprire ( "$SAMPLE_DATA/Big Class.jmp" ) ;
dt1 = dt2 << sottoinsieme ( colonne selezionate ( 0 ) , frequenza di campionamento ( 0,5 )) ;
dt1 << eliminare le colonne ( nome ) ;
// definisce l'elenco per la corrispondenza delle colonne
matchCols = dt2 << ottenere i nomi delle colonne () ;
Rimuovere da ( matchCols , Contiene ( matchCols , espr ( nome ))) ;
// aggiorna dt1
dt1 << Aggiornare ( Insieme a ( dt2 ) , Abbina colonne ( matchCols = matchCols )) ;
Questo dovrebbe funzionare:
aggiornamento_espr = evalinsert (
"dt1 << Aggiorna(
Con(dt2),
Abbina colonne(^textinp^)
)" ) ;
eval ( analizzare ( aggiornamento_espr )) ;