Inconveniente en operación en Access para calculo campo en Access VBA

Quiero preguntarles y pedirles el favor de antemano si me pueden ayudar con lo siguiente:

Tengo el siguiente código en VBA

Private Sub Comando14_Click()
Dim db1, db2, db3 As Database
Dim rs1, rs2, rs3 As Recordset

On Error Resume Next

Set db1 = CurrentDb
Set db2 = CurrentDb
Set db3 = CurrentDb

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto= Subformulario8.Cod_producto_venta") ' Lo que compramos inicialmente (1)
Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos") ' Lo asignamos a otro campo llamado Cantidad_compra2 (2)
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta= Subformulario8.Cod_producto_venta") ' Seleccionamos la cantidad que vendemos

Do While Not rs1.EOF
Do While Not rs2.EOF
Do While Not rs3.EOF
rs1.Edit
rs2.Edit
rs3.Edit

rs2!Cantidad_compra2 = rs1!Cantidad_compra ' asigno a Cantidad_compra2 lo que esta en Cantidad_compra
rs2!Cantidad_compra2 = rs2!Cantidad_compra2 - rs3!Cantidad_venta ' Refresco asignando a Cantidad_compra2 la diferencia con rs3!Cantidad_venta
Loop
Loop
Loop

End Sub

Al ejecutar el código me aparece un mensaje que dice Error de compilación "Se esperaba un tipo definido por el usuario no un proyecto", tengo habilitadas las referencias, además no veo como asignar la condición de una consulta al valor de un texto de un subformulario por ejemplo: Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto= Subformulario8.Cod_producto_venta")

1 respuesta

Respuesta
1

En tu código veo varios errores:

1º/ Si quieres declarar 3 objetos Database y 3 objetos recordset, tienes que hacerlo así:

Dim db1 As Database, db2 As Database, db3 As Database

Dim rs1 As Recordset, rs2 As Recordset, rs3 As Recordset

O de esta otra:

Dim db1 As Database

Dim db2 As Database

Dim db3 As Database

...

tal como tu lo haces, es como si hicieras:

Dim db1 As Variant, db2 As Variant, db3 As Database

Dim rs1 As Variant, rs2 As Variant, rs3 As Recordset

2º/ ¿Para que usas rs1. Edit y rs3. Edit si luego no modificas ningun valor de esos recordsets?

3º/ Cuando modificas un dato de un recordset, tienes que actualizarlo para que se apliquen los cambios, es decir, te falta poner rs2.Update antes del Loop

Y por último, que es lo que preguntas, para hacer referencia al valor de un subformulario, si el botón lo tienes en el formulario principal, tendrías que hacer así:

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto=" &  Me.Subformulario8.Form.Cod_producto_venta)

Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta=" &  Me.Subformulario8.Form.Cod_producto_venta)

Es decir, Me.NombreCONTROLsubformulario.Form.NombreControl

Muchas gracias experto, pero desafortunadamente el  problema persiste pese a que he hecho unas modificaciones, el código que tengo es:

Dim db1 As dao.Database   ' Modifique el Database por dao.Database 
Dim db2 As dao.Database   ' Modifique el Database por dao.Database 
Dim db3 As dao.Database  ' Modifique el Database por dao.Database 

Dim rs1 As Recordset, rs2 As Recordset, rs3 As Recordset

On Error Resume Next

Set db1 = CurrentDb
Set db2 = CurrentDb
Set db3 = CurrentDb


Do While Not rs1.EOF
Do While Not rs2.EOF
Do While Not rs3.EOF

rs2.Edit

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto= Cod_producto_venta") ' Lo que compramos inicialmente (1)

Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos") ' Lo asignamos a otro campo llamado Cantidad_compra2 (2)
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta= Cod_producto_venta") '

rs2!Cantidad_compra2 = rs1!Cantidad_compra ' asigno a Cantidad_compra2 lo que esta en Cantidad_compra
rs2!Cantidad_compra2 = rs2!Cantidad_compra2 - rs3!Cantidad_venta ' Refresco asignando a Cantidad_compra2 la diferencia con rs3!Cantidad_venta
'rs1.Update
'rs1.MoveNext
' OOOjJJJJOOOO 21 de Abril de 2015 no estan relacionadas las tablas Productos ni Productos_venta
rs2.update
Loop
Loop
Loop

 Muchas gracias de nuevo experto pero no se que esta pasando.

Ahora tienes un error nuevo, y otro que ya tenías.

El error nuevo es que no puedes editar un recordset antes de cargarlo, es decir, no puedes poner rs2.Edit antes del Set rs2=....

El error que sigues teniendo es la construcción del recordser rs1, pues ya te indiqué en la respuesta anterior cómo sería para hacer referencia a un campo del subformulario del formulario donde tienes el botón.

Te pongo el código entero, para que no te vuelvas a equivocar:

Private Sub Comando14_Click()
Dim db1 As dao.Database   ' Modifique el Database por dao.Database 
Dim db2 As dao.Database   ' Modifique el Database por dao.Database 
Dim db3 As dao.Database  ' Modifique el Database por dao.Database 
Dim rs1 As Recordset, rs2 As Recordset, rs3 As Recordset
On Error Resume Next
Set db1 = CurrentDb
Set db2 = CurrentDb
Set db3 = CurrentDb
Do While Not rs1.EOF
Do While Not rs2.EOF
Do While Not rs3.EOF
Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto=" & Me.Cod_producto_venta) ' Lo que compramos inicialmente (1)
Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos") ' Lo asignamos a otro campo llamado Cantidad_compra2 (2)
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta=" & Me.Cod_producto_venta) '
rs2.Edit
rs2!Cantidad_compra2 = rs1!Cantidad_compra ' asigno a Cantidad_compra2 lo que esta en Cantidad_compra
rs2!Cantidad_compra2 = rs2!Cantidad_compra2 - rs3!Cantidad_venta ' Refresco asignando a Cantidad_compra2 la diferencia con rs3!Cantidad_venta
'rs1.Update
'rs1.MoveNext
' OOOjJJJJOOOO 21 de Abril de 2015 no estan relacionadas las tablas Productos ni Productos_venta
rs2.update
Loop
Loop
Loop
End Sub

Ahora tengo la duda de si el campo que usas en el WHERE de los recordsets 1 y 3 (Cod_producto_venta) está en el formulario o en el subformulario...Si está en el formulario, esta forma es la correcta, si está en el subformulario, la correcta es la de la respuesta anterior

Hola

El subformulario lo probé por aparte y me señala el mismo error ("Error de compilación, Se esperaba un tipo definido por el usuario, no un proyecto")
cuando oprimo el botón, vale mencionar que eso me dice cuando lo ejecuto por aparte o dentro del mismo formulario abuelo), al decir formulario abuelo
me refiero a que estamos trabajando un formulario dentro de otro subformulario.

Comparando mi aplicación con otra aplicación que tengo desarrollada y que si me funciona bien habiulito las mismas Referencias dentro del VBA:
- Visual Basic For Applications
-Microsoft aCCESS 15.0 Object Library
-OLE Automation
-Microsoft Office 15.0 Access database engine ObjectLibrary
, pero pese a eso me menciona el mismo error, no se a que se deba


Dim db1 As Database ' dao.Database
Dim db2 As Database 'dao.Database
Dim db3 As Database 'dao.Database

Dim rs1 As Recordset, rs2 As Recordset, rs3 As Recordset

On Error Resume Next

Set db1 = CurrentDb
Set db2 = CurrentDb
Set db3 = CurrentDb


Do While Not rs1.EOF
Do While Not rs2.EOF
Do While Not rs3.EOF

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto=" & Me.Sub_MasProd.Form.Subformulario_Productos8.Form.Cod_producto_venta) 'Se coloca asi por que es un subformulario dentro de otro subformulario
Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos") ' Lo asignamos a otro campo llamado Cantidad_compra2 (2)
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta=" & Me.Sub_MasProd.Form.Subformulario_Productos8.Form.Cod_producto_venta) 'Se coloca asi por que es un subformulario dentro de otro subformulario


'rs1.MoveNext
'rs2.MoveNext
'rs3.MoveNext

rs1.edit
rs2.edit
rs3.edit


rs2!Cantidad_compra2 = rs1!Cantidad_compra ' asigno a Cantidad_compra2 lo que esta en Cantidad_compra
rs2!Cantidad_compra2 = rs2!Cantidad_compra2 - rs3!Cantidad_venta ' Refresco asignando a Cantidad_compra2 la diferencia con rs3!Cantidad_venta
'rs1.Update
'rs1.MoveNext
' OOOjJJJJOOOO 21 de Abril de 2015 no estan relacionadas las tablas Productos ni Productos_venta
rs2.update
Loop
Loop
Loop

De nuevo muchas gracias.

Att. Herna Camilo

Cuando te sale el error, ¿te marca alguna linea en concreto?

Analizando el código en detalle, veo que tienes otro error: tienes que poner las instrucciones set rs1, set rs2... antes de los bucles Do While, como tenías en el código de la primera pregunta.

Además, no entiendo qué es lo que intentas hacer:

primero coges con rs1 el valor del campo "Cantidad_compra" de la tabla Productos que corresponde al Cod_Producto del cuadro del subformulario. Si es un valor único, obtienes el mismo resultado usando DLookup("Cantidad_compra","Productos","Cod_producto=" & me.....)

Lo mismo se puede decir para rs3, y te ahorras trabajar con dos recordsets.

En cuanto al rs2, abres un recordset sobre la tabla Productos y coges sólo el campo Cantidad_compra2. Luego le modificas el valor por el que te devuelve el recorset rs1, para luego volverlo a modificar por la diferencia con el valor de rs3... Entonces, ¿para qué haces la primera modificación, si no la llegas a guardar?

Hola Amigo, muchas gracias por tu colaboración pero en primera instancia utilizando código sql, tengo dos problemas, el primero es que la consulta no me trae el calor de la consultas, siendo que dentro de la condición where si me toma el valor del texto.

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto=" & Me.Cod_producto_venta) 'Se coloca asi por que es un subformulario dentro de otro subformulario
Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos") ' Lo asignamos a otro campo llamado Cantidad_compra2 (2)
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta=" & Me.Cod_producto_venta) 'Se coloca asi por que es un subformulario dentro de otro subformulario

Hago la consulta por aparte (En el Sql de Access) y si me muestra valor, 2. obviamente al no encontrar valor el computador se queda en un loop que me bloquea la aplicación, chevere seria que funcionara con sql, aunque la función o DLookup es buena es chevere con Sql, el código que tengo es:

Dim db1 As dao.Database
Dim db2 As dao.Database
Dim db3 As dao.Database

Dim rs1 As Recordset, rs2 As Recordset, rs3 As Recordset

On Error Resume Next

Set db1 = CurrentDb
Set db2 = CurrentDb
Set db3 = CurrentDb

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto=" & Me.Cod_producto_venta)
Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos")
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta=" & Me.Cod_producto_venta)


Do While Not rs1.EOF
Do While Not rs2.EOF
Do While Not rs3.EOF

rs1.edit
rs2.edit
rs3.edit

rs2!Cantidad_compra2 = rs1!Cantidad_compra ' asigno a Cantidad_compra2 lo que esta en Cantidad_compra
rs2!Cantidad_compra2 = rs2!Cantidad_compra2 - rs3!Cantidad_venta ' Refresco asignando a Cantidad_compra2 la diferencia con rs3!Cantidad_venta


rs1.MoveNext
rs2.MoveNext
rs3.MoveNext


rs2.update
Loop
Loop
Loop

Vale, pero la pregunta sigue siendo ¿en qué línea te marca el error?

Por el mensaje o bien te falta alguna referencia por registrar (que no creo porque las que dices que tienes debieran llegar), o el error está en la sintaxis para recoger el valor del subformulario, que no usas el nombre correcto (has de usar el nombre del CONTROL que lleva dentro el sbformulario, no el nombre del subformulario en sí)

Para saber si la sintaxis es correcta, puedes comprobarlo fácilmete lanzando un MsgBox que te muestre el valor de ese campo.

Si no te marca ninguna línea con el error que te da, quítale al código el "On error resume next" y mira a ver dónde se origina el problema.

Hola Experto, pues a pesar de que tengo el siguiente código:

Dim db1 As dao.Database
Dim db2 As dao.Database
Dim db3 As dao.Database

Dim rs1 As dao.Recordset, rs2 As dao.Recordset, rs3 As dao.Recordset

On Error Resume Next

Set db1 = CurrentDb
Set db2 = CurrentDb
Set db3 = CurrentDb

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto=" & Me.Cod_producto_venta) 'Se coloca asi por que es un subformulario dentro de otro subformulario
Set rs2 = db2.OpenRecordset("Select Cantidad_compra2 from Productos") ' Lo asignamos a otro campo llamado Cantidad_compra2 (2)
Set rs3 = db3.OpenRecordset("Select Cantidad_venta from Productos_venta Where Cod_producto_venta=" & Me.Cod_producto_venta) 'Se coloca asi por que es un subformulario dentro de otro subformulario

Do While Not rs1.EOF
Do While Not rs2.EOF
Do While Not rs3.EOF

rs1.edit
rs2.edit
rs3.edit

rs2!Cantidad_compra2 = rs1!Cantidad_compra ' asigno a Cantidad_compra2 lo que esta en Cantidad_compra
rs2!Cantidad_compra2 = rs2!Cantidad_compra2 - rs3!Cantidad_venta ' Refresco asignando a Cantidad_compra2 la diferencia con rs3!Cantidad_venta

rs1.MoveNext
rs2.MoveNext
rs3.MoveNext

rs2.update
Loop
Loop
Loop

En los Set rs1, Set rs2 y Set rs3 no me trae los valores de las consultas.

Muchas gracias de nuevo
Att. Hernán Camilo.

Pásame la Bd, porque si no, vamos estar así eternamente...

A que correo se la puedo enviar?,muchas gracias!. 

Sube una copia dejando sólo el formulario y los subformularios, y las tablas y consultas que necesiten para funcionar a dropbox, onedrive (si usas alguno), o a cualquier web de intercambio de archivos (mega, filebig...) y me pones aquí el enlace de descarga.

Hola Experto, el link de la descarga es el siguiente:

https://www.filebuck.com/files/Jis4vX5G1430077876.html 

El formulario se llama Subformulario productos8 y el comando, en donde esta el código esta en la parte inferior derecha del formulario

Y se llama coomando14

Las tablas que hacen parte del formulario son:

  • Mascotas
  • Productos
  • Productos_venta

Por cuestión de tiempo no puedo dejar solo el formulario quien me decías con las tablas correspondientes, pero trabaja únicamente sobre el subformulario y las tablas que le mencione anteriormente

¡Muchas Gracias!

Att. Hernán Camilo Martínez V.

[email protected]

Después de ojear tu BD, lamento decirte que no te voy poder ayudar, pues tienes un buen cacao montado y no tengo tiempo para analizar la BD entera a fondo a ver qué viene de cada sitio y lo que pretendes hacer (cosa que aún no tengo claro).

Decirte, sin embargo, que a mí no me salta el error que a tí, pero hay cosas que debes corregir:

1º/ Los recordserts 1 y 3 los construyes mal, pues cod_producto es un campo de texto y tu lo pasas como si fuera numérico. Rs1 sería así:

Set rs1 = db1.OpenRecordset("Select Cantidad_compra from Productos Where Cod_producto='" & Me.Cod_producto_venta & "'"

Y lo mismo has de hacer con rs3.

2º/ El rs2.update tienes que colocarlo antes del cambiar de registro, es decir, antes del rs2.movenext

3º/ Creo que los rs2.movenext, rs2movenext y rs3movenext los tienes mal colocados, debería ir cada uno antes de cerrar el loop correspondiente

4º/ Usar "On error resume next" como control de errores no siempre es buena idea, porque cuando encuentra un error no sabes lo que está pasando ni por qué. Por ejemplo, para un producto que escogí al azar, el rs3 no devuelve registros, por lo que rs2 nunca se va a actualizar...

5º/ El subformulario en cuestión (Subformulario Productos8), no está bien relacionado con su formulario padre (Sub_MasProd) y no veo de qué forma lo puedes hacer...

Mi consejo sería que te replantearas la BD, simplificando tablas, o al menos, que te replantearas lo que intentas hacer con ese formulario/subformulario...

En fin, un saludo, y de nuevo lamento no poder seguir ayudándote en esta cuestión.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas