C sharp - Sumar un campo por rango de fechas en C#

 
Vista:

Sumar un campo por rango de fechas en C#

Publicado por Lourdes (1 intervención) el 20/12/2018 14:37:35
Hola!

Tengo un programa WindowsForm en Visual studio el cual se conecta a una base de datos SQL Server.

En una de las tablas "Pedido" se guarda toda la información de un pedido con la Fecha (DateTime) y Ganancia (Money), al igual que su clase en VisalStudio

Necesito que calcula el total de las ganancia según dos datepicker de un form (fecha desde y fecha hasta) que hagan referencia a la fecha del pedido. Para esto realizo lo siguiente

Procedimiento almacenado en base de datos SQL

1
2
3
4
5
6
7
8
9
10
11
ALTER PRODECURE [Ganancias_Reporte]
 
@Fecha1 Datetime,
 
@Fecha2 Datetime
 
as
 
select sum(Ganancia) as Ganancias from Pedidos
 
where Fecha between @Fecha1 and @Fecha2


Luego realizo la conexión del programa a sp en la clase SQL que utiliza SqlClient

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public DataTable Reporte_Ganancias(DateTime Fecha1, DateTime Fecha2)
{
 
    string sql = "Ganancias_Reportes";
 
    SqlConnection cn = new SqlConnection(connect);
 
    SqlCommand cmd = new SqlCommand(sql, cn);
 
    cmd.CommandType = CommandType.StoredProcedure;
 
    cmd.Parameters.AddWithValue("@Fecha1", Fecha1);
 
    cmd.Parameters.AddWithValue("@Fecha2", Fecha2);
 
    SqlDataAdapter da = new SqlDataAdapter(cmd);
 
    DataTable dt = new DataTable();
 
    cn.Open();
 
    da.Fill(dt);
 
    cn.Close();
 
    return dt;
 
}


Luego hago el llamado del StoredProcedure desde el Form para que muestre en pantalla en valor del DataTable:

1
2
3
4
5
private void btnCalcular_Click(object sender, EventArgs e)
{
    DataTable dt =        sql.Reporte_Ganancias(DateTime.Parse(dtpFechaDesde.Text), DateTime.Parse(dtpFechaHasta.Text));
    MessageBox.Show("Ganancias = " + dt.ToString());
}

El valor que me devuelve es nulo. Haciendo el debug las fechas las asigna correctamente pero el dt lo retorna null.

Realizo la query en la base de datos reemplazando las variables por las fechas indicadas

1
2
3
select sum(Ganancia) from Pedidos
 
where Fecha between '13/12/2018 0:00:00' and '13/12/2018 0:00:00'

y me devuelve un valor de 2940

También probé asignando las variables como varhcar en el sp y como string en el programa para que pase las fechas con formato texto y tambien devuelve nulo.

¿Qué puedo hacer? Necesito ayuda
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Sumar un campo por rango de fechas en C#

Publicado por miguelZ (8 intervenciones) el 20/12/2018 17:30:42
Hola,
recuerda que estas regresando un data table por loque debes leer la tabla por campo y numero de renglones

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//pseudo codigo
DataTable dt = sql.Reporte_Ganancias(DateTime.Parse(dtpFechaDesde.Text), DateTime.Parse(dtpFechaHasta.Text));
 
 
// si sabes que siempre devuelve un renglon
 
var suma=  dt.row[0].[0];
 
// .O un  Loop  para todos los renglones
 
foreach (DataRow row in dt.Rows)
{
    // ... total 
    Console.WriteLine(row.Field<doble>(0));
}

La pregunta es si solo devuelves un valor porque regresar una tabla es mejor que
tu stored procedure lo ejecutes como un escalar, asi solo obtienes una cantidad.
Y no habria necesidad de leer una tabla

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Sumar un campo por rango de fechas en C#

Publicado por William Brito (2 intervenciones) el 20/12/2018 17:43:57
El stored procedure no retorna un entero/decimal, retorna una coleccion de resultados en forma un dataset, en tu caso contiene una unica tabla que tiene una sola columna y una sola fila.
1
2
3
4
5
6
7
var dataset = new Dataset();
 
// tu data-adapter
da.Fill(dataset);
 
// buscar el valor en la primera tabla, primera fila, lo que sea que este en la primera columna....
string resultado_asString =  dataset.Tables[0].Rows[0][0].ToString();



no hagas copy and paste, esto lo escribi aqui mismo y puede contener errores tontos. Solo debes recordar que un stored procedure puede contener varias sentencias select y el resultado de cada una es retornado, por eso el resultado de la ejecucion es un dataset no una unica DataTable.

Espero te sea util.

William
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar