Ficheros Aleatorios

Juan Carlos
04 de Mayo del 2004
Podrían orientarme en este problema que les voy a comentar o si es mejor utilizar archivos secuenciales (no he intentado):

Tengo un proyecto con 3 TextBox, para nombre, departamento y telefono. Tambien tengo 4 Botones los cuales son para guardar, nuevo, leer y eliminar. Para las acciones de nuevo, guardar y leer (en una List) todo me funciona correctamente. Cuando quiero Eliminar alguno de estos es cunando tengo problemas, te anexo el codigo:

Private Sub cmdEliminar_Click()

cmdLeer_Click

txtNombre.text = ""
txtDepartamento.text = ""
txtTelefono.text = ""

Dim nFic As Long, nFic2 As Long
Dim sFicEmp As String, sFicEmp2 As String

Dim i As Integer, j As Integer

nFic = FreeFile
nFic2 = FreeFile
sFicEmp = "empleados.dat"
sFicEmp2 = " emp.dat"

i = 1
j = 1

Open sFicEmp For Random As nFic Len = Len(Emp)
Open sFicEmp2 For Random As nFic2 Len = Len(Emp)


While Not EOF(nFic)
Get #nFic, i, Emp
If i <> 2 Then 'Ejemplo: quiero borrar el registro 2
Put #nFic2, j, Emp
j = j + 1
End If
i = i + 1
Wend


Close nFic, nFic2
Name "emp.dat" As "empleados.dat"

End Sub

Si tengo 4 nombres al inicio:
1.- a
2.- b
3.- c
4.- d

y elimino el registro 2, al momento de cmdLeer_Click me muestra lo siguiente:
1.- a
2.- c
3.- d
4.-

y cuando creo uno nuevo,lo muestra de la siguiente manera:
1.- a
2.- c
3.- d
4.-
5.- e

En los ficheros aleatorios no puedes borrar los registros???

Les agradecería me ayudaran en esta cuestion.

Saludos desde Mty, Mx ([email protected])

en?
04 de Mayo del 2004
Hola, el problema está en que utilizas la función EOF() en un fichero abierto en modo Random, ya que lee hasta que obtiene un último registro incompleto.

para solucionarlo sin tocar el EOF() sería así:

While Not EOF(nFic)
Get #nFic, i, Emp
If Not EOF(nFic) Then <--- Añade esto para comprobar que és el último, que estará en blanco.
If i <> 2 Then 'Ejemplo: quiero borrar el registro 2
Put #nFic2, j, Emp
j = j + 1
End If
i = i + 1
End If
Wend


Pero de paso te digo como lo hago yo siempre,
la cuestión és que lea el número de registros que contenga, y para saber la cantidad de registros que hay en el fichero és así:
NúmeroDeRegistros = LOF(nFic) Len(Emp)

y lo hago en un For:

For Cont = 1 to NúmeroDeRegistros
Get #nFic, , Emp
If Cont <> 2 Then 'Ejemplo: quiero borrar el registro 2
Put #nFic2, , Emp
End If
Next

* Si te fijas no es necesario poner el número de registro que lees o escribes, en el caso de que vayas a leerlo de principio a fin, ya que si omites ese parámetro se lee el siguiente automáticamente; y lo mismo para el Put #nFic, pues escribe después del último.



Saludos.