Ficheros Aleatorios
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])
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])
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.
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.
