venerdì 30 maggio 2008

Microsoft DreamSpark - una opportunità per tutti gli studenti

Microsoft dà la possibilità a tutti gli studenti di avere gli strumenti di sviluppo a livello professionale.
Sostanzialmente DreamSpark è composto da:

  • Visual Studio 2008 Professional Edition
  • Visual Studio 2005 Professional Edition
  • Sql Server 2005 Developer Edition
  • Xna Game Studio 2.0
  • Xna Creators Club Online
  • Microsoft Expression Studio
  • Windows Server 2003 Standard Edition

Tutti gli studenti / responsabili scolastici / presidi possono scaricare e utilizzare gratuitamente tutti i pacchetti.

Le note dolenti .. l'Italia NON è compresa nella lista di chi può avere subito gli strumenti di DreamaSparsk, lo sarà nel corso del 2009 :( :( :(

Powerered with Window Live Writer

giovedì 29 maggio 2008

Dynamics NAV CTP 2009

In questi giorni sto giocando con la "Technical Preview for Microsoft Dynamics NAV".

Ho scaricato l'immagine del disco virtuale dal sito di  Microsoft Partnersource.

Nel disco è contenuta l'immagine di una installazione Windows Server 2003 trial contenente:

  1. Dynamics NAV 5.1
  2. SQL Server 2005
  3. Visual C# Express
  4. Micorosft Office 2007
  5. Microsoft Office 2007 Server
  6. Microsoft Share Point

Il nuovo client di Dynamics NAV come noto fornisce un nuovo front-end utente basato su una web application con dei servizi ASP.NET che interfacciano il database di Dynamics ospitato su SQL Server 2005.

Questa l'interfaccia della nuova scheda cliente, la società di esempio è la classica "Cronus"

 

Questa invece è la stessa Form con il client "Classico" che punta allo stesso database della web application.

 

 

 

Come noto le novità sostanziali di questa release che, a detta di MIcrosoft verrà distribuita a partire da settembre 2008 sono:

  1. Nuovo oggetto "page", contiene il tracciato xaml per la definizione delle pagine per l'interfaccia web application
  2. Il report di Microsoft Reporting Services accanto (meglio in sostituzione) del classico report, il report di navision rimane perchè i reports hanno una doppia funzione: a) report b) batch di elaborazione
  3. Possibilità di "consumare" i web services con una "classica" applicazione Windows Forms

Esiste un tool di trasformazione che a fronte degli oggetti di Dynamics NAV "genera" dei nuovi oggetti che forniscono l'interfaccia tra il database e la web application.

Tutti i sorgenti che ho visto sono in C#.

Powerered with Window Live Writer

lunedì 19 maggio 2008

Calcolo del Cin del Bollettino Freccia

Su richiesta di qualcuno che me l'ha chiesto esemplifico il calcolo del Cin del bollettino freccia.

Il bollettino freccia è il sostituto del bollettino postale introdotto dalle banche come forma alternativa di pagamento.

I campi necessari per il calcolo del cin del bollettino freccia sono i seguenti

Campo Componenti Lunghezza Note
Importo   9 Importo * 100 senza decimali con zeri significativi nessun segno solo importi positivi
Cin importo   1 Vedi formula
Identificativo pagamento   21  
  Codice Sia 5 Attribuito dalla banca all'azienda cliente
  Riferimento 16 Riferimento univoco al documento
Cin intermedio   1 Vedi formula
IBAN   27  
  Codice paese 2 previsti IT e SM
  CIN IBAN 2 Vedi calcolo CIN IBAN
  CIN BBAN 1 Vedi calcolo CIN BBAN
  ABI 5 Codice Abi cliente
  CAB 5 Codice Cab cliente
  CC 12 Numero conto corrente cliente
Codice esenzione   1 Valore fisso = 1
Codice Divisa   1 Valore fisso = E
Cin complessivo   1 Calcolato su tutti i campi precedenti

 

I caratteri ammessi per i campi alfanumerici sono tutti i 26 caratteri maiuscoli i caratteri cioè presenti nella  tabella ASCII da 65 a 90 compresi più i 10 caratteri da 0 a 9 compresi.

Rimando alla consultazione del mio blog per il calcolo del CIN del BBAN e dell'IBAN.

Formula del Cin Freccia

Il calcolo è abbastanza lineare (in pseudocodice):

Per ogni carattere contenuto nel codice da cui calcolare il cin
Si accumula il valore ascii moltiplicato per la posizione relativa del carattere nel codice partendo da sinistra (Esempio con un codice A1 la somma diventa 65 * 1 +  49 * 2).

Si calcola il resto della divisione intera per 36 (funzione modulo) + 1

Con quest'ultimo valore si ottiene il carattere "puntato" come sottostringa di: Z0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

La funzione in C#

private static string CalcolaCin(string valore)
{
       if ((valore == string.Empty) || (valore == null))
       {
             throw new Exception("Valore non ammesso");
       }
       string lettere = "Z0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
       int somma = 0;
       int i = 0;
       for (int k = 0; k < valore.Length; k++)
       {
             char c = valore.Substring(k,1).ToCharArray()[0];
             somma += (int) c * (k + 1);
       }
       i = (somma % 36);
       return lettere.Substring(i,1);
}

Esempio di calcolo con C#
Esempio di calcolo con VB.NET
Libreria comune da referenziare

Powerered with Window Live Writer

Microsoft Expression Blend 2.5 Preview Marzo 2008

MIcrosoft Expression Blend 2.5 Preview Marzo 2008 è disponibile per lo scaricamento.

Expression Blend è uno strumento professionale per la produzione di applicazioni web compatibili con Silverlight.

sabato 17 maggio 2008

Internet Explorer 8 Beta 1 Disponibile

E' disponibile a questo indirizzo Internet Explorer 8 Beta 1.

venerdì 16 maggio 2008

Un backup per le cartelle di Outlook 2002 e successivi

Microsoft distibuisce un add-in che consente di predisporre, a intervalli regolari, un salvataggio automatico delle casrtelle di Office Outlook.

Il tutto è disponibile a questo link

giovedì 15 maggio 2008

Utilizzo di SQLite su Visual Studio 2005 - 2008

SQLite è uno dei DataBase che più agevolmente si presta a diventare un valido sostituto di Access.
Come database embedded è leggerissimo, non ha bisogno di nessuna installazione se non quella del provider ADO.NET System.Data.SQLite.

Anche se non obbligatorio, è' opportuno scaricare il database e i tools dal sito di SQLite soprattutto sqlite3.exe che fornisce una console "linea comandi" di gestione al database, una vera manna per gli smanettoni.

Oltre a fornire l'interfaccia / provider ADO.NET di SQLite è possibile "disegnare" la propria base dati e, all'occasione poter creare il database.

Il problema dell'interfaccia ide è che si tratta di un addon, sulla versione Express non è prevista, nel designer di connessioni e dataset altri database che non siano Access o Sql Express entrambi gestiti in locale.

Per poter aggirare questa limitazione i creatori del driver hanno pensato bene di permettere di "sganciare" da express il provider di Access e sostituire provvisoriamente il proprio a questo.

L'installazione aggiunge nel menù un semplice programma che su Visual Express provvede a sganciare / riagganciare access tra i provider.

Con esclusione della versione Express 2008 su tutte le altre versioni di Visual Studio 2005 e 2008 è possibile utilizzare il wizard per la definizione del dataset tipizzato, della connessione ai dati ed eventualmente creare anche il database.

Su Express 2008 c'è un bug già riconosciuto che impedisce l'utilizzo del wizard e del designer, il collegamento "a mano" con la definizione da codice è sempre possibile, come è possibile in tutte le altri progetti basati sul Framework 2 o successivi.

Nei casi in cui non sia possibile geneare un nuovo database tramite l'ide è possibile utilizzare il programma console sqlite3.exe.

Un esempio di utilizzo del programma a linea comandi:

D:\sqlite>sqlite3.exe dbprova.db3
sqlite> create table tableprova (id integer primary key autoincrement, descrizione varchar(50), valore decimal(10,3));

Per "solidarietà" con la versione express non utilizzo la definizione del dataset tipizzato / tableadapter.
Tra l'altro .. sono andato a "sbirciare" sul dataset tipizzato / tableadapter di prova generato da visual express 2005, beh il codice è comunque incompleto.

Se può essere d'aiuto la gestione del dataset può essere fatta con un database di access e poi si può intervenire nella classe generata dal wizard con una nostra "partial class" che dall'interno riconfiguri tutti gli elementi (command, connection, ecc) facendoli puntare a SQLite.

Proseguiamo con l'aggiungere un dataset non tipizzato al progetto.

Aggiungiamo un DataTable "tableprova" al progetto e i 3 campi

Campo Tipo Note
id Int32 PK, autonumber (-1 sul seed e sullo start)
descrizione string  
valore decimal 12 interi,3 decimali

Completata questa fase è possibile aggiungere alla form selezionandoli dalla casella degi strumenti il controllo BindingSource e il controllo BindingNavigator .

Agendo sulla prprietà dei controlli colleghiamo BindingNavigator a BindingSource e BindingSource al DataSet il bindinsource collegato al dataset/tableprova.

Ora inizia la parte difficile, dobbiamo sostituire quanto fa il designer che genera il TableAdapter  un oggetto che è costruito ad hoc dal wizard, al suo posto utilizzeremo un normale DataAdapter.

A livello di classe definiamo un oggetto di tipo DataAdapter 

C#
SQLiteDataAdapter daTableProva;
// Definiamo anche la stringa di connessione

string Connessione = Properties.Settings.Default.Connessione;

VB.NET
Dim daTableProva As SQLiteDataAdapter
'Definiamo anche la stringa di connessione
Dim Connessione As String = My.Settings.Connessione

Per la configurazione del SQLiteDataAdapter ho introdotto un metodo apposito "Inizializza".

C#

void Inizializza()
{
   SQLiteConnection cn = new SQLiteConnection(Connessione);
   daTableProva = new SQLiteDataAdapter("SELECT * FROM tableprova", cn);
   System.Data.Common.DataTableMapping tableMapping = new System.Data.Common.DataTableMapping();
   tableMapping.SourceTable = "Table";
   tableMapping.DataSetTable = "tableprova";
   tableMapping.ColumnMappings.Add("id", "id");
   tableMapping.ColumnMappings.Add("descrizione", "descrizione");
   tableMapping.ColumnMappings.Add("valore", "valore");
   daTableProva.TableMappings.Add(tableMapping);
   SQLiteCommandBuilder cmb = new SQLiteCommandBuilder(daTableProva);
   daTableProva.InsertCommand = cmb.GetInsertCommand();
   daTableProva.UpdateCommand = cmb.GetUpdateCommand();
   daTableProva.DeleteCommand = cmb.GetDeleteCommand();

}

VB.NET

   Private Sub Inizializza()
        Dim cn As New SQLiteConnection(Connessione)
        daTableProva = New SQLiteDataAdapter("SELECT * FROM tableprova", cn)
        Dim tableMapping As New System.Data.Common.DataTableMapping()
        tableMapping.SourceTable = "Table"
        tableMapping.DataSetTable = "tableprova"
        tableMapping.ColumnMappings.Add("id", "id")
        tableMapping.ColumnMappings.Add("descrizione", "descrizione")
        tableMapping.ColumnMappings.Add("valore", "valore")
        daTableProva.TableMappings.Add(tableMapping)
        Dim cmb As New SQLiteCommandBuilder(daTableProva)
        daTableProva.InsertCommand = cmb.GetInsertCommand()
        daTableProva.UpdateCommand = cmb.GetUpdateCommand()
        daTableProva.DeleteCommand = cmb.GetDeleteCommand()
    End Sub

Problema del recupero dell'ultimo ID nel caso di campi chiave autonumber.
Il comando sql per generare un campo autonumber durante la creazione di una tabella SQLite è:
CREATE TABLE mytable (id integer primary key autonumber, ..altri campi);
Su SQLite esiste una funzione last_insert_rowid() che restituisce l'ultimo id attribuito.

Per recuperarlo nel nostro dataset è necessario "abbonarsi" all'evento RowUpdated di SQLiteDataAdapter.

C#
daTableProva.RowUpdated += new EventHandler<System.Data.Common.RowUpdatedEventArgs>(daTableProva_RowUpdated);
...

void daTableProva_RowUpdated(object sender, System.Data.Common.RowUpdatedEventArgs e)

{
    // recupero dell'ultimo id attribuito automaticamente negli
    // inserimenti
    if (e.Row.RowState == DataRowState.Added)
    {
       SQLiteCommand cm = new SQLiteCommand("SELECT last_insert_rowid() As ID", daTableProva.SelectCommand.Connection);
       SQLiteDataReader dr = cm.ExecuteReader();
       int k = 0;
       if (dr.Read())
         k = (int)((Int64)dr[0]);
       e.Row["id"] = k;
    }
}



VB.NET
AddHandler daTableProva.RowUpdated, AddressOf daTableProva_RowUpdated

...

Private Sub daTableProva_RowUpdated(ByVal sender As Object, ByVal e As System.Data.Common.RowUpdatedEventArgs)
    ' recupero dell'ultimo id attribuito automaticamente negli
    ' inserimenti
    If e.Row.RowState = DataRowState.Added Then
       Dim cm As New SQLiteCommand("SELECT last_insert_rowid() As ID", daTableProva.SelectCommand.Connection)
       Dim dr As SQLiteDataReader = cm.ExecuteReader()
       Dim k As Integer = 0
       If dr.Read() Then
          k = CInt(DirectCast(dr(0), Int64))
       End If
       e.Row("id") = k
    End If
End Sub

Progetto di esempio in C# realizzato con Visual Studio 2008
Progetto di esempio VB.NET realizzato con Visual Studio 2008

Powerered with Window Live Writer

lunedì 5 maggio 2008

Archivio Sportelli Bancari - Elenco Abi Cab Aggiornato a Fine Aprile 2008

L'archivio sportelli bancari elenco Abi Cab aggiornato a fine aprile 2008  è disponibile per lo scaricamento a questo indirizzo:
Alcune informazioni sui files:
- campi separati da tabulazione hex: 09
- righe separate dal terminatore di riga windows hex: 0d0a
- intestazione colonne sulla prima riga
Il file TabAbi contiene i dati relativi alle banche.
Il file TabAbiCab contiene le informazioni relative agli sportelli
Nel file TabAbi e TabAbiCab è presente il campo "Aggiornamento" che evidenzia la data di riferimento di validità dei dati.
Tutte le righe di TabAbiCab che NON contengono la data più recente sono da considerarsi relative a sportelli non più attivi o assorbiti da altre banche, tali sportelli sono presenti solo come log dei dati storici, ne è sconsigliato l'utilizzo per nuove emissioni di flussi di comunicazione con le banche.
Questo archivio è da considerarsi frutto di una rielaborazione "amatoriale" dei dati degli sportelli bancari reperibili in rete l'unico mio apporto è l'aggiunta della data di ultima importazione in modo tale da costituire un archivio comprendente anche i dati di banche e sportelli non più attivi.
Non si rivendica nessun diritto riguardo al contenuto del file, l'utilizzatore ne può fare ciò che vuole senza contattarmi nè informarmi della cosa, preferirei inoltre non essere neanche citato come fonte in eventuali successive redistribuzioni.
Se si vuole una garanzia circa la correttezza dei dati e/o una qualsiasi licenza il mio consiglio è di NON utilizzare il presente archivio e di rivolgersi direttamente alla propria banca chiedendo di avere in forma ufficiale il file degli sportelli bancari.

Powerered with Window Live Writer