Ziel: Zählen Sie, wie viele Zeilen einer Spalte leere Werte haben.
Methode 1 (funktioniert):
dt = CurrentDataTable();
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Methode 2 (funktioniert):
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE></CODE></PRE><P> </P><P><U>Methode 3 (funktioniert nicht):</U></P><PRE><CODE class=" language-jsl">Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Der vom Debugger für Methode 3 zurückgegebene Fehler lautet „Das Argument sollte numerisch sein{1} beim Zugriff oder bei der Auswertung von ‚Is Missing‘ , Is Missing/*###*/(Column( dt, „ColName“ ))“
Es ist also ziemlich einfach zu verstehen, dass das Verweisen auf eine Spalte durch dt:ColName mit dt:Name("ColName") identisch ist, aber ich bin verwirrt, warum Column(dt, "ColName") anders funktioniert.
Wenn ich außerdem Folgendes tun würde:
ref1 = dt:ColName;
ref2 = dt:Name("ColName");
ref3 = Column(dt, "ColName");Dann erhalte ich ref1 und ref2, die einen einzelnen numerischen Wert enthalten (entsprechend dem ersten Wert in der Spalte), während ref3 ein Verweis auf ein entsprechendes Spaltenobjekt ist (wie ich es von allen drei Deklarationen erwartet hätte).
Die Ergebnisse von ref1 und ref2 kommen mir besonders seltsam vor – die Methoden Nr. 1 und Nr. 2 oben gaben die korrekte Anzahl leerer Zellen in der Spalte zurück, sodass bei diesen Implementierungen der Referenz offensichtlich nicht nur der erste Wert in betrachtet wurde die Kolumne.Es scheint, dass es beim Festlegen von dt:ColName auf eine Variable nicht akzeptabel ist, den gesamten dt:ColName zu verwenden, und dass stattdessen die Variable auf dt:ColName[1] gesetzt wird.
Warum dieses Verhalten?Wenn ich es benutze ref = dt:ColName , würde ich erwarten, dass es entweder denselben Spaltenverweis zurückgibt, der von generiert wurde ref = Column(dt, „ColName“) oder vielleicht eine Matrix/Liste voller Werte, die dem Inhalt der Spalte in der Reihenfolge entsprechen, in der sie erscheinen.
Im Wesentlichen beschränken sich meine Fragen auf (1) warum verhalten sich diese unterschiedlich, (2) gibt es eine einfache Möglichkeit zu erkennen, wann dt:ColName verwendet werden muss und wann Column(dt, „ColName“) verwendet werden muss, und (3) warum ref1 = dt:CFU einen Verweis auf den ersten Wert in der Spalte zurückgeben, anstatt entweder einen Verweis auf die Spalte selbst oder eine vollständig ausgefüllte Matrix/Liste, die allen Werten in der Spalte entspricht?
Danke!
Der Grund dafür, dass [] benötigt wird, liegt darin, dass „Get Rows Where“ auf der aktuellen Zeile basiert. Die Verwendung von Column("X")[] bezieht sich auf die aktuelle Zeile der Spalte "X" und entspricht Column("X")[Row()].
Als @pmroz sagte, AsColumn("X") wird funktionieren, weil es einen Verweis auf die Spalte in der aktuellen Zeile zurückgibt.
Meldungen wie „Get Rows Where“ und „Select Where“ hängen zusätzlich zu „For Each Row“-Schleifen und Spaltenformeln von der aktuellen Zeile ab.
Es wird auch mit funktionieren ALS SÄULE :
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Update: Ich habe gerade festgestellt, dass Methode Nr. 3 bei Verwendung funktioniert
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Für mich kommt es mir immer noch wie ein merkwürdiges Verhalten vor. Wenn ref = Column(dt, „ColName“) gibt eine Spaltenreferenz zurück, warum brauche ich hier []?
Ich würde das Gegenteil erwarten – denn ref = dt:ColName Gibt nur den ersten Wert in der Spalte zurück, ich gehe davon aus, dass [] in der Spalte verwendet werden muss GetRowsWhere(IsMissing(dt:ColName[])) Anweisung, und da Column(dt, „ColName“) bereits eine ganze Spalte zurückgibt, warum ist [] notwendig?