Problemi di ordinamento date

lunedì 25 febbraio 2008 - 11.09

supremeprogrammer Profilo | Newbie

Ciao a tutti,ho un problema da sottoporvi.
Mi ritrovo un datatable con n righe dove per ogni riga ho due colonne, ognuna con una data.Indi percui per ogni riga ho data_inizio_intervallo e data_fine_intervallo.
Ho poi una web form asp net (c#) con due textbox dove l'utente deve inserire altre due date.
Devo controllare che tali date non siano comprese o a cavallo degli intervalli di tempo con data inizio e data fine presi da ciascuna riga del datatable.
Insomma alla fine devo consentire il salvataggio delle date inserite dall'utente solo se esse risultano individuare un intervallo di tempo non compreso,che non comprende o che non è a cavallo di nessuno degli intervalli individuati dalle date presenti in ciascun record.
Conoscete qualche algoritmo che mi faciliti il compito o avete una qualche idea per risolvere la cosa.
Mi si continuano ad ingarbugliare le idee e non riesco ad avere un approccio corretto alla risoluzione del problema.
Ho provato a fare una matrice dove ad ogni riga oltre alle date prese dal datatable,metto l'esito della verifica rispetto alle date inserite dall'utente.Però poi,anche se in nessuna riga vi sia sovrapposizione di intervalli di tempo in caso di tentativo di inserimento della data iniziale casualmente coincidente con la data finale di uno dei periodi presenti nel datatable,mi serve comunque aumentare di un giorno la data che si sta cercando di inserire,in modo da non farle coincidere.

Grazie infinite anticipatamente

P.S.:Dubbio atroce... posso confrontare banalmente due date così: data1<data2?

Ferux Profilo | Newbie

Ciao,
per quanto riguarda il dubbio atroce in vb .net esiste una funzione DateDiff che fa il confronto tra date.


Per il resto del problema devi inserire le date in una struttura tipo Dictionary, l'importante è che implementi la IList. (se la collection implementa la Ilist può essere bindato al gridview\datagrid)

http://msdn2.microsoft.com/it-it/library/3eayzh46(VS.80).aspx

Pertanto ti tieni in Sessione la struttura e prima dell'inseriemnto verifichi che non esista l'elemento appena inserito: se il controllo va bene allora inserisci nella collection l'elemento e lo bindi al datagrid.

Spero di essere stato chiaro

Ing Ferux
[MCP MCAD]

supremeprogrammer Profilo | Newbie

Ciao,
innanzitutto grazie per la risposta.
Credo che il tutto sia un po più complesso di come pensi,questo perchè non mi devo limitare a controllare che le date che l'utente vuole inserire siano presenti tra quelle esistenti nel Dictionary o matrice che sia.Devo controllare pure che l'intervallo che ha come estremi tali date non sia compreso,che comprenda o che sia a cavallo di nessun intervallo che abbia come estremi una coppia di date presenti nella matrice o dizionario.
Mettici poi che in caso l'utente cerchi di inserire una data iniziale che coincide con una data finale esistente nel dictionary o cerchi di inserire una data finale che coincide con una data iniziale esistente nel dictionary,deve essere incrementata di un giorno la data da inserire e controllare nuovamente che il nuovo intervallo rientri nei canoni di inserimento.

In quanto a DateDiff,non esiste nulla per C#? Confrontare due date con l'operatore < o col > proprio non si può?

Grazie

Ferux Profilo | Newbie

Ciao,
ecco la versione c#

Ciao,
ecco la versione c#

public static long DateDiff(DateInterval interval, DateTime startDate, DateTime endDate)
{
long dateDiffVal = 0;
Calendar cal = Thread.CurrentThread.CurrentCulture.Calendar;
TimeSpan ts = new TimeSpan(endDate.Ticks - startDate.Ticks);
switch (interval)
{
case DateInterval.Day:
dateDiffVal = (long)ts.TotalDays;
break;
case DateInterval.Hour:
dateDiffVal = (long)ts.TotalHours;
break;
case DateInterval.Millisecond:
dateDiffVal = (long)ts.TotalMilliseconds;
break;
case DateInterval.Minute:
dateDiffVal = (long)ts.TotalMinutes;
break;
case DateInterval.Month:
dateDiffVal = (long)(((cal.GetYear(endDate)
- cal.GetYear(startDate)) * 12
+ cal.GetMonth(endDate))
- cal.GetMonth(startDate));
break;
case DateInterval.Quarter:
dateDiffVal = (long)((((cal.GetYear(endDate)
- cal.GetYear(startDate)) * 4)
+ ((cal.GetMonth(endDate) - 1) / 3))
- ((cal.GetMonth(startDate) - 1) / 3));
break;
case DateInterval.Second:
dateDiffVal = (long)ts.TotalSeconds;
break;
case DateInterval.Week:
dateDiffVal = (long)(ts.TotalDays / 7);
break;
case DateInterval.Year:
dateDiffVal = (long)(cal.GetYear(endDate) - cal.GetYear(startDate));
break;
}
return dateDiffVal;

Utilizza le collection: fai una classe Orari ed una Orario (dove Orari e una list<Orario>), nella classe orario poi metti dei metodi per il controllo sull'inserimento.
Orari orari = new Orari();
Orario orario = new Orario(datainizio,datafine);
if(orari.IsPossibleToInsert() == true)
{
orari.Add(orario);
}

IsPossibleToInsert() == in questo metodo metti le tue regole per inserire l'orario. Questo metodo è della classe Orari e quindi basta che fai un foreach sugli elementi presenti.
Nella classeorari metti il metodo privato DateDiff che ti ho fornito.

Essendo una collection implementa IList ed è bindabile.

Saluti

Ing Ferux
[MCP MCAD]
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5