Decimales

Ante todo agradecer el simple hecho de que se moleste en leer esta consulta y agradecer más si se contesta.
He creado una base de datos en Access 2.000. Le he dado el formato a cada uno de los campos y todo funciona bien.
A la hora de crear un formulario he creado un evento en Visual Basic que recoge un valor de un campo de dicho formulario lo divide entre 166.386 y lo devuelve en otro campo del mismo formulario. Todo funciona bien salvo que la hacer esto el valor resultante me da un numero redondeado. He probado dando formato numérico con tres decimales al campo de destino, al de origen incluso pero nada. Le he dado formato Euro también por si ese es el problema pero no.
El problema que tengo es que necesito que me de ese valor con Visual Basic pueto que el resultado me lo devuelve a un campo de tabla cosa que no puede hacer si genero una expresión.
¿Qué debo hacer? ¿Debo dar formato decimal al campo de formulario destino desde Visual Basic? Siendo así.. ¿Cómo he de hacerlo?
Insisto nuevamente en agradecer tu atención a mi pregunta.
Santiago

1 Respuesta

Respuesta
1
Seguramente te está ocurriendo que el campo de la tabla donde intentas el resultado con decimales es un campo numérico tipo Entero o Entero Largo (Long); seguramente este último. Si es así, por mucho que le pongas formato decimal, siempre te saldrá entero pues no puede ser otra cosa.
Comprueba el tamaño del campo numérico, para que admita decimales debe se single, double o moneda dependiendo del máximo valor que pueda alcanzar y de la precisión. Si no es ese el error, dame otro toque y no te preocupes que no será muy complicado (a veces nos empeñamos en que dos y dos son cinco).
Efectivamente ese era el problema. Mil gracias. No he caído que el problema podía venir de la misma tabla. Me encerré en que el problema estaba en el formulario.
Después de esto me he encontrado con otro problema en el cual no había caído.
El evento de suma de valores a un campo determinado del formulario funciona bien. El único problema surge cuando modifico uno de los valores en los campos de origen. En vez de actualizarme el resultado lo que hace es sumar el nuevo valor al campo de destino. Es decir si tengo A B y C que me da una serie de valores POR Y y Z. estos me los suma bien. Pero si modifico por ejemplo A el resultado seria X+Y+Z+El nuevo valor originado por A.
¿Se puede solucionar de alguna manera?
Te adjunto el código de los eventos.
Private Sub B_imponible_16__AfterUpdate()
[iva16].Value = [B_imponible_16_].Value * 1.16 - [B_imponible_16_]
[totaliva].Value = [totaliva].Value + [iva16].Value
[Total_B_Imponibles].Value = [Total_B_Imponibles].Value + [B_imponible_16_].Value
[Total_B_Imponible__Euros].Value = [Total_B_Imponibles].Value / 166.386
[Total_iva_Euros].Value = [totaliva].Value / 166.386
End Sub
Private Sub B_imponible_4__AfterUpdate()
[iva4].Value = [B_imponible_4_].Value * 1.04 - [B_imponible_4_]
[totaliva].Value = [totaliva].Value + [iva4].Value
[Total_B_Imponibles].Value = [Total_B_Imponibles].Value + [B_imponible_4_].Value
End Sub
Private Sub B_imponible_7__AfterUpdate()
[iva7].Value = [B_imponible_7_].Value * 1.07 - [B_imponible_7_]
[totaliva].Value = [totaliva].Value + [iva7].Value
[Total_B_Imponibles].Value = [Total_B_Imponibles].Value + [B_imponible_7_].Value
End Sub
De nuevo agradezco enormemente tu colaboracon conmigo.
Santy
Has puesto:
[totaliva].Value = [totaliva].Value + [iva16].Value
Es decir, al mismo totaliva le sumas el iva16, cuando deber B_imponible_16 + iva_16.
El mismo error, más o menos, cometes en los demás eventos.
Para empezar, [totaliva]. value da exactamente el mismo resultado que [totaliva] a secas, sin value y si empleas la expresión más simple, el código será más legible.
En segundo lugar, los campos que obtienes a partir del valor de otros no deberías guardarlos, sino hacerlos campos calculados. Todos los campos que actualizs en los eventos podrían ser campos calculados y entonces, no sería necesario actualizarlos en los evento, si no poner la fórmula de cálculo en el origen de datos. Por ejemplo:
En el campo [iva16], en la propiedad origen del control, pones linetralmente:
= [B_imponible_16_] * 1.16 - [B_imponible_16_]
Con signo igual incluido y siempre estará actualizado sin necesidad de que tú lo hagas manualmente.
Creo que tratando todos los campos así te resultará todo más fácil y más claro.
Lo de .Value no es más que la herencia de las ayudas que he ido obteniendo desde que comencé a emplear los eventos en VB de access. Gracias por la aclaración.
Respecto a los campos calculados no me sirve.
Podría obtener la misma información que busco con los eventos creando consultas y operando campos pero lo que busco es mantener un control preciso del valor que me va a dar la base de datos por ejemplo en un registro en concreto. M encuentro en la situación de que hay gastos que no soportan iva. ¿Por lo que tendría que modificar ese registro en la tabla o consulta y para que hacerlo si lo puedo hacer directamente desde el formulario?
Pues bien el error que me has encontrado no es más que hacer que un campo se sume a si mismo más el nuevo valor calculado
Es decir al actualizar B imponible 4 creo un valor que es iva 4. Dichos valores se dirigen rtambien a total iva y total base imponible. Para que se sumen los bvalores de las bases imponibles 4 7 y 16 y los ivas correspondientes en los campos total iva y total base imponible no he encontrado otra opción.
Es complicado pero es la única forma que he encontrado de que me sume los valores de tres campos en uno solo conservando el origen de control a la tabla y campo de tabla en concreto.
¿Existe algún modo de que se actualice actualmente dichos campos de suma de valores ya calculados sin tener que forzar a hacerlo? Si no se puede, ¿cómo puedo forzar a la acutalizacion de ambos campos? He mirado en ayuda he consultado he buscado entre opciones y demás y no veo la repuesta. ¿Quizá con una macro? Luego se me plantea otro problema. ¿Si modifico un valor iva 4 7 o 16 a valor 0 teniendo su base imponible correspondiente un valor superior a 0 podre mantener la suma de el resto de campos calculados iva?
Me parece que la cosa se complica pero confío que alguien en este planeta consiga entender algún día mis necesidades de NO usar una expresión com, o la que me indicabas o generarla con el generador al efecto [jajajajja >;=) ]
Necesito que me calcule siempre el valor en formulario para poder modificarlo posteriormente y evitar el generar los valores iva en consultas e informes para su posterior impresión.
De nuevo Mil gracias SaNtY (Espero no acabar con tu paciencia, Gracias mil de nuevo)
! Menudo lío que me has hecho!. No acabo de entender lo que pretendes.
Lo de sumar 3 campos es muy sencillo:
[totaliva]= [iva4]+[iva7]+[iva16]
Es posible que te haya dado errores intentando hacerlo así si alguno de los campos era nulo. Es se soluciona así:
[totaliva]=nz( [iva4],0)+nz([iva7],0)+nz([iva16],0)
Y lo mismo puedes hacer con la base imponible.
Me estoy empezando a temer que los totales que actualizas no lo son para cada registro, si no para el conjunto de la tabla. Si es así, indícamelo, pues en ese caso el planteamiento es completamente distinto.
Sigo insistiendo en los campos calculados. Siempre los puedes copiar y pegar en otro formulario o informe.
Si fueras mujer (cosa que no se...) Te juro que te pediría en matrimonio! ja ja ja....
Todo funciona tal y como yo quería que lo hiciera >:=)
No sin tu enoorme ayuda por supuesto!
Ahora quisiera finalizar la obra maestra con algo más de lo que algunos me han catalogado de imposible.
En mi base de datos tengo dos tablas llamadas gastos y proveedores.
En la tabla gastos tengo dos campos, Nif y Nombre de proveedor cuyos registros se obtienen de la tabla proveedores, mediante la búsqueda en un cuadro de lista. (Uno para cada campo nif Nombre proveedor)
Mi pregunta es. ¿Cómo hacer para que al seleccionar en el formulario gastos un registro de el cuadro de lista nombre de proveedor, me aparezca automáticamente el valor Nif de dicho Nombre de p`roveedor en el campo Nif del formulario?
Con esta pregunta JURO dejar de marearte con mis preguntas.
Respondas o no a esta pregunta te garantizo la mejor de las puntuaciones en la valoración, me has salvado la vida amigo >:=)
Un saludo SaNtY
Creo que te sobra el campo Nombre de proveedor pues te basta con el Nif para identificarle.
En el cuadro de lista (mejor usa un cuadro combinado), en la propiedad origen de la fila pulsa el botón con tres puntos que aparece a la derecha y entrarás en el generador de consultas. En vez de hacer una consulta con un sólo campo de salida, hazla con dos (puedes hacerla con el número que quieras) Nombre y Nif: el campo que elijas primero será el que se muestre en el control, pero dispones de la información de los demás usando la propiedad column. No te olvides de actualizar las demás propiedades como número de columnas, ancho etc.
Si la primera columna es Nombre y la segunda Nif, se mostrará en Nombref, pero también puedes referirte a ellas como: [Nombredelcombo].column(0) y [Nombredelcombo].column(1), respectivamente. Puedes crear un campo calculado llamado Nif = [Nombredelcombo].column(1). ¡Y ya está!
En mi página web: http://usuarios.tripod.es/jbchea/, en la sección Novedades, te puedes bajar un archivo llamado Combos.zip que te puede ilistrar sobre cómo trabajar con cuadros combinados.
Saludos.
PD. Nuestro amor es imposible: Soy varón, heterosexual, felizmente casado y con mi mujer nunca hablo de informática.
Perdona mi torpeza.
Me he formado un taco haciendo las pruebas digno de tbo.
Pero ganas no han faltado. Bonita web por cierto.
Voy a mirar la base de datos con los combo que me has comentado.
Te mantendré al corriente.
Por cierto... Ya tenemos algo más en común. Yo también estoy felizmente comprometido, con mi novia no se puede hablar de informática a pesar de ser economista, y heterosexual convencido. >;=)
Un saludo
Te adjunto el código.
Option Compare Database
Private Sub B_imponible_16__AfterUpdate()
[Iva_16_] = [B_imponible_16_] * 1.16 - [B_imponible_16_]
[totaliva] = Nz([Iva_4_], 0) + Nz([Iva_7_], 0) + Nz([Iva_16_], 0)
[Total_B_Imponible__Euros] = [Total_B_Imponibles] / 166.386
[Total_iva_Euros] = [totaliva] / 166.386
[Importe_Factura] = [Total_B_Imponibles] + [totaliva]
[Importe_Factura_Euros] = [Total_iva_Euros] + [Total_B_Imponible__Euros]
[Total_B_Imponibles] = Nz([B_imponible_4_], 0) + Nz([B_imponible_7_], 0) + Nz([B_imponible_16_], 0)
End Sub
Private Sub B_imponible_4__AfterUpdate()
[Iva_4_].Value = [B_imponible_4_] * 1.04 - [B_imponible_4_]
End Sub
Private Sub B_imponible_7__AfterUpdate()
[Iva_7_] = [B_imponible_7_] * 1.07 - [B_imponible_7_]
End Sub
Private Sub prov_AfterUpdate()
[nif] = [prov].Column(0)
End Sub
_______
Pues bien, el problema es el siguiente.
Si después de haber dado los valores a los campos del formulario y estos hayan sido calculados, me encuentro que. Si uno de los valores calulados de iva es modificado por mi intencionadamente, la suma de totaliva nunca se me actualiza. He probadode mil formas, del as cuales he conseguido que si me las actualice pero no he conseguido que se actualicen total iva Euros por ejemplo.
El mismo problema me surge cuando hago lo mismo en cualquiera de las bases imponibles. Debería actualizarse cada vez que modifico un valor de base imponible 4 7 o 16 así como alguno de sus iva (podría ser un gasto sin soportado de iva, lease un tributo no estatal. En cuanto a las bases imponibles podría ser un simple fallo en la inserción de los datos)
El combo box ha sido un éxito. Chico... me encantaría dominar access como tu!
Tu base de datos es preciosa!
Aprobechando ... Por que razon acces hace esas comidas de recursos de sistema sin apenas hacer nada? no deja de sorprenderme. Y a razon de que mi targeta grafica hace esos barridos tan raros cuando veo un informe?? parece que mi grafica no tenga recursos suficientes pero creo que con una grafica que con 32Mb de memoria y el motor que tiene es mas que suficiente no?
De nuevo mil gracias
PD: Si me hago pesado con tabta consulta no dudes en decírmelo.
Insisto. Para ests cosas deberías usar campso calculados.
Como no son campos calculados, debes calcular su valor cada vez que modificas uno de los operandos, es decir, debes realizar todos los cálculos.
Mete todas las operaciones, incluyendo las de los afterupdate de iva4 e iva7 en el primer procedimiento (el afterupdate_iva16). Todas esas operaciones se deben repetir en cada afterupdate de los operandos, pero no es necesario que que copies todo el código; basta con que ponga, dentro de cada evento:
call B_imponible_16__AfterUpdate
Y ya está.
Saludos.
P.D. Estas conversaciones son públicas y el que haya querido seguirlas se habrá perdió a mitad del culebrón. Finaliza ya esta pregunta y, si quieres, empieza otra.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas