Necesito ayuda sobre un error 3027 en un formulario con DAO en una base de datos
Es una pregunta muy tonta, pero me está trayendo un dolor de cabeza terrible!
Estoy trabajando con un formulario donde utilizo DAO, y al ejecutar diferentes consultas me surge el error 3027 en tiempo de ejecución. No se puede actualizar. Base de datos u objeto de sólo lectura. Seguramente mi error se encuentre en la declaración de los recordsets. ¿Alguien me puede orientar?
Estoy trabajando con un formulario donde utilizo DAO, y al ejecutar diferentes consultas me surge el error 3027 en tiempo de ejecución. No se puede actualizar. Base de datos u objeto de sólo lectura. Seguramente mi error se encuentre en la declaración de los recordsets. ¿Alguien me puede orientar?
1 Respuesta
Respuesta de emperador20
1
1
Estuve revisando, pido disculpas por la respuesta anterior me imagine que ya te habías dado cuenta pero no conozco tu capacidad de programación.
Set auxiliar = dbcrono2.OpenRecordset("select * from conceptos, impuestos where impuestos!imp_nombre = '" & padre & "' and conceptos!Descripcion = '" & var & "'", dbOpenDynaset)
If auxiliar.EOF Then
Set auximpuesto = dbcrono2.OpenRecordset("select * from impuestos where IMP_NOMBRE = '" & var & "'")
Acá haces dos consultas ¿por qué a una le pones dbopendynaset y a la otra no?
Estoy viendo parte por parte así te puedo ayudar mejor.
Set auxiliar = dbcrono2.OpenRecordset("select * from conceptos, impuestos where impuestos!imp_nombre = '" & padre & "' and conceptos!Descripcion = '" & var & "'", dbOpenDynaset)
If auxiliar.EOF Then
Set auximpuesto = dbcrono2.OpenRecordset("select * from impuestos where IMP_NOMBRE = '" & var & "'")
Acá haces dos consultas ¿por qué a una le pones dbopendynaset y a la otra no?
Estoy viendo parte por parte así te puedo ayudar mejor.
Estuve probando y esto es lo que yo use y uso
Set Database = OpenDatabase(App.Path & "deb2.mdb")
Database.Execute "update [detalles de pedidos] set idpedido = " & 10248 & " where idpedido = " & 10249
Así modificas todo de una sino tienes que usar un command.execute
Set Database = OpenDatabase(App.Path & "deb2.mdb")
Database.Execute "update [detalles de pedidos] set idpedido = " & 10248 & " where idpedido = " & 10249
Así modificas todo de una sino tienes que usar un command.execute
vos lo queres hacer no es eliminar sino modificar activos = false en todos los campos cuando
conceptos!descripcion = '" & auxconcepto!descripcion & "'")
una consulta probaste hacer la consulta asi
update conceptos set activos = false where conceptos!descripcion = '" & auxconcepto!descripcion & "'")
porque por ahi si vos en la consulta seleccionas todo pero ¿el dao trabaja como un command? que vos podes modificar con solo una instruccion
Proba el update directo y me contás mi email es
[email protected]
conceptos!descripcion = '" & auxconcepto!descripcion & "'")
una consulta probaste hacer la consulta asi
update conceptos set activos = false where conceptos!descripcion = '" & auxconcepto!descripcion & "'")
porque por ahi si vos en la consulta seleccionas todo pero ¿el dao trabaja como un command? que vos podes modificar con solo una instruccion
Proba el update directo y me contás mi email es
[email protected]
Leandro:
Quiero contarte que ya había realizado las modificaciones necesarias y ahora funciona sin errores; lo único que me queda por resolver es el tema de la eliminación de conceptos, ya que existen conceptos repetidos para más de un impuesto, por lo que al momento de eliminar, lo hace al primer registro de la tabla de conceptos que coincide con el nombre que tengo guardado en la variable, ¿podrías ayudarme a descubrir que es lo que le falta a mi consulta? Gracias. Acá te copio el código correspondiente al command:
Private Sub cmdEliminar_Click()
Dim respuesta As String
Dim cronoaux As DAO.Database
Dim auxiliar As DAO.Recordset
Dim auximpuesto As DAO.Recordset
Dim auxconcepto As DAO.Recordset
'si estamos posicionados en la raíz del árbol
If raiz = True Then
MsgBox "Imposible eliminar el listado completo de Impuestos", vbCritical, "Información del sistema"
Else
'si estamos posicionados en un impuesto que posee conceptos vinculados
If tvTreeView.Nodes(I).Children Then
MsgBox "Existen conceptos asociados a este impuesto. No puede eliminarse", vbCritical, "Información del sistema"
Else
'si estamos posicionados en un impuesto sin conceptos o en un concepto abrimos la base de datos
Set cronoaux = OpenDatabase("C:Backup Disco AnteriorKarina variosNuevo proyecto 040504crono.mdb")
'si se trata de un impuesto sin conceptos
If padre = "Impuestos" Then
Set auximpuesto = cronoaux.OpenRecordset("select * from impuestos where IMP_NOMBRE = '" & var & "'")
auximpuesto.Edit
auximpuesto.Fields("ACTIVO") = False
auximpuesto.Update
auximpuesto.Close
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
Else
'si se trata de un concepto
'se tiene que verificar que coincida el impuesto y el concepto, ya que hay conceptos repetidos
Set auxconcepto = cronoaux.OpenRecordset("select * from conceptos, impuestos where (impuestos!imp_nombre = '" & padre & "' and conceptos!descripcion = '" & var & "')")
Set auxiliar = cronoaux.OpenRecordset("select * from conceptos where conceptos!descripcion = '" & auxconcepto!descripcion & "'")
auxiliar.Edit
auxiliar.Fields("ACTIVOS") = False
auxiliar.Update
auxconcepto.Close
auxiliar.Close
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
End If
End If
End If
End Sub
Quiero contarte que ya había realizado las modificaciones necesarias y ahora funciona sin errores; lo único que me queda por resolver es el tema de la eliminación de conceptos, ya que existen conceptos repetidos para más de un impuesto, por lo que al momento de eliminar, lo hace al primer registro de la tabla de conceptos que coincide con el nombre que tengo guardado en la variable, ¿podrías ayudarme a descubrir que es lo que le falta a mi consulta? Gracias. Acá te copio el código correspondiente al command:
Private Sub cmdEliminar_Click()
Dim respuesta As String
Dim cronoaux As DAO.Database
Dim auxiliar As DAO.Recordset
Dim auximpuesto As DAO.Recordset
Dim auxconcepto As DAO.Recordset
'si estamos posicionados en la raíz del árbol
If raiz = True Then
MsgBox "Imposible eliminar el listado completo de Impuestos", vbCritical, "Información del sistema"
Else
'si estamos posicionados en un impuesto que posee conceptos vinculados
If tvTreeView.Nodes(I).Children Then
MsgBox "Existen conceptos asociados a este impuesto. No puede eliminarse", vbCritical, "Información del sistema"
Else
'si estamos posicionados en un impuesto sin conceptos o en un concepto abrimos la base de datos
Set cronoaux = OpenDatabase("C:Backup Disco AnteriorKarina variosNuevo proyecto 040504crono.mdb")
'si se trata de un impuesto sin conceptos
If padre = "Impuestos" Then
Set auximpuesto = cronoaux.OpenRecordset("select * from impuestos where IMP_NOMBRE = '" & var & "'")
auximpuesto.Edit
auximpuesto.Fields("ACTIVO") = False
auximpuesto.Update
auximpuesto.Close
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
Else
'si se trata de un concepto
'se tiene que verificar que coincida el impuesto y el concepto, ya que hay conceptos repetidos
Set auxconcepto = cronoaux.OpenRecordset("select * from conceptos, impuestos where (impuestos!imp_nombre = '" & padre & "' and conceptos!descripcion = '" & var & "')")
Set auxiliar = cronoaux.OpenRecordset("select * from conceptos where conceptos!descripcion = '" & auxconcepto!descripcion & "'")
auxiliar.Edit
auxiliar.Fields("ACTIVOS") = False
auxiliar.Update
auxconcepto.Close
auxiliar.Close
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
End If
End If
End If
End Sub
Leandro:
Te cuento que le cambié esa opción que vos me indicaste pero sigue dándome el mismo error..
Te cuento que le cambié esa opción que vos me indicaste pero sigue dándome el mismo error..
El problema surge en un formulario en que cual tengo enlazado un TreeView con una base de datos. En el evento de Eliminar es donde tengo inconvenientes; aquí te paso el código referido a esa parte del proyecto:
La idea es no eliminar registros, sino simplemente cambiarles el estado de Activo a Inactivo con un campo booleano.
Private Sub cmdEliminar_Click()
'verificar si se trata de un impuesto o de un concepto
Dim respuesta As String
Dim dbcrono2 As DAO.Database
Dim auxiliar As DAO.Recordset
Dim auximpuesto As DAO.Recordset
Dim auxconcepto As DAO.Recordset
If tvTreeView.SelectedItem.Text = "Impuestos" Then
MsgBox "Imposible eliminar el listado completo de Impuestos", vbInformation, "Información del sistema"
Else
If tvTreeView.Nodes(I).Children Then
MsgBox "Existen conceptos asociados a este impuesto. No puede eliminarse", vbCritical, "Información del sistema"
Else
respuesta = MsgBox("Está seguro de que desea eliminar?", vbQuestion + vbYesNo, "Pregunta del sistema")
If respuesta = vbYes Then
'borra el nodo del árbol
'si se confirma la eliminación del impuesto/concepto seleccionado verificar que no tenga vinculaciones
'inactiva el concepto de la base de datos
Set dbcrono2 = OpenDatabase("C:Backup Disco AnteriorKarina variosNuevo proyecto 040504crono.mdb", , True)
Set auxiliar = dbcrono2.OpenRecordset("select * from conceptos, impuestos where impuestos!imp_nombre = '" & padre & "' and conceptos!Descripcion = '" & var & "'", dbOpenDynaset)
If auxiliar.EOF Then
Set auximpuesto = dbcrono2.OpenRecordset("select * from impuestos where IMP_NOMBRE = '" & var & "'")
auximpuesto.Edit
auximpuesto.Fields("ACTIVO") = False
auximpuesto.Update
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
Else
auxiliar.Edit
auxiliar.Fields("ACTIVOS") = False
auxiliar.Update
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
End If
End If
End If
End If
End Sub
Desde ya te estoy muy agradecida por estar predispuesto a ayudarme!
La idea es no eliminar registros, sino simplemente cambiarles el estado de Activo a Inactivo con un campo booleano.
Private Sub cmdEliminar_Click()
'verificar si se trata de un impuesto o de un concepto
Dim respuesta As String
Dim dbcrono2 As DAO.Database
Dim auxiliar As DAO.Recordset
Dim auximpuesto As DAO.Recordset
Dim auxconcepto As DAO.Recordset
If tvTreeView.SelectedItem.Text = "Impuestos" Then
MsgBox "Imposible eliminar el listado completo de Impuestos", vbInformation, "Información del sistema"
Else
If tvTreeView.Nodes(I).Children Then
MsgBox "Existen conceptos asociados a este impuesto. No puede eliminarse", vbCritical, "Información del sistema"
Else
respuesta = MsgBox("Está seguro de que desea eliminar?", vbQuestion + vbYesNo, "Pregunta del sistema")
If respuesta = vbYes Then
'borra el nodo del árbol
'si se confirma la eliminación del impuesto/concepto seleccionado verificar que no tenga vinculaciones
'inactiva el concepto de la base de datos
Set dbcrono2 = OpenDatabase("C:Backup Disco AnteriorKarina variosNuevo proyecto 040504crono.mdb", , True)
Set auxiliar = dbcrono2.OpenRecordset("select * from conceptos, impuestos where impuestos!imp_nombre = '" & padre & "' and conceptos!Descripcion = '" & var & "'", dbOpenDynaset)
If auxiliar.EOF Then
Set auximpuesto = dbcrono2.OpenRecordset("select * from impuestos where IMP_NOMBRE = '" & var & "'")
auximpuesto.Edit
auximpuesto.Fields("ACTIVO") = False
auximpuesto.Update
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
Else
auxiliar.Edit
auxiliar.Fields("ACTIVOS") = False
auxiliar.Update
tvTreeView.Nodes.Remove tvTreeView.SelectedItem.Index
End If
End If
End If
End If
End Sub
Desde ya te estoy muy agradecida por estar predispuesto a ayudarme!
Haber si es esto...
Esta es tu declaración de la base
Set dbcrono2 = OpenDatabase("C:Backup Disco AnteriorKarina variosNuevo proyecto 040504crono.mdb", , True)
ESTA ES LA DECLARACION para las bases fijate que donde doce readonly vos tenes true
'set dbcrono2 = opendatabase(ruta de la base, options, READONLY,connect)
Si esto no resulto avisame que me fijo otra cosa
Esta es tu declaración de la base
Set dbcrono2 = OpenDatabase("C:Backup Disco AnteriorKarina variosNuevo proyecto 040504crono.mdb", , True)
ESTA ES LA DECLARACION para las bases fijate que donde doce readonly vos tenes true
'set dbcrono2 = opendatabase(ruta de la base, options, READONLY,connect)
Si esto no resulto avisame que me fijo otra cosa
- Compartir respuesta
- Anónimo
ahora mismo