Access VBA: Problema al añadir un registro desde otro formulario

Tengo un formulario denominado Subpresupuesto con un botón que al pulsarlo abre un formulario independiente (Formulario_Emergente_Añadir_Subpresupuesto) para dar valor a ciertos campos de ese SubFormulario_Subprsupuesto y cree un registro.

El problema es que una vez dados los valores en el Formulario emergente y trasladarlos al Subformulario con código, no consigo que me grabe el registro, salvo que lo haga yo de forma manual. Os pongo el código:

        '*******Toma de datos********
        Var_Año = Me![Año]
        Var_Id_Expediente = Me![Id_Expediente]
        Var_Id_Inventario = Me![Id_Inventario]
        Var_Id_Presupuesto = Me![Id_Presupuesto]
        Var_Id_Subpresupuesto = Nz(DMax("Id_Subpresupuesto", "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) + 1
        Var_Id_Plantilla_Presupuesto = Me![Id_Plantilla_Presupuesto]
        Var_Tipo_Presupuesto = Me![Tipo_Presupuesto]
        Var_Descripcion = Me![Descripcion]
        '********Rellenar datos Presupuesto**********
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Año] = Var_Año
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Expediente] = Var_Id_Expediente
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Inventario] = Var_Id_Inventario
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Presupuesto] = Var_Id_Presupuesto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Id_Subpresupuesto] = Var_Id_Subpresupuesto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Orden_Impresion] = Var_Id_Subpresupuesto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Tipo_Presupuesto] = Var_Tipo_Presupuesto
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form![Descripcion] = Var_Descripcion
DoCmd. RunCommand acCmdSaveRecord

He puesto el comando DoCmd. RunCommand acCmdSaveRecord para que el registro se grabe, pero no me lo graba. ¿Como debo hacerlo ¿

Respuesta
2

Vamos a ver si me aclaro, dices que tienes un formulario SubPresupuesto, y que desde él, mediante un botón de comando abres un formulario emergente, que usas para dar valores a "un subformulario" ¿Dónde está ese subformulario?

Dicho esto, si en el formulario independiente "!rellenas" unos controles y quieres que te aparezcan en el ¿subformulario? Bastaría con decirle que los inserte en la tabla origen de ese subformulario y luego que reconsulte su origen. Por ejemplo, en ese formulario emergente

Docmd. Runsql"insert into tablaorigensubform(cliente, direccion, fechanac,...) values (text1, text2, tet3,...)"

forms!nombredelformulario!subpresupuesto.form.requery

He escrito la siguiente orden, siguiendo tus consejos:

DoCmd.RunSQL "INSERT into Subpresupuestos (Año, Id_Expediente, Id_Inventario, Id_Presupuesto, Id_Subpresupuesto, Orden_Impresion, Tipo_Presupuesto, Descripcion)" & _
" VALUES (" & Var_Año & ", " & Var_Id_Expediente & ", " & Var_Id_Inventario & ", " & Var_Id_Presupuesto & ", " & Var_Id_Subpresupuesto & ", " & Var_Id_Subpresupuesto & ", " & Var_Tipo_Presupuesto & ", " & Var_Descripcion & ");"

Pero me da error: 3075 "Falta operador" y me muestra el valor de la última variable (Var_Descripcion)

Gracias por tu ayuda

Por partes. Primero, el salto de línea no es así(luego lo ves). Tampoco entiendo lo del punto y coma final. Por otro lado, no hace falta que lo escribas así( lo verás en el código).

Mira, por lo que entendí, si tengo un formulario Formulario1 con un subformulario independiente, que supongo que será tu Subpresupuestos(yo le llamo Ventas por no escribir tanto)

Si pulso el botón se abrirá en vista diálogo el segundo formulario que dices(yo lo llamo copia( y por comodidad mía le he puesto el mismo nombre a los controles, pero da exactamente igual)

Escribo lo que quiera y pulso el botón de la derecha(ya que no sé donde pones la instrucción

Al pulsar el botón

Me ha "pasado" a la tabla Ventas y, por tanto, al formulario, los datos del formulario Copia.

El código del botón del formulario1 es

DoCmd.OpenForm "copia", , , , acFormAdd, acDialog

Y el código del botón del formulario Copia es

Private Sub Comando13_Click()
DoCmd.RunSQL "insert into ventas(fechaventa,cliente,producto,precio,cantidad,subtotal)" _
& "values(fechaventa,cliente,producto,precio,cantidad,subtotal)"
Forms!formulario1!Ventas.Form.Requery
End Sub

Como ves, parece más sencillo.

Ya lo he resuelto, pero el problema no era el salto de línea. El punto y como lo he puesto porque si no no funcionaba. El problema era que la variable Var_Descripcion es texto y no había añadido las '.

Poniéndolo así, me funciona:

DoCmd.RunSQL "INSERT INTO Subpresupuestos ( Año, Id_Expediente, Id_Inventario, Id_Presupuesto, Id_Subpresupuesto, Orden_Impresion, Tipo_Presupuesto, Descripcion)" _
& " VALUES (" & Var_Año & ", " & Var_Id_Expediente & ", " & Var_Id_Inventario & ", " & Var_Id_Presupuesto & ", " & Var_Id_Subpresupuesto & ", " & Var_Id_Subpresupuesto & ", '" & Var_Tipo_Presupuesto & "', '" & Var_Descripcion & "');"

Gracias

Ahora me ha surgido un problema con el formato de fechas al intentar introducir un nuevo campo fecha:

        '*******Toma de datos********
        Var_Año = Me![Año]
        Var_Id_Expediente = Me![Id_Expediente]
        Var_Id_Inventario = Me![Id_Inventario]
        Var_Id_Presupuesto = Me![Id_Presupuesto]
        Var_Id_Subpresupuesto = Nz(DMax("Id_Subpresupuesto", "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) + 1
        Var_Fecha_Subpresupuesto = Format(Me![Fecha_Presupuesto], "dd/mm/yy")
        Var_Id_Plantilla_Presupuesto = Me![Id_Plantilla_Presupuesto]
        Var_Tipo_Presupuesto = Me![Tipo_Presupuesto]
        Var_Descripcion = Me![Descripcion]
        '********Rellenar datos Presupuesto**********
        DoCmd.SetWarnings False 'Desactiva el mensaje de ACCESS de que se van a agregar registros
        DoCmd.RunSQL "INSERT INTO Subpresupuestos ( Año, Id_Expediente, Id_Inventario, Id_Presupuesto, Id_Subpresupuesto, Fecha_Presupuesto, Orden_Impresion, Tipo_Presupuesto, Descripcion)" _
        & " VALUES (" & Var_Año & ", " & Var_Id_Expediente & ", " & Var_Id_Inventario & ", " & Var_Id_Presupuesto & ", " & Var_Id_Subpresupuesto & ", #" & Format(Var_Fecha_Subpresupuesto, dd / mm / yy) & "#, " & Var_Id_Subpresupuesto & ", '" & Var_Tipo_Presupuesto & "', '" & Var_Descripcion & "');"
        Forms![Formulario_Expedientes]![Subformulario_Presupuesto].Form![Subformulario_Subpresupuestos].Form.Requery
        

Si la fecha es 15/10/19, la fecha que introduce es 19/10/15

¿Has probado a ponerlo como Cdate(format([fechaventa],"dd/mm/yy"))?

De todas formas me parece raro. En la instrucción que te puse, inserta un campo fecha en otro campo fecha sin necesidad de eso.

Aunque parezca raro, lo solucionado dando formato al revés, es decir:

DoCmd.RunSQL "INSERT INTO Subpresupuestos ( Año, Id_Expediente, Id_Inventario, Id_Presupuesto, Id_Subpresupuesto, Fecha_Presupuesto, Orden_Impresion, Tipo_Presupuesto, Descripcion)" _
& " VALUES (" & Var_Año & ", " & Var_Id_Expediente & ", " & Var_Id_Inventario & ", " & Var_Id_Presupuesto & ", " & Var_Id_Subpresupuesto & ", #" & Format(Var_Fecha_Subpresupuesto, "yy/mm/dd") & "#, " & Var_Id_Subpresupuesto & ", '" & Var_Tipo_Presupuesto & "', '" & Var_Descripcion & "');"

Total, que estoy volviendo loco con los formatos, porque ahora que he solucionado el de la fecha, me surge otro error en otro comando:

DoCmd.RunSQL "UPDATE Subpresupuestos SET Subpresupuestos.Total_Subpresupuesto = " & Var_Subtotal_Presupuesto & ", Subpresupuestos.[%_Descuento_Subpresupuesto] = 0.1, Subpresupuestos.Descuento_Subpresupuesto = " & Var_Descuento & ", Subpresupuestos.Neto_Subpresupuesto = " & Var_Neto_Subpresupuesto & ", Subpresupuestos.Total_Horas = " & Var_Total_Horas & ", Subpresupuestos.[PVP/H] = " & Var_PVP_H & "" & _
" WHERE (((Subpresupuestos.Año)= " & Var_Año & ") AND ((Subpresupuestos.Id_Expediente)= " & Var_Id_Expediente & ") AND ((Subpresupuestos.Id_Inventario)= " & Var_Id_Inventario & ") AND ((Subpresupuestos.Id_Presupuesto)= " & Var_Id_Presupuesto & ") AND ((Subpresupuestos.Id_Subpresupuesto)= " & Var_Id_Subpresupuesto & "));"

Me da error de sintaxis en la instrucción UPDATE (El valor de la variable es 21,33). Yo creo que es por la coma del decimal, porque si le obligo a la variable Var_PVP_H a que tome un valor entrero, por ejemplo 25, funciona correctamente.

Por lo que pongo:

No tiene porqué darlo. A menos que el campo donde vayas a insertarlo lo hayas puesto como byte, entero o entero largo, ya que éstos no admiten decimales. Prueba a ponerlo como single o long

El campo es single

No sé que tienes hecho, ni entiendo la obstinación en pone variables que van a ser iguales al valor de un control ¿para qué? Basta con poner el propio control. Además, si le dices que actualice la tabla Subpresupuestos ¿Para qué decirle que el campo total_presupuestos es de la tabla esa? Porque si tengo la tabla Tabla1

Donde los campos Cantidad y otro son singles.

Tengo el formulario independiente donde escribo lo que quiero y como quiero. En el caso de texto4 le voy a decir que me inserte el cuadrado de lo que escriba

Cuando pulso el botón( pero podría ser en cualquier otro evento)

Es decir, me ha pasado la fecha sin problemas, y en los campos numéricos la coma sin problemas. El código del botón es

Private Sub Comando6_Click()
DoCmd.RunSQL "insert into tabla1(fecha,cantidad,otro)values(texto0,texto2,texto4^2)"
End Sub

En el caso de actualizar sería lo mismo. Voy a actualizar, en este caso el único registro que tengo. En el formulario cambio los valores

Al pulsar el botón

y el código del botón Actualizar(aunque podría ser en cualquier otro evento)es

Private Sub Comando7_Click()
DoCmd.RunSQL "update tabla1 set fecha=texto0,cantidad=texto2,otro=texto4 where idloquesea=1"
End Sub

El tema es que mi intención es copiar unos valores de un subpresupuesto (por ejemplo subpresupesto 2) en otro subpresupuesto (por ejemplo en el subpresupuesto 3), en los mismo campos, por lo que el campo tiene que admitir los valores, ya que los estoy sacando de esos campos.

Dim Var_Subtotal_Presupuesto As Currency
Dim Var_Descuento As Currency
Dim Var_Neto_Subpresupuesto As Currency
Dim Var_Total_Horas As Single
Dim Var_PVP_H As Single
Var_Subtotal_Presupuesto = Round(DSum("[Importe_Partida]", "Subpresupuestos_Lineas", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " and [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto] = " & Var_Id_Subpresupuesto), 2)
Var_Descuento = DLookup("[Descuento_Subpresupuesto]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & "")
Var_Porc_Descuento = Var_Descuento / Var_Subtotal_Presupuesto
Var_Neto_Subpresupuesto = Var_Subtotal_Presupuesto - Var_Descuento
Var_Total_Horas = DLookup("[Total_Horas]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & "")
Var_PVP_H = Format(DLookup("[PVP/H]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & ""), "#.#0")
'Var_PVP_H = 25
DoCmd.RunSQL "UPDATE Subpresupuestos SET Subpresupuestos.Total_Subpresupuesto = " & Var_Subtotal_Presupuesto & ", Subpresupuestos.[%_Descuento_Subpresupuesto] = 0.1, Subpresupuestos.Descuento_Subpresupuesto = " & Var_Descuento & ", Subpresupuestos.Neto_Subpresupuesto = " & Var_Neto_Subpresupuesto & ", Subpresupuestos.Total_Horas = " & Var_Total_Horas & ", Subpresupuestos.[PVP/H] = " & Var_PVP_H & "" & _
" WHERE (((Subpresupuestos.Año)= " & Var_Año & ") AND ((Subpresupuestos.Id_Expediente)= " & Var_Id_Expediente & ") AND ((Subpresupuestos.Id_Inventario)= " & Var_Id_Inventario & ") AND ((Subpresupuestos.Id_Presupuesto)= " & Var_Id_Presupuesto & ") AND ((Subpresupuestos.Id_Subpresupuesto)= " & Var_Id_Subpresupuesto & "));"

 El valor de Var_PVP_H es 21,33 en el subpresupuesto 2. Si lo ejecuto me da error (Veras que la línea Var_PVP_H tiene la coma previa para dejarla sin efecto). en este caso me da error. 

Sin embargo, si quito la coma previa y fuerzo que el valor sea 25, si que funciona.

En efecto, el problema es la coma del decimal (supongo que también tendrá algo que ver con la configuración del windows y por eso a unos les funciona bien y a otros no), no se explicar porque pero he encontrado esta solución en intenet y funciona. La pongo por si sirve a alguien más.

He creado un módulo de clase:

Public Function CambiaDecimal(mstrtxt As Variant) As String

'función para suprimir la "," y cambiar por "." en la sentecia UPDATE y evitar error
Dim encuentra As Integer

Dim tem As String

encuentra = InStrRev(mstrtxt, ",")

If encuentra > 0 Then ' hay decimal
tem = Replace(mstrtxt, ",", ".", 1)
CambiaDecimal = tem
Else
CambiaDecimal = mstrtxt
End If

End Function

Y al tomar los valores para las variables lo hago así:

Var_Subtotal_Presupuesto = CambiaDecimal(Round(DSum("[Importe_Partida]", "Subpresupuestos_Lineas", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " and [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto] = " & Var_Id_Subpresupuesto), 2))
Var_Descuento = CambiaDecimal(DLookup("[Descuento_Subpresupuesto]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & ""))
Var_Porc_Descuento = CambiaDecimal(DLookup("[Descuento_Subpresupuesto]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & "") / Round(DSum("[Importe_Partida]", "Subpresupuestos_Lineas", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " and [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto] = " & Var_Id_Subpresupuesto), 2))
Var_Neto_Subpresupuesto = CambiaDecimal(Round(DSum("[Importe_Partida]", "Subpresupuestos_Lineas", "[Año]=" & Var_Año & " AND [Id_Expediente]=" & Var_Id_Expediente & " and [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto] = " & Var_Id_Subpresupuesto), 2) - DLookup("[Descuento_Subpresupuesto]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & ""))
Var_Total_Horas = CambiaDecimal(DLookup("[Total_Horas]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & ""))
Var_PVP_H = CambiaDecimal(DLookup("[PVP/H]", "Subpresupuestos", "[Año]= " & Var_Año & " AND [Id_Expediente]= " & Var_Id_Expediente & " AND [Id_Inventario]= " & Var_Id_Inventario & " AND [Id_Presupuesto]= " & Var_Id_Presupuesto & " AND [Id_Subpresupuesto]= " & Var_Id_Presupuesto_Copiar & ""))


DoCmd.RunSQL "UPDATE Subpresupuestos SET Subpresupuestos.Total_Subpresupuesto = " & Var_Subtotal_Presupuesto & ", Subpresupuestos.[%_Descuento_Subpresupuesto] = " & Var_Porc_Descuento & ", Subpresupuestos.Descuento_Subpresupuesto = " & Var_Descuento & ", Subpresupuestos.Neto_Subpresupuesto = " & Var_Neto_Subpresupuesto & ", Subpresupuestos.Total_Horas = " & Var_Total_Horas & ", Subpresupuestos.[PVP/H] = " & Var_PVP_H & "" & _
" WHERE (((Subpresupuestos.Año)= " & Var_Año & ") AND ((Subpresupuestos.Id_Expediente)= " & Var_Id_Expediente & ") AND ((Subpresupuestos.Id_Inventario)= " & Var_Id_Inventario & ") AND ((Subpresupuestos.Id_Presupuesto)= " & Var_Id_Presupuesto & ") AND ((Subpresupuestos.Id_Subpresupuesto)= " & Var_Id_Subpresupuesto & "));"

Y no se muy bien ni como ni porque, pero FUNCIONA

Con esto lo dejo. Por lo que ví al principio, tienes un formulario con un subformulario que a su vez tiene otro subformulario. Y querías que en el subformulario del subformulario te guarde unos valores que pones en el formulario. Si tengo

Donde pone, abajo, año, nombreproducto, etc es el subformulario del subformulario facturas y depende de la tabla DetalleFactura. Si pulso el botón pasar

Ahora cambio los valores de los cuadros de texto del formulario

Al pulsar el botón

El código del botón es simplemente( el subformulario Facturas está relacionado con su subformulario por IdFactura)

Private Sub Comando12_Click()
DoCmd. RunSQL "insert into detallefactura(año, nombreproducto, precio, cantidad, subtotal)values(texto1, texto3, texto5, texto7, texto9)"
DoCmd.RunSQL "update detallefactura set idfactura=forms!formulario1!facturas.form!idfactura where idfactura is null"
Me!Facturas.Form!detallefactura.Form.Requery
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas