Obiettivo: contare quante righe di una colonna hanno valori vuoti.
Metodo 1 (funziona):
dt = CurrentDataTable();
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Metodo 2 (funziona):
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE></CODE></PRE><P> </P><P><U>Metodo 3 (non funziona):</U></P><PRE><CODE class=" language-jsl">Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
L'errore restituito dal debugger per il metodo 3 è "l'argomento deve essere numerico{1} nell'accesso o nella valutazione di 'Is Missing' , Is Missing/*###*/(Column( dt, "ColName" ))"
Quindi, è abbastanza facile capire che fare riferimento a una colonna con dt:ColName è identico a dt:Name("ColName"), ma sono confuso sul motivo per cui Column(dt, "ColName") si comporta in modo diverso.
Inoltre, se dovessi fare quanto segue:
ref1 = dt:ColName;
ref2 = dt:Name("ColName");
ref3 = Column(dt, "ColName");Quindi ottengo ref1 e ref2 che contengono un singolo valore numerico (corrispondente al primo valore nella colonna), mentre ref3 è un riferimento a un oggetto Colonna appropriato (come mi sarei aspettato che tutte e tre le dichiarazioni realizzassero).
I risultati ref1 e ref2 mi sembrano particolarmente strani: i metodi n. 1 e n. la colonna.Sembra che ciò che sta accadendo sia che quando dt:ColName viene impostato su una variabile, è inaccettabile utilizzare l'intero dt:ColName e si sceglie invece di impostare la variabile su dt:ColName[1].
Perché avere questo comportamento?Quando uso ref = dt:ColName , mi aspetto che restituisca lo stesso riferimento di colonna generato da ref = Colonna(dt, "ColNome") o forse una matrice/lista piena di valori che corrispondono al contenuto della colonna nell'ordine in cui appaiono.
In sostanza, le mie domande si riducono a (1) perché si comportano in modo diverso, (2) esiste un modo semplice per identificare quando è necessario utilizzare dt:ColName e quando è necessario utilizzare Column(dt, "ColName"), e (3) perché lo fa ref1 = dt:CFU restituire un riferimento al primo valore nella colonna anziché un riferimento alla colonna stessa o una matrice/lista completamente popolata che corrisponde a tutti i valori nella colonna?
Grazie!
Il motivo per cui [] è necessario è perché Get Rows Where si basa sulla riga corrente. L'utilizzo di Column("X")[] si riferisce alla riga corrente della colonna "X" ed è equivalente a Column("X")[Row()].
COME @pmroz detto, AsColumn("X") funzionerà perché restituisce un riferimento alla colonna nella riga corrente.
Messaggi come Get Rows Where e Select Where dipendono dalla riga corrente, oltre ai cicli For Each Row e alle formule di colonna.
Funzionerà anche con COME COLONNA :
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Aggiornamento: mi sono appena reso conto che il metodo n. 3 funzionerà se lo si utilizza
Print(NRows(dt<<GETROWSWHERE></GETROWSWHERE>
Mi sembra ancora un comportamento strano. Se ref = Colonna(dt, "ColNome") restituisce un riferimento di colonna, perché ho bisogno di [] qui?
Mi aspetterei il contrario - da allora ref = dt:ColName restituisce solo il primo valore nella colonna, mi aspetto di dover utilizzare [] in the GetRowsWhere(IsMissing(dt:ColName[])) e poiché Column(dt, "ColName") restituisce già un'intera colonna, perché [] è necessario?