Objectif : compter combien de lignes d'une colonne ont des valeurs vides.
Méthode 1 (fonctionne) :
dt = CurrentDataTable();
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Méthode 2 (fonctionne) :
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE></CODE></PRE><P> </P><P><U>Méthode 3 (ne fonctionne pas) :</U></P><PRE><CODE class=" language-jsl">Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
L'erreur renvoyée par le débogueur pour la méthode 3 est "l'argument doit être numérique{1} lors de l'accès ou de l'évaluation de 'Is Missing' , Is Missing/*###*/(Column( dt, "ColName" ))"
Il est donc assez facile de comprendre que référencer une colonne par dt:ColName est identique à dt:Name("ColName"), mais je ne comprends pas pourquoi Column(dt, "ColName") fonctionne différemment.
De plus, si je devais faire ce qui suit :
ref1 = dt:ColName;
ref2 = dt:Name("ColName");
ref3 = Column(dt, "ColName");Ensuite, j'obtiens ref1 et ref2 contenant une seule valeur numérique (correspondant à la première valeur de la colonne), alors que ref3 est une référence à un objet Column approprié (comme je m'attendais à ce que les trois déclarations le fassent).
Les résultats ref1 et ref2 me semblent particulièrement étranges - les méthodes n°1 et n°2 ci-dessus renvoyaient le nombre correct de cellules vides dans la colonne, donc évidemment dans ces implémentations de la référence, il ne s'agissait pas seulement de regarder la première valeur dans la colonne.Il semble que ce qui se passe, c'est que lorsque dt:ColName est défini sur une variable, il est inacceptable d'utiliser l'intégralité de dt:ColName et il est plutôt choisi de définir la variable sur dt:ColName[1].
Pourquoi avoir ce comportement ?Quand j'utilise ref = dt:ColName , je m'attendrais à ce qu'il renvoie la même référence de colonne générée par ref = Colonne (dt, "ColName") ou peut-être une matrice/liste pleine de valeurs qui correspondent au contenu de la colonne dans l'ordre dans lequel elles apparaissent.
Essentiellement, mes questions se résument à (1) pourquoi ceux-ci se comportent-ils différemment, (2) existe-t-il un moyen simple d'identifier quand dt:ColName doit être utilisé et quand Column(dt, "ColName") doit être utilisé, et (3) pourquoi réf1 = dt:UFC renvoyer une référence à la première valeur de la colonne au lieu d'une référence à la colonne elle-même ou d'une matrice/liste entièrement remplie qui correspond à toutes les valeurs de la colonne ?
Merci!
La raison pour laquelle [] est nécessaire est que Get Rows Where repose sur la ligne actuelle. L'utilisation de Column("X")[] fait référence à la ligne actuelle de la colonne "X" et équivaut à Column("X")[Row()].
Comme @pmroz dit, AsColumn("X") fonctionnera car il renvoie une référence à la colonne de la ligne actuelle.
Les messages tels que Get Rows Where et Select Where dépendent de la ligne actuelle, en plus des boucles For Each Row et des formules de colonne.
Cela fonctionnera également avec COMME COLONNE :
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Mise à jour : je viens de réaliser que la méthode n°3 fonctionnera si vous l'utilisez
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Cela me semble toujours un comportement étrange. Si ref = Colonne (dt, "ColName") renvoie une référence de colonne, pourquoi ai-je besoin de [] ici ?
Je m'attendrais au contraire - puisque ref = dt:ColName ne renvoie que la première valeur de la colonne, je m'attendrais à devoir utiliser [] dans le GetRowsWhere(IsMissing(dt:ColName[])) instruction, et puisque Column(dt, "ColName") renvoie déjà une colonne entière, pourquoi [] est-il nécessaire ?