Ver Mensaje Individual
  #2 (permalink)  
Antiguo 09/08/2016, 16:50
X_fran
 
Fecha de Ingreso: octubre-2007
Mensajes: 273
Antigüedad: 17 años, 1 mes
Puntos: 5
Respuesta: informe con crystal report usando procedimiento almacenado

Hola, es posible te pueda servir mediante un DataSet tipado. Creas un dataset, y le agregas los DataTables que necesites, pensando en los campos que mostrarás en el informe. Una vez completado, creas un nuevo informe enlazándolo al DataSet creado y ubicas en el informe los campos del o los datatables que incluya de dataset. Puede ser que necesites incluir uno que otro acumulado u otro campo que se clcule mediante fórmulas, directamente en el Informe.

Digamos tienes un DataSet llamado DTSCanhaRecibida que contiene al menos un DataTable nombrado CanhaRecibida, un procedimiento almacenado denominado ResumenCanhaBrutaRecibida, y para este caso muy puntual, la conexión la tomamos de una clase de la que heredamos.

Olvidémonos por un momento del tratamiento de errores.


Código C#:
Ver original
  1. internal DTSCanhaRecibida ResumenCanhaRecibida(DateTime periodoIni, DateTime periodoFin, string listadoIdZonas, Reglas.Entities.zafra zafraActiva){
  2. DTSCanhaRecibida dts=new DTSCanhaRecibida();
  3. using (SqlConnection con =  (SqlConnection)base.DataBaseHelper.GetNewConnection())
  4.                 {
  5.                     using (SqlCommand cmd = con.CreateCommand())
  6.                     {
  7.                         cmd.CommandTimeout = 300;
  8.                         cmd.CommandText = "[ResumenCanhaBrutaRecibida]";
  9.                         cmd.CommandType = System.Data.CommandType.StoredProcedure;
  10.                         cmd.Connection = con;
  11.  
  12.                         DbParameter param1 = new System.Data.SqlClient.SqlParameter("@periodoIni", System.Data.SqlDbType.DateTime);
  13.                         param1.Value = periodoIni.Date;
  14.  
  15.                         DbParameter param2 = new System.Data.SqlClient.SqlParameter("@periodoFin", System.Data.SqlDbType.DateTime);
  16.                         param2.Value = periodoFin.Date;
  17.  
  18.                         DbParameter param3 = new System.Data.SqlClient.SqlParameter("@cadenaIdZonas", System.Data.SqlDbType.NVarChar);
  19.                         param3.Value = listadoIdZonas;
  20.  
  21.                         DbParameter param4 = new System.Data.SqlClient.SqlParameter("@zafraId", System.Data.SqlDbType.Int);
  22.                         param4.Value = zafraActiva.id_zafra;
  23.  
  24.                         cmd.Parameters.Add(param1);
  25.                         cmd.Parameters.Add(param2);
  26.                         cmd.Parameters.Add(param3);
  27.                         cmd.Parameters.Add(param4);
  28.  
  29.                         SqlDataAdapter adapter = new SqlDataAdapter(cmd);
  30.                         adapter.Fill(dts, "CanhaRecibida");
  31.                     }
  32.                 }
  33. return dts;
  34. }

Lo más significativo del método, cramos un SqlDataAdapter que al instanciar se le ha pasado un objeto de tipo SqlCommand que llenará el DataTable "CanhaRecibida" de nuesto DataSet tipado al llamar al método Fill del adapter. Por supuesto, el objeto SqlCommand llamará al procedimiento almacenado.

De esta forma tenemos en una clase X, un metodo que al llamarlo, devuelve un DataSet con información, solo tenemos que crear una instancia de dicha clase, y llamar al método para llenar una variable de tipo DTSCanhaRecibida que se convertirá en DataSource de nuestro Informe, y por supuesto asignarle el informe al visor de reportes.

Qué manera de darle para "atrás y para alante" enhhh !!!!