Uso de DCount en una instrucción DoCmd.RunSQL UPDATE

Estoy tratando de actualizar mediante código VBA el campo "NroOrdItem" (formato número: doble, estandar. 0 decimal y 0 Valor Predeterminado) de la tabla "FacturasProcesadas" (tiene 26000 registros) debe ser el resultado de contar el campo "Coditem" (formato texto) que sea igual a "Coditem" y que el campo "IdFact" sea mayor o igual a "IdFact". Para ello use un boton comando y el siguiente código me aparece en rojo con el siguiente mensaje de error: "Error de compilación: Se esperaba: Fin de la instrucción" marcando en azul el nombre de la tabla en la función DCount:

DoCmd.RunSQL "UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem = DCount("*","FacturasProcesadas","Coditem='" & [Coditem] & "' And CDbl(IdFact) >= " & CDbl([IdFact]))
WHERE (((FacturasProcesadas.IdFact)<>0))"

La instrucción UPDATE la utilice en una consulta y funciona bien:

UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem = DCount("*","FacturasProcesadas","Coditem='" & [Coditem] & "' And CDbl(IdFact) >= " & CDbl([IdFact]))
WHERE (((FacturasProcesadas.IdFact)<>0));

He buscado ejemplos en la Web y tratado de detectar el error pero no lo he logrado

1 Respuesta

Respuesta
1

Debe usted construir una cadena cuyo contenido sea el que busca. El problema es que dentro de la cadena necesita usted tener el carácter ", que es el mismo que delimita la cadena, por lo que se interpreta como fin de la cadena. Para que eso no pase, sustituya cada " dentro de la cadena por "".

Como ejemplo, si quiere construir una cadena cuyo contenido sea:

Hola esto es una "prueba" de mi cadena

Para construir esa cadena no puede usar:

Dim strCadena As String

strCadena = "Hola esto es una "prueba" de mi cadena"

Pero sí:

strCadena = "Hola esto es una ""prueba"" de mi cadena"

Gracias por tu respuesta.

Estuve modificando la instrucción reemplazando las comillas como indicaste pero deje las comillas simples y quedó así:

DoCmd.RunSQL "UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount("" * "", ""FacturasProcesadas"", ""Coditem = '"" & [Coditem] & '"" And CDbl(IdFact) >= "" & CDbl([IdFact])) WHERE IdFact <>0"

La formula así como la transcribí la acepta, pero ahora me dice "Se ha producido el error 13 en tiempo de ejecución: No coinciden los tipos":

NroOrdItem: formato número, doble

Coditem: formato texto

IdFact: formato número, doble

Sigo sin poder descifrar donde está el error si en las comillas o en el tipo de datos.

Sigue usted construyendo mal la cadena. Mire la diferencia entre:

"UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount(""*"", ""FacturasProcesadas"", ""Coditem = '"" & [Coditem] & '"" And CDbl(IdFact) >= "" & CDbl([IdFact]))    WHERE IdFact <>0"

y

"UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount(""*"", ""FacturasProcesadas"", ""Coditem =  '" & [Coditem] & "'  And CDbl(IdFact) >=  " & CDbl([IdFact]) & " WHERE IdFact <>0"

¡Gracias por tu respuesta

Sigo con problemas con la cadena, use:

"UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount(""*"", ""FacturasProcesadas"", ""Coditem =  '" & [Coditem] & "'  And CDbl(IdFact) >=  " & CDbl([IdFact]) & " WHERE IdFact <>0"

Ahora me da el siguiente error: "Se ha producido el error 2465 en tiempo de ejecución: Inventario..... no encuentra el campo '[1' a que hace referencia la expresión.

Sigo con problemas con la cadena, use:

"UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount(""*"", ""FacturasProcesadas"", ""Coditem =  '" & [Coditem] & "'  And CDbl(IdFact) >=  " & CDbl([IdFact]) & " WHERE IdFact <>0"

Ahora me da el siguiente error: "Se ha producido el error 2465 en tiempo de ejecución: Inventario..... no encuentra el campo '[1' a que hace referencia la expresión.

Eso se debe a que o bien [Coditem] o bien [IdFact] (o ambos) no son campos del formulario.

Cuando obtenga el error, pulse sobre "depurar" y en el código colóquese sobre [Coditem] o sobre [Idfact]. Si los reconoce, verá que aparece un "tooltip" con su valor. En cambio, no aparecerá si no los reconoce.

Tal como muestro en esta imagen:

Gracias por tu respuesta. 

Estuve ajustando el código donde está inserta la cadena y reemplace campos por matrices. Tambien ahora el error es de sintaxis: "Error de sintaxis en la cadena en la expresión de consulta: DCount(""*"", ""FacturasProcesadas"", ""Coditem = '499CZ10200004' And CDbl(IdFact) >= 18812) WHERE Coditem = '499CZ10200004"

La cadena quedo así

DoCmd.RunSQL "UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount(""*"", ""FacturasProcesadas"", ""Coditem = '" & MiItem & "' And CDbl(IdFact) >= " & CDbl(MiNro) & ") WHERE Coditem = '" & MiItem & "' "

Este es el código que uso porque Coditem e IdFact son campos de una tabla

Option Compare Database

Dim RS As DAO.RecordsetDim TotalReg As Double

Dim MiItem As String

Dim MiNro As Double


Private Function Calculos()

On Error GoTo ErrorHandler

Set RS = CurrentDb.OpenRecordset("SELECT IdFact, Coditem, StkActF, Cantid, Precio, NroFact, FechaFact, AñoFact, Proveed, Mon, TC, NroOrd, TEst, TFecha, NroOrdItem, Stock, CantXFact, FaltaJust FROM FacturasProcesadas WHERE IdFactProc <> 0")

If RS.RecordCount = 0 Then Exit Function  

DoCmd.RunMacro "Macro26"       

With RS

    RS.MoveLast: RS.MoveFirst

    ReDim DelControl1(0 To RS.RecordCount)

    ReDim DelControl2(0 To RS.RecordCount)

    TotalReg = RS.RecordCount

        For i = 0 To RS.RecordCount - 1

            DelControl1(i) = RS!Coditem

            MiItem = DelControl1(i)

            DelControl2(i) = RS!IdFact

            MiNro = DelControl2(i)

DoCmd.RunSQL "UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem= DCount(""*"", ""FacturasProcesadas"", ""Coditem =  '" & MiItem & "' And CDbl(IdFact) <=  " & CDbl(MiNro) & ") WHERE Coditem = '" & MiItem & "' "

            If TotalReg = i Then

                Exit For

                Else

                    RS.MoveNext

            End If

        Next i                          

    End With

DoCmd.RunMacro "Macro27"

RS.Close

Set RS = Nothing

Exit Function

ErrorHandler:

         MsgBox Error

         Exit Function

End Function

Defina una variable de tipo cadena

Dim strSQL as String

Asigne el valor a la cadena

strSQL = "UPDATE blablabla"

Depure el código, revise el contenido de la variable strSQL y cópielo en una consulta nueva. Verá si es una consulta válida o contiene algún error.

Hice lo que sugeriste y tuve que arreglar la consulta que como tal funciona, la cadena es:

UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem = DCount("*","FacturasProcesadas","Coditem='" & [Coditem] & "' And CDbl(IdFact) <= " &  CDbl([IdFact])) WHERE (((FacturasProcesadas.IdFact)<>0));

Pero cuando utilizo esa cadena en mi código la muestra con letras en rojo y sombrea en azul "FacturasProcesadas" y da el mismo error que al principio:  "Error de compilación: Se esperaba fin de la instrucción"  y cuando ingreso a Depuración: Compilar me da el siguiente error : "Error de compilación: Error de sintaxis" 

Vuelvo a realizar las modificaciones que fuimos viendo anteriormente y vuelvo a recibir los mismos errores

  1. A las comilla dobles le agregue otra comilla doble, me acepto el cambio pero me da el siguiente error: "Inventario..... no encuentra el campo '[1' a que hace referencia la expresión"
  2. Reemplace campos por matrices y el error es de sintaxis: "Error de sintaxis en la cadena en la expresión de consulta: DCount(""*"", ""FacturasProcesadas"", ""Coditem = '499CZ10200004' And CDbl(IdFact) >= 18812) WHERE Coditem = '499CZ10200004"

Por lo visto es un error de sintaxis pero el bucle For esta leyendo los datos de la tabla y lo guarda en la variable que use en la cadena.

Ya no se que otro cambio puedo hacer, es la primera vez que uso esta función en el código. 

Si puede, suba la base de datos a algún sitio desde en que me la pueda descargar.

Gracias. Donde puedo subir la base de prueba (te mando el formulario y la tabla que actualiza) porque la base con la que trabajo es muy grande.

Estuve verificando nuevamente la formula y la separe con dos variables tipo texto (MiContador y miSQL) y que quedaron así:

MiContador = "DCount(""*""; ""FacturasProcesadas"";""Coditem ='" & MiItem & "' And CLng(IdFact) = " & CLng(MiNro) & " Or CLng(IdFact) < " & CLng(MiNro) & ")"

miSQL = "UPDATE FacturasProcesadas SET FacturasProcesadas.NroOrdItem = '" & MiContador & "' WHERE FacturasProcesadas.Coditem = '" & MiItem & "'"

DoCmd.RunSQL miSQL

Ahora me da el siguiente error:

El error que muestra que, según parece, correspondería a la asignación del valor de la nueva variable MiContador, en realidad no se corresponde con esa asignación. Verá que no aparece el "Or" (aunque tampoco sé para qué necesita ese Or, cuando realmente es más sencillo usar el <=). Y si se fija, en el error que obtiene falta cerrar las comillas de la condición "CodItem = ... 18812")"

Debería usted prestar más atención a la creación de cadenas. Se lía usted bastante y a cada cambio que hace elimina un error para incluir uno nuevo.

Muchas gracias por tus respuestas y disculpas por la demora en responder. La función ya no da error de sintaxis sino que no coinciden los tipos, por lo que me encuentro analizando los campos de las tablas y las variables que se utilizan como así también el procedimiento. 

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas