-
L'importanza degli standards
-
Se compraste una macchina e vi accorgeste che hanno scambiato la posizione del freno con quella della frizione, oppure che hanno messo la leva del tergicristallo vicino al freno a mano, non vi incazzereste ?? E non tirereste una maledizione ai progettisti ogni volta che sbagliate un'operazione a causa di quegli spostamenti ?
E' quello che succede a me quotidianamente con una nuova tastiera wireless (una Microsoft 700) in cui i 6 tasti Home/End, PgUp/PgDn e Ins/Canc sono posizionati con un layout 2x3 (2 colonne, 3 righe) invece che il classico 3x2.
Usando molto il tasto End per andare a fine riga durante la digitazione di codice in Visual Studio, la mano dopo anni di abitudine cade sempre in posti sbagliati. Capisco la volontà di risparmiare qualche centimetro di spazio, ma i progettisti dovrebbero veramente pensarci su 2000 volte prima di cambiare un layout che ormai fa appunto parte di uno "standard" e per questo dovrebbe essere mantenuto.
Microsoft comunque è in buona compagnia: le tastiere Logitech dei miei colleghi hanno lo stesso problema (evidenziato maggiormente dal fatto che il tasto Canc ha una dimensione doppia ed è molto vicino al Return), e ancor peggio ha fatto Lenovo con i suoi portatili scambiando il Control con il Fn (come ha fatto notare un ex MVP che ha risolto in modo drastico...)

-
Database naming conventions: addio a tab, vw, sp
-
Ieri ho preso una drastica decisione: ho deciso di cambiare la naming convention che da tempo usavo per i database sql, eliminando tutti i prefissi che usavo per le tabelle, viste, e stored procedure (che dall'avvento di Linq comunque uso molto piú raramente).
I motivi che mi hanno fatto cambiare idea sono stati due. Il primo è che comunque si tratta di una sorta di notazione "ungherese" che ormai in un mondo tutto typed e pieno di intellisense (per Sql2005 uso SqlPrompt, Sql2008 lo avrà di suo) non ha piú senso.
Inoltre, rinunciando ai prefissi, non devo più rinominare le N classi che ottengo dal designer di Linq to Sql di Vs2008, e soprattutto non mi espongo a strani "comportamenti" come questo:
Supponiamo di avere una tabella tabEmployees di impiegati (con chiave primaria idEmployee) che ha una Foreign Key idManager su se stessa. Se faccio drag 'n drop della tabella e rinomino dal designer la classe chiamandola Employee (ovvero togliendo il "tab") lui NON rinomina l'EntityRef attraverso la quale accedo ai dati del manager (resta "tabEmployees1" anche se comunque posso modificarla dalle properties dell'association). Più subdolo il caso in cui abbia un'altra tabella (es. una tabella Richiesta Ferie) che ha due Foreign Key sulla prima: idEmployeeRequester e idEmployeeApproval (il richiedente e l'approvatore).
In questo caso sempre se ho rinominato la classe tabEmployee in Employee, nella classe VacationRequest mi trovo l'EntityRef "Employee" che si riferisce alle seconda FK che trova (in questo caso l'approvatore), mentre la prima entityref restava nominata "tabEmployees".
Non so se ci avete capito qualcosa... io ci ho perso un po' per trovare un baco in una mia applicazione, scoperto il quale ho preso Visio e ho rasato via tutti i "tab" di qualche decina di tabelle. Occhio solo che oltre al rename delle tabelle, dovete aggiornare anche i riferimenti dentro viste, stored e trigger.
-
Left outer Join in LINQ con due condizioni
-
Non ho trovato molti esempi su come impostare una query Linq2Sql che abbia una Left Outer join con due (o più) condizioni all'interno della join; mi segno quindi qui come penso sia corretto fare:
Supponiamo di avere una tabella Employees (impiegati), una Groups (gruppi) e una JoinEmployeesGroups che mi tenga la relazione molti a molti. Voglio tirare fuori tutti i gruppi, ovvero idGroup e GroupName e una terza colonna che mi indichi se un determinato impiegato è associato a quel gruppo (il classico caso di binding ad una checkboxlist ad esempio).
In Sql, per ottenere ad esempio i gruppi a cui è associato l'impiegato 12, farei:
SELECT g.idGroup,
g.GroupName,
( CASE
WHEN j.idEmployee IS NOT NULL THEN 1
ELSE 0
END ) AS Selected
FROM Groups AS g
LEFT OUTER JOIN JoinEmployeesGroups AS j ON ( g.idGroup = j.idGroup ) AND ( j.idEmployee = 12 )
ORDER BY GroupName
ottenendo
idGroup GroupName Selected
---------- --------------- -----------
MAG Magazzino 0
MGMT Management 1
MANUF Manufacturing 0
PROC Procurement 0
HWDEV Progettisti HW 0
SWDEV Progettisti SW 1
Come tradurla in Linq to Sql ?
var qgroup = from g in db.Groups
join j in db.JoinEmployeesGroups.Where( p => p.idEmployee == 12) on g.idGroup equals j.idGroup into jg
from x in jg.DefaultIfEmpty()
orderby g.GroupName
select new { g.idGroup, g.GroupName, Selected = (x.idEmployee != null) };
La parte blu è quella "tricky" (parola grossa, era ovvio che si facesse così)... Ma dove metterla ? Alla fine non cambia praticamente niente se la mettiamo nella parte della join o nella seconda from (verificato con la query sql che genera)
var qgroup = from g in db.Groups
join j in db.JoinEmployeesGroups on g.idGroup equals j.idGroup into jg
from x in jg.Where( p => p.idEmployee == 12).DefaultIfEmpty()
orderby g.GroupName
select new { g.idGroup, g.GroupName, Selected = (x.idEmployee != null) };
Come bindare alla checkboxlist e selezionare gli item giusti è poi banale
cblGroups.DataSource = qgroup;
cblGroups.DataTextField = "GroupName";
cblGroups.DataValueField = "idGroup";
cblGroups.DataBind();
foreach (var gr in qgroup)
{
ListItem li = cblGroups.Items.FindByValue(gr.idGroup);
li.Selected = gr.Selected;
}
Ogni giorno mi innamoro sempre di più di LINQ... :-)
-
Camicie azzurre e geek
-
L'altro giorno ho visto questo divertentissimo video (Another Bubble) dove al minuto 1.40 si prende in giro il "nostro" (geek, IT manager, smanettoni, web_2.0_men, ecc) modo di vestire dicendo che portiamo sempre camicie azzurre (e pantaloni khaki)... Boh, mi sono detto, non ci ho fatto mai caso...
Oggi guardando l'intervista (high res - low res) che Paolo e Marco hanno fatto al Tech Ed di Orlando mi sono ricreduto :-)

-
HTC Touch Pro: il mio prossimo telefono
-
E' qualche settimana che sto rimuginando su quale telefono comprarmi, visto che la "cabina telefonica" JasJar/Qtek9000 è rimasta nel vecchio posto di lavoro: aspettare l'Iphone italiano ?? nooo... "troppo da fighetti" come dice Silvano :-); andare sul sicuro con un classico Nokia ?? sarebbe l'n-esimo e con Symbian e Java non ho un buon rapporto...
Visto che probabilmente dovrò ancora scrivere un po' di codice col .Net Compact Framework un telefono con Windows Mobile sarà d'obbligo e la scelta stava per cadere sul nuovo HTC Touch Diamond anche se io sono molto legato alla tastiera Qwerty e so già che ne avrei sentito la mancanza (non per niente tutt'oggi uso ancora il mio vecchio Nokia 6800).
E invece è stato da poco annunciato l'HTC Touch Pro, in pratica un Diamond che con 7 mm di spessore e 50 gr in più aggiunge una vera tastiera Qwerty...l'attesa (fine estate ?) sarà lunga !