mario.deghetto

Visual Basic & .NET
posts - 146, comments - 25, trackbacks - 0

martedì 26 gennaio 2010

CodeProject: l’uso di token nei documenti Office

Segnalo un altro interessante articolo per l’uso di token nei documenti Office, pubblicato su CodeProject a questo indirizzo:

http://www.codeproject.com/KB/office/OfficeTokenReplacement.aspx

Immaginate questo scenario: avete dei documenti Word e volete integrare tali documenti con i dati provenienti da un database. Un tipico esempio è il caso di una fattura prodotta in formato Word.

Ovviamente in questo caso non vogliamo utilizzare la stampa unione di Word, anche perché tale modalità permette, sì, di stampare anche una singola fattura, ma richiede all’operatore qualche manovra in più che potrebbe non saper fare e quindi vogliamo automatizzare il più possibile tutto il processo.

L’unica particolarità che il documento Word deve contenere, oltre al testo fisso, è un insieme di uno o più “token“, cioè un “gettone”, un segnalino. Ognuno di questi token corrisponderà a un’unità elementare di dato, allo stesso modo dei codici di campo di Word per la stampa unione.

Il codice presentato è in Visual Basic .NET ed è adatto sia all’uso con MS Office (versione 2007), sia con OpenOffice (versione 2.4 e successive).

posted @ martedì 26 gennaio 2010 5.11 | Feedback (0) |

CodeProject: Upgrade da VB6 a VB.NET

Segnalo un articolo abbastanza interessante sulla migrazione da VB6 a VB.NET, pubblicato su CodeProject al seguente indirizzo:

http://www.codeproject.com/KB/vb/VB6ToVBNET.aspx

L’articolo affronta alcuni aspetti che possono dare dei problemi durante la migrazione e in particolare quelli riguardanti le seguenti aree:

  • l’uso di Visual Studio 2008 Upgrade Wizard
  • cambio del Framework .NET di riferimento
  • cancellare il report generato automaticamente durante l’upgrade
  • correzione degli errori
  • codice riguardante l’uso delle stringhe, degli operatori logici e per la gestione dei file
  • DoEvents

E’ un breve testo in inglese, ma potrebbe essere una sufficiente base per iniziare a testare la migrazione di un semplice progetto VB6 verso VB.NET.

posted @ martedì 26 gennaio 2010 5.10 | Feedback (0) |

#48: VB.NET – Impostazione della lingua di sistema nell’assembly

Creando un semplice progetto di conversione di un file CSV, dal formato “inglese” (con separatore di campo “,” e con il punto decimale) a quello italiano (con separatore di campo “;” e con la virgola decimale) e compilando, la mia attenzione è stata attirata da una voce presente nel menu “Compila” del mio Visual Studio 2008 Team System in italiano.

In particolare, la voce di menu Compila > Esegui analisi del codice su [nome progetto], permette di rilevare tutte le imperfezioni che potrebbero crearci dei problemi in futuro nell’ambito della nostra applicazione.

Una delle segnalazioni che mi sono apparse è la seguente: “Microsoft.Performance : L’assembly ‘CSVconverter.exe’ contiene un file di risorse basato su ResX e quindi è necessario contrassegnarlo con l’attributo NeutralResourcesLanguage, specificando la lingua delle risorse all’interno dell’assembly. In tal modo si migliorano le prestazioni di ricerca di una risorsa che viene recuperata per la prima volta.

Una soluzione per questa segnalazione è quella di aggiungere un contrassegno nel file AssemblyInfo.vb.

Per fare ciò, attivate il pulsante “Mostra tutti i file” nella finestra Esplora Soluzioni e fate doppio click sul file AssemblyInfo.vb. Alla fine di tale file è sufficiente aggiungere quanto segue:

<Assembly: NeutralResourcesLanguageAttribute(“”)>

Un’altra possibilità è invece quella di esplicitare la lingua di sistema dell’applicazione. In questo caso, è sufficiente aprire le proprietà del progetto: fate click con il pulsante destro del mouse sul nome del progetto e dal menu contestuale scegliete “Proprietà”. Nella scheda Applicazione, troverete un pulsante “Informazioni Assembly…”: premetelo e vi apparirà la finestra che, tra le altre cose, espone la proprietà di sistema. Se la voce indicata è quella di default, cioè “(Nessuno)”, modificate tale voce, scegliendo dall’elenco a discesa la voce “Italiano (Italia)”, o qualunque altra lingua sia quella predefinita per la vostra applicazione. Tale modifica si rifletterà nel file AssemblyInfo.vb che, alla fine, riporterà quanto segue:

<Assembly: NeutralResourcesLanguageAttribute(“it-IT”)>

posted @ martedì 26 gennaio 2010 5.10 | Feedback (0) |

[Entity Framework] Guida free ed esempi

Emanuele Mattei mi segnala una guida sull’Entity Framework molto interessante, in lingua inglese, corredata da ampi esempi.

La guida, liberamente scaricabile, è in formato PDF da 514 pagine.

Per scaricare la guida e gli esempi, potete andare all’indirizzo http://blogs.msdn.com/chkoenig/archive/2008/12/09/community-contributions-entity-framework-learning-guide.aspx, dove troverete il post di Chris Koenig, un Developer Evangelist di Microsoft.

Da non perdere!

posted @ martedì 26 gennaio 2010 5.09 | Feedback (0) |

[VB 2005-2008] Controllo PrintForm

Colgo la palla al balzo di una richiesta passata nel forum dedicato a VB & .NET. In particolare si chiede come si può fare in VB 2005 a stampare un form.

Visual Basic/Studio 2005 non offrono un controllo standard per stampare un form, come si poteva fare direttamente in VB 6.0. Tuttavia potete scaricare il Visual Basic Power Pack e, dopo averlo installato, tra i vari controlli aggiuntivi troverete anche il controllo PrintForm che permette di stampare un form su stampante, in anteprima o su file.

Il VBPP si può scaricare da qui:

Microsoft Visual Basic 2005 Power Packs 2.0
http://www.microsoft.com/downloads/details.aspx?FamilyID=92faa81e-e9c1-432c-8c29-813493a04ecd&displaylang=en

Microsoft Visual Basic Power Packs 3.0
http://msdn.microsoft.com/en-us/vbasic/bb735936.aspx

Una volta che avrete aggiunto il controllo PrintForm sul vostro form, potete, per esempio, utilizzare la seguente istruzione per vedere il form in anteprima di stampa (previa impostazione della proprietà PrintAction a PrintPreview:

PrintForm1.Print()

La proprietà PrintAction può essere impostata a PrintToPrinter o a PrintToFile, rispettivamente per inviare la stampa alla stampante o a un file specificato dalla proprietà PrintFileName.

posted @ martedì 26 gennaio 2010 5.08 | Feedback (0) |

#47: VB.NET – ADO.NET 2.0 – Supporto a Vista 64 bit e Access 2007

Prendendo spunto da una discussione, ma anche da un mio problema personale proprio su questo argomento, ho pensato che fosse opportuno fissare un paio di appunti e di precisazioni, in particolare sull’uso del Provider JET 4.0 per l’accesso ai database in formato Access 2007 e sul problema del sistema operativo Windows Vista a 64 bit.

Partiamo dal caso dei 64 bit. Come molti sapranno, Vista è distribuito in due edizioni: a 32 bit, che è la piattaforma che molti di noi sono abituati ad utilizzare da molto tempo, e a 64 bit. Prossimamente, le nuove versioni di Windows arriveranno esclusivamente a 64 bit e quindi ci dobbiamo abituare a convivere con questa nuova piattaforma, con le sue particolarità.

Il problema deriva dal fatto che Windows Vista a 64 bit non supporta JET 4.0, in quanto questo provider dati è fornito solo a 32 bit.

Le alternative per risolvere questo problema sono sostanzialmente due:

  • evitare di utilizzare Access e orientarsi direttamente all’uso di SQL Server Express, Compact o edizioni superiori (consigliato!);
  • compilare il progetto Visual Basic 2008 o Visual C# 2008 con il solo supporto per la piattaforma x86 (cioè a 32 bit).

Per questa seconda possibilità, dobbiamo eseguire i seguenti passi:

  1. fare click con il pulsante destro del mouse sul nome del progetto e scegliere “Proprietà”;
  2. passare alla scheda “Compilazione”;
  3. fare click sul pulsante “Opzioni di compilazione avanzate”;
  4. nella combo “CPU di destinazione” selezionare “x86″, anziché “AnyCPU”.

A questo punto potremo eseguire l’applicazione anche su Vista a 64 bit, tenendo però conto che la nostra applicazione non sarà compilata a 64 bit ma bensì a 32 bit. Questo potrebbe comportare qualche problema nel futuro, se Microsoft deciderà prima o poi di chiudere il supporto ai 32 bit sui sistemi operativi a 64 bit.

Vediamo ora come si utilizza il provider JET 4.0 per Access: in particolare le stringhe di connessione ai database Access cambiano a seconda che utilizziamo Access 2003 o Access 2007:

' Access 2003:
Dim stringaconn As String = _
    "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & _
    "c:\test\prova2.mdb"

' Access 2007:
Dim stringaconn As String = _
    "Provider=Microsoft.ACE.OLEDB.12.0;" & _
    "Data Source=c:\test\prova2.accdb;" & _
    "Persist Security Info=False;"

Per maggiori dettagli sulle stringhe di connessione di ciascun provider dati (anche non-Access), date un’occhiata al sito www.connectionstrings.com.

Scriviamo quindi il programma finale per inserire un record in una tabella Access (2003 o 2007):

  1. creiamo un nuovo progetto in Visual Basic 2008;
  2. nel form predefinito aggiungiamo due TextBox di nome txtCognome e txtNome, nonché un pulsante per eseguire il frammento di codice;
  3. inserire il seguente codice a livello di form (di nome Form1):
Imports System.Data.OleDb

Public Class Form1
   Private Sub cmdInserisci_Click(ByVal sender As System.Object, _
         ByVal e As System.EventArgs) Handles cmdInserisci.Click

      ' Access 2003:
      'Dim stringaconn As String = _
      '    "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & _
      '    "c:\test\prova2.mdb"

      ' Access 2007:
      Dim stringaconn As String = _
         "Provider=Microsoft.ACE.OLEDB.12.0;" & _
         "Data Source=c:\test\prova2.accdb;" & _
         "Persist Security Info=False;"

      Dim objconn As New OleDbConnection(stringaconn)
      objconn.Open()
      Dim stringasql As String = _
         "Insert into prova2(Cognome,Nome) " & _
         "values(@cognome, @nome)"
      Dim objcomm As New OleDbCommand(stringasql, objconn)
      objconn = New OleDbConnection(stringaconn)
      objconn.Open()
      objcomm = New OleDbCommand(stringasql, objconn)
      objcomm.Parameters.Add(New OleDbParameter("@cognome", _
         Me.txtCognome.Text))
      objcomm.Parameters.Add(New OleDbParameter("@nome", _
         Me.txtNome.Text))
      Try
         Dim righeAggiornate As Integer = objcomm.ExecuteNonQuery
         If righeAggiornate = 1 Then MessageBox.Show("tutto bene")
      Catch ex As Exception
         MessageBox.Show(ex.Message & _
            Environment.NewLine & ex.StackTrace, "Errore")
      Finally
         objconn.Close()
         Me.txtCognome.Text = ""
         Me.txtNome.Text = ""
         Me.txtCognome.Focus()
      End Try
   End Sub
End Class

Naturalmente, per utilizzare alternativamente Access 2003 o Access 2007, è sufficiente commentare/decommentare la definizione della stringa di connessione opportuna.

posted @ martedì 26 gennaio 2010 5.07 | Feedback (0) |

[VS 2008] Tabella comparativa dei prodotti

Ogni tanto leggo che qualcuno chiede di conoscere quali sono le differenze tra le varie versioni di Visual Studio 2008, dalla Express alla Team System, e quindi eccomi pronto a soddisfare ogni curiosità!

E’ possibile scaricare da qui un file in formato Word (.docx), PDF o XPS, con tutte le differenze tra le varie versioni. Sono ben 35 pagine di tabelle! … Purtroppo tutte in inglese.

Ma non c’è problema: per chi non conosce bene l’inglese, c’è anche la pagina specifica in italiano. Unico problema che quando provate a stamparla, anche se espandete tutte le voci, vi apparirà la pagina con le voci compresse   ;-P

Del resto è inutile lamentarsi: “per ben apparire, un po’ bisogna soffrire”!    :-D

posted @ martedì 26 gennaio 2010 5.06 | Feedback (0) |

Confronto tra vari tipi di animazioni di SilverLight e di Flash

Casualmente sono capitato in un blog un po’ diverso dal solito. In particolare, questo blog vorrebbe confrontare le performance di SilverLight e di Flash, mostrando gli stessi effetti grafici (immagini, testo, animazioni, effetti 3D, manipolazione di immagini e così via) con entrambe le tecnologie.

Al di là dei risultati del confronto che, spesso, sembrano dare maggiore risalto ai risultati di Flash, mi sembra interessante vedere quante cose incredibili si possono fare con Silverlight e con Flash!

Se avete la curiosità di dare un’occhiata ai molti esempi presentati in questo blog, andate qui.

Gli esempi sono in C#, ma sono molto brevi e (credo) facilmente convertibili in VB.NET.

posted @ martedì 26 gennaio 2010 5.05 | Feedback (0) |

[VB.NET] Valutazione di espressioni grazie a System.Reflection

Mi è capitato più volte di leggere delle richieste di funzioni per la valutazione di espressioni matematiche, tipo questa:

3+2*((5*3)-(20/10))

Una buona soluzione è stata scritta da Corrado Cavalli in un post di “MSDN Tips & Tricks” e precisamente utilizzando le librerie System.Reflection e System.CodeDom. Il post, realizzato con codice VB.NET e C#, si trova qui.

posted @ martedì 26 gennaio 2010 5.04 | Feedback (0) |

#46: VB.NET – impedire lo spostamento di un form

Prendo l’occasione di una discussione avuta un po’ di tempo fa, tra me e Riccardo Girardi, il quale aveva la necessità di trovare il modo per bloccare la posizione di un form. La gestione dell’evento di spostamento del form stesso non andava bene, perché causava un brutto sfarfallìo (flickering).

Ho trovato nel blog di Luciano Bastianello il codice in C# con cui viene realizzata questa funzionalità e l’ho convertito in VB.NET, con una correzione da parte di Riccardo Girardi:

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)
   Const WM_NCLBUTTONDOWN As Integer = 161
   Const WM_SYSCOMMAND As Integer = 274
   Const HTCAPTION As Integer = 2
   Const SC_MOVE As Integer = 61456
   If (m.Msg = WM_SYSCOMMAND) AndAlso _
         (m.WParam.ToInt32() = SC_MOVE) Then
      Return
   End If
   If (m.Msg = WM_NCLBUTTONDOWN) AndAlso _
         (m.WParam.ToInt32() = HTCAPTION) Then
      Return
   End If
   MyBase.WndProc(m)
End Sub

E’ sufficiente inserire questo codice all’interno del codice del form da bloccare e il gioco è fatto.

posted @ martedì 26 gennaio 2010 5.03 | Feedback (0) |

#45: ADO.NET Leggere la chiave del record appena inserito in SQL Server

Uno dei problemi che più frequentemente mi vengono posti riguarda la possibilità di inserire un nuovo record in una tabella e di conoscere il valore assegnato dal DBMS al campo auto incrementante.

Questo problema è solitamente risolto, peraltro in modo brillante ed elegante, con una specifica stored procedure (SP) di SQL Server. Qualcuno, però, chiede come si può fare direttamente da codice, senza “scomodare” una stored procedure.

Ad un primo esame, non abbiamo la possibilità di inserire il record e subito dopo leggere il valore del campo IDENTITY, perché nel frattempo, tra la nostra scrittura del record e la nostra lettura della chiave, qualche altro utente potrebbe aver inserito un nuovo record.

Queste due operazioni, invece, devono essere fatte in un unico blocco, cioè devono essere eseguite in un’unica transazione (principio di “atomicità” della transazione).

A questo proposito c’è una particolarità di SQL Server che possiamo utilizzare per risolvere questo problema: in T-SQL possono essere eseguite più istruzioni in sequenza, senza soluzione di continuità, semplicemente separando ciascuna istruzione con un punto e virgola (;).

In questo modo le singole istruzioni saranno eseguite una dopo l’altra senza interrompere la transazione e restituendo, così, il corretto valore della colonna IDENTITY.

Un esempio di codice di questa tecnica è il seguente:

      Dim cn As System.Data.SqlClient.SqlConnection
      Dim cnStr = "Data Source = HP\SQL2008EXPRESS;" & _
         "Initial Catalog=NOMEDATABASE;" & _
         "Password=PIPPO;" & _
         "User ID=sa;" & _
         "Persist Security Info=True"
      cn = New System.Data.SqlClient.SqlConnection(cnStr)
      cn.Open()
      Dim cmd As New System.Data.SqlClient.SqlCommand( _
         "SET NOCOUNT ON; INSERT INTO Tabella (ANAnome) " & _
         "VALUES ('De Ghetto Mario'); " & _
         "SELECT SCOPE_IDENTITY() AS ANAID;", cn)
      Dim risultato = cmd.ExecuteScalar()
      MessageBox.Show("Il nuovo ID inserito è " & risultato)
      cn.Close()
      cn = Nothing

Attenzione a impostare correttamente i parametri della stringa di connessione (nome dell’istanza, nome del database, utente e password), altrimenti non potrete collegarvi correttamente alla fonte dati.

Con ACCESS...

La tecnica che ho illustrato funziona solo con SQL Server.

Con Access (database .mdb) non è possibile inviare più di un comando SQL alla volta, ma è possibile eseguire più istruzioni SQL all’interno di una transazione (che bisogna attivare esplicitamente).

Inoltre, è necessario cambiare le istruzioni SQL, perché SET NOCOUNT non esiste in Access, così come non esiste SCOPE_IDENTITY().

L’articolo che si trova nella Knowledge Base di Microsoft all’indirizzo http://support.microsoft.com/default.aspx/kb/815629/en-us spiega come fare la stessa cosa con una tabella di Access da VB.NET.

Attenzione che l’accesso, nell’articolo, avviene tramite le librerie JET che devono essere state già installate (e che non funzionano all’interno di progetti a 64 bit, ma solo compilando a 32 bit)!

posted @ martedì 26 gennaio 2010 5.01 | Feedback (0) |

Powered by: