<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Bonjour,
J'essaie de mettre à jour une table de données avec les colonnes d'une autre table, en utilisant les 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. Puisque dt2 est défini par l'utilisateur, je ne peux pas connaître ces autres noms de colonnes à l'avance, d'où la nécessité d'utiliser une chaîne formatée :
// définit une chaîne pour la correspondance des colonnes
textinp = "";
matchCols = dt2 << obtenir les noms de colonnes (chaîne);
// supprime "ROUTE" de la liste des noms de colonnes dt2
pour (je = articles (matchCols), je > 0, je--,
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éner (textinep, ":" ,matchCols , " = :" ,matchCols , ", " );
);
textinp = gauche (textinep, longueur (textinp)-2);
imprimer (textinep);
// met à jour dt1
dt1 << Mise à jour (
Avec( dt2 ),
Faire correspondre les colonnes (
analyser (entrée texte)
)
);
L'analyse de textinp avec la commande update produit cette erreur (la chaîne est produite correctement comme indiqué sur la première ligne) :
":X = :X, :Y = :Y"
Inattendu ",". Il manque peut-être un ";" ou ",".
Ligne 1 Colonne 8 : :X = :X►, :Y = :Y
Pour autant que je sache, il ne devrait y avoir aucun problème pour séparer plusieurs colonnes avec des virgules à l'intérieur des colonnes de correspondance (), 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 de 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 = Ouvrir ( "$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 :
mise à jour_expr = evalinsert (
"dt1 << Mise à jour (
Avec( dt2 ),
Faire correspondre les colonnes (^textinp^)
)" ) ;
évaluer ( analyser ( mise à jour_expr )) ;