<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour,
J'essaie de mettre à jour une table de données avec des colonnes d'une autre table, en utilisant des critères de colonnes correspondants définis par une chaîne.
Dans l'exemple ci-dessous, dt1 est ma table principale et dt2 est une sorte de fichier de configuration contenant la colonne à ajouter (c'est-à-dire "ROUTE"), tandis que toutes les autres colonnes sont utilisées pour correspondre à dt1. Étant donné que dt2 est défini par l'utilisateur, je ne peux pas connaître ces autres noms de colonne à l'avance, d'où la nécessité d'utiliser une chaîne formatée :
// définit la chaîne pour la correspondance des colonnes
textinp = "" ;
matchCols = dt2 << obtenir les noms de colonnes (chaîne de caractères);
// supprimer "ROUTE" de la liste des noms de colonne dt2
pour (je = articles (matchCols), i > 0, i--,
si ( contient (matchCols , "ITINÉRAIRE" ), retirer (matchCols, i));
);
// crée une chaîne pour la correspondance des colonnes
pour (je=1, je<= articles (matchCols), i++,
textinp = concat (texte, ":" ,matchCols , " = :" ,matchCols , ", " );
);
textinp = la gauche (texte, longueur (textinp)-2);
imprimer (textinp);
// met à jour dt1
dt1 << Mise à jour (
Avec( dt2 ),
Faire correspondre les colonnes(
analyser (texte)
)
);
L'analyse textinp de la commande de mise à jour produit cette erreur (la chaîne est produite correctement comme indiqué dans la première ligne) :
":X = :X, :Y = :Y"
Inattendu ",". Il manque peut-être un ";" ou ",".
Ligne 1 Colonne 8 : :X = :X►, :Y = :Y
Autant que je sache, il ne devrait pas y avoir de problème pour séparer plusieurs colonnes avec des virgules à l'intérieur de match columns(), et en fait, lorsque j'essaie de le définir littéralement, c'est-à-dire:
// met à jour dt1
dt1 << Mise à jour (
Avec( dt2 ),
Faire correspondre les colonnes(
:X = :X, :Y = :Y
)
);
Cela fonctionne parfaitement bien. Une idée pourquoi il ne peut pas gérer/analyser la chaîne? Votre aide est grandement appréciée!
Merci à vous deux! J'ai seulement essayé la 2ème réponse, qui a fonctionné!
Faire correspondre les colonnes() accepte apparemment deux listes de noms de colonnes (pas sous forme de chaînes) comme argument correspondant.
Essaye ça:
// Exemples de tableaux
dt2 = Ouvert ( "$SAMPLE_DATA/Grande classe.jmp" ) ;
dt1 = dt2 << sous-ensemble ( colonnes sélectionnées ( 0 ) , taux d'échantillonnage ( 0,5 )) ;
dt1 << supprimer des colonnes ( Nom ) ;
// définit la liste pour la correspondance des colonnes
matchCols = dt2 << obtenir les noms de colonnes () ;
Retirer ( matchCols , Contient ( matchCols , Expr ( Nom ))) ;
// met à jour dt1
dt1 << Mise à jour ( Avec ( dt2 ) , Faire correspondre les colonnes ( matchCols = matchCols )) ;
Cela devrait fonctionner :
expr_mise_à_jour = evalinsert (
"dt1 << Mettre à jour(
Avec( dt2 ),
Faire correspondre les colonnes (^ textinp ^)
)" ) ;
eval ( analyser ( expr_mise_à_jour )) ;