Imprimir página | Cerrar ventana

Abrir formulario al evento notinlist

Impreso de: Foro de Access y VBA
Categoría: Access y VBA
Nombre del foro: Access y VBA
Descripción del foro: Foro de programacion en Access (Con código y sin código)
URL: http://www.mvp-access.com/foro/forum_posts.asp?TID=86327
Fecha de impresión: 26/Marzo/2026 a las 15:42


Tema: Abrir formulario al evento notinlist
Publicado por: pabloph2016
Asunto: Abrir formulario al evento notinlist
Fecha de publicación: 18/Abril/2022 a las 19:32
Hola a todos: Tengo un formulario en el que pregunto el producto mediante un cuadro combinado, si tecleo algo que no está en la lista, en el evento notinlist pregunto si quiere añadir el dato. De una página de microsoft saqué un ejemplo para hacerlo mediante un inputbox por cada campo, consigo que funcione. Intenté hacerlo con un DoCmd.OpenForm "entrada_productos" y debajo un me.cc.Requery, después de añadir, al volver, me da el error 2118:Debe guardar el campo activo., probé a poner DoCmd.Runcommandsaverecord pero me da el mismo error.
¿Alguien puede decirme algo?
Gracias
Pablo




Respuestas:
Publicado por: Kiket
Fecha de publicación: 18/Abril/2022 a las 20:00
La manera en que yo corrijo errores con el evento "NotInlist" es no limitando el combo a sus datos en lista, y luego al saltar el mensaje que pueda continuar sin que quede trabado el campo.., no se si esto pueda ayudarte..



-------------
Kike


Publicado por: pabloph2016
Fecha de publicación: 18/Abril/2022 a las 20:06
Lo que quiero hacer es limitar a la lista y que de opción a añadir en caso de que no esté en la lista.
Gracias
Pablo



Publicado por: Kiket
Fecha de publicación: 18/Abril/2022 a las 20:18
Se puede mostrar el mensaje por el evento "NotInlist" aunque no se limiten los datos en la lista.. y luego ya se opera con lo que se desea (en este caso añadir)..; porque si limitamos los datos no podremos añadir..; tampoco soy muy experto en esto, pero creo que funciona así, lo revisaré esta noche para ver si estoy en lo cierto que no estoy en casa..; ya mañana veo si lo solucionaste y sino te enviaré el código que yo ejecuto en estos casos

-------------
Kike


Publicado por: Kiket
Fecha de publicación: 18/Abril/2022 a las 20:39
Perdón.. creo que me equivoqué.. si se puede añadir; mira este código que yo utilizo en estos casos para que pueda corregir el bloqueo y me de paso a continuar o añadir:

Private Sub CodFamProductyServ_NotInList(NewData As String, Response As Integer)
    Dim strName As String, strWhere As String
    strName = NewData
    
    '..Comprobamos primero si existe en la base de datos pero no en el combo
    If Not IsNull(DLookup("CodFamProductyServ", "Tbl2611_FamProductyServ", "CodFamProductyServ='" & NewData & "'")) Then
        MsgBox " .. Este Codigo de Familia esta duplicado (ya existe en la base de datos pero posiblemente no se marcó como agrupador); inserte uno nuevo o modifique este."
        Response = acDataErrContinue
        Me.CodFamProductyServ = ""
        Exit Sub
    End If
    '------
    
    strWhere = "[CodFamProductyServ] = '" & strName & "'"
    If vbYes = MsgBox("La Familia " & NewData & " no está definida. " & _
        "¿Quieres añadir esta Familia?", vbYesNo + vbQuestion + vbDefaultButton1) Then
         DoCmd.OpenForm "Frm2611_FamProductyServ", DataMode:=acFormAdd, WindowMode:=acDialog, _
            OpenArgs:=strName
           If IsNull(DLookup("CodFamProductyServ", "Tbl2611_FamProductyServ", strWhere)) Then
               MsgBox "Has fallado al añadir una Familia por el valor introducido.  Por favor intentalo de nuevo.", vbInformation
              Response = acDataErrContinue
            Else
                Response = acDataErrAdded
            End If
    Else
        Response = acDataErrDisplay
    End If
End Sub

.. espero que te sirva


-------------
Kike


Publicado por: pabloph2016
Fecha de publicación: 19/Abril/2022 a las 18:08
Hola, gracias por las aportaciones.
No se si lo había dicho, consigo añadir un dato mediante un inputbox por cada campo, adaptando un ejemplo que vi en la web, de microsoft creo que era. Lo que pregunto es si puedo llamar a un formulario de entrada de datos que ya está hecho.
Gracias
Pablo




Publicado por: Kiket
Fecha de publicación: 19/Abril/2022 a las 23:12
Parece que tengas problemas con la relación del formulario con la tabla donde quieres guardarlos, por el origen de datos que tiene el formulario con dicha tabla.. porque comentas que si puedes guardar esos datos en campos del formulario (o eso es lo que entiendo) y luego al intentar hacer el guardado final (a la tabla) con ese formulario de entrada de datos no te deja.. es así?

Si fuese así, podrías no asociar el formulario directamente a la tabla y con un recordset (asociarlo entonces a esta) para antes de guardar ver si existen los datos que quieras guardar, evitando errores de duplicados por campos con clave principal o que son obligatorios en los guardados de un registro.. 


-------------
Kike


Publicado por: pabloph2016
Fecha de publicación: 20/Abril/2022 a las 21:12
Con un inputbox por cada campo se graban en la tabla como yo quiero. Si en el evento notinlist, después de preguntar si quiero añadir, le digo si y tengo DoCmd.openform "entrada_productos",,,acformadd (no recuerdo cuantas comas). Se abre el formulario, tecleo los datos, y empiezan los problemas, ahora mismo no recuerdo si deja grabar el registro o no.
Tengo que volver a verlo, mañana lo intentaré otra vez y te comento.
Gracias
Pablo



Publicado por: Kiket
Fecha de publicación: 20/Abril/2022 a las 23:47
No he utilizado nunca la sentencía de los Inputbox.. pero estas intentando guardar datos con ellos a un registro de una tabla y luego con la apertura del formulario de entrada de datos quieres volver a hacerlo, ¿sobre la misma tabla?..(eso me confunde, porque un registro de una tabla tiene sus reglas para que se complete su guardado)..
Porque no guardar los datos del tirón con el formulario de entrada de datos?... aunque yo como dije lo haría de otra forma (suelo utilizar recordsets y consulto antes de guardar).. o utilizaría distintas tablas para actualizar los datos de los inputbox por una parte y luego otra tabla para los datos generales de un registro..; por ejemplo, un producto (coche) puede tener familias asociadas (marcas, TipoDeCombustible, etc.. que a veces conviene tener en otras tablas relacionadas)..; haz las pruebas que dices y mañana me indicas si el registro se grabó completamente o no; creo que por ahí deben ir los tiros..


-------------
Kike


Publicado por: main
Fecha de publicación: 21/Abril/2022 a las 12:56
HOLA
Esto es un ejemplo para añadir en un combo que recoge tipos de Unidades, uno que no exista en la Tabla "ArtiUds"

Private Sub UdsIni_NotInList(NewData As String, Response As Integer)
Dim ctl As Control
Dim rs As Recordset
Set rs = CurrentDb().OpenRecordset("ArtiUds", dbOpenDynaset)
    ' Devuelve un objeto de control que apunta al cuadro combinado.
    Set ctl = Me!UdsIni
    ' Pide al usuario que compruebe que desea agregar un nuevo valor.
    If MsgBox("El valor que pretende introducir no está en la lista: ¿Deseas agregar " & NewData & "?.", 292, "Actividades") = vbYes Then
        ' Establece el argumento Response para         'indicar que se han agregado los datos.
        
        rs.AddNew
        rs!Id_Ud = Nz(DMax("Id_Ud", "ArtiUds"), 0) + 1
        rs!Descrip = NewData
        rs.Update
        Response = acDataErrAdded
        MsgBox "Se añadio " & NewData & " al registro de unidades."
    Else
    ' Si el usuario elige no desea agregarlo, suprimir el mensaje de error y deshacer los     ' cambios.
        Response = acDataErrContinue
        ctl.Undo
    End If
rs.Close
Set rs = Nothing
End Sub

Saludos


Publicado por: pabloph2016
Fecha de publicación: 21/Abril/2022 a las 18:15
Hola, ayer decía que lo iba a probar hoy, el código que tengo es esta:
Private Sub producto_muestra_NotInList(NewData As String, Response As Integer)
Dim respuesta As Integer
respuesta = MsgBox("el dato tecleado:" & NewData & " no está en la lista" & vbCrLf & "Quieres añadir(S/N):", vbYesNo, "AÑADIR DATO")
If respuesta = vbYes Then 'yes=6,vbno=7
DoCmd.OpenForm "entrada_productos", , , , acFormAdd
DoCmd.RunCommand acCmdSaveRecord
Me.producto_muestra.Requery
End If
'*********************************
'Dim rsproductos As DAO.Recordset
'Dim i As Integer 'contador para los campos
'Dim sMsg As String 'para preguntar el dato de cada campo
'Response = acDataErrContinue
'Set rsproductos = CurrentDb.OpenRecordset("productos", dbOpenDynaset)
' rsproductos.AddNew
' rsproductos.Fields(0) = DMax("codigo_producto", "productos") + 1
' For i = 1 To rsproductos.Fields.Count - 1
' sMsg = "Dato del campo " & rsproductos(i).Name
' If rsproductos(i).Type = 3 Then sMsg = sMsg & " Tipo numérico"
' If rsproductos(i).Type = 10 Then sMsg = sMsg & " Tipo texto"
' 'inputbox(promt,title,default,xpos,ypos)
' rsproductos(i).Value = InputBox(sMsg)
' Next i
' rsproductos.Update
'Me.producto_muestra = Null
'Me.producto_muestra.Requery
'ElseIf respuesta = 7 Then
'MsgBox "Has pulsado No"
'End If
'*********************************
End Sub
Las líneas finales comentadas (') funcionan bien, en las iniciales, abrir un formulario de entrada es donde está el error: Error 2118 Debe guardar el registro...
No se si Response tendrá algo que ver
Un saludo
Pablo



Publicado por: pabloph2016
Fecha de publicación: 03/Mayo/2022 a las 20:40
Se puede cerrar



Publicado por: emiliove
Fecha de publicación: 03/Mayo/2022 a las 20:57
Y la solución ¿cual fué?



Imprimir página | Cerrar ventana