Foros del Web » Programación para mayores de 30 ;) » .NET »

realizar sumatoria de fechas

Estas en el tema de realizar sumatoria de fechas en el foro de .NET en Foros del Web. Hola a todos, hoy vengo con un problema que no he logrado solucionar por mi mismo ya que no me manejo muy bien con fechas. ...
  #1 (permalink)  
Antiguo 04/05/2010, 20:04
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
realizar sumatoria de fechas

Hola a todos, hoy vengo con un problema que no he logrado solucionar por mi mismo ya que no me manejo muy bien con fechas.

Tengo una webform donde muestro en 1 grafica las estadisticas del numero de ingenieros necesarios para cierto dia del año. Hasta aqui he podido crear la grafica (lo mas sencillo del mundo) pero necesito variaciones en la grafica, por ejemplo que en vez de mostrarme la grafica por dia me la muestre por semana, sumando el numero de ingenieros utilizados los dias de esa semana.

Estos datos (numero de ingenieros, dia del año), estan en 2 arreglos diferentes, uno de int, otro de datetime, despues paso el datetime a string para poder ser usado en las graficas (las graficas se generan con el plugin WebChart). Entonces lo que en si necesito es poder saber donde termina una semana, de forma que puedo generar nuevos arreglos donde guardar la suma de la 1er semana por ejemplo.

El forma del arreglo de strings (que puedo pasar a datetime si es necesario) con las fechas son del tipo dd/mm/aaaa. Pareciera a mi punto de vista algo sencillo pero no se me ocurre como hacerlo, esto podria solucionarme muchos de los problemas que tengo ya que habria mas pero este es basico para poder avanzar.

Por cierto, los datos son tomados de una tabla y guardados en los arreglos antes mencionados para poder manejarlos mejor.
  #2 (permalink)  
Antiguo 04/05/2010, 21:16
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: realizar sumatoria de fechas

Esta es la parte del codigo que guarda en los 2 arreglos la informacion de la tabla.

Código:
DataRow Row1;
        int noregistros = tabla.Rows.Count;
        DateTime[] fecha = new DateTime[noregistros];
        double[] cantidad = new double[noregistros];
        for (int i = 0; i < noregistros; i++)
        {
            Row1 = tabla.Rows[i];  //empieza a tomar los registros de la tabla del primero(0) hasta el ultimo (noregistros)
            fecha[i] = (DateTime)Row1[0]; //toma la fecha del registro correspondiente convertida en datetime para poder ser comparada como una fecha
            cantidad[i] = Convert.ToDouble(Row1[1]); //toma la cantidad del registro correspondiente convertida en numero de doble precision
        }
        DateTime v1 = new DateTime(año, 01, 01);
        int nosemanas = System.Globalization.CultureInfo.CurrentUICulture.Calendar.GetWeekOfYear(v1, System.Globalization.CalendarWeekRule.FirstDay, v1.DayOfWeek);
        DateTime[] semanas = new DateTime[nosemanas];
        double[] scantidad = new double[nosemanas];
edito: como veran ya tengo las fechas y cantidades de ingenieros en sus respectivos arreglos, tambien tengo otros 2 arreglos de tamaño igual al numero total de semanas del año, falta poder llenar el arreglo de semanas con el dia ultimo de cada semana y podria hacer lo que necesito.

De una vez les digo que tambien necesito hacer eso por mes y por año (aunque este ultimo solo seria sumar todos las cantidades en un solo registro, el problema vendria si quiciera mostra 3 años, pues tendria que separar los registros en estos 3 años para mostrarlos por separado en la grafica.

Esto tiene muchas variaciones, por lo que tal vez siga pidiendo ayuda aunque espero que con la solucion que me den para tomar ciertas fechas del calendario del sistema puedo hacer todo lo demas.

Última edición por LOD_Fredy; 04/05/2010 a las 21:45
  #3 (permalink)  
Antiguo 05/05/2010, 08:43
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: realizar sumatoria de fechas

Quizás te sirva la función DatePart:

Código vb:
Ver original
  1. DatePart(DateInterval.WeekOfYear, (DateTime)Row1[0])
Te devuelve el número de semana entre 1 y 53.

http://msdn.microsoft.com/es-es/libr...15(VS.80).aspx

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #4 (permalink)  
Antiguo 05/05/2010, 12:40
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: realizar sumatoria de fechas

no compa, eso no me sirve.

Tengo esto que no he probado por que me falta el arreglo con los domingos de todo el año (cada fin de semana) para poder hacer la comparacion.

Código:
DateTime ddomingo= new DateTime(); //contendra la fecha del dia domingo de cada semana para poder realizar la comparacion
        string domingo=""; //contendra la cadena domingo, se inicializa en ""
        int cont = -1;    //contador necesario para encontrar el domingo anterior a la fecha que se esta viendo
        for (int i = 0; i < nosemanas; i++)
            for (int j = 0; j < noregistros; j++)
            {
                while (domingo != "domingo") //este while es lo que permite saber que dia es domingo buscando el domingo anterior para cada fecha, de aqui la resta a los dias en vez de sumarlos
                {
                    ddomingo = fecha[j].AddDays(cont);
                    domingo = ddomingo.ToString("ddddd");
                    cont--;
                }
                domingo = ""; //domingo y cont se devuelven a sus valores inciales para que puedan volver a entra al while
                cont = -1;                  
            if (fecha[j] > ddomingo && fecha[j] <= semanas[i]) // aqui checa que la fecha que se esta viendo este entre el lunes (primer dia de esa semana) y el domingo (ultimo dia de esa semana), lo que aqui falta es tener el arreglo de semanas, que es en lo que estoy trabajando para ver si mi codigo funciona bien
                    cantidades[i] += cantidad[j];  //cuado se cumple la condicion hace la suma de la cantidad de IA de las fechas y lo guarda en cantidades, asi se suman las cantidades que correspondan a la misma semana.
          }
no soy muy bueno explicando, espero le entiendan a mi explicacion o al codigo.

[/code]
  #5 (permalink)  
Antiguo 05/05/2010, 15:38
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: realizar sumatoria de fechas

Edito: encontre la solucion, en parte el problema venia de otro parte, el numero de semanas, era 1, por lo que solo me mostraba 1 semana en la grafica pero ya lo solucione asignando a la variable nosemanas, el numero 53.

Aqui el codigo de todo el boton
Código:
    protected DataTable Semana(DataTable tabla, int año)
    {
        DataRow Row1; //Se crea un renglon de datos que servira para manejar los registros de la tabla
        int noregistros = tabla.Rows.Count; //se cuenta el numero de registros
        DateTime[] fecha = new DateTime[noregistros]; //se crean los arreglos para las fechas y cantidades de forma que puedan manejar mas libremente
        double[] cantidad = new double[noregistros];

        for (int i = 0; i < noregistros; i++)
        {
            Row1 = tabla.Rows[i];  //empieza a tomar los registros de la tabla del primero(0) hasta el ultimo (noregistros-1)
            fecha[i] = (DateTime)Row1[6]; //toma la fecha del registro correspondiente convertida en datetime para poder ser comparada como una fecha
            cantidad[i] = Convert.ToDouble(Row1[7]); //toma la cantidad del registro correspondiente convertida en numero de doble precision
        }                

        DateTime v1 = new DateTime(año, 01, 01); //se crea un dato datetime con la fecha del primer dia del año especificado para obtener el numero de semanas de ese año
        int nosemanas = 53;//System.Globalization.CultureInfo.CurrentUICulture.Calendar.GetWeekOfYear(v1, System.Globalization.CalendarWeekRule.FirstFullWeek, v1.DayOfWeek); //Esta instruccion toma el datetime antes mencionado y checa si
        DateTime[] semanas = new DateTime[nosemanas];
        double[] cantidades = new double[nosemanas];
        
        DateTime esdomingo = new DateTime(año,01,01);//"01/01/" + año.ToString());
        DateTime respaldo= new DateTime();
        respaldo=esdomingo;   
        int cont=1;

        while ("domingo" != respaldo.ToString("ddddd"))            
            respaldo = esdomingo.AddDays(cont++);
        cont=1;
        for (int i = 0; i < nosemanas; i++)
        {               
            while("domingo" != respaldo.ToString("ddddd"))
                respaldo=respaldo.AddDays(cont++);            
            semanas[i] = respaldo;//AQUI FALTA ENCONTRAR COMO OBTENER EL DIA DEL FIN DE SEMANA DE CADA SEMANA(DOMINGO)            
            cantidades[i] = 0;
            respaldo = respaldo.AddDays(7);            
        } 

        DataTable table1 = new DataTable("Tabla"); //se crea una tabla donde se guardaran los dias y la cantidad de IA para cada dia, la cual sera utilizada para generar la grafica
        table1.Clear(); //se limpia la tabla en caso de que tenga informacion
        table1.Columns.Add("semanas"); //se agrega una columna donde iran las fechas
        table1.Columns.Add("cantidades", typeof(float));
        string[] ssemana = new string[nosemanas];

        for (int i = 1; i <= nosemanas; i++)
            ssemana[i - 1] = "Semana " + i.ToString();
                
        DateTime ddomingo= new DateTime();        
        for (int i = 0; i < nosemanas; i++)
        {
            ddomingo = semanas[i].AddDays(-7);            
            for (int j = 0; j < noregistros; j++)
            {                          
                if (fecha[j] > ddomingo && fecha[j] <= semanas[i]) //aqui empieza a comparar fechas, si son iguales suma las cantidades de IA que contengan
                    cantidades[i] += cantidad[j]; //de esta forma solo quedaran fechas unicas desde el 01/01/año al 31/12/año con la
            }
        }

        for (int i = 0; i < nosemanas; i++)
        {
            DataRow row = table1.NewRow(); //se crea un nuevo renglon de datos para almacenar de 1 por 1 registro
            row[0] = ssemana[i]; //guardando la fecha (dia) en tipo cadena            
            row[1] = cantidades[i]; //la cantidad de IA correspondiente a esa fecha (dia)
            table1.Rows.Add(row); //e irlos guardando en la tabla que finalmente sera la que genere la grafica
        }

        return table1;    //se retorna la tabla para poder ser utilizada en el metodo que genera la grafica
    }
Falta comentarlo bien y acomodar el codigo para buscar reducirlo o mejorar la logica de programacion, mañana empiezo a ver eso y tambien me pongo a hacer lo otro que les mencione para ya casi tener la parte principal del proyecto.

Última edición por LOD_Fredy; 05/05/2010 a las 16:29
  #6 (permalink)  
Antiguo 06/05/2010, 04:18
Avatar de Bravenap  
Fecha de Ingreso: noviembre-2002
Ubicación: Los Arroyos, El Escorial, Madrid
Mensajes: 2.084
Antigüedad: 21 años, 5 meses
Puntos: 4
Respuesta: realizar sumatoria de fechas

Si lo has solucionado, estupendo. No obstante, la idea que yo tenía es crear un arreglo con 53 elementos, uno por semana. Al recorrer las filas por días, vas sumando el número de ingenieros si coincide el número de la semana.

Por otro lado no sé de dónde obtienes el DataTable, pero si es de una base de datos quizás podrías hacer la consulta SQL de tal manera que te agrupe el número de ingenieros si coincide el número de semana:

Código SQL:
Ver original
  1. SELECT SUM(campoNumIngenieros) AS TotalIngenierosSemana, DATEPART(ww, campoFecha) AS NumSemana
  2. FROM tblIngenieros
  3. GROUP BY DATEPART(ww, campoFecha)

Un saludo.
__________________
¡¡NO A LA GUERRA!!
Si ponemos a nuestros mensajes títulos adecuados, la gente se animará más a abrirlos y resultarán más útiles en las busquedas. ¡No a los ayuuudaaa, urgenteee y similares!
  #7 (permalink)  
Antiguo 06/05/2010, 17:56
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: realizar sumatoria de fechas

Muy buena solucion la tuya solo que en mi base de datos las fechas estan por dias, del 1 al ultimo de cada mes. Lo de tener "semana 1", etc es para ponerlo en la grafica pero en si lo que tuve que hacer es obtener el primer domingo del año 2010 por ejemplo, fue 3 de enero, a partir de ese ir sumando 7 dias para tener todos los domingos del año, esto para poder checar que las fechas esten entre el primer dia de la semana 1 (viernes) y el ultimo dia de la semana 1 y asi para cada semana. No se si se podia hacer algo mas sencillo que lo que yo hice pero fue lo que se me ocurrio y funciona. Ahora, veo que estoy diciendo algo que no hice en el codigo y es un error, necesito cambiar la parte donde checo por primera vez las fechas contra los lunes y domingos ya que el primer dia de la primer semana no es lunes (seria 28 de diciembre del 2009).

Ahora estoy peleandome con el codigo para hacer las graficas por mes.
  #8 (permalink)  
Antiguo 06/05/2010, 18:56
 
Fecha de Ingreso: junio-2008
Ubicación: Caracas
Mensajes: 135
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: realizar sumatoria de fechas

Cita:
Iniciado por Bravenap Ver Mensaje
Si lo has solucionado, estupendo. No obstante, la idea que yo tenía es crear un arreglo con 53 elementos, uno por semana. Al recorrer las filas por días, vas sumando el número de ingenieros si coincide el número de la semana.

Por otro lado no sé de dónde obtienes el DataTable, pero si es de una base de datos quizás podrías hacer la consulta SQL de tal manera que te agrupe el número de ingenieros si coincide el número de semana:

Código SQL:
Ver original
  1. SELECT SUM(campoNumIngenieros) AS TotalIngenierosSemana, DATEPART(ww, campoFecha) AS NumSemana
  2. FROM tblIngenieros
  3. GROUP BY DATEPART(ww, campoFecha)

Un saludo.
Muy buena la discución

Sobretodo el manejo de fechas ...
  #9 (permalink)  
Antiguo 06/05/2010, 20:14
 
Fecha de Ingreso: abril-2009
Mensajes: 341
Antigüedad: 15 años
Puntos: 3
Respuesta: realizar sumatoria de fechas

Ahora el codigo para sumar los IA (Ingenieros de Aplicacion) por mes.

Código:
protected DataTable Mes(DataTable tabla, int año)
    {
        DataRow Row1; //Se crea un renglon de datos que servira para manejar los registros de la tabla
        int noregistros = tabla.Rows.Count; //se asigna a noregistro el numero de registros que contiene la tabla
        DateTime[] fecha = new DateTime[noregistros]; //se crean los arreglos para las fechas y cantidades de forma que se puedan manejar mas libremente
        double[] cantidad = new double[noregistros];

        for (int i = 0; i < noregistros; i++)
        {
            Row1 = tabla.Rows[i];  //empieza a tomar los registros de la tabla del primero(0) hasta el ultimo (noregistros-1)
            fecha[i] = (DateTime)Row1[6]; //toma la fecha del registro correspondiente convertida en datetime para poder ser comparada como una fecha
            cantidad[i] = Convert.ToDouble(Row1[7]); //toma la cantidad del registro correspondiente convertida en numero de doble precision
        }

        
        int nomeses = 13;
        DateTime []meses = new DateTime[nomeses]; 
        double[] cantidades = new double[nomeses-1]; 

        DateTime mes = new DateTime(año, 01, 01);                     

        meses[0] = mes;
        for(int i=1;i<nomeses;i++)        
            meses[i]=mes.AddMonths(i);
        mes = new DateTime(año, 12, 31);
        meses[12] = mes;

        DataTable table1 = new DataTable("Tabla"); //se crea una tabla donde se guardaran los dias y la cantidad de IA para cada dia, la cual sera utilizada para generar la grafica
        table1.Clear(); //se limpia la tabla en caso de que tenga informacion
        table1.Columns.Add("meses"); 
        table1.Columns.Add("cantidades", typeof(float));
        string[] smeses = new string[nomeses-1]; 
        string srespaldo = "";
        int inc = 0;

        foreach (string rmes in CultureInfo.CurrentCulture.DateTimeFormat.MonthNames)
        {
            if(rmes!="")
            smeses[inc] = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(rmes);
            inc++;
        }        

        for(int i=0;i<nomeses-1;i++)            
            for (int j = 0; j < noregistros; j++) 
            {
                if (fecha[j] >= meses[i] && fecha[j] <= meses[i+1]) 
                    cantidades[i] += cantidad[j];
            }        

        for (int i = 0; i < nomeses-1; i++)
        {
            DataRow row = table1.NewRow();             
            row[0] = smeses[i]; 
            row[1] = cantidades[i]; 
            table1.Rows.Add(row); 
        }

        return table1;
    }
como veran, tiene mucha similitud con el de semanas aunque este esta mas pequeño, este codigo me hace pensar en la posibilidad de reducir el otro codigo ya que creo que use muchas cosas innecesarias pero bueno, no soy un programador estrella.

Etiquetas: fechas, realizar, sumatoria
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:07.