Technology Experience
.NET World

Automatizzare Reporting Services con codice managed

Reporting Services di SQL Server 2005 non significa solo report esposti da IIS e quindi raggiungibili via browser, ma significa anche avere un componente lato client per fare esattamente la stessa cosa. E’ quello che ho fatto nell’applicazione di fatturazione che ho reso pubblica molto, molto tempo fa.

I report sono in formato RDLC ed usando la finestra di preview è possibile stampare sulla stampante di default, esportare in PDF e fare le solite cose fattibili con un’anteprima di stampa (zoom, regolare l’orientamento della pagine, decidere la stampante, settare il numero di copie, etc.). Ma non solo.

L’architettura di Reporting Services permette di scrivere codice managed per ottenere lo stesso risultato raggiungibile dalla classica UI. Per esempio: possiamo lanciare una stampa di una certa fattura senza alcuna richiesta da parte dell’utente, e possiamo esportare un report di stampa in qualsiasi formato, tra cui il PDF. Ecco qualche link utile per questo tipo di approccio.

Programattically render pdf from ReportViewer
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=240094&SiteId=1

Walkthrough: Printing a Local Report without Preview
http://msdn2.microsoft.com/en-us/library/ms252091(VS.80).aspx

Due piccole note. L’esportazione in formato PDF è piuttosto semplice, perchè il metodo Render esposto dalla classe LocalReport non fa altro che ritornare un byte[] che poi va salvato su disco dandogli un nome come C:MioReport.pdf.
La stampa diretta su stampante è invece un po’ più impegnativa, perchè comunque passa attraverso l’uso dei tradizionali oggetti PrintDocument di .NET per stampare il documento.

Se stasera riesco, integro queste due piccole scoperte nel mio RapportinoMaker e se ce la faccio entro fine mese ho tutto automizzato. Spettacolare!

Technorati Tags:

Send to Kindle
.NET World

Uploadare un documento ad una Document Library di Sharepoint

Il sito http://enjoy.vivendobyte.net/igordamiani.it.reborn è un sito Sharepoint 2007.

All’interno di questo sito ho creato alcune liste, alcune pubbliche ed altre private. Tra queste ultime, ve ne è una in cui raccolgo rapportini e fatture che ovviamente devono rimanere privati. Ho voluto dare una marcia in più al mio RapportinoMaker, il software di cui ho parlato qua, per automizzare l’upload di documenti PDF (fatture) e documenti Excel (rapportini) su questa famigerata lista Sharepoint. Pensavo di dover lavorare con http e con NetworkCredentials, ma ho preso una strada diversa che voglio illustrare perchè può essere utile anche a voi.

Come giustamente mi ha fatto notare mio fratello, qualsiasi lista di Sharepoint è raggiungibile anche attraverso il classico Esplora Risorse. Ciò significa che, per esempio, posso raggiungere la mia Document Library andando al path di rete:

\enjoy.vivendobyte.netigordamiani.it.reborn<nome_lista><nome_folder>

Se ci siamo già autenticati, allora il folder si apre automaticamente, altrimenti appare la classica dialog che chiede username e password. Detto questo è facile dedurre che possiamo copiare un qualsiasi file usando la classica File.Copy(source, destination): nulla di strano.

Il vero problema è che quando non ci siamo autenticati, la chiamata a File.Copy solleva un’eccezione. E’ un problema che non ho risolto, ma ci ho girato attorno. Usando questa libreria, mappo il disco di rete su un drive locale (per esempio, Z:). La procedura di mapping del disco passa da un’autenticazione (username + password), quindi il problema è risolto.

Riassumendo, per l’upload di un file su una Document Library di Sharepoint 2007 faccio quanto segue:

  1. connetto il path remoto \enjoy.vivendobyte.netigordamiani.it.reborn sul drive locale Z:
  2. copia il file dal mio PC locale a Z:<nome_lista><nome_folder><nome_file>
  3. cancello il drive mappato Z:

Ecco un piccolo stralcio di codice per darvi qualche spunto:

static void Main(string[] args) { NetworkDrive nd = new NetworkDrive(); nd.LocalDrive = "Z:"; nd.Force = true; nd.PromptForCredentials = false; nd.SaveCredentials = true; nd.ShareName = @"\nome_dominio ome_sito_wss"; nd.MapDrive(USERNAME, PASSWORD); string remoteFile = @"Z: ome_lista ome_cartellapippo.txt"; File.Copy(@"D:Documentipippo.txt", remoteFile, true); nd.UnMapDrive(); }

Ho nascosto le informazioni sensibili. Le costanti USERNAME e PASSWORD contengono lo username e la password necessarie per loggarsi sul sito Sharepoint. Con la chiamata a MapDrive() connetto il network path, poi copio il file, poi sconnetto tutto.

Technorati Tags:

Send to Kindle
.NET World

RapportinoMaker: WOW!

Sul mio blog di UGIdotNET avevo parlato una volta di come sfrutto una serie di tecnologie per mettere in piedi un sistema per permettermi di fare i rapportini di lavoro e le relative fatture con un software estremamente automizzato, che mi consente davvero di risparmiare un bel po’ di tempo e di avere meno grattacapi alla fine di ogni mese. Siccome non ho trovato il link, rispiego tutto daccapo.

Alla fine di ogni mese, devo preparare un rapportino di lavoro in Excel con l’elenco di tutte le giornate lavorative che ho fatto. L’elenco deve essere fatto giorno per giorno, bisogna indicare quante ore sono state fatte e così via. Invece di compilare a mano, utilizzo un sistema molto più semplice: sul mio palmare utilizzo Agenda Fusion. Con questo software segno quotidianamente la giornata lavorativa, intesa come luogo di lavoro, ora di arrivo, ora di uscita ed altre informazioni adesso non pertinenti. Quando arrivo a casa sincronizzo il contenuto dell’agenda con Microsoft Outlook 2007. Va da sè, quindi, che posso calcolare quanti giorni ho lavorato in un mese semplicemente contando le giornate dentro Outlook.

Ed è quello che ho fatto con RapportinoMaker, un software di mia creazione e che non distribusco nè vendo.
Ecco alcune caratteristiche:

  1. compilazione automatica del foglio Excel, con relativo salvataggio in una directory apposita e con un nome del file “sensato” (ad esempio: Rapportino_Maggio_2007.xls)
  2. grazie a domain-model, DAL, NHibernate e Reporting Services, posso generare automaticamente la fattura con il software di fatturazione che mi sono sviluppato. Sì, esatto, è lo stesso che feci ai tempi e che fece vedere Davide Mauri ad una sessione degli scorsi Community Days a Milano. Il domain-model espone oggetti come Articolo, Cliente, Fattura e RigaFattura, che possono essere ovviamente istanziati e creati programmaticamente. La fattura viene creata impostando cliente e data ed una sola riga di fattura che contiene l’articolo. Quest’ultimo è una semplice attività di consulenza, dove il costo unitario è la mia tariffa giornaliera e la quantità è il numero di giornate lavorative conteggiate. Poi salvo il tutto su database. Nei prossimi giorni vorrei generare automaticamente il file PDF e le copie fisiche sulla stampante di default
  3. dentro Microsoft Outlook 2007, mi salvo nelle Bozze un’e-mail precompilata con destinatario, oggetto, testo ed allegato per spedire la fattura ed il rapportino alle persone competenti
  4. vorrei uploadare sia il rapportino Excel sia la fattura in formato PDF su una lista Sharepoint privata. Così, ovunque io mi trovi, posso accedere a tutte le informazioni e se qualcuno mi chiama e mi dice: “Igor, dovresti mandarmi il rapportino di 2 mesi fa” io non vado in panico e so esattamente dove andare

Tutto questo, ve lo posso assicurare, è molto più semplice di quello che può sembrare. Adesso che ho sviluppato tutto il sistema, faccio davvero molto poco. Arrivo a casa e, quando mi ricordo, sincronizzo il palmare. Alla fine di ogni mese, lancio una console application che fa tutto quello descritto qui sopra, facendomi davvero guadagnare un bel po’ di tempo. Spettacolare, sono davvero soddisfatto.

Vi chiederete perchè ne parlo proprio stasera.

Ad Aprile ho cambiato la società per la quale faccio consulenza, e questa sera mi sono messo qui a modificare il mio software per adeguarlo alle nuove esigenze: prima fra tutti, il template del foglio Excel per il rapportino è diverso, e quindi ho dovuto modificare la logica per la compilazione automatica. Nulla di che: celle in posizione diverse e roba del genere. In più ho sistemato qualche bug che giaceva nel codice da un po’ troppo tempo. Usando TFS per questo progetto, mi sono ritrovato una serie di WorkItem che mi aspettavano.

Per oggi chiudo qua. Con il giusto mix di sport e programmazione, oggi è stata davvero una domenica con i fiocchi!

Technorati Tags:

Send to Kindle
My personal life

Un pomeriggio pedalando

Parcheggio per una giornata intera al Parco dell’Idroscalo (nei dintorni di Linate): 3,50 Euro
Un biscotto gelato ed una bottiglietta d’acqua naturale fresca: 3,00 Euro
Fare quasi 25km in mountain-bike intorno al Parco dell’Idroscalo mentre gli idrovolanti decollano ed atterrano sull’acqua NOH HA PREZZO.

Ma adesso sono veramente stanco, perchè non faccio molta ginnastica e devo recuperare un po’ il fisico. Però – devo dirlo – adesso mi sento un po’ più ossigenato e sento letteralmente le giunture di braccia e ginocchia più sciolte. Ogni tanto ci vuole! Bella domenica.

Send to Kindle
Software

Winzip 11 è mio!

Non è che ho acquisito la parte di maggioranza della società Winzip Computing, con sede a Mansfield nel Connecticut.
Semplicemente, circa 3-4 settimane fa ho acquistato una licenza di Winzip 11.

Ovviamente ho tolto il registration number! Polemico sì, ma stupido no! Il mondo del software è popolato di un gran numero di prodotti freeware, ma devo dire che spendere i proprio soldi per acquistare un software che si ritiene indispensabile non ha davvero prezzo.

Technorati Tags:

Send to Kindle
My personal life

Imparare l’inglese con il PC

Il titolo del post è così stupido che sembra che voglia parlare di quelle raccolta da edicola per imparare – appunto – l’inglese.

Qualche giorno fa, non mi ricordo con chi (probabilmente era un collega) stavamo pensando ai bei tempi, ovvero quelli nei quali la nostra passione è sbocciata per farci arrivare dove siamo oggi. I soliti discorsi nostalgici di noi informatici, nè più nè meno, insomma. E siamo arrivati a dire che noi siamo stati un pochino fortunati, perchè chi si è ritrovato a videogiocare durante gli anni ’90 (ma in realtà anche da molto prima) ha avuto la possibilità quasi a livello inconscio di imparare l’inglese. Mi spiego meglio.

Pensiamo banalmente a Prince Of Persia, Indianapolis 500, la saga di Ultima (compreso l’Underworld), Eye Of The Beholder ed un’altra camionata di videogiochi che avevo e con i quali ho giocato. Tutti videogiochi che avevo erano in inglese. Grazie a quelli, ho cominciato a masticare l’inglese, volente o nolente. Ma in realtà anche il semplice uso di un PC doveva obbligatoriamente passare da una minima conoscenza della lingua straniera, perchè il DOS ed i vari software shareware/freeware (Winzip, RAR, editor di testi vari) erano tutti in inglese. Magari inizialmente si passava da termini semplici e banali per arrivare a frasi più complesse. Ricordo le fasi iniziali di un gioco di ruolo per PC, nel quale si stabiliva la classe del proprio personaggio (guerriero, ladro, stregone, etc.) in base alle risposte che si davano alle domande poste da una zingara che si incontrava all’inizio dell’avventura: leggere quelle domande era tutt’altro che semplice, anche perchè erano espresse in un inglese volutamente arcaico e “deformato”. Oppure, ancora: avete mai provato a fare il setup di un’auto di Indy 500? Avete mai fatto un volo con il mitico Falcon F-16? Si imparavano termini come gear, throttle, brakes, tires, lap, steer, wheel ed un altro centinaio di parole: le stesse che compaiono oggi durante i gran premi di Formula 1 o di Moto GP! Oppure, mi viene in mente quando sentii Andrea dire picklock: ancora una volta, chi si è ritrovato a giocare di ruolo (su carta o su PC) negli anni che furono, ha dovuto per forza farlo in in lingua inglese, perchè avere qualcosa in italiano  era assolutamente un tabù.

I bambini ed i ragazzini di oggi invece non hanno questa possibilità, perchè oggi la maggior parte dei videogiochi e delle applicazioni è totalmente localizzato nella nostra bella lingua italiana. Non solo, sono anche parlate, e quindi leggono anche di meno. Da Windows XP/Vista fino ad arrivare a Need for Speed Most Wanted. Ci sarebbe Internet – che ai nostri tempi non c’era – ma non conosco alcun ragazzino che vada sulla Internet non-italiana solo per imparare una lingua staniera. La mia sorellina, per esempio, quando va sul sito della Disney e trova qualche parola che non conosce, preferisce chiamare me invece di prendere il piccolo dizionario per cercare il termine. Solo che io invece di darle la soluzione cerco di farla ragionare e di darle gli aiutini.

Technorati Tags:

Send to Kindle
.NET World

In WPF i controlli non devono avere per forza un nome

Il titolo del post è talmente significativo che potrei addirittura non scrivere nulla qua.

Questa cosa dei controlli senza nome è una cosa a mio avviso comodissima, perchè non è detto che tutti i controlli che mettiamo su una Window o una Page abbiano davvero un significato dal punto di vista programmatico. Pensiamo alle classiche Windows Forms: credo che sia successo a tutti di mettere delle Label solo per dare un’etichetta a TextBox o ad altri controlli di input. Il designer ci mettere per default un nome come Label1, e poi dobbiamo essere noi a dare un nome più sensato. In certi casi, come questo che ho appena citato, il nome non lo vorrei proprio dare, perchè non mi interessa vedere quella label nel codice C#. O comunque, possiamo darlo magari in un secondo momento, quando ci rendiamo conto che magari ci serve gestirlo in qualche modo.

In WPF accade esattamente così. Quando aggiungiamo un nuovo controllo su una Window esso non ha alcun nome. Lo capiamo perchè nello XAML il tag – ad esempio <TextBox />, non ha l’attributo Name. In questo caso, quel controllo non ha nome e non possiamo gestirlo nel code-behind C# attraverso una variabile dedicata. Trovo comodissimo poter aggiungere controlli no-named, solo per creare la UI e per abbellirla, senza che questo mi vada ad intaccare e a “sporcare” il codice, l’Intellisense e così via. Possiamo ovviamente recuperarne l’istanza in altri modi, come navigare nel visual tree della Windows e cercare un determinato oggetto, perchè l’oggetto esiste a tutti gli effetti, solo che non ha nome e quindi il compilatore evita di istanziare una variabile nel code-behind.

Technorati Tags:

Send to Kindle
Hardware

Il display del mio Nokia N70 ha smesso di funzionare

04 Aprile 2006. Sembra un giorno come un altro, non è vero? Invece no: quel giorno acquistai il mio Nokia N70, dopo che al cinema mi rubarono (leggesi: sparì senza spiegazioni) il mio Nokia 6630.

15 Giugno 2007. Sembra un altro giorno come un altro, giusto? Oltre al fatto che è “oggi”, rappresenta un’altra cosa. E’ il giorno in cui il mio Nokia N70 ha smesso di funzionare. Ieri lo usavo tranquillamente, oggi no. Il telefono in sè tecnicamente funziona anche, perchè sono riuscito a comporre il numero 4916 e sentivo la vocina TIM dall’altra parte che mi informava del credito residuo. E’ il display che ha qualche problema: semplicemente si è sputtanato. Scusate il termine, forse sul Muro di UGIdotNET non l’avrei mai scritto. Non visualizza nulla, se non pixel a caso, che cambiano in modo random in base a quello che premo sul tastierino. Se faccio in tempo, dopo lo porto in un centro assistenza Nokia per vedere un po’ cosa mi dicono. Sono pessimista. Qualche mio collega parla di smagnetizzazione del display. Boh. Va a finire che mi toccherà spendere altri soldi per un cellulare nuovo.

Consigli? Pareri? Sono tutt’orecchi.

Technorati Tags:

Send to Kindle
.NET World

Disponibile per il download: Flickr Browser

Ho messo on-line il progetto Flickr Browser di cui ho parlato qualche tempo fa sul mio blog. Le caratteristiche che mi sento di evidenziare in questo mio piccolissimo progetto sono le seguenti:

  • possibilità di avere l’elenco dei set fotografici di un determinato utente
  • possibilità di sfogliare tutte le foto appartenenti ad un certo set fotografico
  • avere le informazioni EXIF di una certa foto
  • possibilità di salvare su disco locale una certa foto

In una versione futura, sulla quale sto lavorando, vorrebbe andare anche a scrivere su Flickr, nel senso di poter uploadare qualche foto in un qualche set fotografico già esistente. Già adesso sulla UI è presente una TextBox per ciascun set sulla quale diventerà possibile droppare un file JPG dal PC locale per uploadarlo sul portale. Per farlo, però, bisogna autenticarsi verso Flickr con permessi di scrittura: la cosa non è così difficile, anzi, solo che non ho ancora implementato l’interfaccia per farlo.

Il progetto è ovviamente stato realizzato in WPF ed è downloadabile da qua. Ricordo che il download comprende i sorgenti del progettino, e quindi potete un po’ dare un’occhiata a come ho usato data-binding (davvero tanto), templates, ListBox, eventi e quant’altro. Credo sia il primo progetto WPF per accedere a Flickr, tra l’altro, dal momento che googlando non ho trovato nulla di questo tipo. Vorrei migliorare e potenziare un po’ il software, per esempio aggiungendo ricerche per tags, per data e così via. Ma trattandosi di un progetto freeware, non c’è alcuna fretta.

Technorati Tags:

Send to Kindle
IV del Venerdì

[IV] del Venerdì (8)

La donna era in piedi, lì accanto a suo figlio, il bambino con la spalla fracassata. Non riusciva a metabolizzare ciò che era successo in quei pochi attimi. Un minuto prima, il cantante stava intonando una litania dolce e poetica, senza capirne il testo: forse era scritta in qualche lingua strana che non capiva, forse latino, forse un’altra lingua di Faerie. Forse chissà. Era come se la canzone avesse ammaliato tutti quelli in platea. Un minuto dopo, il cantante aveva sparato a suo figlio senza un perchè. La donna odiava l’Artista per quello che aveva fatto. Ma sentiva di odiarlo indipendentemente da questo. Il suo odio proveniva da qualcosa di più remoto e di più antico. “Tu già lo conosci. Tu già lo odiavi.” – pensava la donna. O forse era una voce nella sua mente?

Uno dei metodi più banali per capire quali sono le notizie che “girano” di più al mondo consiste nel prendere le prime pagine dei quotidiani più accreditati. Vedendo anche solo la prima pagina, basta leggere il titolo più grande e qualche titoletto attorno per vedere che in un certo periodo si parla di questo o di quello. Se prendessimo in considerazione gli ultimi 12 mesi, ad esempio, credo che sarebbero davvero poche le notizie che ci riguardano da vicino: si è parlato di intercettazioni telefoniche, di quella spia russa della quale non so scrivere il nome senza googlare almeno un po’, si è parlato di vari scandali come quello delle varie banche, di Unipol, del generale Speciale, di leggi mai approvate e altre leggi che avrebbero fatto bene a tenersi per loro, di fusioni di grandi società, etc.

In linea di massima, sono tutte notizie che non ci toccano minimamente. Questo è il motivo principale per il quale, imho, la politica sta lentamente fallendo: c’è l’impressione (e impressione mica tanto) che quello che fanno i politici non ha un impatto diretto ed immediato sulla nostra vita di tutti i giorni. Piuttosto che proporre idee, fare una finanziaria seria, fare qualcosa per la sicurezza, i politici vogliono ritrovarsi in Parlamento – diciamolo tutti assieme per favore – a farsi i fatti loro. Oggi c’è qualcuno che grida di tornare alle urne per cambiare il governo. Sebbene questo in vigore sia il governo che ho votato, sono d’accordo con questo appello, perchè un governo che non ha polso e non ha carattere non può andare da nessuna parte. Però ritengo anche che se anche tornasse al potere la CdL non sarebbe poi molto diverso: se faccio mente locale sui suoi governi passati, ritengo che Berlusconi abbia governato facendo principalmente i suoi interessi personali. Avrà pur fatto qualcosa per il Paese, ma diverse volte ha fatto fare alla nostra nazione diverse figuracce in campo internazionale, e comunque sia anche lui ha tenuto assieme la sua maggioranza con vertici e riunioni di governo solo per far zittire questa o quella polemica. Questo è un mio punto di vista.

E visto che va di moda chiederlo…e quindi?

E quindi io sono la persona meno adatta per dire qual’è la cosa giusta da fare. Sono solo uno sviluppatore. Penso però che se le cose proseguiranno così in questo modo, con un sacco di problemi ai quali non si trova (o non si vuole trovare) una risposta, passeranno anni ed anni, ma prima o poi arriverà qualcuno che smonterà tutto questo sistema malato e fatto da politici così lontani dai nostri bisogni e incapaci davvero di avere la percezione reale di quello che la gente pensa di loro. Penso che sia giusto che arrivino dei giovani nuovi – ogni tanto – a cambiare la facciata della nostra politica interna. Sarebbe anche ora. Ma questi giovani, prima che arrivino in parlamento, prima che possano essere davvero efficaci, vengono “traviati” da anni ed anni di università in scienze politiche, e quindi quando arriva il loro turno in realtà sono diventati simili ai loro predecessori. Politici lontani anni-luce dalle nostre esigenze di cittadini. Mi viene in mente l’affermazione di Beppe Grillo quando fece la famosa conferenza stampa in Telecom, dove diceva che in non-ricordo-bene quale stato c’era una gara d’appalto per aggiudicarsi l’utilizzo dell’UMTS: uno dei vincoli per partecipare a questa gara era proprio quella di non essere e di non appartenere ad una società di telecomunicazioni!

La morale? Mi piacerebbe per assurdo che per entrare in parlamento e governare il Paese bisognerebbe essere tutto fuorchè un politico! E’ un’esagerazione o una stupidaggine? Può darsi, ma mi piace così tanto!

Send to Kindle