[ACCESS]Leer un registro de la base de datos dentro de un recordset DAO

Presento un problema... Tengo el siguiente código:

Im vCantProd, vCantProdS, vIdProd, ValueCantS, Aux, Op, ORIGIN As Integer
Dim rst, totCantS As DAO.Recordset
vProd = Nz(Me.Cuadro_combinado32.Value, 0)
vCantProd = Nz(Me.Texto42.Value, 0)
If vCantProd = 0 Then Exit Sub
Set rst = CurrentDb.OpenRecordset("CosultaCantS", dbOpenSnapshot)
With rst
.MoveFirst
Do Until .EOF
If .Fields("IdProd").Value = vProd Then
            ValueCantS = .Fields("SumaDeCantProdS").Value
            vCantProdS = .Fields("CantProd").Value
            Aux = .Fields("CantProd").Value
            Op = vCantProdS - ValueCantS
            vCantProdS = Op - vCantProd
    Select Case vCantProdS
        Case Is < 0
            If Aux = 1 Then
                MsgBox "No hay cantidad suficiente de este producto en almacen" & vbCrLf & vbCrlf_ & "El stock actual del producto es " & Op & "unidad", vbCritical, "SIN STOCK"
            End If
            If Aux > 1 Then
                MsgBox "No hay cantidad suficiente de este producto en almacen" & vbCrLf & vbCrlf_ & "El stock actual del producto es " & Op & "unidades", vbCritical, "SIN STOCK"
            End If
        Exit Do
        Case Is <= 5
        Dim ConfirmSal As Integer
            ConfirmSal = MsgBox("Atención, si se confirma esta operación en almacen solo quedará " & vCantProdS & "unidades", vbYesNo + vbInformation, "STOCK CRÍTICO")
             If ConfirmSal = vbNo Then
               DoCmd.SetWarnings False
                DoCmd.RunCommand acCmdDeleteRecord
                DoCmd.SetWarnings True
                DoCmd.GoToRecord , , acNewRec
             End If
        Exit Do
    End Select
End If
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
End Sub

en un formulario de salidas de inventario de un almacén, lo que deseo lograr es que de una consulta que adelante les mostraré me tome los valores id del producto, factura del producto y la cantidad para a esa cantidad restarle el valor que se extrae de dicho producto. El caso es que no me funciona. Les muestro la consulta en vista diseño para que tengan una idea:

En la siguiente imagen se muestra señalado en rojo los campos que solicito en la consulta.

y este es el error que me salta al tratar de hacer una operación:

1 respuesta

Respuesta
2

Al trabajar con recordsets no puedes abrir directamente una consulta parametrizada como la que tú tienes: o bien abres el recordset sobre la SQL de esa consulta, o defines primero los parámetros y les asignas su valor.

Opción 1, cambia la linea del Set rst=... por una como ésta:

Set rst=CurrentDb.OpenRecordset("Select .... WHERE IDProd=" & Me.IdProd " AND CodFact=" & Me.CodFact )

Opción 2, cambia la linea del Set rst=... por todo esto:

Dim qdf As QueryDef
Set qdf = dbs.QueryDefs("ConsultaCantS")
qdf.Parameters("Forms!Salidas!IdProd") = Forms!Salidas!IdProd
qdf.Parameters("Forms!Salidas!CodFact") = Forms!Salidas!CodFact
Set rst = qdf.OpenRecordset()

Ojo que los parámetros no sé si son los correctos en los dos casos, porque no se ve todo en el diseño de la consulta y tampoco sé si vienen del mismo formulario que muestras o de otro...

Por otro lado, comentarte que las únicas variables que has definido de un tipo concreto son ORIGIN y totCantS, el resto las tienes declaradas como Variant, y no como Integer o Recordset.

Maestro, disculpe usted la molestia, he modificado mi codigo con sus sugerencias pero ahora me salta el error de que no coinciden los tipos. Le adjunto mi codigo modificado. que podr'a suceder??

saludos

Private Sub Texto42_BeforeUpdate(Cancel As Integer)
Dim vCantProd As Integer
Dim vCantProdS As Integer
Dim vIdProd As Integer
Dim ValueCantS As Integer
Dim Aux As Integer
Dim Op As Integer
Dim ORIGIN As Integer
Dim rst As DAO.Recordset
vProd = Nz(Me.Cuadro_combinado32.Value, 0)
vCantProd = Nz(Me.Texto42.Value, 0)
If vCantProd = 0 Then Exit Sub
Set rst = CurrentDb.OpenRecordset("SELECT Salidas.CantProdS, Productos.IdProd, Productos.CantProd, Entradas.CodFact FROM (Entradas INNER JOIN Productos ON Entradas.CodFact = Productos.CodFact) INNER JOIN Salidas ON (Productos.IdProd = Salidas.CodProd) AND (Entradas.CodFact = Salidas.CodFact) WHERE IdProd = ") & Me.Cuadro_combinado32 '" AND CodFact= "' & Me.Cuadro_combinado30 '")
With rst
.MoveFirst
Do Until .EOF
If .Fields("IdProd").Value = vProd Then
            ValueCantS = .Fields("SumaDeCantProdS").Value
            vCantProdS = .Fields("CantProd").Value
            Aux = .Fields("CantProd").Value
            Op = vCantProdS - ValueCantS
            vCantProdS = Op - vCantProd
    Select Case vCantProdS
        Case Is < 0
            If Aux = 1 Then
                MsgBox "No hay cantidad suficiente de este producto en almacen" & vbCrLf & vbCrlf_ & "El stock actual del producto es " & Op & "unidad", vbCritical, "SIN STOCK"
            End If
            If Aux > 1 Then
                MsgBox "No hay cantidad suficiente de este producto en almacen" & vbCrLf & vbCrlf_ & "El stock actual del producto es " & Op & "unidades", vbCritical, "SIN STOCK"
            End If
        Exit Do
        Case Is <= 5
        Dim ConfirmSal As Integer
            ConfirmSal = MsgBox("Atención, si se confirma esta operación en almacen solo quedará " & vCantProdS & "unidades", vbYesNo + vbInformation, "STOCK CRÍTICO")
             If ConfirmSal = vbNo Then
               DoCmd.SetWarnings False
                DoCmd.RunCommand acCmdDeleteRecord
                DoCmd.SetWarnings True
                DoCmd.GoToRecord , , acNewRec
             End If
        Exit Do
    End Select
End If
.MoveNext
Loop
End With
rst.Close
Set rst = Nothing
End Sub

Supongo, ya que no lo dices, que el error lo tienes en la linea del Set rst=...

Y no es de extrañas, porque esa SQL deja mucho que desear (no puedes meter paréntesis por donde quieras, cambiar el orden de las comillas y omitir & para encadenar distintas partes de la cadena de la SQL y esperar que funcione bien, jejeje)

Además, podías haber probado la otra alternativa que te comentaba, que tampoco te hubiera llevado más de dos minutos en hacer las modificaciones...

Prueba así:

Set rst = CurrentDb.OpenRecordset("SELECT Salidas.CantProdS, Productos.IdProd, Productos.CantProd, Entradas.CodFact FROM Entradas INNER JOIN Productos ON Entradas.CodFact = Productos.CodFact INNER JOIN Salidas ON Productos.IdProd = Salidas.CodProd AND Entradas.CodFact = Salidas.CodFact WHERE IdProd = " & Me.Cuadro_combinado32 & " AND CodFact= '" & Me.Cuadro_combinado30 & "'")

Eso te funcionará suponiendo (por cómo has intentado hacer la SQL) que IdProd es un número y CodFact un texto. SI no fuera así, tendrás que modificarlo poniendo o sacando comillas simples donde sea necesario.

Mestro idProd y CodFact ambos son numeros

Entonces:

Set rst = CurrentDb.OpenRecordset("SELECT Salidas.CantProdS, Productos.IdProd, Productos.CantProd, Entradas.CodFact FROM Entradas INNER JOIN Productos ON Entradas.CodFact = Productos.CodFact INNER JOIN Salidas ON Productos.IdProd = Salidas.CodProd AND Entradas.CodFact = Salidas.CodFact WHERE IdProd = " & Me.Cuadro_combinado32 & " AND CodFact= " & Me.Cuadro_combinado30)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas