Access - ACCESS 2010: DSuma con varias condiciones

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

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 09/01/2023 19:09:30
Hola a todos.

Espero que me puedan ayudar.

Soy un aficionado a Access.

Llevo un tiempo tratando de conseguir que me calcule un sumatorio de una tabla cumpliendo 2 o tres requisitos y no lo consigo.

Si pongo una condición, hace la suma correctamente, pero necesito que calcule la suma teniendo en cuenta 3 condiciones.

Si pongo esto: No calcula bien. Me suma los que cumplen la condición "CL" e ignora las demás condiciones.

=DSuma("[CONTTotVto]";"[CONT_Contabilidad]";"[CONTTipo='CL'" Y "[CONTCodigo]=[Código]" Y "[CONTSaldado]=0")

Si pongo esto: Si calcula bien, pero necesito que cumpla el resto de condiciones.

Suma correctamente los que cumplen la condición CONTipo= CL
=DSuma("[CONTTotVto]";"[CONT_Contabilidad]";"[CONTTipo]='CL'")
o
Suma correctamente los que cumplen la condición CONTSaldado= 0
=DSuma("[CONTTotVto]";"[CONT_Contabilidad]";"[CONTSaldado]=0)
o
Suma correctamente los que cumplen la condición CONTCodigo= [Código]
=DSuma("[CONTTotVto]";"[CONT_Contabilidad]";"[CONTCodigo]=[Código]")


Espero haberme explicado bien y que me puedan ayudar.

Gracias y saludos.

Pd. Me ocurre lo mismo con código
DSum ("[Campo]","[Tabla]","[Criteria]")
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 09/01/2023 22:06:10
Se tiene que crear la expresión en ingles (que es el idioma que Access utiliza para evaluarlas en VBA)
Basándome en que individualmente funcionan:

1
=DSuma("[CONTTotVto]";"[CONT_Contabilidad]";"CONTTipo = 'CL' AND CONTCodigo = [Código] AND CONTSaldado = 0")


Si desease cambiar las condiciones por una variable:
1
2
3
Condiciones = "CONTTipo = 'CL' AND CONTCodigo = [Código] AND CONTSaldado = 0"
Me.El_Cuadro_de_texto = =DSuma("[CONTTotVto]";"[CONT_Contabilidad]"; Condiciones ")

En este caso se tendría que asignar en VBA, no como origen de un cuadro de texto en el diseño formulario (con la excepción de disponer de las TempVars y utilizarlas)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 10/01/2023 17:37:20
Perfecto.

Me funcionó correctamente.

Muchas gracias y saludos cordiales.
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 12/01/2023 10:04:13
Buenos días.

¿Me podría ayudar con este código?

Me da error en la línea CurrentDb.Execute......
He comprobado las variables y da resultados correctos,
cDEBE , es ok.
cHABER , ok
y sSaldo me devuelve también un resultado correcto. ( Al aparecer el error en la línea update, paso el ratón por encima de estas variables y los datos son correctos.
Tambien el CCC que aqui he puesto un for next de un número de prueba.

CCC=48
Los campos de la tabla "Clientes" también son correctos "SaldoCliente" y "Código" con acento.

Cuando paso el ratón por encima de la línea "CurrentDb....." los datos cSALDO y CCC aparecen correctos, pero da error :
(Se ha producido el error '3144' en tiempo de ejecución: Error de sintaxis en la instrucción UPDATE

Muchas gracias de antemano y saludos cordiales.

------------------------------------------------------------------------------------------------
Dim CCC As Long, cDEBE, cHABER, cSALDO As Double

For CCC = 48 To 48

cDEBE = Nz(DSum("[CONTTotVto]", "[CONT_Contabilidad]", "CONTTipo = 'CL' AND CONTCodigo = " & CCC), 0)
cHABER = Nz(DSum("[CONTTotVto]", "[CONT_Contabilidad]", "CONTTipo = 'CO' AND CONTCodigo = " & CCC), 0)
cSALDO = D2(cDEBE - cHABER)

CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= " & cSALDO & "WHERE Código = " & CCC

Next CCC
-------------------------------------------------------------------------------------------------
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 12/01/2023 13:32:11
Sospecho que el problema lo causa un valor que tiene parte decimal.

Access (internamente) utiliza como separador decimal el punto y como separador de listas la coma.
La capa de abstracción del idioma (el castellano en este caso) utiliza la coma como separador decimal y como separador de listas el punto y coma.

Eso crea un conflicto, una coma en lugar de un punto (del castellano al ingles) hace que un valor numérico con parte decimal lo 'traduzca' como dos datos y genere un error en tiempo de ejecución.

Si ese fuera el caso hay solución:
La función STR, que le informa a Access de que el dato es un literal de texto en otro idioma y (en base a la configuración regional) invierta los cambios.

(Otra opción es la función Replace, reemplazando la coma decimal castellana por por el punto decimal americano)

1
2
Original:
CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= " & cSALDO & "WHERE Código = " & CCC

1
2
Corregida:
CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= " & Str( cSALDO) & " WHERE Código = " & CCC


Por cierto, faltaba un espacio antes del '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
sin imagen de perfil
Val: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 12/01/2023 18:17:18
Buenas tardes.

Ha dado uste en el clavo. Parece ser un problema de compatibilidad entre el punto y la coma.
El campo "SaldoCliente", tiene formato Doble y 2 decimales. He probado otras configuraciones, simple , currency etc. Finalmente lo he dejado como estaba. Doble y 2 decimales.

Parece ser que no hacepta el número que resulta de esta operacion cSALDO = 73.376,07

De momento la solución que he encontrado es poner un: INT

cSALDO = Int(cSALDO) Me tengo que conformar de momento con que me guarde el entero, aunque no es la solución que esperaba.
Me guarda en "SaldoCliente" 73.376,00
He probado también con lo que me comenta:
cSALDO = STR (cSALDO) y también lo admite pero me guarda el valor :
"SaldoCliente" = 7.337.607,00

No sé porque Access lo hace tan complicado. ;.)))

Muchas gracias una vez más por su atención.

Saludos.


Pd. D2 es una funcion para que redondee números y no tener que poner format cada vez.
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 12/01/2023 19:25:04
Access no lo complica, lo complica el usuario.

Es muy extraño que Access guarde ese dato en un campo numérico, el único caracter que no sea un digito que admite es el separador decimal (sea la coma o el punto) si se muestran los separadores de millares es que se le esta dando formato y en ese punto si que puede ser un lio el poner puntos y comas a discreción y después aplicar una función para manipular el contenido.

¿Cuál es el dato que se desea guardar?:
.- 73.376,00
.- 7.337.607,00
.-73.376,07

El dato REAL es este 73376,07 que STR convierte a 73376.07 el resto es formato sobre formato, la conversión que hace Str es correcta y si se intenta utilizar en otro contexto (incluida la ventana de inmediato), como lo hace a través de la capa del idioma los resultados pueden ser engañosos.
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 13/01/2023 11:06:41
Buenos días.

Los datos que resultan del cálculo son:

cDEBE = 824018,090579643
cHABER = 794575,769671631

cSALDO = D2(cDEBE - cHABER) = 29442,32

Si pongo:

cSALDO = Int(cSALDO) = 29.442,00
"SaldoCliente", admite el dato pero no es la solución correcta.


Si pongo:
cSALDO = Str(cSALDO) = 2.944.232,00

Me guarda en el campo "SaldoCliente" la cantidad de 2.944.232,00 en vez de 29.442,32


Gracias por su ayuda y paciencia.

Saludos cordiales.
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 13/01/2023 14:02:04
El error sigue siendo el mismo, un numero puede constar de dos partes: la entera y la decimal, entre ellas un único separador: el resto le sobra si es un numero.

Si al numero se le añaden los separadores decimales se convierte en un texto (ya no es un número) y la función que permite convertir el dato (STR) ya no funcionara correctamente.

Comienzo a sospechar que hay algo intermedio entre el dato real (procedente de un campo numérico) y el que se utiliza para convertir y guardar.

Si efectúo el calculo en la ventana de inmediato me da este resultado:
1
2
3
4
cDEBE = 824018.090579643
cHABER = 794575.769671631
?cDEBE - cHABER
 29442,320908012

Aun aceptando que se recorte a dos decimales, ni en el calculo posteado ni en el que he efectuado en la ventana de inmediato aparecen los 'separadores de millares' que están generando el conflicto.

Y si se quiere seguir en esa línea de utilizar datos con formato (sea cDEBE = 824,018.090579643 o cDEBE = 824.018,090579643) se tendrá que utilizar la función REPLACE y sustituir los puntos por una cadena vacía para que 'simule' un numero aun siendo un texto y ya puestos, un nuevo REPLACE y se modifica la coma por un punto (el separador decimal) que es el dato que espera 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
sin imagen de perfil
Val: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 17/01/2023 13:59:21
Buenos días.

Encontré la solución.
Parece ser que el problema estaba en :

CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= " & Str( cSALDO) & " WHERE Código = " & CCC

Por algún motivo, SaldoCliente no acepta decimales usando "CurrentDb.Execute..."

En cambio, acabo de aprender a actualizar registros mediante...:

Dim rst As Recordset
Dim sql As String
sql = "SELECT * FROM Clientes WHERE Código = " & CCC
Set rst = CurrentDb.OpenRecordset(sql, dbOpenDynaset)
rst.Edit
rst("SaldoCliente") = cSALDO
rst.Update
rst.Close
Set rst = Nothing


y funciona perfectamente.


Quedo muy agradecido por su ayuda.
Reciba un cordial saludo.
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 17/01/2023 14:29:02
La SQL funciona correctamente, pero es muy estricta y exige que los datos sean correctos, en la alternativa interviene la capa de abstracción de la configuración regional que valida el dato para una correcta conversión de tipos.

Te propongo una verificación, ejecuta estas 'dos versiones' y comenta los resultados:
1
2
CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= 29442,32 WHERE Código = " & CCC
CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= 29442.32 WHERE Código = " & CCC
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 17/01/2023 17:09:03
Buenas tardes.

La primera opción, da error.

La segunda, funciona perfectamente.
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 17/01/2023 19:01:57
Son los mismos datos con la única diferencia del separador decimal.

En una (la que tiene la coma y 'no funciona') el separador decimal es interpretado como 'separador de listas' y divide el dato en dos, al esperar un dato y tener dos (uno sin asignar a nada) se delata el error.

¿Porqué pasa eso? ... porque en una sola SQL se le pueden asignar valores a múltiples campos y la coma es el separador de listas:

1
CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= 29442.32, Comisiones = 10, Agente = 'Luis Martínez' WHERE Código = " & CCC

En la que funciona se le cambia el separador decimal (en castellano la coma simple) por el punto decimal (el separador decimal en en VBA que se utiliza en América, el país donde se diseño Access).

Ese cambio lo hace (para eso esta diseñada) la función STR, si no lo hace es porque el dato esta 'manipulado' en origen y si se mantiene ese método de trabajo los problemas pueden ir a mas.
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 18/01/2023 09:52:11
Estuve haciendo pruebas usando, STR, REPLACE... y no conseguí nungún progreso.

Mis nociones de informática no dan para más. ;-)

Los cálculos de cDEBE y cHABER (DSum) los hace sobre campos con formato número doble y 2 decimales.

A no ser que (DSum) haga cambios de formatos por su cuenta que no entiendo.

Y si el resultado de cSALDO es aceptado por "rst" , ¿Por qué no es aceptado por CurrentDb.Execute "UPDATE...?
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

ACCESS 2010: DSuma con varias condiciones

Publicado por Anonimo (3319 intervenciones) el 18/01/2023 11:12:30
Entre el motor de Access (VBA) y los formularios, consultas .... hay una capa de abstracción que en base a la configuración regional de la maquina traduce los nombres y expresiones para que la aplicación trabaje en ruso, chino, alemán, español .... y en esa capa se procesan los datos en un intento (muchas veces no logrado) de ayudar al usuario y sus diferentes métodos/manías.

En VBA se espera que el usuario tenga un cierto conocimiento de lo que hace y las validaciones esperan 'datos lógicos/concretos', no esperan (por ejemplo) que cinco mil cuatrocientas seis con treinta lo escriban así: 5.406,30, porque ese dato no es un numero es su representación formal, los números solo tiene dos partes, entera y decimal y se escriben y guardan con el formato correcto: 5406,30 (el separador decimal).

Sospecho que los cuadro de texto para la toma de datos son 'independientes' y se les da formato y con ese formato se utiliza la función STR.

Si lo anterior se adapta a lo real para convertir 5.406,30 en un numero adecuado para utilizar en VBA se tendrá que hacer en dos pasos:

1.- eliminar los separadores no-decimales
Un Numero = 5.406,30 (texto)
Numero = Replace(Numero, ".","") ===>>> 5406,30 (se eliminan los puntos, separadores 'estéticos')

2.- aplicar el separador correcto
Numero = Replace(Numero, ",",".") ===>>> 5406.30(se traduce el numero al formato correcto para utilizar VBA

-- en el punto 2 y en VBA también así y valido para cualquier configuración que no sea la americana (que no necesita conversiones) ---
Numero = 5406,30
Numero = Str(Numero) ====>>> 5406.30
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 19/01/2023 08:21:48
Buenos días.

Anotado.

Gracias.
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (2 intervenciones) el 18/05/2023 16:41:51
Hola.

Finalmente encontré la solución.

El problema estaba en el UPDATE.

Cuando los campos de una tabla son numéricos de tipo "Double", deberemos usar , ' (Comilla simple) y así funciona perfectamente.

Ejemplo:

CurrentDb.Execute "UPDATE CONT_Contabilidad SET CONTSaldo = '" & cSALDO & "'" & " WHERE CONTCodigo = " & CCC & ""

Muchas gracias y saludos cordiales.
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
Imágen de perfil de Eduardo

ACCESS 2010: DSuma con varias condiciones

Publicado por Eduardo (319 intervenciones) el 18/01/2023 21:17:06
Para evitar el error en UPDATE suelo utilizar la siguiente función.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Public Function CambiaDecimal(mstrtxt As Variant) As String
 
'función para suprimir la "," y cambiar por "." en la sentecia UPDATE y evitar error
 
    Dim encuentra As Integer
    Dim tem As String
 
    encuentra = InStrRev(mstrtxt, ",")
 
    If encuentra > 0 Then    ' hay decimal
        tem = Replace(mstrtxt, ",", ".", 1)
        CambiaDecimal = tem
    Else
        CambiaDecimal = mstrtxt
    End If
 
 
End Function

Por ejemplo,

1
CurrentDb.Execute "UPDATE Clientes SET SaldoCliente= " & CambiaDecimal(cSALDO) & " WHERE Código = " & CCC
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: 6
Ha aumentado su posición en 11 puestos en Access (en relación al último mes)
Gráfica de Access

ACCESS 2010: DSuma con varias condiciones

Publicado por Vicente (15 intervenciones) el 19/01/2023 08:22:10
Buenos días.

Lo pruebo y le digo.

Gracias.
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