Esta utilidad la hice basándome en unos discos que vendía (¿vende?) Correos con los códigos postales de las provincias (y capitales de provincia) de España.
Por tanto, para usarlo de forma "eficiente" deberás comprar los discos que venden en las oficinas de Correos (antes costaban 1000 pesetas, no sé cuanto valdrán ahora...).
En estos discos se incluye una utilidad para manejar esa información, pero realmente a mi no me funcionaba muy bien... realmente no me gustaba cómo estaba hecha...
Así que me decidí a "destripar" el formato en que estaba guardada la información y fabricarme mi utilidad para Windows. La primera versión (por el 93) la hice para el VB3 (¿o era el VB2?, no recuerdo... tampoco importa mucho...) Esta versión debería seguir funcionando en el VB3, pero la compilé con el VB4 de 32 bits. De todas formas como incluyo los listados... pues la compilas cómo mejor te plazca.El programa en sí es muy simple, por tanto no voy a dar más explicaciones y mostrar el código, una foto del formulario y los más importante:
un link para que te bajes los listados (gscpostal.zip 4.79 KB)
Este otro link es para los archivos con los códigos postales de Málaga y Granada (dirdat.zip 78.2 KB)¡A disfrutarlo! Y si te gusta y te puede ser de utilidad, me lo dices y yo tan pancho.
La base de todo está en los archivos que se usan para obtener la información, están estructurados de la siguiente forma:
Un archivo Dir.dat con los datos de las provincias que están disponibles
Para cada provincia existe dos archivos: xxPob.dat y xxDir.dat
La xx se sustituirá por el número del código de provincia, por ejemplo Málaga es el 29, Barcelona el 08, Madrid el 28, etc.
El formato de Dir.dat es muy simple: El nombre de la provincia y el código separados por una coma.
En este archivo estarán las provincias que tenemos disponibles, en este ejemplo incluyo sólo las de Málaga y Granada, son las que realmente necesito (ya que en principio lo usamos en mi empresa y sólo trabajamos con datos de estas dos provincias)
Si necesitas alguna provincia en particular... o bien te compras los discos (sólo 1000 pesetillas, no me llevo comisión...) o bien me lo pides y veremos que puedo hacer.La estructura de los archivos xxPob.dat y xxDir.dat es la misma, pero con un significado diferente en el contenido:
xxPob.dat contiene los nombres de las poblaciones y xxDir.dat el callejero de la capital de provincia.Ahora pasemos a ver el código del programa, aunque primero una foto del form:
El código:
' 'gsCPostal.bas Declaración de tipos y variables globales 'en VB4 no es necesario usar este módulo ya que se pueden 'declarar los tipos de datos de forma privada en los forms ' Option Explicit Type tipoProvDAT 'Para el fichero Prov.DAT Prov As String miniCP As String End Type '---------------------------------------------------------- 'NOTA: los ficheros xxPOB.dat (poblaciones) (19/Abr/94) ' y xxDIR.dat (direcciones de la capital), 'tienen la mísma longitud de datos y las mísmas posiciones. 'Por ejemplo el campo "Poblacion": ' en población hace referencia a la población, ' en dirección hace referencia a la calle. '---------------------------------------------------------- Type tipoPobDAT 'Longitud 83 caracteres PrvLen As String * 1 Provincia As String * 17 PobLen As String * 1 Poblacion As String * 58 CPLen As String * 1 CPostal As String * 5 End Type Global Provincia As String Global HayCP As Integer Sub AbrirCPfrm() 'Abrir y mostrar la ventana de Códigos Postales 'Comprobar si ya está en memoria... If HayCP Then If CPfrm.WindowState = 0 Then CPfrm.WindowState = 1 Else CPfrm.WindowState = 0 End If Else CPfrm.Show End If End Sub'-------------------------------------------------- ' gsCPostal Form para los códigos postales ' (c)Guillermo Som Cerezo, 1993-96 '-------------------------------------------------- Option Explicit Option Compare Text Dim iniH As Integer Dim iniW As Integer Dim lngTmp As Long Dim Provincias() As tipoProvDAT Dim numProv As Integer Dim EsFormLoad As Integer Dim CPostal As Variant Dim miniCP As String Dim Poblacion As String Dim tCP As tipoPobDAT Dim nomFicCP As String Dim nomDirCP As String Dim numFic As Integer Dim numRegCP As Integer Dim lenPOB As Integer Dim PobODir As Integer Dim Pob_Dir As String Dim ClickEnList As Boolean Function BuscarEnList(oTextB As TextBox, oListB As ListBox) As Integer 'Actualizar el ListBox, según lo escrito en el TextBox 'Ver ficha 103 de Notas Guille Dim i As Integer, j As Integer Dim iHallado As Integer Dim sTmp As String If ClickEnList Then Exit Function End If If oListB.ListCount Then ClickEnList = True sTmp = oTextB.Text j = Len(sTmp) iHallado = 0 For i = 0 To (oListB.ListCount - 1) If StrComp(sTmp, Left$(oListB.List(i), j)) = 0 Then iHallado = i + 1 Exit For End If Next i If iHallado Then oListB.TopIndex = iHallado - 1 oListB.ListIndex = iHallado - 1 End If BuscarEnList = iHallado ClickEnList = False End If End Function Private Sub AbrirProvincia() Dim i As Integer Dim Combo1Index As Integer Dim sFile As String Dim lTmp As Long 'Cambiar el cursor del ratón... MousePointer = vbHourglass DoEvents 'Abrir el fichero de datos de la provincia activa... sFile = nomDirCP & Provincias(numProv).miniCP & Pob_Dir ClickEnList = True If Len(Dir$(sFile)) Then numFic = FreeFile Open sFile For Random As numFic Len = Len(tCP) numRegCP = LOF(numFic) \ Len(tCP) ListPoblacion.Clear ListCodigo.Clear TxtCodigo = "" TxtPoblacion = "" For i = 1 To numRegCP Get numFic, i, tCP lenPOB = Asc(tCP.PobLen) Poblacion = Left$(tCP.Poblacion, lenPOB) CPostal = tCP.CPostal ListPoblacion.AddItem Poblacion ListCodigo.AddItem CPostal ListPoblacion.ItemData(ListPoblacion.NewIndex) = i ' ListCodigo.NewIndex ListCodigo.ItemData(ListCodigo.NewIndex) = i ' ListPoblacion.NewIndex Next i Close numFic End If ClickEnList = False If ListCodigo.ListCount > 0 Then ListCodigo.ListIndex = 0 End If Caption = "Códigos Postales -" & Provincias(numProv).Prov Provincia = Provincias(numProv).Prov If PobODir Then CmdPobDir.Caption = "Mostrar las Direcciones de " & Provincia Else CmdPobDir.Caption = "Mostrar las Poblaciones de " & Provincia End If MousePointer = vbDefault End Sub Private Sub Combo1_Click() 'Seleccionar la provincia If Not EsFormLoad Then numProv = Combo1.ListIndex + 1 AbrirProvincia End If End Sub Private Sub Combo1_Change() If Not EsFormLoad Then numProv = Combo1.ListIndex + 1 End If End Sub Private Sub CmdCerrar_Click() Unload Me End Sub Private Sub CmdPobDir_Click() '------------------------------------------------------ 'Poder seleccionar ente Poblaciones o Direcciones ' (25/May/94) '------------------------------------------------------ PobODir = Not PobODir If PobODir Then Pob_Dir = "POB.DAT" Else Pob_Dir = "DIR.DAT" End If AbrirProvincia End Sub Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer) If KeyCode = vbKeyF3 Then Unload Me End If End Sub Private Sub Form_Load() 'Abrir el fichero de provincias Dim i As Integer Dim ProvinciaDat As String 'Sólo una copia cada vez If App.PrevInstance Then End End If iniH = Height iniW = Width 'Posicionar la ventana Top = GetSetting("CPostal.ini", "Posiciones", "Top", Top) Left = GetSetting("CPostal.ini", "Posiciones", "Left", Left) Provincia = GetSetting("CPostal.ini", "General", "Provincia", Provincia) If Provincia = "" Then Provincia = "MALAGA" End If PobODir = True Pob_Dir = "POB.DAT" ' 'Buscar el fichero PROV.DAT en este orden: 'primero: en el directorio C:\CP 'segundo: en el de la aplicación 'tercero: en el directorio actual ' nomFicCP = "C:\CP\PROV.DAT" nomDirCP = "C:\CP\" i = 0 Do If Len(Dir$(nomFicCP)) = 0 Then If i = 0 Then i = i + 1 nomFicCP = App.Path & "\PROV.DAT" nomDirCP = App.Path & "\" ElseIf i = 1 Then i = 2 nomFicCP = "PROV.DAT" nomDirCP = "" Else Beep MsgBox "No he hallado el fichero de PROVINCIAS (PROV.DAT)," & vbCrLf & vbCrLf & "Este archivo debe estar en una de estas localizaciones:" & vbCrLf & " El directorio C:\CP," & vbCrLf & " El directorio del programa " & App.Path & "," & vbCrLf & " El directorio actual." & vbCrLf & vbCrLf & "Programa Terminado.", vbCritical, "Código Postal" End End If Else Exit Do End If Loop numProv = 0 numFic = FreeFile Open nomFicCP For Input As numFic Do While Not EOF(numFic) Input #numFic, ProvinciaDat Input #numFic, miniCP ProvinciaDat = Trim$(ProvinciaDat) numProv = numProv + 1 'Reservar memoria... ReDim Preserve Provincias(numProv) As tipoProvDAT Provincias(numProv).Prov = ProvinciaDat Provincias(numProv).miniCP = Left$(Trim$(miniCP), 2) Combo1.AddItem ProvinciaDat Combo1.ItemData(Combo1.NewIndex) = Val(miniCP) Loop Close numFic EsFormLoad = True Combo1.ListIndex = 0 If Provincia <> "" Then For i = 1 To numProv If Provincia = Provincias(i).Prov Then Combo1.ListIndex = i - 1 Exit For End If Next End If numProv = Combo1.ListIndex + 1 AbrirProvincia HayCP = True EsFormLoad = False End Sub Private Sub Form_Resize() If WindowState <> vbMinimized Then Height = iniH Width = iniW End If End Sub Private Sub Form_Unload(Cancel As Integer) SaveSetting "CPostal.ini", "Posiciones", "Top", Top SaveSetting "CPostal.ini", "Posiciones", "Left", Left SaveSetting "CPostal.ini", "General", "Provincia", Provincia Set CPfrm = Nothing End Sub Private Sub ListPoblacion_Click() 'Conectar los ListBoxs ListCodigo.ListIndex = ConectarLists(ListPoblacion.ItemData(ListPoblacion.ListIndex), ListCodigo) ListPoblacion.TopIndex = ListPoblacion.ListIndex ListCodigo.TopIndex = ListCodigo.ListIndex If ClickEnList Then Exit Sub ClickEnList = True TxtPoblacion.Text = ListPoblacion.Text TxtCodigo.Text = ListCodigo.Text ClickEnList = False End Sub Private Sub ListCodigo_Click() 'Conectar los ListBoxs ListPoblacion.ListIndex = ConectarLists(ListCodigo.ItemData(ListCodigo.ListIndex), ListPoblacion) ListPoblacion.TopIndex = ListPoblacion.ListIndex ListCodigo.TopIndex = ListCodigo.ListIndex If ClickEnList Then Exit Sub ClickEnList = True TxtPoblacion.Text = ListPoblacion.Text TxtCodigo.Text = ListCodigo.Text ClickEnList = False End Sub Private Sub TxtCodigo_Change() lngTmp = BuscarEnList(TxtCodigo, ListCodigo) End Sub Private Sub TxtCodigo_GotFocus() TxtCodigo.SelStart = 0 TxtCodigo.SelLength = Len(TxtCodigo.Text) End Sub Private Sub TxtCodigo_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then If BuscarEnList(TxtCodigo, ListCodigo) Then TxtCodigo = ListCodigo.Text TxtPoblacion = ListPoblacion.Text End If KeyAscii = 0 TxtCodigo_GotFocus End If End Sub Private Sub TxtPoblacion_Change() lngTmp = BuscarEnList(TxtPoblacion, ListPoblacion) End Sub Private Sub TxtPoblacion_GotFocus() TxtPoblacion.SelStart = 0 TxtPoblacion.SelLength = Len(TxtPoblacion.Text) End Sub Private Sub TxtPoblacion_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then If BuscarEnList(TxtPoblacion, ListPoblacion) Then TxtCodigo = ListCodigo.Text TxtPoblacion = ListPoblacion.Text End If KeyAscii = 0 TxtPoblacion_GotFocus End If End Sub Private Function ConectarLists(queItem As Integer, oListB As ListBox) As Integer Dim i As Integer Dim iHallado As Integer iHallado = 0 For i = 0 To oListB.ListCount - 1 If oListB.ItemData(i) = queItem Then iHallado = i Exit For End If Next ConectarLists = iHallado End Function