Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Funcion eliminar registro que borra todo

Estas en el tema de Funcion eliminar registro que borra todo en el foro de Visual Basic clásico en Foros del Web. Hola! Tengo un problemilla y no veo donde tengo el error, he realizado una funcion para borrar el primer registro de un archivo que siempre ...
  #1 (permalink)  
Antiguo 19/04/2010, 08:10
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Funcion eliminar registro que borra todo

Hola!

Tengo un problemilla y no veo donde tengo el error, he realizado una funcion para borrar el primer registro de un archivo que siempre esta vacio(el registro), el problema es que en vez de borrarme el 1er registro, me genera los mismos registros que tenia menos uno, pero todos vacios como el primero, el que queria eliminar. Podia alguien echarme una manita y decirme donde he cometido el error.

Muchas gracias

Código vb:
Ver original
  1. ' --------------------------------------------------------------------------
  2. ' \\ -- Subrutina para eliminar el 1er registro si esta en blanco.
  3. ' --------------------------------------------------------------------------
  4.  
  5. Private Sub EliminarRegistro()
  6.  
  7. ' Verificamos que el archivo temporal no exista, si existe se elimina
  8. If Dir("Temporal.dat") = "Temporal.dat" Then
  9. Kill "Temporal.dat"
  10. End If
  11.  
  12. FileTemp = FreeFile
  13. 'Abrimos y creamos un nuevo fichero temporal
  14. Open "Temporal.dat" For Random As FileTemp Len = Len(HorasTemp)
  15.  
  16. RegActual = RegActual + 1
  17. RegActualTemp = 1
  18.  
  19. 'Se recorren los registros del archivo
  20.  
  21. For Pos = 1 To RegUltimo - 1
  22.  
  23.     Get #Numero, RegActual, Horas
  24.    
  25. MsgBox "RegActual =  " & RegActual
  26.    
  27. With HorasTemp
  28.    
  29. 'Variables datos de las Horas.
  30.                
  31.         .inicio1 = inicio1_C
  32.         .fin1 = fin1_C
  33.         .inicio2 = inicio2_C
  34.         .fin2 = fin2_C
  35.         .inicio3 = inicio3_C
  36.         .fin3 = fin3_C
  37.         .tiempo = tiempo_C
  38.         .dia = dia_C
  39.         .fecha = fecha_C
  40.         .semana = semana_C
  41.         .mes = mes_C
  42.         .año = año_C
  43.         .npedido = npedido_C
  44.         .Totalhoras = Totalhoras_C
  45.                
  46. End With
  47.    
  48. 'Escribe en el archivo temporal los datos
  49. MsgBox "RegActualTemp  =  " & RegActualTemp
  50.    
  51.     Put #FileTemp, RegActualTemp, HorasTemp
  52.  
  53.     RegActual = RegActual + 1
  54.     RegActualTemp = RegActualTemp + 1
  55.  
  56. Next
  57.  
  58. Close Numero
  59. Close FileTemp
  60.  
  61. 'Elimina el archjivo con los datos
  62. Kill "Horas.dat"
  63.  
  64.  
  65. 'Renombra el archivo temporal a Datos.dat
  66. Name "Temporal.dat" As "Horas.dat"
  67.  
  68. End Sub
  #2 (permalink)  
Antiguo 20/04/2010, 03:26
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Funcion eliminar registro que borra todo

No estoy seguro de que hayas abierto el fichero de datos Numero para leerlo, ya que en la sub solo lo cierras "Close Numero".
De todas formas los valores que guardas de cada registro parecen siempre los mismos.
¿No deberia ser algo como esto?

Código vb:
Ver original
  1. Private Sub EliminarRegistro()
  2.  
  3. ' Verificamos que el archivo temporal no exista, si existe se elimina
  4. If Dir("Temporal.dat") = "Temporal.dat" Then
  5. Kill "Temporal.dat"
  6. End If
  7.  
  8. FileTemp = FreeFile
  9. 'Abrimos y creamos un nuevo fichero temporal
  10. Open "Temporal.dat" For Random As FileTemp Len = Len(HorasTemp)
  11.  
  12. Numero = FreeFile
  13. 'Abrimos el fichero de datos
  14. Open "Horas.dat" For Random As Numero Len = Len(HorasTemp)
  15.  
  16. RegActual = RegActual + 1
  17.  
  18. 'Se recorren los registros del archivo
  19.  
  20. For Pos = 1 To RegUltimo - 1
  21.  
  22.     Get #Numero, RegActual, Horas
  23.    
  24. MsgBox "RegActual =  " & RegActual
  25.    
  26. 'Escribe en el archivo temporal los datos
  27. MsgBox "RegActual  =  " & RegActual
  28.    
  29.     Put #FileTemp, RegActualTemp, Horas
  30.  
  31.     RegActual = RegActual + 1
  32.  
  33. Next
  34.  
  35. Close Numero
  36. Close FileTemp
  37.  
  38. 'Elimina el archjivo con los datos
  39. Kill "Horas.dat"
  40.  
  41.  
  42. 'Renombra el archivo temporal a Datos.dat
  43. Name "Temporal.dat" As "Horas.dat"
  44.  
  45. End Sub

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #3 (permalink)  
Antiguo 20/04/2010, 05:40
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Funcion eliminar registro que borra todo

Hola:

Te respondo en este mensaje porque aqui es donde tienes la pregunta y a fin de no liar al foro:

Código vb:
Ver original
  1. Private Sub EliminarRegistro()
  2.   Dim Entrada As Integer, Salida As Integer, Registro As Single
  3.   Dim RegistroDatos As String * 256
  4.  
  5.   Entrada = FreeFile
  6.   Open "Horas.dat" For Random As #Entrada Len = 256
  7.   Salida = FreeFile
  8.   Open "Horas.tmp" For Random As #Salida Len = 256
  9.   ' Bucle desde el segundo hasta el final (el tamaño del archivo dividido por la longitud de registro)
  10.  For Registro = 2 To LOF(Entrada) / 256
  11.     ' Leemos el Registro
  12.    Get #Entrada, Registro, RegistroDatos
  13.     ' Grabamos el nuevo en el siguiente registro (el tamaño del archivo dividido por la longitud) + 1
  14.    Put #Salida, LOF(Salida) / 256 + 1, RegistroDatos
  15.   Next
  16.   Close #Entrada
  17.   Close #Salida
  18.  
  19.   Kill "Horas.dat"
  20.   Name "Horas.tmp" As "Horas.dat"
  21.  
  22. End Sub

Como ves resulta mas simple de lo que parece, pero no me saltes de aqui para allá. Como te decía en el otro mensaje, revisa el código para aprender su función.

No he puesto la comprobación de existencia del anterior que la puedes simplificar en una sóla y yo te aconsejaría utilizarla así

If Dir("Horas.tmp") <> "" Then Kill "Horas.tmp"

porque si por ejemplo el archivo en disco se llama HORAS.TMP no te funcionará porque el nombre Horas.tmp es diferente de HORAS.TMP


Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #4 (permalink)  
Antiguo 20/04/2010, 05:43
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Funcion eliminar registro que borra todo

Hola pkj!

Referente al codigo me comentas que no esta abierto en esa rutina el Archivo o canal Numero, este lo tengo abierto en el form_Load() al principio, por eso aqui es donde solo abro el temporal para guardar todo lo del archivo Horas.dat escepto el primer registro que es el que me interesa borrar.
He probado tu codigo y me da un error en la linea .:

29. " Put #FileTemp, RegActualTemp, Horas " ,

el error que me da es "Nümero de registro incorrecto". por otro lado veo que has eliminado todo lo contenido en el "Whit/End With", Pregunta de novato.: No es necesario leer y guardar en variables temporales registro a registro o se puede hacer directo?.

Un saludo
  #5 (permalink)  
Antiguo 20/04/2010, 05:57
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Funcion eliminar registro que borra todo

Hola erbunson!

Gracias por adelantado, como bien dices he preferido dividir los temas para no liarla ya que en un lado toco un tema y aqui otro aunque del mismo programilla, pero temas totalmente diferentes. Veo que en la linea 14. Put #Salida, LOF(Salida) / 256 + 1, RegistroDatos, en vez de la variable RegActualTemp pones LOF(Salida) / 256 + 1 que en principio seria lo mismo, ¿Es asi, es mejor es por esto el error de numero de registro ? Tambien veo que como habia consultado a pkj no hay el Whit/End whit ¿Es esto lo que me provocaba que me guardase todos los regitros pero con ceros?

Un saludo
  #6 (permalink)  
Antiguo 20/04/2010, 07:03
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Funcion eliminar registro que borra todo

Hola XYON, el tema es que si grabas con la opción que te doy de LOF(Fichero)/Longitud + 1 con esto SIEMPRE obligas al siguiente registro libre.

Por otra parte si es necesario LEER el Registro, cosa que conseguimos con el GET y la variable para después grabarlo con el PUT, aunque como puedes comprobar no necesariamente EN ESTE CASO tenemos la necesidad de leer en el UDT ya que lo único que hacemos es Leer la Variable desde uno para Grabarla en el otro.

Lo que es del todo innecesario es el Whit/End Whit que utilizas ya que puedes trabajar directamente sobre el UDT, por ejemplo cuando pasas un dato al MsFlexGrid lo puedes hacer como Horas.LoQueSea

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #7 (permalink)  
Antiguo 20/04/2010, 07:19
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Funcion eliminar registro que borra todo

Imagino que el código de erbuson será mejor, ya que creo que tiene experiencia en trabajar con ese tipo de archivos.
Yo realmente solo he modificado un poco tu código.

Como has comentado, con el with lo que hacías era estropear los registros leidos, cuando para lo que tú querías hacer solo hay que leer el registro y guardarlo directamente al nuevo fichero.

El fallo que me comentabas que dá era porque no he revisado tu línea de Put y no he visto que usa una variable incorrecta. No es RegActualTemp sino RegActual, aunque imagino que realmente el mejor modo sería algo como lo que pone erbuson:

Put #Salida, (LOF(Salida) / Len(Horas)) + 1, Horas

Que se dé bien
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #8 (permalink)  
Antiguo 21/04/2010, 00:16
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Funcion eliminar registro que borra todo

Hola pkj!

Muchas gracias, por lo que comentas del codigo de erbunson es cierto lo he probado y modificado en las partes que duplicaba las sentencias que yo tenia en otras lineas fuera de este codigo y me ha funcionado perfectamente.
Como me comentaba Erbunson, aparte de ver el codigo lo que hago es estudiarlo a fondo para aprender, pues copiar y pegar si no se lo que hace el codigo no me aporta nada.

Un saludo y muchas gracias
  #9 (permalink)  
Antiguo 21/04/2010, 06:30
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Funcion eliminar registro que borra todo

hola erbunson!

Una consulta, en tu codigo de borrado de registro sobre entiendo que el valor de la variable "Dim RegistroDatos As String * 256", este 256 se lo has dado como ejemplo, que deberia ser el tamaño del LEN(archivo.dat) es decir que si mi archivo.dat tiene un tamaño por registro de 433 la variable "Dim RegistroDatos As String * 433" seria asi, con intencion de en una sola variable guardar todo el registro.

Estoy casi seguro pero si no fuese asi, dime el porque.

Muchas gracias
  #10 (permalink)  
Antiguo 21/04/2010, 06:46
Avatar de erbuson  
Fecha de Ingreso: noviembre-2009
Mensajes: 701
Antigüedad: 14 años, 5 meses
Puntos: 53
Respuesta: Funcion eliminar registro que borra todo

Efectivamente era un ejemplo y lo que piensas es correcto el 256 es en mi caso la longitud de registro.

Saludos
__________________
Agradecer a quien te enseñó, es enseñar lo que de él aprendiste.
Recuerda: Decir gracias, poco cuesta y mucho vale ...
  #11 (permalink)  
Antiguo 21/04/2010, 06:47
Avatar de pkj
pkj
 
Fecha de Ingreso: julio-2006
Ubicación: Órbita sincrónica
Mensajes: 899
Antigüedad: 17 años, 9 meses
Puntos: 29
Respuesta: Funcion eliminar registro que borra todo

Ese valor es la longitud de 1 registro.
Erbuson ha usado un registro que solo contiene un texto de 256 caracteres como ejemplo.
Tu vas a usar la variable Horas en lugar de RegistroDatos, y el valor a usar debe ser Len(Horas), que es la suma de las longitudes de todos los valores dentro de el registro.

len(horas.Inicio1)+len(horas.fin1)+len(horas.inici o2)+.....

Al poner Len(Horas) consigues la suma de todos de una sola vez.

Espero habertelo aclarado.

Saludos
__________________
No hay preguntas tontas, solo gente estup..., ¡No!, ¿como era? No hay gente que pregunte a tontos... ¡Nooo!... ¡Vaya cabeza!
  #12 (permalink)  
Antiguo 21/04/2010, 06:50
Avatar de XYON126  
Fecha de Ingreso: abril-2006
Mensajes: 272
Antigüedad: 18 años
Puntos: 0
Respuesta: Funcion eliminar registro que borra todo

Muchas gracias!

Aclarado.

Un saludo

Etiquetas: eliminar, funcion, registro, todo
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:22.