Asp.Net, Ajax, Linq to SQL, punti, premi e figli

Che ci fanno tutte queste parole messe insieme? Smile Per capirlo, servono 2 premesse:

Premessa 1: in questi giorni, dopo aver installato Visual Studio 2008, mi stò dedicando ad studiarmi un po’ delle novità di ASP.Net, Ajax e Linq (2Sql). Lo so che, dedicandomi adesso posso apparire “in ritardo” ma non lo è. Ho l’abitudine di leggere e seguire le tecnologie in beta ma di non usarle se non in RTM (ho da pagare le bollette tongue-out).
Tale esigenza di studio è dettata sia dalla voglia di imparare cose nuove, sia dall’esigenza di mandare in produzione un progetto nuovo di zecca quindi, tanto vale, usare i nuovi strumenti!

Premessa 2: sebbene abbia la fortuna di avere una figlia stupenda (lo so…sono il papà quindi non faccio testo tongue-out), mi rendo conto ch, essendo la prima (figlia per me e mia moglie, nipote per mamma e zia), ho la tendenza a viziarla un pò (come credo tutti i papà).
Tempo fa, dopo averle comprato la cameretta nuova, di fronte alle ennesime “lamentele” sul non voler dormire da sola, mi tornò in mente il sistema che usava un vecchio amico (grazie Jo Smile): i punti!
Quando fa la brava, 1 o 2 punti. Quando non è brava, 0 punti. Se fa proprio la monella, IMAGE_020qualche punto salta via (e non è mai successo Smile ).
Ogni tot punti (soglia minima 20), mia figlia riceve un regalino, la cui entità la sceglie lei (più è grande il regalo che si sceglie, più punti deve accumulare).

Dopo queste 2 brevi premesse, dovrebbe inizare a capirsi quell’accozzagla di parole messe nel titolo!

Fino a ieri, i punti venivano gestiti su un semplice foglio di carta. Ogni sera, dopo cena, si faceva il resoconto della giornata e si segnavano i punti sul fogliettino. Si contavano i punti accumulati, si discuteva del regalo e di quanto fosse stata brava (o meno) rispetto ai giorni precedenti.

Ieri poi, avendo finito il foglietto attuale, mi è venuta l’idea di mettere in pratica un po’ di concetti nuovi su qualcosa di reale ed utile in casa (approfittando anche del server domestico).

Il risultato è questo (decisamente migliore del fogliettino):

punti_marti

( sulla grafica ci sono ampissimi margini di miglioramento … lo so tongue-out )

Ma veniamo a qualche dettaglio IT.

Il box con le stellette è uno UserControl con 3 proprietà pubbliche:

1 public string Day { get; set; } 2 public int Point { get; set; } 3 public int PUsed { get; set; }

Vengono usate per caricare i box a Runtime prendendo i dati da una tabella su un Data Base usando Linq to SQL:

1 foreach (var group in point) { 2 int pday = 0; 3 int pused = 0; 4 foreach (var pt in group) { 5 if (pt.used.Trim() == "No") { 6 pday++; 7 } else { 8 pused++; 9 } 10 } 11 UserControl_PuntiGiorno pg = (UserControl_PuntiGiorno)LoadControl("~/UserControl/PuntiGiorno.ascx"); 12 pg.Day = group.Key.Date.ToString("dd - MMM"); 13 pg.Point = pday; 14 pg.PUsed = pused; 15 dv_punti.Controls.Add(pg); 16 } 17

Fin qui, nulla di nuovo.

dc La prima cosa che mi è servita, è stata quella di estrarre i dati raggruppati per giorno (nella tabella, 1 punto = 1 riga).

(qui a sinistra, il semplicissimo DataContext relativo alla semplicissima tabella).

Per farlo, ho usato la seguente query:

1 var point = from p in dc.tblPuntis 2 where p.Data >= DateTime.Today.Subtract(new TimeSpan(30, 0, 0, 0)) && p.Data <= DateTime.Today 3 group p by p.Data into g 4 orderby g.Key 5 select g;

Essa ha lo scopo (evidente), di selezionare dalla tabella del Data Base, tutti i punti acumulati a partire dai 30 giorni antecedenti alla data attuale, e di raggrupparli per giorno.

Il tipo di ritorno di questa query è un IOrderedQueryable<IGrouping<DateTime, tblPunti>>

che mi permette di ciclare tra i gruppi e di contare sia i punti già usati (per ricevere il premio), sia quelli non ancora utilizzati. Passo poi le informazioni allo User Control che mi disegna sia le stelle in grigio (i punti usati), sia quelle gialle (i punti ancora validi).

punti_marti_adminLato amministrazione, la situazione è leggermente diversa.

E’ innanzitutto presente il calendario per selezionare i giorni in cui assegnare i punti. Lo User Control con le stelle (lo stesso usato nella home page), viene caricato in un Update Panel aggiornato ad ogni modifica sui punti.

Sotto il calendario, una semplice textbox per l’inserimento del numero di punti da aggiungere, e 2 bottoni: uno per l’aggiunta e l’altro per la decurtazione dei punti.

L’aggiunta di nuovi punti è una operazione decisamente semplice:

1 if (point > 0) { 2 PuntiDataContext dc = new PuntiDataContext(); 3 for (int i = 0; i < point; i++) { 4 tblPunti p = new tblPunti(); 5 p.punto = 1; 6 p.Data = Calendar1.SelectedDate; 7 p.used = "No"; 8 dc.tblPuntis.InsertOnSubmit(p); 9 } 10 dc.SubmitChanges(); 11 LoadPoints(); 12 }

Dopo le opportune verifiche sul numero inserito nella textbox, ciclo sul totale dei punti da inserire (ricordo: 1 punto == 1 riga), creo l’istanza di tblPunti, popolo i dati e richiamo la InsertOnSubmit. Essa, NON scrive nulla sul Data Base finchè non viene richiamato il metodo SubmitChanges del DataContext (nel mio caso, fuori dal ciclo).

Discorso simile anche per la decurtazione dei punti:

1 var punti = from p in dc.tblPuntis 2 where p.used == "No" 3 orderby p.Data 4 select p; 5 6 foreach (var item in punti) { 7 if (puntiDAsc > 0) { 8 item.used = "Si"; 9 puntiDAsc--; 10 } 11 } 12 dc.SubmitChanges(); 13

Innanzitutto vengono selezionati, in ordine di data, i punti non cancora utlizzati, vengono flaggati come utilizzati e la modifica viene persistita sul Data Base attraverso il dc.SubmitChanges.

Conclusioni

Inutile sottolineare che l’applicazione è decisamente semplice ed è stata mantenuta volutamente tale sia per l’esigenza specifica, sia per il tempo ad essa dedicato. Mettere in piedi il tutto ha portato via poco meno di 3 ore, una delle quali spesa per le rifiniture grafiche e layout.

Nel sitarello (2 pagine), non c’è nulla di architetturalmente rifinito (e ci mancherebbe) ma lo scopo che mi ero prefissato all’inizo (fare qualcosa di carino per mia figlia in poco tempoe contemporaneamente sperimentare qualcosa di nuovo) è stato raggiunto.

Le rifiniture “architetturali”, i Domain Model, S+S & CO li lascio concentrati sull’altro progetto (di cui parlerò in altri post).

Stamattina, quando mia figlia ha visto il nuovo sistema dei punti era felicissima: ora ha anche lei un sito tutto suo come Barbie tongue-out.

Cose da fare:

  1. proteggere la pagina di gestione dei punti. A giudicare da come lei usa il mediacenter, la Wii, e da come si muove agilmente sui siti di Barbie, meglio aggiungere un po’ di protezione: non vorrei trovarmi ad elargire regali più volte al giorno tongue-out
Technorati Tags: ,,