** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Desglose de Monedas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoDesglose de Monedas

 Responder Responder Página  12>
Autor
Mensaje
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Tema: Desglose de Monedas
    Enviado: 14/Noviembre/2017 a las 11:21
Acces_2010 vs winows_7

Buenos dias:
Aprovechando la gentileza del Sr. "Mihura"
Estoy tratando de desglosar un valor de moneda en sus partes fraccionarias y he visto en su página esta función para lograr el objetivo



'---------------------------------------------------------------------------------------------
' Autor : JESUS MANSILLA CASTELLS -Mihura-
'---------------------------------------------------------------------------------------------
Public Function RT_DesgloseMoneda(nDato, ImporteInicial As Currency) As Integer
'variable que no se pierde entre las distintas llamadas
Static ImpRestante As Currency
    
     If IsNull(nDato) Then 'si nDato es nulo: variable al valor inicial y salida
         ImpRestante = ImporteInicial
         Exit Function
     End If

     RT_DesgloseMoneda = Int(ImpRestante / nDato)
     ImpRestante = ImpRestante - (nDato * RT_DesgloseMoneda)

End Function

El probelma es que me da desbordamiento al llegar a esta linea:
RT_DesgloseMoneda = Int(ImpRestante / nDato)
Consecuencia de declarar la función como Integer
Podeis ver alguna solución

Saludos al grupo:




Editado por main - 14/Noviembre/2017 a las 19:42
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 12:07
¿No tendrás un valor cero en nDato?


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 13:15
Hola "Mihura":
Saludos y gracias por estar ahí
En nDato, cuando rompe la función con el mensaje de desboramiento, tengo 0,01 que es el primer valor de la Tabla "Monedas".
Y ahí se queda.
Y ésta es la Select
SELECT 0 AS Valor, RT_DesgloseMoneda(Null,999.99) AS Unidades
FROM Monedas
WHERE (((1)=0))
UNION ALL SELECT Valor, RT_DesgloseMoneda (Valor, 0) AS Unidades FROM Monedas
ORDER BY Valor DESC;





Editado por main - 14/Noviembre/2017 a las 13:19
Arriba
guarracuco Ver desplegable
Moderador
Moderador
Avatar

Unido: 24/Abril/2004
Localización: EEUU
Estado: Sin conexión
Puntos: 2871
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 13:29
prueba enmascarar entre comillas simples el monto.
https://tucondominioaldia.net
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 13:43
Abro el generador de consultas, lo pongo en la ventana SQL, le pego la SQL que has posteado aquí y funciona perfectamente.

Solo se me ocurre que compruebes los valores de la tabla monedas, por cierto yo tengo definido el campo valor como currency.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
fcoval Ver desplegable
Habitual
Habitual


Unido: 19/Enero/2013
Estado: Sin conexión
Puntos: 104
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 14:32
Me parece a mi que no estais teniendo en cuenta que Int abarca un rango desde -32768 a 32767, y en el momento que el resultado de Int(ImpRestante / nDato) este fuera de ese rango va a desbordar.

El esta usando un registro de 0,01€


RT_DesgloseMoneda = Int(ImpRestante / nDato) = Int ( 327,68 / 0,01 ) = Desbordamiento

y

RT_DesgloseMoneda = Int(ImpRestante / nDato) = Int ( 327,67 / 0,01 ) = 32767 (lo maximo que te aceptara)


O lo que es lo mismo: 327.68 o un valor mayor en su caso 999.99
SELECT 0 AS Valor, RT_DesgloseMoneda(Null,327.68) AS Unidades
FROM Monedas
WHERE (((1)=0))
UNION ALL SELECT Valor, RT_DesgloseMoneda (Valor, 0) AS Unidades FROM Monedas
ORDER BY Valor DESC;
Desbordamiento

y

SELECT 0 AS Valor, RT_DesgloseMoneda(Null,327.67) AS Unidades
FROM Monedas
WHERE (((1)=0))
UNION ALL SELECT Valor, RT_DesgloseMoneda (Valor, 0) AS Unidades FROM Monedas
ORDER BY Valor DESC;
OK


Perdon por explicarme tan mal.

Editado por fcoval - 14/Noviembre/2017 a las 14:43
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 14:58
Aparte de que tienes razón .....  Wink

La tabla de monedas abarca desde 0,01 € a 500,00 € y la rutina trata las monedas de mayor a menor, con lo nunca va a intentar dividir 327,67 entre 0,01 €, si esa fuera la cantidad a dividir lo haría por 200 (que es la siguiente fracción de moneda descendente).

De todas formas el error que indicas se dará intentáramos sacar el desglose de más de:
        500 * 32767 = 16.383.500 €


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 19:19
Hola de nuevo
Efectivamente el valor máximo que me acepta con la funcion declarada como integer es de 327,67 y a partir de ahí, desbordamiento. Pero incluso con ese valor, no me calcula las unidades y el resultado de la consulta es el siguiente:

DesgloseMonedas
Valor Unidades
500,00 € 0
200,00 € 0
100,00 € 0
50,00 € 0
20,00 € 0
10,00 € 0
5,00 € 0
2,00 € 0
1,00 € 0
0,50 € 0
0,20 € 0
0,10 € 0
0,05 € 0
0,02 € 0
0,01 € 32767

Que Tampoco devuelve las unidades
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 19:26
¿Y cómo tienes creada la tabla monedas?


Editado. Por cierto edita la rutina de cálculo y cámbiala a Long.


Editado por Mihura - 14/Noviembre/2017 a las 19:28
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 19:37
El campo Valor como moneda


Editado por main - 14/Noviembre/2017 a las 19:47
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 19:40
y si la funcion la declaro asi:
Public Function RT_DesgloseMoneda(nDato, ImporteInicial As Currency) As Long
No me dá el desbordamiento pero obtengo algo parecido
DesgloseMonedas
Valor Unidades
500,00 € 0
200,00 € 0
100,00 € 0
50,00 € 0
20,00 € 0
10,00 € 0
5,00 € 0
2,00 € 0
1,00 € 0
0,50 € 0
0,20 € 0
0,10 € 0
0,05 € 0
0,02 € 0
0,01 € 99999


Editado por main - 14/Noviembre/2017 a las 19:47
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 19:51
El problema es que no está cogiendo el DESC de la SELECT, el primer valor que tiene que analizar es el 500,00 € no el 0,01 €.

Yo he probado tu SELECT con mi tabla monedas y funciona, así que la tontería la tiene tu tabla. Te diría que la borraras y la volvieras a crear. Y aseguráte que en la ejecución el primer valor que trata es 500,00 €.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 19:59
Pues alguna otra cosa deberia de pasar. He creado otra tabla.
Los valores introducidos son ascendentes
Los valores devueltos por la consulta lo son descendentes, pero las unidades tienen valor cero.
Asi que no se donde puede estar el Gazapo.

Arriba
main Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 31/Agosto/2009
Localización: OVIEDO
Estado: Sin conexión
Puntos: 873
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 20:02
Incluso dejo la Select asi:
SELECT Valor, RT_DesgloseMoneda (Valor, 0) AS Unidades FROM Monedas
ORDER BY Valor DESC;
y tampoco calcula las unidades.
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 9670
Enlace directo a este mensaje Enviado: 14/Noviembre/2017 a las 20:08
Crea una BD con lo justo para comprobar el proceso y cuélgala en algún lugar público ...
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable