** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - ERROR 2046 "......no está disponible ahora"
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoERROR 2046 "......no está disponible ahora"

 Responder Responder Página  12>
Autor
Mensaje
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Tema: ERROR 2046 "......no está disponible ahora"
    Enviado: 04/Agosto/2018 a las 10:55
Hola buenas días y buen verano a todos. Este error se produce cuando desde un form. emergente, al cerrarlo, selecciona un botón del form. subyacente que al recibir el enfoque dicho botón, ha de ejecutar un codigo que está en dicho botón colgado del evento Click. Ese evento lo que hace es grabar o guardar el registro del form. subyacente y se coloca en modo nuevo registro. Entonces el error 2046 avisa de que la acción guardar registro no se encuentra disponible. He leído en internet que parece ser un error de Access; por favor, alguno sabe decirme ¿en que consiste éste error, y en su caso, como se puede solucionar?.

Gracias
Muchas gracias, aunque sólo lo hayas leído.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 106
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 11:11
Hola:

Prueba en el código en el evento al cerrar del form emergente y creando un nuevo registro en otro form (pq. en el mismo no podría ser ya que lo estás cerrando o has cerrado):

* En el form que cierras para guardar lo que has hecho:

DoCmd.RunCommand acCmdSaveRecord

* En el form que abres:

DoCmd.OpenForm "nombre_form"
DoCmd.GoToRecord , , acNewRec


Saludos.
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 11:27
Gracias por contestar. No necesito abrir un nuevo form. porque el form. subyacente está abierto. El emergente está abierto sobre elsubyacente. 
Muchas gracias, aunque sólo lo hayas leído.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 106
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 11:35
Hola:

No me refería que abrieras otro form. Digo que en el evento del form que cierras pongas las tres líneas que he anotado. Por empezar por un sitio.

Saludos.
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 12:01
Voy a intentar explicarlo mejor:

Tengo un form. de pedidos que, una vez rellenados los datos necesarios, pulso un botón que me abre un form. emergente donde voy seleccionando y grabando los detalles del pedido, es decir, los productos que se incluyen en cada pedido. Cuando he terminado de cumplimentar todos los productos del pedido, pulso un botón que se llama "Cerrar Pedido". Este botón desencadena:

Private Sub btnCerrarPedido_Click()
    DoCmd.DoMenuItem acFormBar, acRecordsMenu, 5, , acMenuVer70

  If IdCliente = 6 Or IdCliente = 11 Or IdCliente = 12 Then
        Set wShell = CreateObject("WScript.Shell")
             respuesta = wShell.PopUp("NO SE EMITE EL ALBARAN.", 3, "REPARTO EXTERNO TIENDA", vbInformation)
        Set wShell = Nothing
        DoEvents
     btnCerrar_Click
  Else
     ImprimirAlbaran_Click
     btnCerrar_Click
  End If
End Sub

Como me remite al botón Cerrar, este botón desencadena:
Private Sub btnCerrar_Click()
On Error GoTo Err_btnCerrar_Click
 If IsNull(Me.IdPedido) = False Then
       DoCmd.SetWarnings False
         DoCmd.RunSQL ("DELETE tbPedidosBaseClientes.IdDiaSemana, tbPedidosBaseClientes.IdCliente, tbPedidosBaseClientes.IdProducto," _
         & " tbPedidosBaseClientes.Uds, tbPedidosBaseClientes.PrecioUnidad, tbPedidosBaseClientes.BImp, tbPedidosBaseClientes.DTO," _
         & " tbPedidosBaseClientes.ImpDTO, tbPedidosBaseClientes.Neto, tbPedidosBaseClientes.IVA, tbPedidosBaseClientes.ImpIVA," _
         & " tbPedidosBaseClientes.Total FROM tbPedidosBaseClientes WHERE (((tbPedidosBaseClientes.IdDiaSemana)=" & byDia & ") AND ((tbPedidosBaseClientes.IdCliente)=" & intIdCliente & "));")
     Espera (0.15)
           DoCmd.RunSQL ("INSERT INTO tbPedidosBaseClientes ( IdDiaSemana, IdCliente, IdProducto, Uds, PrecioUnidad, BImp, DTO, ImpDTO, Neto, IVA, ImpIVA, Total )" _
           & " SELECT [Forms]![frmDetallesPedido]![DiaSemana] AS X, tbDetallesPedido.IdCliente, tbDetallesPedido.IdProducto, tbDetallesPedido.Uds," _
           & " tbDetallesPedido.PrecioUnidad, tbDetallesPedido.BImp, tbDetallesPedido.DTO, tbDetallesPedido.ImpDTO, tbDetallesPedido.Neto," _
           & " tbDetallesPedido.IVA, tbDetallesPedido.ImpIVA, tbDetallesPedido.Total FROM tbDetallesPedido" _
           & " WHERE (((tbDetallesPedido.IdCliente)=" & intIdCliente & ") AND ((tbDetallesPedido.IdPedido)=" & lgIdPedido & "));")
       DoCmd.SetWarnings True
     Espera (0.1)
        DoCmd.Close acForm, Me.Name
        DoCmd.SelectObject acForm, "frmPedidos"
        Forms!frmPedidos!btnNuevoPedido.SetFocus
 Else
     DoCmd.Close acForm, Me.Name
 End If
Exit_btnCerrar_Click:
    Exit Sub
Err_btnCerrar_Click:
    MsgBox Err.Description
    Resume Exit_btnCerrar_Click
End Sub

Por lo que cuando sale o cierra el form. emergente, me selecciona el form. subyacente "frmPedidos"  y en él el botón "NuevoPedido", y que ya puesto en el frmPedidos, en el evento al recibir el enfoque, está puesto que vaya a ejecutar el evento click del botón NuevoPedido del form frmPedidos y que tiene éste código:

Private Sub btnNuevoPedido_Click()
On Error GoTo Err_btnNuevoPedido_Click
 Me.Cliente.Locked = False
 Me.IdCliente.Locked = False
    If IsNull(Me.IdCliente) = True And IsNull(Me.IdPedido) = True Then
           MostrarMensaje ("No ha seleccionado ningún Cliente y/o falta el Número de Pedido." & Chr(10) & Chr(13) _
               & Chr(10) & Chr(13) & "Si quiere abandonar pulse DESHACER y luego CERRAR.")
           Cliente.SetFocus
    End If
    
    If IsNull(Me.IdCliente) = False And IsNull(Me.IdPedido) = False Then
           DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
           DoCmd.GoToRecord , , acNewRec
          
            Cliente.SetFocus
            Cliente = ""
            Destinatario = ""
            DireccionDestinatario = ""
            CiudadDestinatario = ""
            CodPostalDestinatario = ""
            PROVINCIA = ""
            Tipo = ""
'            Me!frmDetallesPedido!NProducto = ""

     End If
Exit_btnNuevoPedido_Click:
    Exit Sub
Err_btnNuevoPedido_Click:
    MsgBox "Aviso desde el Formulario PEDIDOS. Error Nº: " & Err.Number & "  " & Err.Description, vbCritical + vbOKOnly, conNombreApl
    Resume Exit_btnNuevoPedido_Click
End Sub

y cuando llega a la línea en color rojo, que es la de grabar o guardar el registro, salta a la azul que es la de captura de error y da el mensaje de error 2046 la acción de guardar registro no se encuentra disponible ahora.
Muchas gracias, aunque sólo lo hayas leído.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 106
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 12:15
Hola:

Supongo que habrás puesto el código de grabar que te pongo más arriba para probar.

También que graba algo que no sabe qué grabar (me pasó alguna vez y tuve que quitar el código que graba y/o cambiarlo de sitio).

¿Has probado ubicar el código que graba en otro lugar del procedimiento?

Saludos.

Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 12:19
Todo el procedimiento funciona correctamente; el error tan sólo se produce cuando el botón Nuevo Pedido recibe el enfoque y desencadena el evento Click. No se produce el error si elimino el envio al evento click, es decir, si lo hago manual, no se produce el error.
Muchas gracias, aunque sólo lo hayas leído.
Arriba
Parche Ver desplegable
Habitual
Habitual


Unido: 03/Julio/2018
Localización: Alicante
Estado: Sin conexión
Puntos: 106
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 12:35
Hola:

Hasta donde se, que es poco, y quizás te estoy mareando más que otra cosa, veo que recibe el foco pero no hay ningùn evento que produzca botonNuevoPedido por eso manualmente sí que funciona.

Quizás probando un boolean al seleccionar el form emergente...

Saludos.
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 04/Agosto/2018 a las 12:39
No lo puse, pero escribé que, cuando el btnNuevoPedido recibe el enfoque, desencadena el evento Click, es decir, 

Private Sub btnNuevoPedido_GotFocus

 btnNuevoPedido_Click

......
Muchas gracias, aunque sólo lo hayas leído.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1134
Enlace directo a este mensaje Enviado: 05/Agosto/2018 a las 17:28
Indicas que cuando el subformulario recibe el enfoque, se ejecuta el evento click del botón. En ese evento del subformulario, ¿hay algo más?

En el formulario emergente ejecutas 1 consulta (de las 2). Si no la ejecutas, ¿sigue saliendo el mismo error?
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 15:59
Hola pitxiku; no hay ningún subformulario. El form subyacente digamos que es el principal, y el emergente lo hace sobre el principal sin que el principal se cierre o se oculte. El botón btnNuevoPedido se encuentra en el form. principal, y al recibir el foco cuando se cierra o se debe cerrar el form. emergente, es cuando desencadena el evento click del del botón btnNuevoPedido. El código que tengo en cada botón ya está expuesto en ésta consulta. El botón CerrarPedido se encuentra en el form. emergente sobre el principal. Las dos consultas, de eliminación e inserción que se encuentran en el botón cerrar del form. emergente se ejecutan sin problema. Por ello, en el botón Cerrar que está en el form emergente, pongo DoCmd.SelectObjet y en otra línea el btnNuevoPedido.SetFocus. Se me ocurre pensar que, aunque por encima de estas líneas se encuentra la de cerrar el form emergente, éste no se cierra hasta que se termina el Sub, y como las tablas subyacentes del form principal y del emergente están relacionadas con integridad referencial, ¿podría ser que de el error porque al no haberse definitivamente cerrado el form. emergente no permita el sistema guardar el registro del form principal?. Tampoco lo creo, dado que en la primera línea del btnCerrarPedido del form emergente están los comandos de grabar registro. Gracias
Muchas gracias, aunque sólo lo hayas leído.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1134
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 17:55
A ver:

1. Dices que en el formulario "principal" pulsas un botón para abrir el emergente. ¿Qué código hay en ese botón? ¿Por qué no guardas ahí el registro?

2. En el formulario "emergente", cuando lo cierras, envías el foco a un botón del principal; pero eso no tiene que hacer que se ejecute su evento Click. ¿Qué haces para ejecutarlo? Y si hay código de por medio, ¿qué código es?

3. Ya supongo que las consultas se ejecutan bien. Lo que pregunto es qué ocurre si comentas las líneas que ejecutan las consultas y pruebas.

O lo que es lo mismo: hay que encontrar la razón por la que Access no puede guardar el registro después de seguir esos pasos. Porque entiendo que si no usas el formulario emergente, el registro se guarda, ¿no?
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 18:20
Este es el código que abre el form emergente:

Private Sub btnRegistrarProductos_Click()
'Abro el formulario DetallesPedido y le paso los datos de IdPedido,IdCliente y Tipo de cliente, y según el Tipo, también el origen de la línea de registro de precios
     DoCmd.OpenForm "frmDetallesPedido", acNormal, "", , acFormAdd, acWindowNormal
     Forms!frmDetallesPedido!IdPedido = Forms!frmPedidos!IdPedido
     Forms!frmDetallesPedido!IdCliente = Forms!frmPedidos!IdCliente
     Forms!frmDetallesPedido!Tipo = Forms!frmPedidos!Tipo
     DoCmd.MoveSize 4000, 3000
     
    If Me.Tipo = 1 Then
       Forms!frmDetallesPedido!NProducto.RowSource = "SELECT tbBASICORECETAS.NProducto, tbBASICORECETAS.IdProducto,  tbBASICORECETAS.PVReparto, tbBASICORECETAS.TIVA" _
            & " FROM tbBASICORECETAS ORDER BY tbBASICORECETAS.NProducto;"
    ElseIf Me.Tipo = 2 Then
       Forms!frmDetallesPedido!NProducto.RowSource = "SELECT tbBASICORECETAS.NProducto, tbBASICORECETAS.IdProducto, tbBASICORECETAS.PVEspecial, tbBASICORECETAS.TIVA" _
            & " FROM tbBASICORECETAS ORDER BY tbBASICORECETAS.NProducto;"
    ElseIf Me.Tipo = 3 Then
       Forms!frmDetallesPedido!NProducto.RowSource = "SELECT tbBASICORECETAS.NProducto, tbBASICORECETAS.IdProducto, tbBASICORECETAS.PVUnico, tbBASICORECETAS.TIVA" _
            & " FROM tbBASICORECETAS ORDER BY tbBASICORECETAS.NProducto;"
    ElseIf Me.Tipo = 4 Then
       Forms!frmDetallesPedido!NProducto.RowSource = "SELECT tbBASICORECETAS.NProducto, tbBASICORECETAS.IdProducto, tbBASICORECETAS.PVYate, tbBASICORECETAS.TIVA" _
            & " FROM tbBASICORECETAS ORDER BY tbBASICORECETAS.NProducto;"
    Else
       Forms!frmDetallesPedido!NProducto.RowSource = "SELECT tbBASICORECETAS.NProducto, tbBASICORECETAS.IdProducto, tbBASICORECETAS.PVCesion, tbBASICORECETAS.TIVA" _
            & " FROM tbBASICORECETAS ORDER BY tbBASICORECETAS.NProducto;"
    End If
          Forms!frmDetallesPedido!NProducto.Requery
End Sub

Cuando el botón del principal recibe el enfoque, el código que ejecuta es:

Private Sub btnNuevoPedido_GotFocus
    btnNuevoPedido_Click

Y el código que se ejecuta en el btnNuevoPedido_Click es:
Private Sub btnNuevoPedido_Click()
On Error GoTo Err_btnNuevoPedido_Click
 Me.Cliente.Locked = False
 Me.IdCliente.Locked = False
    If IsNull(Me.IdCliente) = True And IsNull(Me.IdPedido) = True Then
           MostrarMensaje ("No ha seleccionado ningún Cliente y/o falta el Número de Pedido." & Chr(10) & Chr(13) _
               & Chr(10) & Chr(13) & "Si quiere abandonar pulse DESHACER y luego CERRAR.")
           Cliente.SetFocus
    End If
    
    If IsNull(Me.IdCliente) = False And IsNull(Me.IdPedido) = False Then
           DoCmd.DoMenuItem acFormBar, acRecordsMenu, acSaveRecord, , acMenuVer70
           DoCmd.GoToRecord , , acNewRec
          
            Cliente.SetFocus
            Cliente = ""
            Destinatario = ""
            DireccionDestinatario = ""
            CiudadDestinatario = ""
            CodPostalDestinatario = ""
            PROVINCIA = ""
            Tipo = ""
'            Me!frmDetallesPedido!NProducto = ""

     End If
Exit_btnNuevoPedido_Click:
    Exit Sub
Err_btnNuevoPedido_Click:
    MsgBox "Aviso desde el Formulario PEDIDOS. Error Nº: " & Err.Number & "  " & Err.Description, vbCritical + vbOKOnly, conNombreApl
    Resume Exit_btnNuevoPedido_Click
End Sub

en la línea roja es dónde se produce el error, de no está disponible la acción guardar registro

Cuando comento las consultas que me indicas en el form emergente, el resultado es que el código ejecuta éstas líneas:

 If IsNull(Me.IdCliente) = True And IsNull(Me.IdPedido) = True Then
           MostrarMensaje ("No ha seleccionado ningún Cliente y/o falta el Número de Pedido." & Chr(10) & Chr(13) _
               & Chr(10) & Chr(13) & "Si quiere abandonar pulse DESHACER y luego CERRAR.")
           Cliente.SetFocus
    End If

lo cual no entiendo porque en el form principal si existen los datos de IdCliente e IdPedido, por lo que el código debería saltar éstas líneas.

Otr mensaje que sale, del Microsoft Access en éste último caso, es que no puede mover el enfoque al btnNuevoPedido. Otra cosa que no entiendo porque el enfoque ya se movió. 


Muchas gracias, aunque sólo lo hayas leído.
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 1134
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 18:45
Por lo que cuentas, parece como si tu código se estuviera ejecutando 2 veces, por lo que la segunda vez ya no tienes datos y ya tienes el foco en el botón. Prueba a colocar puntos de interrupción en el código, para ver cómo se va ejecutando y qué camino lleva.

Otra cosa: en vez del DoCmd.DoMenuItem, puedes usar DoCmd.RunCommand acCmdSaveRecord. Uno ejecuta una acción de menú, el otro intenta guardar el registro. (Casi) Es lo mismo, pero DoMenuItem ya está obsoleto:

- https://msdn.microsoft.com/es-es/VBA/access-vba/articles/docmd-domenuitem-method-access?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev11.query%3FappId%3DDev11IDEF1%26l%3Des-ES%26k%3Dk(vbaac10.chm4148)%3Bk(TargetFrameworkMoniker-Office.Version%3Dv16)%26rd%3Dtrue
Arriba
Goliat2000 Ver desplegable
Asiduo
Asiduo
Avatar

Unido: 11/Noviembre/2014
Localización: Madrid
Estado: Sin conexión
Puntos: 350
Enlace directo a este mensaje Enviado: 17/Agosto/2018 a las 16:09
En efecto pitxiku; con el paso a paso he comprobado que se ejecuta dos veces, y también en el paso paso he comprobado que no hay ninguna instrucción para que se ejecute por segunda vez, por lo que no entiendo el porqué de que se ejecute una segunda vez.
Muchas gracias, aunque sólo lo hayas leído.
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable