En un DataTable el método Compute calcula la expresión dada de las filas actuales que cumplen los criterios de filtro.
Cuando lo utilizamos sobre una tabla el resultado esperado son valores como un string, un integer, etc. A este valor obtenido debemos hacerle una conversión al tipo de dato que deseamos ya que podría generar error por diferencias de objetos.
ds.Tables("Ordenes").Compute("Sum(Total)", "CodigoVendedor = 5")
Parámetros
expression: Expresión que se va a calcular.
filter: Filtro que va a limitar las filas que se evalúan en la expresión.
Valor de retorno: Como mencionamos anteriormente es un objeto sin tipo de datos definido, por este motivo es que hay que aplicarle una conversión (Convert,ctype, cdate, cstr, etc).
Cuáles son las expresiones válidas cuando utilicemos Compute?
Descripción: Count(Empleados) donde Empleados sería el nombre de la columna.
Sum (Suma)Avg (Promedio)
Min (Mínimo)
Max (Máximo)
Count(Recuento)
StDev (Desviación estadística estándar)
Var (Varianza estadística)
Algo muy importante es que en la expresión no se pueden hacer operaciones matemáticas como multiplicar dos columnas (o sumar, restar, dividir, etc)
Sum (Cantidad * Precio) -> NO
Si realmente necesita una operación en dos o más columnas debe crear un DataColumn, establecer su propiedad Expression adecuada y utilizar una expresión de Compute en la columna resultante. En ese caso, dado un DataColumn con el nombre «total» y la propiedad Expression establecida, Cantidad * Precio. Luego en el método Compute si hace Sum(total) para obtener el valor esperado.
El segundo valor en el método Compute es el filtro, donde igual en el SQL una especie de where donde le indicamos los criterios que nos retornen solo los datos que ocupemos.
FechaNacimiento > 1/1/1980 AND FechaNacimiento < 1/1/1990
Edad = 18
Precio <= 2000
Filtros posibles
- <
- >
- <=
- >=
- <>
- =
- IN
- LIKE
Ejemplos
[VB]
Private Sub CalculoOrdenesDia(ByVal ds As DataSet) 'DataTable llamado "Ordenes" que contiene una columna de "Total" Dim CantidadOrdenes as Integer CantidadOrdenes = CType(ds.Tables("Ordenes").Compute _ ("Sum(Total)", "CodigoVendedor = 5"),Integer) End Sub
[C#]
private void CalculoOrdenesDia(DataSet myDataSet){ // DataTable llamado "Ordenes" que contiene una columna de "Total" Integer CantidadOrdenes; CantidadOrdenes = (int)myDataSet.Tables["Ordenes"].Compute("Sum(Total)", "CodigoVendedor = 5"); }