Access: Cálculo de valor máximo de consulta

Estoy preparando un código para que al cambiar la fecha en un campo, calcule el año, serie de albarán y numero de albarán. El número de albarán debe ser el número más alto (teniendo en cuenta la serie y año) +1.

El código es el siguiente:

Private Sub Fecha_AfterUpdate()
Dim MiFecha As Date
Dim MiAño As Integer
Dim MiSerie As String
MiFecha = Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Fecha]
MiAño = Year(MiFecha)
MiSerie = Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Serie_Albaran]
Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Año] = MiAño
Set Base_Actual = CurrentDb
With Base_Actual
    Set Consulta_Numerar_Albaran = .CreateQueryDef("", "SELECT Albaranes_Compras.Año, Albaranes_Compras.Serie_Albaran, Albaranes_Compras.Id_Albaran FROM Albaranes_Compras WHERE (((Albaranes_Compras.Año) = '" & MiAño & "') And ((Albaranes_Compras.Serie_Albaran) = '" & MiSerie & "')) ORDER BY Albaranes_Compras.Serie_Albaran, Albaranes_Compras.Id_Albaran;")
End With
N_Albaran = Nz(DMax("Id_Albaran", Consulta_Numerar_Albaran), 0) + 1
Forms![Formulario Control Stock]![Subformulario Traspaso_Almacenes].Form![Id_Albaran] = N_Albaran
End Sub

Mi intención es definir una consulta con los albaranes ya creados y posteriormente calcular el valor máximo y sumarle 1.

En otros casos lo he hecho creando una consulta desde la base de datos, pero ahora quería intentar definir la consulta desde el propio código.

El problema es que en la función del calculo del valor máximo me da error, me indica que no coinciden los tipos, pero por otro lado, es la primera vez que intento definir una consulta desde el código y no se si estará bien definida.

1 respuesta

Respuesta
2

En mi opinión, el error lo tienes en que a la consulta temporal no le das un nombre, y en el DMax usas como nombre de la consulta un objeto (el consulta_numerar...) y no cadena de texto.

Corrigiendo esas dos cosas, te tendría que funcionar.

También podrías crear un recodset sobre tu consulta temporal, ordenarlo por número de albarán e ir al primer o último registro, según como ordenes, para recoger el dato.

Consulta, si no lo has hecho ya, el último ejemplo de Neckkito en su web, que trata estos temas.

Un saludo.

http://nksvaccessolutions.com/Foro/index.php 

>>

¡Gracias! Solucionado

Lo he solucionado con tus consejos, pero ahora tengo otro problema. Si creo un nuevo albarán, al volver a ejecutar el código, me da error indicando que la consulta que intento crear ya existe. ¿Hay alguna forma de borrar esa consulta, una vez calculado el valor máximo?.

Gracias

¿Hay alguna forma de crear una consulta temporal, sin que quede guardada, para que posteriormente calcule el valor máximo?

En el artículo de Neckkito que te indicaba ( http://siliconproject.com.ar/neckkito/index.php/ejemplos-explicados/consultas/87-ejemplos-explicados/ejemplos-de-consultas/346-querydef-una-alternativa-al-trabajo-con-consultas) tienes explicado cómo comprobar si la consulta existe y borrarla antes de crearla de nuevo, y también la otra opción que te decía, crear un recordset sobre la consulta temporal.

Es más, usando solo DMax() sobre la tabla directamente también puedes obtener el valor buscado, solo tienes que pasarle los criterios de filtrado a la función.

Gracias por tus respuestas, he estado leyendo más sobre los recordset y como no tengo mucha base, me ha surgido alguna duda.

Si quiero hacer una consulta de stock, primero debería acumular las entradas a partir de la tablas "albaranes de compras" y luego acumular las salidas a partir de la tabla "albaranes de ventas". A partir de estas dos consultas crearía una para hacer la diferencia entre ellas y así obtener el stock. Sin embargo, me gustaría no tener que crear estas consulta, porque poco a poco el número de consultas va creciendo y complica un poco la búsqueda entre tantas.

Según lo que he entendido, podría evitar hacer consultas, haciendo recordset, ¿es correcto?

Gracias

Correcto, pero hay veces que es mejor tener las consultas "físicamente" en la BD. Por ejemplo, esas 3 consultas las puedes crear en una sola con una SQL y sobre ella hacer el recordset, pero si no te manejas con soltura en lenguaje SQL, lo más probable es que te acabe fallando.

Otras veces la consulta la puedes crear directamente en el origen datos del formulario o informe, y te evitas tener que dejarla como objeto en la BD. Esto, como todo, tiene sus ventajas e inconvenientes...

Yo tengo BDs con más consultas que tablas, y si usas una nomenclatura adecuada para las mismas, no es difícil encontrar la que buscas en cada ocasión... XDD

Un saludo.


PD: por si no los viste, en la web de Nekkito tienes ejemplos para el cálculo de stocks, tanto solo con consultas como con consultas y VBA.

¡Gracias! 

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 imagino que no he creado la consulta de datos anexados al intentar coger los datos de dos Recordset.

¿Me puedes echar una mano?

Gracias

Te estás desviando del tema original, y lo adecuado sería que abrieses una nueva pregunta con esta duda.

Estaré atento.

Un saludo.


Añade tu respuesta

Haz clic para o

Más respuestas relacionadas