Access - A ver si alguien puede ayudarme

 
Vista:

A ver si alguien puede ayudarme

Publicado por vassago (13 intervenciones) el 15/01/2007 13:02:28
Saludos, tengo un problema con el código siguiente y es que al ejecutar me sale: "error 3421. Error de conversión de datos". el fallo me lo da en qdf.Execute SQL1, a ver si alguien sabría decirme el porque del error.

Private Sub Form_Current()
Dim VaTotal As Double
Dim Pres As Double
Dim MLineales As Double
Dim SQL As String, SQL1 As String
Dim dbs As Database, qdf As QueryDef
Dim rs As Recordset
Dim TTotal As Double

Pres = Presupuesto.Value
Set dbs = CurrentDb
SQL = "SELECT [carpinteria].* FROM [carpinteria] WHERE presupuesto= " + Trim(Pres) + ";"
Set qdf = dbs.CreateQueryDef("Consulta", SQL)
Set rs = qdf.OpenRecordset()
VaTotal = 0
TTotal = 0
If Not rs.EOF Then
Do Until rs.EOF
VaTotal = 0
MLineales = (rs.Fields("longitud") / 1000) + (rs.Fields("altura") / 1000)
MLineales = MLineales * 2
MLineales = MLineales * (rs.Fields("unidades"))
If rs.Fields("monoblock").Value = "VERDADERO" Then
VaTotal = (MLineales * 20) + VaTotal
Else
VaTotal = (MLineales * 19) + VaTotal
End If
If rs.Fields("rematesexterior").Value = "VERDADERO" Then Total = Total + 3
Select Case AlturaPiso.Value
Case "hasta un 2º"
VaTotal = VaTotal
Case "desde un 3º hasta un 5º"
VaTotal = VaTotal + 3
Case "desde un 6º hasta un 8º"
VaTotal = VaTotal + 5
Case "a partir del 9º"
VaTotal = VaTotal + 8
End Select
SQL1 = "update carpinteria set total=" + Trim(VaTotal) + " where presupuesto=" + Trim(Pres)
SQL1 = SQL1 + " and nomenclatura='" + Trim(rs.Fields("nomenclatura")) + "';"
qdf.Execute SQL1
rs.MoveNext
Loop
End If
[Form_Presupuestos].Total.Value = TTotal

rs.Close
dbs.QueryDefs.Delete ("Consulta")
dbs.Close
End Sub
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Error de conversión de datos en una consulta con VBA

Publicado por Alejandro (4142 intervenciones) el 01/08/2023 20:06:46
El error "3421. Error de conversión de datos" ocurre cuando hay una incompatibilidad entre el tipo de datos que se intenta asignar y el tipo de datos esperado en la base de datos. En este caso, el error puede estar relacionado con las concatenaciones en las sentencias SQL y la forma en que se están tratando los valores numéricos y de texto en las consultas.

Para evitar el error y asegurarse de que los valores se concatenen correctamente en las sentencias SQL, es recomendable utilizar parámetros en lugar de concatenar los valores directamente en la cadena SQL. Aquí te muestro cómo podrías modificar el código para utilizar parámetros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
Private Sub Form_Current()
    Dim VaTotal As Double
    Dim Pres As Double
    Dim MLineales As Double
    Dim SQL As String, SQL1 As String
    Dim dbs As Database, qdf As QueryDef
    Dim rs As Recordset
    Dim TTotal As Double
 
    Pres = Presupuesto.Value
    Set dbs = CurrentDb
    SQL = "SELECT [carpinteria].* FROM [carpinteria] WHERE presupuesto= " & Pres & ";"
    Set qdf = dbs.CreateQueryDef("Consulta", SQL)
    Set rs = qdf.OpenRecordset()
    VaTotal = 0
    TTotal = 0
 
    If Not rs.EOF Then
        Do Until rs.EOF
            VaTotal = 0
            MLineales = (rs.Fields("longitud") / 1000) + (rs.Fields("altura") / 1000)
            MLineales = MLineales * 2
            MLineales = MLineales * (rs.Fields("unidades"))
 
            If rs.Fields("monoblock").Value = True Then
                VaTotal = (MLineales * 20) + VaTotal
            Else
                VaTotal = (MLineales * 19) + VaTotal
            End If
 
            If rs.Fields("rematesexterior").Value = True Then
                Total = Total + 3
            End If
 
            Select Case AlturaPiso.Value
                Case "hasta un 2º"
                    VaTotal = VaTotal
                Case "desde un 3º hasta un 5º"
                    VaTotal = VaTotal + 3
                Case "desde un 6º hasta un 8º"
                    VaTotal = VaTotal + 5
                Case "a partir del 9º"
                    VaTotal = VaTotal + 8
            End Select
 
            SQL1 = "UPDATE carpinteria SET total = @VaTotal WHERE presupuesto = @Pres AND nomenclatura = @Nomenclatura;"
            Set qdf = dbs.CreateQueryDef("", SQL1)
            qdf.Parameters("@VaTotal").Value = VaTotal
            qdf.Parameters("@Pres").Value = Pres
            qdf.Parameters("@Nomenclatura").Value = rs.Fields("nomenclatura")
            qdf.Execute
 
            TTotal = TTotal + VaTotal
            rs.MoveNext
        Loop
    End If
 
    [Form_Presupuestos].Total.Value = TTotal
 
    rs.Close
    dbs.QueryDefs.Delete ("Consulta")
    dbs.Close
End Sub

En esta versión del código, hemos utilizado parámetros en la sentencia SQL para asignar los valores de VaTotal, Pres y Nomenclatura en lugar de concatenarlos directamente en la cadena SQL. Esto debería evitar el error de conversión de datos y permitir que la consulta se ejecute correctamente.

Espero que esta solución te sea útil. ¡Buena suerte con tu código en Access!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar