Access: Dudas en el uso de Recordset

He preparado el siguiente código, mi intención es crear un Recordset para calcular las entradas de stock, a partir de la tabla Articulos_Compra y un Recorset para calcular las salidas de stock a partir de la tabla Articulos_Venta.

A partir de estos dos recorset, quiero ejecutar una consulta de datos anexados para insertar los valores en la tabla Articulos_Compra.

El código es:

If Me![Tipo_Albaran] = "Inventario" Then
Fecha_Ultimo_Inventario = Nz(DMax("Fecha", "Albaranes_compras"), 0)
Fecha_Actual = Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Fecha]
Var_Año_Albaran = Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Año]
Var_Serie_Albaran = Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Serie_Albaran]
Var_Id_Albaran = Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Id_Albaran]
    Dim Respuesta As String
    Respuesta = MsgBox("¿Deseas añadir los artículos con stock actual?", 36, "Atención")
    If Respuesta = vbYes Then
        Set Base_Actual = CurrentDb
        With Base_Actual
        Set Salidas_Stock = .CreateQueryDef("", "SELECT Articulos_Venta.[Referencia Articulo], Sum(Articulos_Venta.Cantidad) AS SumaDeCantidad FROM Albaranes_Ventas LEFT JOIN Articulos_Venta ON (Albaranes_Ventas.Año = Articulos_Venta.[Año Albaran]) AND (Albaranes_Ventas.Serie_Albaran = Articulos_Venta.SerieAlbaran) AND (Albaranes_Ventas.Id_Albaran = Articulos_Venta.NumeroAlbaran) WHERE (((Albaranes_Ventas.Fecha) Between #" & Fecha_Ultimo_Inventario & "# And #" & Fecha_Actual & "#)) GROUP BY Articulos_Venta.[Referencia Articulo] ORDER BY Articulos_Venta.[Referencia Articulo], Sum(Articulos_Venta.Cantidad);")
        Set Salidas_Stock_1 = Salidas_Stock.OpenRecordset
        Set Entradas_Stock = .CreateQueryDef("", "SELECT Articulos_Compra.[Referencia Articulo], Sum(Articulos_Compra.Cantidad) AS SumaDeCantidad FROM Albaranes_Compras LEFT JOIN Articulos_Compra ON (Albaranes_Compras.Año = Articulos_Compra.[Año Albaran]) AND (Albaranes_Compras.Serie_Albaran = Articulos_Compra.SerieAlbaran) AND (Albaranes_Compras.Id_Albaran = Articulos_Compra.NumeroAlbaran) WHERE (((Albaranes_Compras.Fecha) Between #" & Fecha_Ultimo_Inventario & "# And #" & Fecha_Actual & "#)) GROUP BY Articulos_Compra.[Referencia Articulo];")
        Set Entradas_Stock_1 = Entradas_Stock.OpenRecordset
        End With
        DoCmd.SetWarnings False 'Desactiva el mensaje de ACCESS de que se van a agregar registros
        DoCmd.RunSQL "INSERT INTO Articulos_Compra ( [Referencia Articulo], Cantidad, [Precio Compra], [Total Articulo], [Año Albaran], SerieAlbaran, NumeroAlbaran ) SELECT Articulos.Referencia, Nz([Entradas_Stock_1].[SumaDeCantidad])-Nz([Salidas_Stock_1].[SumaDeCantidad]) AS Stock, Nz([Precio_Ultima_Compra]) AS Precio_Compra, Round([Stock]*[Precio_Ultima_Compra],2) AS Total, '" & Var_Año_Albaran & "' AS Año, '" & Var_Serie_Albaran & "' AS Serie, " & Var_Id_Albaran & " AS Albaran FROM (Articulos LEFT JOIN [Entradas_Stock_1] ON Articulos.Referencia = [Entradas_Stock_1].[Referencia Articulo]) LEFT JOIN [Salidas_Stock_1] ON Articulos.Referencia = [Salidas_Stock_1].[Referencia Articulo];"
        DoCmd.SetWarnings True  'Vuelve a activar los mensajes
        Me![Subformulario_Articulos_Traspaso].Form.Recalc
    Else
    End If
Else
End If

Pero me da error al intentar anexar los datos, error 3078, no se puede encontrar la tabla o consulta "Entradas_Stock_1".

Me da la sensación que al crear la consulta de datos anexados no reconoce los recordset como una consulta, de ahí el error.

¿Me podeís echar una mano?

1 Respuesta

Respuesta
1

Veo que te haces un lío con los recordsets y las consultas en SQL...

Veamos: en una instrucción en SQL, al final solo pueden aparecer nombres de campos existentes en una tabla/consulta, literales o campos calculados, nombres de tablas o nombres de consultas.

Cuando creas una SQL por medio de código VBA, puedes encadenar variables, referencias a campos de un formulario, de un recordset, pero al final tiene que quedarte como indico en el párrafo anterior.

Esto quiere decir que no puedes usar dentro de una SQL un recordset como origen de datos (es decir, usar un recordset en el FROM)

Hacer lo que pretendes por medio de recordsets es una locura, pues a menos que los recordsets de entradas y salidas devuelvan un único registro, tendrías que usar bucles para recorrer todos y cada uno de ellos.

Además, los recodsets tienen entre sus métodos Add, Edit, Delete, con lo que puedes actualizar directamente uno sin recurrir a consultas.

Por último, si este es un proceso que vas a realizar con cierta asiduidad, mi recomendación sería que te creases 4 consultas (o solo dos si manejas muy bien el lenguaje SQL): una para total entradas, otra para total salidas, otra para el stock (estas 3 las podrías resumir en una) y una de datos anexados para traspasar los datos.

Si te "molesta" mucho tenerlas como objetos, puedes ocultarlas. En el código sólo necesitarás el nombre de la de datos anexados para ejecutarla.

Un saludo.


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas