Eliminar una tabla elegida en un combobox
Me gustaría saber que código puedo utilizar para eliminar (no dejar en blanco) una tabla que tengo elegida mediante un cuadro combinado (combobox).
El código que no me funciona es:
Private Sub cmdEliminarTabla_Click()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01
DoCmd.DeleteObject acTable, " vartabla"
End Sub
2 Respuestas
La verdad, no entiendo la instrucción. Primero, el evento al hacer clic no te sirve porque todavía no has elegido nada en el combinado. Segundo, ¿para qué definir una variable que va a ser exactamente igual al valor de un control?
Supongamos que tengo una serie de tablas
Y tengo un formulario con un combinado al que he llamado Eliminar, donde selecciono la tabla Cobros
Una vez que la he seleccionado
Ha desaparecido
El código del evento Después de actualizar del combinado es, simplemente
Private Sub Eliminar_AfterUpdate() DoCmd.DeleteObject acTable, "" & Me.Eliminar & "" End Sub
Muchas gracias Icue por tu respuesta pero he olvidado decirte que en el evento Después de actualizar del cuadro combinado, tengo el siguiente código que me dió Sveinbjorn, con el cual
visiono la tabla, en el formulario, que he seleccionado en el cuadro combinado.
Private Sub Cuadro_combinado01_AfterUpdate()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado
Por lo tanto me creo un botón de comando y en el evento Al hacer clic le pongo el código que no me funciona.
También he pensado antes de eliminar la tabla cerrarla, pero no funciona.
Un saludo.
Pero tal como lo estás haciendo te obliga a elegir primero un nombre de tabla en el combinado y luego pulsar el botón. ¿Para qué? Si lo puedes hacer en el mismo momento que lo eliges. Prueba a poner la instrucción que te dije en el evento Después de actualizar del combinado.
Gracias Icue:
Lo que pretendo es primero ver la tabla y después de haberla visto eliminarla o no.
Por lo tanto necesito primero verla.
Un saludo
No sé que tendrás puesto, pero si primero quieres verla puedes poner en el evento Después de actualizar
DoCmd.OpenTable "" & Me.Eliminar & ""
Con lo cual abrirás la tabla que hayas elegido. Supongo que después de verla la cerrarás. Entonces podrías poner en ese botón que citas
Dim respuesta as byte
respuesta=msgbox("¿Está seguro de querer eliminar esta tabla?,vbyesno,"Decídete de una vez, luego no hay vuelta atrás")
If respuesta=vbyes then
DoCmd.DeleteObject "" & Me.Eliminar & ""
end if
Gracias Icue por tu respuesta.
No la entiendo bien, pero mañana, hoy he tenido un mal día, la analizaré detenidamente y te diré como me ha ido.
Un saludo.
Buenos días Icue:
La solución que propones me da error: "Se ha producido el error '13' en tiempo de ejecución.
No coinciden los tipos.
Como uso el comando DoCmd.OpenTable "" & Me.Eliminar & ""
Me visiona la tabla tal como es. Mientras que yo la veo como la tengo diseñada en el formulario
mediante el siguiente código en el evento Después de actualizar del Cuadro combinado:
Dim vartabla As String
vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado, tu le llamas "Eliminar"
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
'Preguntas para borrar y borras
If MsgBox("¿Quieres borrar esta tabla?", vbYesNo) = vbYes Then
Me.RecordSource = ""
Me.Requery
DoCmd.DeleteObject acTable, vartabla
End If
Muchas gracias.
Un saludo
Me rindo. Con esa instrucción le estás diciendo que el origen de registros del formulario sean los campos de la tabla que hayas elegido. Eso obliga a que los controles tengan todos el mismo Origen de control, o lo que es lo mismo, que los campos de las diferentes tablas se llamen igual, ya que si no los controles del formulario no te mostrarían los valores.
Buenos dias Icue:
Efectivamente todos los campos se llaman igual en todas las tablas, pero claro, tienen datos distintos.
En total hay 22 campos, pues se trata de escribir asientos contables, con campos como compañia, fecha, moneda, debe, haber, cta. Contable, importe, etc. etc.
El nombre de cada tabla es el del asiento contable.
Imaginate que fueran facturas con sus coceptos fecha, importe, iva, descuento, retnción, etc. etc
Un saludo.
Y dichas facturas las quisiera consultar eligiéndolas mediante un combobox.
O las quisiera modificar eligiéndolas mediante un combobx.
O las quisiera eliminar eligiéndolas mediante un combobox.
Etc. Etc.
Un saludo.
Yo hubiera hecho una sola tabla y le hubiera añadido un campo llamado, por ejemplo, Concepto y ahí es donde elegiría si el "movimiento" corresponde a Ingresos, Salidas, Ventas, etc, ya que todo lo demás es exactamente igual
Luego para saber cualquier cosa, podría poner un combinado con los diferentes conceptos y es donde usaría lo de
Me.recordsource="select * from nombretabla where concepto like '" & me.nombredelcombinado & "'"
Que cuando anoto el asiento que sea quiero que me "arrastre" un saldo en función del tipo de concepto, uso, por ejemplo
Saldo=Dsum("nz([debe])-nz([haber])","nombretabla","concpeto like '" & me.concepto & "'")
Y me evito hacer 20 tablas exactamente iguales.
Buenas noches Icue.
Creo que no me estoy explicando bien y también que te falta información para entenderme:
Los asientos contables se estaban haciendo con Excel y estos asientos (Hojas de Excel) se mandan por correo para contabilizar en oficinas centrales.
El hecho de hacerlos con Access es porque entiendo un poquito de vba y facilito la elaboración de esos asientos que después convierto, mediante vba en hojas de Excel para su contabilización en oficinas centrales. Cuyo administrativo entiende de Excel y de contabilidad.y no de Access.
Yo estoy jubilado ya, tengo 74 años y esto lo hago por hobby y por ayudar a mis hijos. Que son los que disfrutan de las BD que les preparo para sus trabajos.
Seguro que en Excel se puede programar todo lo que hago con vba. Pero repito no soy capaz de hacerlo.
Un saludo.
Lo siento, de Excel no tengo ni idea. Pero como ambos están hechos en VB se puede hacer exactamente lo mismo. No es por presumir, pero no hay nada en Excel que no pueda hacer en Access. Cuando en Excel usas una función, por ejemplo, Buscar. Si, en realidad le estás diciendo en código
Dlookup(...
Muchas gracias Icue.
Con tu ayuda y la de muchos otros he conseguido generar la BD para facilitarle el trabajo a mi hijo
Esta BD se compone de un menu principal donde figuran los siguientes apartados:
Crear asiento en blanco
Alta asiento
Modificar asiento
Comparar asientos
Consultar asientos
Exportar a Excel asiento
Borrar asiento
Para el código de este apartado, es por el que inicié la pregunta en Todoexpertos.
Ahora estoy pensando que sería bueno eliminar mediante código 3 campos que me he inventado (Auto, Signo y nombre tabla)
pues estos no pueden aparecer en Excel cuando los manden a contabilizar a central.
Si tengo problemas pediré ayuda a Todoexpertos.
Un saludo.
- Compartir respuesta
Tu código no te funciona (si cuando haces clic en el combinado ya tiene un valor seleccionado) porque al pasar la variable entre comillas, la estás convirtiendo en una cadena de texto y buscará eliminar una tabla que se llama vartabla, que no existe. Si a tu código le quitas esas comillas en la última línea, te funcionará (con el inciso del paréntesis anterior).
Y como te dice Icue, puedes hacerlo directamente sin pasar por la variable, pero en el evento "Después de actualizar":
DoCmd. DeleteObject acTable, Me.Cuadro_combinado01
Muchas gracias Sveinbjorn por tu respuesta.
Te comento lo mismo que a Icue, en el evento: Después de actualizar tengo el código que tu me enviaste hace unos días y que funciona perfectamente.
Por eso creo un botón de comando donde pueda eliminar la tabla, después de haberla visto en el formulario, con tu código:
Private Sub Cuadro_combinado01_AfterUpdate()
Dim vartabla As String
vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado
Me.RecordSource = "SELECT * FROM [" & vartabla & "]"
'Actualizamos formulario
Me.Requery
End Sub
Un saludo
¿Esto es lo que buscas?
Private Sub Cuadro_combinado01_AfterUpdate() Dim vartabla As String vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado Me.RecordSource = "SELECT * FROM [" & vartabla & "]" 'Actualizamos formulario Me.Requery 'Preguntas para borrar y borras If MsgBox("¿Quieres borrar esta tabla?",vbYesNo)=vbYes Then DoCmd.DeleteObject acTable, vartabla End Sub
Buenos días Sveinbjorn:
El código que envías me puede valer, pero da error "3211" El motor de la base de datos no pudo bloquear la tabla "nombre de la tabla", porque actualmente la está utilizando otro usuario o proceso.
Es lógico pues aparece con el RecordSource que le tengo puesto.
Si elimino código y dejo solo
Private Sub Cuadro_combinado01_AfterUpdate()
If MsgBox("¿Quieres eliminar esta tabla?", vbYesNo) Then
DoCmd.Delete Object acTable, Me.Cuadro_combinado01
End If
End Sub
Con solo este código si funciona pero claro no veo los datos de la tabla y sin ver los datos no puedo decidir si la elimino o la dejo.
Un saludo
Prueba a usar una SQL para eliminar la tabla:
Private Sub Cuadro_combinado01_AfterUpdate() Dim vartabla As String vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado Me.RecordSource = "SELECT * FROM [" & vartabla & "]" 'Actualizamos formulario Me.Requery 'Preguntas para borrar y borras If MsgBox("¿Quieres borrar esta tabla?",vbYesNo)=vbYes Then CurrentDb.Execute "DROP TABLE " & vartabla End Sub
y si te da error, cambia o elimina el Recordsource antes de proceder al borrado
Private Sub Cuadro_combinado01_AfterUpdate() Dim vartabla As String vartabla = Me.Cuadro_combinado01 'Pillamos el nombre de la tabla del cuadro combinado Me.RecordSource = "SELECT * FROM [" & vartabla & "]" 'Actualizamos formulario Me.Requery 'Preguntas para borrar y borras If MsgBox("¿Quieres borrar esta tabla?",vbYesNo)=vbYes Then Me.RecordSource = "" Me.Requery DoCmd.DeleteObject acTable, vartabla End If End Sub
- Compartir respuesta