Newsgroup: it.comp.lang.visual-basic
Titolo: vb.net controllare date in un range...con una punta di polemica!

esempio:
DataStart 25/03/2010
DataEnd  05/04/2010
Mostra i giorni di aprile....
io riesco a farlo solo così
a=datastart
b=dataend
 while a<=b
        - controllo che a sia nel mese che voglio mostrare ...se si
mostro la data
        - incrementa a di un giorno
    end while
....ho recuperato dal db le date che iniziano o terminano nel mese
che
voglio mostrare e lo ho parcheggiate in una data table che scandisco.
Se sono 10 date da mostrare ok....ma se purtroppo il numero di date
da
controllare sale...degrada velocemente le prestazioni...e siccome
prima o poi andrà sul web sta roba....
Hint che vi vengono in mente???
grazie!
OT
E LA POLEMICA???
La polemica è che la cricca dei programmatori s'è ricostituita in
casta più in là!
Io capisco che mi trovo dalla parte niubba in 
vb.net
.
E capisco che è più interessante parlare di pattern MVM e reflection o
di Domain in wpf usando Silverlight...anche perchè dai 100 che
chiedono aiuto...se parli di queste cose ti seguono forse in 10...ad
esagerare!
Ovvio che lo spirito di community alla Stallman o ce l'hai o non ce
l'hai....e che c'è chi la conoscenza se la tiene stretta e chi la
condivide!
E' anche abbastanza palese che su un NG microsoft siano
psicologicamente più portati a parlare fra "esperti" piuttosto che con
i niubbi.
E' ovvio che uno come me sopporta sopporta e poi scoppia ....
e poi dà dei miopi furboni ai "colleghi" di
microsoft.public.it.dotnet.vb...tanto per non fare nomi!
Io mi sono un po rotto che un MVP mi risponda ovvietà SE mi
risponde....e tranquillamente se ne freghi negli altri casi.
Siccome non lo fanno solo a me....siccome "loro sanno" ed io "sono
ignorante"....si ficchino la loro saggezza nelle loro belle
"intelligenze sopraffine"(è un eufimismo eh!)....
Loro camperanno meglio senza niubbi a chiedere che scocciano le loro
dotte dissertazioni....ed io mi arrangerò come sempre!
Però fa pena lo spirito di community di quel NG....
spero che ICLVB si trasformi e "sfondi" anche in dotnet...c'è tutta un
altra aria qui!
Ad maiora ICLVB!!!

<cut>
Sinceramente non ho capito il tuo sfogo.
Credo che la maggior parte dei problemi
vengano risolti, su quello come su altri ng ms.
Quando sei venuto su m.p.i.o.e. credo tu
sia stato *trattato bene* e lo stesso
credo possa testimoniare Alberto, che � venuto
a trovarci 2 o tre settimane fa
(Alberto hai poi risolto?).
Al momento sugli ng Microsoft ci sono
inoltre due problemi.
1) i server ms vanno come vanno e quindi
    non � detto che il tuo post sia letto
    da chi utilizza il server news ms
2) purtoppo(e purtroppo alla n), l'interesse
    ms per i newsgroup � in forte(eufemismo)
    calo. Puntano tutto(o quasi) sui forum.
Mi spiace tu non abbia avuto riscontri.
Vedo quello che posso fare contattando
qualcuno in grado di aiutarti sull'ng
in cui hai posto la domanda o su questo.
Grazie per l'attenzione.
-- 
---------------------------
Mauro Gamberini
Microsoft MVP - Excel
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle 
firme digitali 4919 (20100305) __________
Il messaggio � stato controllato da ESET NOD32 Antivirus.
www.nod32.it
__________ Informazioni da ESET NOD32 Antivirus, versione del database delle firme digitali 4919 (20100305) __________
Il messaggio � stato controllato da ESET NOD32 Antivirus.
www.nod32.it

 Hint che vi vengono in mente???
A parte che non si capisce che versione di VB stai usando ci sono degli hint 
basici
1) Le date son numeri, puoi metterli in un vettore ed ordinarli
2) Se persisti i dati in un DB puoi poi applicare a questi una query SQL
3) Se usi dei datatable in memoria ed usi .NET magari questo ti aiuta
http://www.emmet-gray.com/Articles/SQL_Engine.htm
 

 b=dataend
(magari � per questo che non hai ricevuto risposte?)
Ciao
Raf
 

 wrote:
zac
datastart 30/03/2010
dataend   04/04/2010
i giorni fra le due date sono 6 (considero anche il datastart)
MA
quanti nel mese scelto? ad esempio aprile?
mi deve marcare
1/4/10
2/4/10
3/4/10
4/4/10
non ho trovato di meglio che generare i giorni fra le due date e
scartare quelli non in aprile(nel mese scelto) ...quelli ok li
memorizzo in una hashtable perchè al giorno accettato va abbinato un
codice!...se il giorno è già occupato ovvio che ignora e segnala
opportunamente il conflitto alle procedure apposite.
Solo che questa cosa va bene se i periodi da controllare (che derivano
da una query il cui risultato è parcheggiato in una datatable) sono
pochi ...appena salgono un po degrada ...e poi mi sembra una
sooluzione troppo "brute force"
per chi mi chiedeva la versione? VB.net 2008
scusa eh ...che cambia? Mi sembra una cosa trasparente alla versione
a meno che tu non mi voglia far usare linq per generare i giorni...ma
ti stoppo subito ...troppo lento!
per la polemica...ovvio....sono sfoghi!
Sarò nostalgico ma sono sempre rimasto alla goliardia dei Meeting...ai
flame con il compianto Lupo su Dao Ado...alle scarrozzate di zio Gibbi
per la campagna bolognese...alle polemiche del sito comune piene di
"fermento vivo"...alla "lotta" per scalare le statistiche di chi
rispondeva di più!
Convengo: un mondo che oramai esiste sempre più nei ricordi ucciso da
facebook e dall'iphone/twitter
...c'è chi ha visto Zanna in emanazione plenaria presso il santuario
di radicofani nella persona di Frà Pancrazio
...e chi vocifera che Moreno oramai faccia il venditore di Mohito
sulla spiaggia a Santo Domingo
sigh!

 ti stoppo subito ...troppo lento!
Non serve Linq, basta saper usare l'SQL sapendo che ci sono le funzioni di 
aritmetica sulle date....
E non dire che la cosa sarebbe lenta. 

 Hint che vi vengono in mente???
Ciao Wodka40,
Dato che utilizzi un DBMS ed i dati risiedono l�, io tenderei ad incapsulare 
la logica di estrazione in una stored procedure parametrica che andrai a 
parametrizzare e richiamare lato client.
Ti allego un esempio per SQL Server 2008:
USE tempdb;
GO
/* Funzione di generazione numeri interi fino ad un max di 256 */
CREATE FUNCTION dbo.ufn_GetNums(@n AS int) RETURNS TABLE
AS
RETURN
    WITH
    L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
    L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
    L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
    L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
    Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L3)
    SELECT TOP (@n) n FROM Nums ORDER BY n;
GO
CREATE PROCEDURE dbo.up_GetMonthDays(
@From AS date,
@To AS date,
@Month AS int
)
AS
DECLARE @Days AS int = DATEDIFF(day, @From, @To) + 1;
WITH CTE_Date(Date) AS
(
    SELECT DATEADD(day, n - 1, @From)
    FROM dbo.ufn_GetNums(@Days)
)
SELECT Date
FROM CTE_Date
WHERE MONTH(Date) = @Month;
GO
EXEC dbo.up_GetMonthDays '20100325', '20100405', 3;
/* Output:
Date
----------
2010-03-25
2010-03-26
2010-03-27
2010-03-28
2010-03-29
2010-03-30
2010-03-31
(7 row(s) affected)
*/
EXEC dbo.up_GetMonthDays '20100325', '20100405', 4;
/* Output:
Date
----------
2010-04-01
2010-04-02
2010-04-03
2010-04-04
2010-04-05
(5 row(s) affected)
*/
EXEC dbo.up_GetMonthDays '20100325', '20100405', 5;
/* Output:
Date
----------
(0 row(s) affected)
*/
DROP PROCEDURE dbo.up_GetMonthDays;
DROP FUNCTION dbo.ufn_GetNums;
La UDF ufn_GetNums non � altro che un generatore di numeri estremamente 
efficiente (scritta da Itzik Ben-Gan) che puoi facilmente modificare per 
generare range pi� estesi nel caso ti servissero.
La stored procedure up_GetMonthDays calcola la differenza in giorni tra le 
date passare come argomento e la successiva query non fa altro che generare 
un result set con i giorni compresi tra le due date, restituendo solo quelle 
nel mese specificato.
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo
http://social.microsoft.com/Forums/it-IT/sqlserverit
 

 Ti allego un esempio per SQL Server 2008:
Questo � un secondo esempio che utilizza una CTE ricorsiva per ottenere il 
risultato richiesto:
USE tempdb;
GO
CREATE PROCEDURE dbo.up_GetMonthDays(
@From AS date,
@To AS date,
@Month AS int
)
AS
WITH CTE_Date AS
(
    SELECT @From AS Date
    UNION ALL
    SELECT DATEADD(day, 1, Date)
    FROM CTE_Date
    WHERE Date < @To
)
SELECT *


/* Output:

(7 row(s) affected)
*/

/* Output:

(5 row(s) affected)
*/

/* Output:
Date
----------
(0 row(s) affected)
*/
DROP PROCEDURE dbo.up_GetMonthDays;
Di default il numero massimo di ricorsioni � pari a 100 e se superi tale 
valore otterrai il seguente errore:
Msg 530, Level 16, State 1, Procedure up_GetMonthDays, Line 8
The statement terminated. The maximum recursion 100 has been exhausted 
before statement completion.
Nel caso avessi la necessit� di superare tale limite, puoi specificare il 
query hint MAXRECURSION seguito dal numero massimo di ricorsioni ammesso 
(fino ad un max di 32767).
Se specifichi 0 non verr� applicato alcun limite:
WITH CTE_Date AS
(
    SELECT @From AS Date
    UNION ALL
    SELECT DATEADD(day, 1, Date)
    FROM CTE_Date
    WHERE Date < @To
)
SELECT *
FROM CTE_Date
WHERE MONTH(Date) = @Month
OPTION (MAXRECURSION 0);


 grazie!
Io nel DB ho una tabellina con i giorni dell'anno, mi serve per sapere i
festivi e altre cose.
Al cambio di anno popolo i giorni per quell'anno se non presenti.
A quel punto sarebbe una JOIN pura, la cosa pi� brutta � popolare questa
tabella, che poi in modo grezzo puoi popolare 15 anni, sono 5mila record,
non fanno paura neanche ad access.
Non � una buona soluzione ma io questa tabella me la trovo per altre
cose...

 > Ti allego un esempio per SQL Server 2008:
...ti ringrazio per la disponibilità.
VI ringrazio tutti