<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao,
Sto cercando di aggiornare una tabella di dati con le colonne di un'altra tabella, utilizzando i criteri delle colonne corrispondenti definiti da una stringa.
Nell'esempio qui sotto, dt1 è la mia tabella principale, e dt2 è una sorta di file di configurazione contenente la colonna da aggiungere (es. "ROUTE"), mentre tutte le altre colonne sono utilizzate in corrispondenza di dt1. Poiché dt2 è definito dall'utente, non posso conoscere questi altri nomi di colonna in anticipo, quindi la necessità di utilizzare una stringa formattata:
// definisce la stringa per la corrispondenza delle colonne
textinp = "";
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 (matchCols , "ITINERARIO" ), rimuovere da (matchCols, i));
);
// crea una stringa per la corrispondenza delle colonne
per (io=1, io<= articoli (matchCols), i++,
textinp = concat (testo, ":" ,matchCols , " = :" ,matchCols , "," );
);
textinp = Sinistra (testo, lunghezza (textinp)-2);
stampa (textinp);
// aggiorna dt1
dt1 << Aggiornamento (
Con( dt2 ),
Corrispondenza 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, ad esempio:
// aggiorna dt1
dt1 << Aggiornamento (
Con( dt2 ),
Corrispondenza colonne(
:X = :X, :Y = :Y
)
);
Funziona perfettamente bene. Qualche idea sul motivo per cui non è in grado di gestire/analizzare la stringa? Il tuo aiuto è molto apprezzato!
Grazie ad entrambi! Ho provato solo la seconda risposta, che ha funzionato!
Corrispondenza colonne() apparentemente accetta due elenchi di nomi di colonne (non come stringhe) come argomento corrispondente.
Prova questo:
// Tabelle di esempio
dt2 = Aprire ( "$SAMPLE_DATA/Classe grande.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 << Aggiornamento ( Con ( dt2 ) , Corrispondenza colonne ( matchCols = matchCols )) ;
Questo dovrebbe funzionare:
aggiornamento_expr = evalinsert (
"dt1 <
Con( dt2 ),
Corrispondenza colonne(^textinp^)
)" ) ;
eval ( analizzare ( aggiornamento_expr )) ;