Access: Problema al actualizar campos de un formulario para modificar campos de un subformulario suyo

He creado un subformulario dentro de un formulario (a su vez ambos estan dentro de un formulario principal).

Quiero que al modificar un campo en el subformulario se me actualicen ciertos valores en el formulario.

He preparado un código y funciona, pero me sale un mensaje indicándome que otro usuario ha modificado este registro, a ver si quiero guardarlo...

Sin embargo, no hay ningún usuario más usando la base.

Respuesta
2

Jon: Esta pregunta me sale sugerida y si bien la estructura que citas la veo clara, no es así con el resto.

Llamandole FPrincipal al Formulario de más alto Nivel, F1 al que hay dentro de éste y F1SubF al que hay dentro del F1 >> ¿El problema se te presenta en el FPrincipal o en el F1?

Si comentas además los Vinculos que hay entre FPrincipal y F1 y entre F1 y F1SubF y el Origen de datos de cada uno, podré hacerme una composición de lugar e intento ayudarte.

Si además citas aquí el Código que tienes y te funciona, mejor.

Ese error se presenta, porque tú mismo eres el "otro usuario", y la modificación se hace de un modo "descontrolado". Es mi apreciación pero no tengo suficientes elementos de juicio. Un saludo >> Jacinto

Antes de nada gracias por tu ayuda:

Empecé haciendo un pequeña base y poco a poco se ha ido haciendo más grande y complicándose. La idea inicial era hacer una base para cálculo de volúmenes a partir de un inventario de enseres y mobiliario, por lo inicialmente la estructura era una tabla "Clientes", una tabla "Expedientes" y una tabla "Inventario" (a parte hay otras tablas como Tabla "Articulos" y "Inventario_Articulos").

Es la típica base en la que eligiendo en un subformulario continuo referencias de artículos e indicando las cantidades, te calcula el volumen estimado del inventario. Hasta aquí todo bien.

Empecé a liarme la manta, y añadí la Tabla "Presupuestos", que esta relacionada con la tabla "Inventario" y como un Presupuesto puede tener varios Subpresupuestos, añadí la tabla "Subpresupuestos" con las tabla "Subpresupuestos_Lineas".

La idea es que en un Expediente puede haber varios Inventarios, cada Inventario puede tener varios Presupuestos que se componen, cada uno, de uno o varios Subpresupuestos.

Te pongo unos pantallazos para que te hagas una idea:

Al hacer un cambio en el Subformulario Subpresupuestos quiero que modeifique campos del Subformulario_Presupuestos. El código es el siguiente:

Private Sub Añadir_Cajas_AfterUpdate()
If Me![Añadir_Cajas] = True Then
    Me![Etiqueta_Numero_Cajas].Visible = True
    Me![Numero_Cajas].Visible = True
    Me![Etiqueta_PVP_Cajas].Visible = True
    Me![PVP_Cajas].Visible = True
    Me![Etiqueta_Total_Cajas].Visible = True
    Me![Total_Cajas].Visible = True
    Me![Etiqueta_Precio_Subpresupuesto].Visible = True
    Me![Precio_Subpresupuesto].Visible = True
    Me![Numero_Cajas] = DSum("[Cantidad]", "Consulta_Inventario_Articulos", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " AND [Caja]= True")
    Me![PVP_Cajas] = DLookup("[PVP_Cajas]", "Datos_Control")
    Me![Total_Cajas] = Me![Numero_Cajas] * Me![PVP_Cajas]
    If Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Excepto_Cajas] = True Then
        Dim RespuestaExcepto_Cajas As String
        RespuestaExcepto_Cajas = MsgBox("¿Quieres desactivar la opción de cajas no incluidas en el material?", 36, "Atención")
            If RespuestaExcepto_Cajas = vbYes Then
                Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Excepto_Cajas] = False
            Else
            End If
    Else
    End If
    DoCmd.RunCommand acCmdSaveRecord
Else
    Me![Numero_Cajas] = ""
    Me![PVP_Cajas] = ""
    Me![Total_Cajas] = ""
    Me![Precio_Subpresupuesto] = Me![Neto_Subpresupuesto]
    Me![Etiqueta_Numero_Cajas].Visible = False
    Me![Numero_Cajas].Visible = False
    Me![Etiqueta_PVP_Cajas].Visible = False
    Me![PVP_Cajas].Visible = False
    Me![Etiqueta_Total_Cajas].Visible = False
    Me![Total_Cajas].Visible = False
    Me![Etiqueta_Precio_Subpresupuesto].Visible = False
    Me![Precio_Subpresupuesto].Visible = False
    DoCmd.RunCommand acCmdSaveRecord
Var_Año = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Año]
Var_Id_Expediente = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Expediente]
Var_Id_Inventario = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Inventario]
Var_Id_Presupuesto = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Presupuesto]
Var_Id_Subpresupuesto = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Subpresupuesto]
    If Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Excepto_Cajas] = False Then
        RespuestaExcepto_Cajas = MsgBox("¿Quieres activar la opción de cajas no incluidas en el material?", 36, "Atención")
            If RespuestaExcepto_Cajas = vbYes Then
                Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Excepto_Cajas] = True
            Else
            End If
    Else
    End If
End If
DoCmd.RunCommand acCmdSaveRecord
Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form.Refresh
'************Actualización TOTALES presupuesto*************
Call Recalcular_Totales_Presupuesto
DoCmd.RunCommand acCmdSaveRecord
Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Listado_Subpresupuestos].Form.Refresh
'************Actualización Temas cajas en Presupuesto Conjunto**********
Call Recalcular_Totales_Cajas_Presupuesto_Conjunto
DoCmd.RunCommand acCmdSaveRecord
Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form.Refresh
End Sub
Sub Recalcular_Totales_Cajas_Presupuesto_Conjunto()
'************Actualización Temas cajas en Presupuesto Conjunto**********
Var_Año = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Año]
Var_Id_Expediente = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Expediente]
Var_Id_Inventario = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Inventario]
Var_Id_Presupuesto = Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Presupuesto]
Var_Num_Cajas_Conjunto = Nz(DSum("[Numero_Cajas]", "Subpresupuestos", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " and [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto), 0)
Var_Total_Cajas_Conjunto = Nz(DSum("[Total_Cajas]", "Subpresupuestos", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " and [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto), 0)
If Var_Num_Cajas_Conjunto <> 0 Then
    Var_PVP_Cajas_Conjunto = Round(Var_Total_Cajas_Conjunto / Var_Num_Cajas_Conjunto, 2)
Else
    Var_PVP_Cajas_Conjunto = 0
End If
        If Var_Total_Cajas_Conjunto <> 0 Then
            Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Cajas_Incluidas] = True
        Else
            Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Cajas_Incluidas] = False
        End If
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Numero_Cajas] = Var_Num_Cajas_Conjunto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Total_Cajas] = Var_Total_Cajas_Conjunto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![PVP_Cajas] = Var_PVP_Cajas_Conjunto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Precio_Presupuesto] = Var_Total_Cajas_Conjunto + Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Neto_Presupuesto]
DoCmd.RunCommand acCmdSaveRecord
Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form.Refresh
End Sub

He incluido varias veces la linea:

DoCmd.RunCommand acCmdSaveRecord

Por ver si al ir guardando poco a poco evitaba el mensaje

Gracias

De acuerdo Jon: Comienzo a ver mejor la estructura, pero tengo algunas dudas. Adjunto imagen.

1.- ¿Los Objetos son los que cito en la Imagen?

2.- ¿Cuál es la ubicación de cada procedimiento?. Ejemplo >>

Private Sub Añadir_Cajas_AfterUpdate() en el Formulario ...........Parece que sea en SubFormulario_Presupuesto, a no ser que haya controles ocultos en SubFormulario_SubPresupuestos. ¿Y el otro Procedimiento >>

Sub Recalcular_Totales_Cajas_Presupuesto_Conjunto()?

Un saludo >> Jacinto

Jon: Estaba esperando la información complementaria, para terminar de resolver el problema, pero si es que ya lo has hecho, quito éste tema de los pendientes. Un saludo >> Jacinto

Perdona, he estado liado y he tenido abandonado el access. El problema que tenía es que las modifIcaciones en una tabla, a través de un formulario, debían afectar a otra tabla. Es decir, los cambios en subpresupuestos deben incluirse en la tabla presupuestos, ya que esta recoge sumas acumuladas de todos los subformularios que forman parte de ese presupuesto. No conseguía hacerlo a través de los formularios, y me volví loco intentando hacerlo directamente en las tablas a través de objetos recordset, pero al actualizar los formularios se me generaba el problema comentado.

Finalmente, volví a la idea inicial de hacerlo a través de los formularios, usando el comando de cmDsaverecord y parece que funciona, aunque a veces no acumula los totales.

Cosas de access, supongo, porque no es normal que a veces funcione y a veces no.

Gracias por todo.

Estupendo Jon: Mejor que lo hayas resuelto. Es posible que lo que comentas de que algunas veces no te hace los cálculos se debe a la falta de algún Recalc, o Refresh, no lo sé.

Simplemente es un comentario por si te ayuda. Un saludo >> Jacinto

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas