martes, 16 de septiembre de 2008

Control calendario: mostrar los datos del datatable

De la misma manera que construimos la tabla del calendario, dentro da cada una de las celdas, montaremos otra tabla con los datos datos del DataTable, pero filtrando únicamente los correspondientes a la fecha que estamos tratando:
System.Data.DataTable datos = datos_fecha_agrupa(indice);
la variable indice es la que itera por las fechas del mes, y la función datos_fecha_agrupa devuelve un DataTable con los datos a mostrar:


    // Devuelve un datatable con los datos a mostrar para cada fecha.
    //
    // La primera columna es la fecha.
    // 
    // Si agrupar es true agrupa por la segunda columna y totaliza por la tercera.
    //
    // El origen de datos debe estar ordenado por la columna a agrupar.

    public DataTable datos_fecha_agrupa(DateTime fecha)
    {
        string artAnt = "";
        double cantAcum = 0;
        bool primero = true;
        object[] valores = new object[2];
        if (datosglobal == null)
            return null;
        DataTable datos = datosglobal;
        if (datos.Rows.Count == 0)
            return null;            // Si no hay datos, no hace nada

        if (agrupar)
        {
            Int32 total = 0;
            Int32 totalAnt = 0;
            DataTable salida = new DataTable();
            salida.Columns.Add("Artículo", System.Type.GetType("System.String"));
            salida.Columns.Add("Cantidad", System.Type.GetType("System.Double"));

            foreach (DataRow fila in datos.Rows)
            {
                if (Convert.ToDateTime(fila.ItemArray[0]).Equals(fecha))
                {
                    string art = fila.ItemArray[1].ToString();
                    double cantidad= (double)fila.ItemArray[2];
                    if (disponible)
                    {
                        total = (Int32)fila.ItemArray[3];
                    }
                    if (art.Equals(artAnt))
                    {
                        cantAcum += cantidad;
                    }
                    else
                    {
                        if (primero)
                        {
                            primero = false;
                        }
                        else
                        {
                            valores[0] = (object)artAnt;
                            if (disponible)
                                valores[1] = (object)(totalAnt - cantAcum);
                            else
                                valores[1] = (object)cantAcum;
                            salida.Rows.Add(valores);
                        }
                        artAnt = art;
                        cantAcum = cantidad;
                        if (disponible)
                            totalAnt = total;
                    }
                }
            }
            if (!primero)
            {
                valores[0] = (object)artAnt;
                if (disponible)
                    valores[1] = (object)(totalAnt - cantAcum);
                else
                    valores[1] = (object)cantAcum;
                salida.Rows.Add(valores);
            }
            return salida;
        }
        else
        {
            int campos=datos.Columns.Count-1;
            DataTable salida2 = new DataTable();
            foreach (System.Data.DataColumn dcolumna in datos.Columns)
            {
                if(!dcolumna.ColumnName.Equals("Fecha"))
                    salida2.Columns.Add(dcolumna.ColumnName, dcolumna.DataType);
            }
            foreach (System.Data.DataRow dfila in datos.Rows)
            {
                object[] val=new object[campos];
                if (Convert.ToDateTime(dfila.ItemArray[0]).Equals(fecha))
                {
                    for(int i=1;i<=campos;i++)
                        val[i-1]=dfila.ItemArray[i];
                    salida2.Rows.Add(val);
                }
            }
            return salida2;
        }
    }

No hay comentarios: