• Domingo 22 de Diciembre de 2024, 19:00

Autor Tema:  Eliminar Registros En Access  (Leído 10662 veces)

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Eliminar Registros En Access
« en: Miércoles 1 de Marzo de 2006, 20:45 »
0
Hola a todos, el problema es el siguiente: Cuando trabajo con bases de datos creadas en Access todo me funciona perfectamente el problema esta en que cada vez el archivo crece de tamaño. Eso en comprensible ya que cada dia se vana añadiendo nuevos registros en las diferentes tablas de la base de datos, ahora bien lo logico seria que en el momento que elimino registros de las tablas la base de datos el archivo (.mdb) disminuyera de tamaño... Pero extrañamente esto no ocurre asi.

Por ejemplo, tengo un archivo cuyo tamaño es de aproximadamente 15Mb y posee mas de 5mil registros en las diferentes tablas, he borrado mas de 2mil registros y el archivo sigue del mismo tamaño.

He llegado a una conclusion, recuerdo que cuando utilizaba VFP y eliminaba registros de una tabla con la sentecia sql el programa marcaba el registro como eliminado, pero el registro segui existiendo dentro de la tabla, es decir eliminaba logicamente el registro mas no fisicamente. Recuerdo tambien que habia que abrir la base de datos de forma exclusiva y realizar una limpieza de la base de datos para que ahora si borrara fisicamente todos los registros marcados como eliminados dentro de la base de dato.

No se si haya que hacer algo parecido dentro de access, en realidad lo he buscado y no lo he encontrado. Preferiria que lo que haya que hacer sea desde VB porque asi no tengo que utilizar el Access para nada y mi programa seria 100% independiente y el mismo se encargaria de realizar la depuracion de la base de datos.

Yo dentro de mis programas utilizo la sentencia sql DELETE para borrar los registros de la base de datos, no se si existe otra forma mejor para hacerlo y que en realidad borre fisicamente los registros y asi el tamaño del archivo disminuya.

Agradeceria la ayuda de todos los que puedan ya que tengo un archivo que ha llegado al catastrofico tamaño de 120Mb y sigue creciendo como una bestia imparable.


------- :angel: ------ o ------ :devil: -------
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...

Del Piero

  • Miembro activo
  • **
  • Mensajes: 44
    • Ver Perfil
Re: Eliminar Registros En Access
« Respuesta #1 en: Miércoles 1 de Marzo de 2006, 21:08 »
0
Puedes probar los siguiente:

  Ingresa al menu Herramientas de Access, submenu "Utilidades de la Base de

Datos", luego elije "Compactar y reparar base de datos".

Si tu base de datos tiene contraseña tienes que ingresar en modo exclusivo.

ebolo

  • Miembro MUY activo
  • ***
  • Mensajes: 188
    • Ver Perfil
Re: Eliminar Registros En Access
« Respuesta #2 en: Jueves 2 de Marzo de 2006, 10:33 »
0
Hola a todos, según tengo entendido eso es lo normal en bd de access, cuando eliminas registros, se eliminan pero el tamaño no disminuye en la misma proporción.
A parte de lo dicho por Del Piero, también lo que puedes hacer es crearte otra bd nueva e importar todo, de esta forma mejora mucho el rendimiento de la misma.

Saludos.

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Eliminar Registros En Access
« Respuesta #3 en: Jueves 2 de Marzo de 2006, 15:38 »
0
Reparar y compactar, o crear una nueva base de datos e importar, funciona de las 2 maneras, personalmente al trabajar en VB6 prefiero reparar y compactar, me parece que es más rápido y seguro.
 :comp:

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Re: Eliminar Registros En Access
« Respuesta #4 en: Jueves 2 de Marzo de 2006, 16:10 »
0
Gracias por sus respuestas, en primer lugar probe lo que me dijo del piero y eso disminuyo considerablemente el tamaño de la base de datos, el problema esta en que es el usuario que debe de abrir la db en access y realizar el procedimiento, el problema esta en que como les dije eso hace que el programa no sea 100% independiente, ahora no se si existe una forma de hacer lo mismo pero desde vb, osea que sea mi programa y no el usuario el que realice la compactacion de la db.

Lo de crear una nueva db y pasar todos los registros es muy complicado, bueno en lugar de complicado es muy largo y lento, porque manejo tablas que presentan mas de 100mil registros y la idea es que sea algo rapido y eficaz, imaginate pasar 100mil registros uno a uno de una tabla a otra.

Por los momentos lo que estoy haciendo es compactar la db por access pero si alguien sabe como hacer que sea mi aplicacion y no yo el que lo haga se los agradeceria.
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...

Sagutxo

  • Miembro MUY activo
  • ***
  • Mensajes: 320
    • Ver Perfil
Re: Eliminar Registros En Access
« Respuesta #5 en: Jueves 2 de Marzo de 2006, 16:55 »
0
Salu2.

Código: Text
  1. DBEngine.CompactDatabase PathDeBaseACompactar, NuevaBaseCompactada, dbLangGeneral, , PassDb
  2.  

Luego solo tendras que borrar la DB vieja y renombrar la DB nueva.

   Tambien podrías crear antes un .zip de la DB vieja por si acaso :) el proceso no fuera bien.

Espero que te funcione, a mi si :)

 :smartass:  :comp:  :smartass:
Mi mujer tiene un físico bárbaro!!!. Einstein.

cpmario

  • Miembro HIPER activo
  • ****
  • Mensajes: 629
    • Ver Perfil
    • http://www.cpimario.com
Re: Eliminar Registros En Access
« Respuesta #6 en: Jueves 2 de Marzo de 2006, 20:29 »
0
Te djunto el código que utilizo para compactar y reparar la base de datos en DAO

Código: Text
  1. Sub CompactDbase(sDbase As String, Aviso As Boolean)
  2.      Dim sBakDb As String
  3.      Dim db As Database
  4.      On Error Resume Next
  5.      If sDbase <> "" Then
  6.           Screen.MousePointer = vbHourglass
  7.           'try and open it in exclusive mode
  8.           Set db = OpenDatabase(sDbase, True)
  9.           If Err = 0 Then
  10.                 'opened ok so close it
  11.                 db.Close
  12.                 'construct the correct .bak filename
  13.                 sBakDb = Left$(sDbase, InStr(sDbase, ".")) & "BAK"
  14.                 'give a chance to exit
  15.                 If Aviso Then
  16.                      gstrMsg = "Su base de datos " & sDbase & vbCrLf & " se copiará. " & sBakDb
  17.                      If MsgBox(gstrMsg, vbOKCancel + vbExclamation, "Compactando la Base de Datos") = vbCancel Then
  18.                           Screen.MousePointer = vbDefault
  19.                           Exit Sub
  20.                      End If
  21.                 End If
  22.                 'kill any existing .bak
  23.                 If ExistFilename(sBakDb) Then
  24.                     Kill (sBakDb)
  25.                 End If
  26.                 If Err <> 0 Then Err = 0 'err because no existing .bak
  27.                 'copy original to sBakdb
  28.                 FileCopy sDbase, sBakDb
  29.                 If Err <> 0 Then
  30.                      'call the generic error handler
  31.                      GenErrorHandler "copiado de " & sDbase & " a " & sBakDb, Err, Error
  32.                      Screen.MousePointer = vbDefault
  33.                      Exit Sub
  34.                 End If
  35.      
  36.                 'kill the existing database because can't compact into an existing one
  37.                 If ExistFilename(sDbase) Then
  38.                     Kill (sDbase)
  39.                 End If
  40.                 DoEvents
  41.                 If Err = 0 Then
  42.                      'deleted ok so compact it
  43.                      'DBEngine.RepairDatabase sBakDb
  44.                      DBEngine.CompactDatabase sBakDb, sDbase, dbLangGeneral, dbDecrypt
  45.                      If Err <> 0 Then
  46.                           'call the generic error handler
  47.                           GenErrorHandler "compactado de la base de datos", Err.Number, Err.Description
  48.                           Err = 0
  49.                           'copy bakdb to original
  50.                           FileCopy sBakDb, sDbase
  51.                           If Err <> 0 Then
  52.                                 'call the generic error handler
  53.                                 GenErrorHandler "Error en copiado de " & sBakDb & " a " & sDbase, Err.Number, Err.Description
  54.                                 Screen.MousePointer = vbDefault
  55.                                 Exit Sub
  56.                           End If
  57.                      Else
  58.                             If Aviso Then
  59.                                   MsgBox "Reparación y compactación completa.", vbOKOnly + vbExclamation, App.Title
  60.                             End If
  61.                      End If
  62.                 Else
  63.                 End If
  64.           Else
  65.                 'call the generic error handler
  66.                 GenErrorHandler "intento de abrir la base de datos de manera exclusiva.", Err, Error
  67.           End If
  68.      End If
  69.      Screen.MousePointer = vbDefault
  70. End Sub
  71.  
Espero te sirva.
 :comp:

elmango80

  • Miembro MUY activo
  • ***
  • Mensajes: 149
  • Nacionalidad: ve
    • Ver Perfil
Re: Eliminar Registros En Access
« Respuesta #7 en: Viernes 3 de Marzo de 2006, 19:54 »
0
Muchas gracias por la informacion Sagutxo... ya me iba a poner a probar lo que me dijiste cuando vi que cpmario me habia mandado el codigo completo... Bueno gracias por la ayuda y ya sabia yo que por aqui iba a encontrar la solucion de mis problemas como siempre....
Citar
No soy bueno, tampoco soy malo sino todo lo contrario...