Oggi vi metto a disposizione un piccolo programmino che dato un codice fiscale trova luogo di nascita e la provincia.
Il programma si appoggia a un database Excel dove contiene in colonne ( Codice Catasto, Provincia, Luogo).
Alla fine del codice troverete il file del programma con il relativo file Excel dell'elenco dei Comuni 2012.
Il cuore del programma è la ricerca, sfrutta la ricerca binaria per ottimizzare la ricerca del valore e ci mette esattamente Log(n) invece di scansionarli tutti e ci metterebbe N*N.
Qui di seguito vi allego la funzione Ricerca Binaria implementata nel programma. Vi ricordo che la funzione la dovete usare soltanto se avete un Database ordinato o un array ordinato.
Ora vi metto a disposizione tutto il codice del programma.
Public Class Form1
'Variabili
Dim DtSet As System.Data.DataSet
Dim myConnectionString As String
Dim myConnection As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection
Dim MyCommand As System.Data.OleDb.OleDbDataAdapter
Dim ValoreCella As String
Dim ValoreDaCercare As String
''' <summary>
''' CpmmettiFileExcel - Funzione che serve per connettersi al file .xls
''' </summary>
''' <param name="NomeFileExcel"></param>
''' <remarks></remarks>
Private Sub ConnettiFileExcel(ByVal NomeFileExcel As String)
Try
myConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & NomeFileExcel & ";Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"";"
myConnection.ConnectionString = myConnectionString
myConnection.Open()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
''' <summary>
''' DisconnettiFileExcel - Funzione che serve per disconnetere e chiudere la lettura del file .xls
''' </summary>
''' <remarks></remarks>
Private Sub DisconnettiFileExcel()
Try
myConnection.Close()
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
''' <summary>
''' CaricaCartella - Carica il nome della cartella o finistra del file Excel
''' </summary>
''' <param name="NomeCartella"></param>
''' <remarks></remarks>
Private Sub CaricaCartella(ByVal NomeCartella As String)
Try
MyCommand = New System.Data.OleDb.OleDbDataAdapter _
("select * from [" & NomeCartella & "$]", myConnection)
MyCommand.TableMappings.Add("Table", "TestTable")
DtSet = New System.Data.DataSet
MyCommand.Fill(DtSet)
'Copia interamente la tabella nel DataGridView
'DataGridView1.DataSource = DtSet.Tables(0)
'Ciclo che serve per popolare il DAtaGridView
For i As Integer = 0 To DtSet.Tables(0).Rows.Count - 1
DataGridView1.Rows.Add()
For j As Integer = 0 To DtSet.Tables(0).Columns.Count - 1
ValoreCella = DtSet.Tables(0).Rows(i).Item(j).ToString
DataGridView1.Rows(i).Cells(j).Value = ValoreCella
Next
Next
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
''' <summary>
''' CaricaConfiguraioneDataGridView - Carica le caratteristiche del DataGridView
''' </summary>
''' <remarks></remarks>
Private Sub CaricaConfiguraioneDataGridView()
DataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
DataGridView1.AutoSize = True
End Sub
''' <summary>
''' Carica il programma - Load Form
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim File As String
File = Application.StartupPath & "\ELENCO_COMUNI_2012.xls"
ConnettiFileExcel(File)
CaricaCartella("Elenco Comuni")
DisconnettiFileExcel()
End Sub
Private Sub txtCodiceFiscale_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtCodiceFiscale.TextChanged
Select Case txtCodiceFiscale.TextLength
Case 16 'Quando ho inserito tutto il codice fiscale
ValoreDaCercare = txtCodiceFiscale.Text.Substring(11, 4)
txtCodiceCatasto.Text = ValoreDaCercare
Case 0 'Quando ho cancellato il codice fiscale
txtCodiceFiscale.Text = ""
txtLuogoNascita.Text = ""
txtProvincia.Text = ""
txtCodiceCatasto.Text = ""
Case Else
txtCodiceFiscale.Text = txtCodiceFiscale.Text.Replace(" ", "")
End Select
End Sub
Private Sub txtCodiceFiscale_Validated(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtCodiceFiscale.Validated
'Controllo correttezza CodiceFiscale
txtCodiceFiscale.Text = txtCodiceFiscale.Text.Replace(" ", "")
If txtCodiceFiscale.TextLength <> 16 Then
MsgBox("Attenzione Codice Fiscale con meno di 16 carateri, ricontrollare perfavore", vbInformation, "Attenzione!!!")
End If
End Sub
''' <summary>
''' MetodoCerca - /* Funzione per Ricerca Binaria con ricorsione */
''' </summary>
''' <param name="Partenza"></param>
''' <param name="Fine"></param>
''' <param name="Valore"></param>
''' <returns></returns>
''' <remarks></remarks>
Private Function MetodoCerca(ByVal Partenza As Integer, ByVal Fine As Integer, ByVal Valore As String) As Integer
If Valore = "" Then
Return -1
End If
If Partenza > Fine Then
Return -1
End If
Dim middle As Integer = 0
middle = (Partenza + Fine) / 2
'Console.WriteLine(DataGridView1.Item(0, middle).Value.GetHashCode & " = " & Valore.GetHashCode)
If Valore < DataGridView1.Item(0, middle).Value Then
Return MetodoCerca(Partenza, middle - 1, Valore)
ElseIf Valore > DataGridView1.Item(0, middle).Value Then
Return MetodoCerca(middle + 1, Fine, Valore)
ElseIf Valore = DataGridView1.Item(0, middle).Value Then
Return middle
End If
Return -1
End Function
Private Sub txtCodiceCatasto_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtCodiceCatasto.TextChanged
If txtCodiceCatasto.Text = "" Then
Exit Sub
End If
Dim RigaValore As Integer
txtCodiceCatasto.Text = UCase(txtCodiceCatasto.Text)
RigaValore = MetodoCerca(0, DataGridView1.Rows.Count - 1, txtCodiceCatasto.Text)
If RigaValore <> -1 Then
DataGridView1.CurrentCell = DataGridView1.Item(0, RigaValore)
txtProvincia.Text = DataGridView1.Item(1, RigaValore).Value
txtLuogoNascita.Text = DataGridView1.Item(2, RigaValore).Value
'MsgBox("Trovato")
Else
txtLuogoNascita.Text = "Error"
txtProvincia.Text = "Error"
End If
End Sub
End Class