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.
1 Respuesta
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.
- Compartir respuesta