Eliminar Tabla sin registros en Macro Access

Necesito eliminar una tabla pero sólo en el caso en el que no tenga registros. Iría la orden en una macro y tengo 150 tablas creadas, pero algunos días 25 no tendrán registros y hay que eliminarlas pero al día siguiente pueden ser 75 las que no tengan registros. Imagino que tendré que repetir la orden para cada una de las tablas y que la macro corra sobre todas ellas, pero desconozco cómo programarlo.

2 respuestas

Respuesta
2

Joaquin: Antes que nada recomendarte que hagas una copia de tu BD, sin haber aplicado el código que te cito, y que tu debes poner en el Evento Click de un botón de comando, o el lugar que tu veas más conveniente.

Dim Tbl As AccessObject
Dim NumReg As Long
Dim CuentaVacias As Integer
For Each Tbl In CurrentData.AllTables
   If Not Tbl.Name Like "MSys*" Then
        NumReg = Nz(DCount("*", Tbl.Name), 0)
        If NumReg = 0 Then
             If MsgBox("Vas a eliminar la Tabla >> " & Tbl.Name & vbCrLf & vbCrLf & "¿Quieres borrarla Definitivamente?", vbYesNo) = vbYes Then
                  CuentaVacias = CuentaVacias + 1
                  CurrentDb.Execute "DROP TABLE " & Tbl.Name & ";"
             End If
        End If
    End If
Next Tbl
MsgBox "Se han borrado: " & CuentaVacias & " Tablas que no tenían Registros", vbInformation, "TABLAS BORRADAS"

Los mensajes de aviso, solo son como ejercicio para seguir el código y una vez comprobado su buen funcionamiento comentarlos o borrarlos. Si quieres dejarlos pues tu eliges.

Un saludo >> Jacinto

Muchas gracias Jacinto por tu respuesta, pero (y a lo mejor tenía que haber empezado por ahí), ¿cómo hago que esto "corra" en Access? Mi idea era integrarlo en una Macro para que una vez ejecutado todo el proceso de creación de las diferentes tablas, ejecutar esta segunda macro para eliminar aquellas tablas sin registros.

Joaquin: Las macros de antes y las de ahora incrustadas no las he utilizado nunca, porque me encuentro más cómodo con VBA. Es una cuestión personal, por lo que se me hace difícil sugerirte cómo hacerlo. Tal como te explicaba, puedes programar un botón en su evento Click y poner ese código.

No obstante desde una macro puedes llamar (ejecutar) código. Si tú estás familiarizado con las Macros, sean incrustadas o no te será sencillo hacerlo de la siguiente manera.

1.- En un Módulo Estándar copia ese código pero con un Nombre de Procedimiento. Ejemplo>>

Public Sub BorraTablasVacias()
Dim Tbl As AccessObject
Dim NumReg As Long
Dim CuentaVacias As Integer
For Each Tbl In CurrentData.AllTables
        If Not Tbl.Name Like "MSys*" Then
                NumReg = Nz(DCount("*", Tbl.Name), 0)
                If NumReg = 0 Then
                        If MsgBox("Vas a eliminar la Tabla >> " & Tbl.Name & vbCrLf & vbCrLf & "¿Quieres borrarla Definitivamente?", vbYesNo) = vbYes Then
                                CuentaVacias = CuentaVacias + 1
                                CurrentDb.Execute "DROP TABLE " & Tbl.Name & ";"
                        End If
                End If
        End If
Next Tbl
MsgBox "Se han borrado: " & CuentaVacias & " Tablas que no tenían Registros", vbInformation, "TABLAS BORRADAS"
End Sub

Después de ésto, llamas a BorraTablasVacias() desde la Macro.

En éste par de enlaces, Microsoft sugiere como hacerlo.

https://support.office.com/es-es/article/acci%C3%B3n-de-macro-ejecutarc%C3%B3digo-e6a62d3f-02c6-4daf-a5f7-402fd600bed4 

https://msdn.microsoft.com/es-es/library/office/ff834373.aspx 

Mis saludos >> Jacinto

Joaquin: Te he enviado una respuesta a tu segundo mensaje, pero no lo veo aquí.

Te sugería una metodología para llamar a una Función o procedimiento desde Macro.

Si no lo has recibido, me comentas e intento reproducirlo. Un saludo >> Jacinto

Gracias Jacinto por tu tiempo y tus respuestas.

He probado a hacerlo y me funcionaba, pero de repente me da error 3295 en la sintaxis en DROP TABLE

No he tocado (o al menos eso creo) tu código, pero ha dejado de funcionar.

Joaquin: Es posible que el código haya encontrado una Tabla con separaciones en el Nombre ya que lo he probado un par de veces en dos bases distintas y no me ha presentado problemas, pero los nombres de mis Tablas nunca tiene caracteres especiales, ni acentos ni espacios. Prueba el siguiente que yo no he probado y me comentas.

Public Sub BorraTablasVacias()
Dim Tbl As AccessObject
Dim NombTabla As String
Dim NumReg As Long
Dim CuentaVacias As Integer
For Each Tbl In CurrentData.AllTables
        If Not Tbl.Name Like "MSys*" Then
                NumReg = Nz(DCount("*", Tbl.Name), 0)
                If NumReg = 0 Then
                        If MsgBox("Vas a eliminar la Tabla >> " & Tbl.Name & vbCrLf & vbCrLf & "¿Quieres borrarla Definitivamente?", vbYesNo) = vbYes Then
                                CuentaVacias = CuentaVacias + 1
                NombTabla =Tbl.Name
                                CurrentDb.Execute "DROP TABLE [" & NombTabla & "]"
                        End If
                End If
        End If
Next Tbl
MsgBox "Se han borrado: " & CuentaVacias & " Tablas que no tenían Registros", vbInformation, "TABLAS BORRADAS"
End Sub

Ya me contarás >> Un saludo >> Jacinto

¡Gracias! Ya he resuelto el problema de la sintaxis. Efectivamente era porque había espacios en blanco. Con los [ ] no se ha solucionado, pero he renombrado las tablas (quitándoles espacios) y ya funciona.

Respuesta
1

Me podrías decir si la conformación de las tablas son todas iguales ;¿Además por qué tienes que generar tantas tablas?

Por que si miro la pregunta de pronto veo que tienes mal diseñado el sistema ; si me das la información que te pido tal vez pueda ayudarte propopniendo otero tipo de solución ...

Lee sobre los temas de BASES DE DATOS RELACIONALES y sus tipos de relaciones, para que sirven, como se usan, mira también algo de álgebra relacional, busca sobre normalización de bases de datos,,,.

¡Gracias! Ya tengo resuelto el problema. Es información de diferentes puntos de venta, y cada día puede realizxar uno una venta o no, por eso tener tantas tablas. Y no, no hay posibilidad de trabajar en otra cosa que no sea Access.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas