Access - Nuevo en VB

 
Vista:
sin imagen de perfil
Val: 5
Ha aumentado su posición en 30 puestos en Access (en relación al último mes)
Gráfica de Access

Nuevo en VB

Publicado por Saw (3 intervenciones) el 03/05/2020 16:22:56
Saludos, Estoy realizando una base de datos, pero tengo un error: '-2147217900 (8004e14)' en tiempo de ejecución:

Error de sintaxis en la cláusula WHERE

Alguien me puede dar una idea para resolver?

1
2
Sql = "SELECT tblProductos.IdProducto, tblProductos.CodigoPro, tblProductos.NombrePro, tblProductos.ExistPro, tblProductos.ExistMinPro, tblProductos.PCostoPro, tblProductos.PVenta1Pro, tblProductos.PVenta2Pro, tblProductos.PVenta3Pro, tblProductos.PMinimoPro, tblCategorias.NombreCategoria, tblProveedores.NombreEmpresaPro " _
& " FROM (tblProductos INNER JOIN tblCategorias ON tblProductos.IdCategoria = tblCategorias.Idcategoria) INNER JOIN tblProveedores ON tblProductos.IdProveedor = tblProveedores.IdProveedor WHERE " & Filtro & " order By " & Ordenar
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 Francisco
Val: 467
Plata
Ha disminuido 1 puesto en Access (en relación al último mes)
Gráfica de Access

Nuevo en VB

Publicado por Francisco (212 intervenciones) el 03/05/2020 18:09:51
Hola

Que valor contiene las variable FILTRO y ORDENAR ???


Saludos
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
sin imagen de perfil
Val: 5
Ha aumentado su posición en 30 puestos en Access (en relación al último mes)
Gráfica de Access

Nuevo en VB

Publicado por Williams Santos (3 intervenciones) el 04/05/2020 00:34:25
Saludos.

Aquí dejo lo que estpy programando:

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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
Sub LlenarProductosGrid()
    Dim Sql As String
    Dim Filtro As String
    Dim Ordenar As String
    Dim Columnas As Integer
    Dim Op As Integer
    Dim Ord As Integer
 
    Op = cmdTipoBusqueda.ListIndex
    Filtro = ""
 
    Select Case Op
        Case 0:
            Filtro = " tblProductos.NombrePro Like '%" & txtFiltro & "%'"
        Case 1:
            Filtro = " tblProductos.CodigoPro Like '%" & txtFiltro & "%'"
        Case 2:
            Filtro = " tblCategorias.NombreCategoria Like '%" & txtFiltro & "%'"
        Case 3:
            Filtro = " tblProveedores.NombreEmpresaPro Like '%" & txtFiltro & "%'"
        Case 4:
            Filtro = " tblProductos.PVenta1Pro >= " & txtFiltro
        Case 5:
            Filtro = " tblProductos.PVenta1Pro <= " & txtFiltro
    End Select
 
    Ord = cmdOrdenarpor.ListIndex
 
    Select Case Ord
        Case 0:
            Ordenar = " tblProductos.NombrePro ASC "
        Case 1:
            Ordenar = " tblProductos.CodigoPro ASC "
   End Select
   'Sql, para esto se debe coger datos de Access de la Consulta rápida
 
       Sql = "SELECT tblProductos.IdProducto, tblProductos.CodigoPro, tblProductos.NombrePro, tblProductos.ExistPro, tblProductos.ExistMinPro, Format(tblProductos.PCostoPro, 'currency'), Format(tblProductos.PVenta1Pro, 'currency'), Format(tblProductos.PVenta2Pro, 'currency'), Format(tblProductos.PVenta3Pro, 'currency'), Format(tblProductos.PMinimoPro, 'currency'), tblCategorias.NombreCategoria, tblProveedores.NombreEmpresaPro " _
& " FROM (tblProductos INNER JOIN tblCategorias ON tblProductos.IdCategoria = tblCategorias.Idcategoria) INNER JOIN tblProveedores ON tblProductos.IdProveedor = tblProveedores.IdProveedor;"  'WHERE " & Filtro & " order by " & Ordenar
 
       'Sql = "SELECT tblProductos.IdProducto, tblProductos.CodigoPro, tblProductos.NombrePro, tblProductos.NombreCortoPro, tblProductos.ExistPro, tblProductos.ExistMinPro, Format(tblProductos.PCostoPro, 'currency'), Format(tblProductos.PVenta1Pro,'currency'), Format(tblProductos.PVenta2Pro,'currency'), Format(tblProductos.PVenta3Pro,'currency'), Format(tblProductos.PMinimoPro,'currency'), tblCategorias.NombreCategoria, tblProveedores.NombreEmpresaPro " _
        '    & "FROM tblProveedores INNER JOIN (tblCategorias INNER JOIN tblProductos ON tblCategorias.Idcategoria = tblProductos.IdCategorias) ON tblProveedores.IdProveedor = tblProductos.IdProveedor WHERE '" & txtFiltro & "' order by " & Ordenar
 
      ' Sql = "SELECT tblProductos.IdProducto, tblProductos.CodigoPro, tblProductos.NombrePro, tblProductos.NombreCortoPro, tblProductos.ExistPro, tblProductos.ExistMinPro, Format(tblProductos.PCostoPro,'currency'), Format(tblProductos.PVenta1Pro,'currency'), Format(tblProductos.PVenta2Pro,'currency'), Format(tblProductos.PVenta3Pro,'currency'), Format(tblProductos.PMinimoPro,'currency'), tblCategorias.NombreCategoria, tblProveedores.NombreEmpresaPro " _
       '             & " FROM tblCategorias, tblProductos INNER JOIN tblProveedores ON tblProductos.IdProveedor = tblProveedores.IdProveedor WHERE " & Filtro & " order by " & Ordenar
'    & " FROM (tblProductos INNER JOIN tblCategorias ON tblProductos.IdCategoria = tblCategorias.Idcategoria) INNER JOIN tblProveedores ON tblProductos.IdProveedor = tblProveedores.IdProveedor WHERE " & Filtro & " order by " & Ordenar
 
   Columnas = 12
 
   Call LlenarGrid(msGrid, Sql, Columnas)
   'Se debe formar siempre matrices iguales ej, 12x12
    msGrid.ColWidth(0) = 0 'índice de la columna, no es necesario (cero)
    msGrid.ColWidth(1) = 0 'Id del Producto, no es necesario (cero)
    msGrid.ColWidth(2) = 1800
    msGrid.ColWidth(3) = 4000
    msGrid.ColWidth(4) = 1100
    msGrid.ColWidth(5) = 1100
    msGrid.ColWidth(6) = 1500
    msGrid.ColWidth(7) = 1500
    msGrid.ColWidth(8) = 1500
    msGrid.ColWidth(9) = 1500
    msGrid.ColWidth(10) = 2000
    msGrid.ColWidth(11) = 2000
    msGrid.ColWidth(12) = 4000
   'Esta lineas permite solo escoger datos requeridos de la Db access
    msGrid.TextMatrix(0, 2) = "Código"
    msGrid.TextMatrix(0, 3) = "Nombre Producto"
    msGrid.TextMatrix(0, 4) = "Exist"
    msGrid.TextMatrix(0, 5) = "Exis. Min"
    msGrid.TextMatrix(0, 6) = "P. Costo"
    msGrid.TextMatrix(0, 7) = "P. Venta 1"
    msGrid.TextMatrix(0, 8) = "P. Venta 2"
    msGrid.TextMatrix(0, 9) = "P. Venta 3"
    msGrid.TextMatrix(0, 10) = "P. Mínima"
    msGrid.TextMatrix(0, 11) = "Categoría"
    msGrid.TextMatrix(0, 12) = "Proveedor"
    msGrid.ColAlignment(4) = flexAlignCenterCenter 'Centrar los datos
    msGrid.ColAlignment(5) = flexAlignCenterCenter
    Dim PrecioCost1 As Integer
    SumTotal = 0
    For Fila = 1 To msGrid.Rows - 1
        Exist = msGrid.TextMatrix(Fila, 4)
        PrecioCost = CCur(msGrid.TextMatrix(Fila, 6)) 'CCur
 
        SumaTotal = SumaTotal + (Exist * PrecioCost)
 
        If Exist <= 0 Then
           msGrid.Row = Fila
           msGrid.Col = 4
           msGrid.CellBackColor = &HC0&   'color de fondo
           msGrid.CellForeColor = &H80000005  'color de la letra
        End If
 
    Next Fila
    lblNumArticulos.Caption = msGrid.Rows - 1
    txtTotalLista.Text = Format(SumaTotal, "currency")
End Sub
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

Nuevo en VB

Publicado por Anonimo (3316 intervenciones) el 04/05/2020 21:12:43
Lo primero que salta a la vista, es que se esta utilizando:

1
Filtro = " tblProductos.NombrePro Like '%" & txtFiltro & "%'"

Cuando debería ser así en Access:

1
Filtro = " tblProductos.NombrePro Like '*" & txtFiltro & "*'"
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
sin imagen de perfil
Val: 5
Ha aumentado su posición en 30 puestos en Access (en relación al último mes)
Gráfica de Access

Nuevo en VB

Publicado por Williams Santos (3 intervenciones) el 06/05/2020 00:57:37
Saludos Anonimo, verifique la importante acotación que me haces (Filtro = " tblProductos.NombrePro Like '*" & txtFiltro & "*'"), realice el respectivo cambio, pero aún sigo teniendo el mismo error!! Espero me puedas ayudar verificando donde estoy fallando... Muy agradecido por darle tiempo a mis problemas. >> Error de sintaxis en la cláusula WHERE <<
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

Nuevo en VB

Publicado por Anonimo (3316 intervenciones) el 06/05/2020 10:02:46
He copiado integra la exposición del código y 'pegado' en una base de datos con el fin de poder analizar un poco la sintaxis, algo muy complejo porque faltan partes imprescindibles (el resto de la aplicación) , como son las tablas y demás objetos a los que se hace referencia.

La SQL que se construye (cuya longitud es de 660 caracteres) me da la impresión de que esta generada con ayuda (de Access y asumo que el generador grafico de consultas).

Me baso para ello en que al final (cuando se le añade a esa consulta de selección el condicionante) se ha utilizado la SQL que Access genero y …..

El generador grafico de consultas las finaliza con un punto y coma, elemento INDISPENSABLE que le indica/permite al motor de Access saber 'cuando' acaba la SQL, fuera de ese entorno (consultas guardadas) el punto y coma final no se necesita y (en casos como el actual) da lugar a errores.

Solo conozco una causistica en la que Access utiliza (internamente y en las consultas) el punto y coma:
Como separador en una consulta con PARAMETROS, como separador de los parámetros de la SQL en la que se aplicaran y que viene a continuación

A lo practico.... En esa SQL (la única activa en el código posteado) el error esta en el carácter (ubicado en la posicion 614/615) cuya parte trascribo a continuación:

1
.. or = tblProveedores.IdProveedor;"  'WHERE " & Filtro & " order by " & Ordenar

Tras IdProveedor (donde se supone que finaliza la SQL copiada del generador grafico) aparece un punto y coma (que para el motor de Access es el indicador de su final) y después …. el Where …… MAL

Utiliza la SQL (funcionara), pero QUITALE el punto y coma para que asuma el WHERE (y lo que le sigue) como parte de la misma SQL

Nota:
No se debe de olvidar de que si no hay contenido (adecuado al condicional que se esta generando) en la variable 'txtfiltro' aparecería un NULL que daría al traste con todo lo anterior, aconsejo verificar si ese dato 'existe' y no es un NULL o asimilable (supongo que se hará en un paso anterior y aquí no comentado)..


El método de programar me lleva a pensar que se arrastra de otros entornos de programación (el uso del porcentaje como indicador ambiguo o la utilización de objetos asumidos pero no naturales de Access tal como los GRID) ¿esta suposición es correcta?.
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