none
¿Cómo calcular el descuento a una venta correctamente?

    Question

  • Tengo un formulario donde genero los precios de un equipo, éste equipo lo puedo armar con componentes (cada componente tiene su respectivo precio),

    logro calcular el precio de los componentes y asignarlo la caja subtotal (como se muestra en la imagen):

    Ensable de Equipo

    mi problema está cuando quiero calcular el descuento de ese equipo incluso con el iva tengo el mismo problema.

    Tengo el siguiente método:

    public void CalcularDescuento()
            {
                if (txtPrecio.Text == "" && txtDescuento.Text == "")
                {
                    MessageBox.Show("Verifique si el precio no está vacío");
                }
                else
                {
                    double precio;
                    double descuento;
                    double descuentoTotal;
                    double total;
                    precio = Convert.ToDouble(txtPrecio.Text);
                    descuento = Convert.ToDouble(txtDescuentoPor.Text);
                    descuentoTotal = (descuento / 100) * precio;
                    txtDescuento.Text = Convert.ToString(descuentoTotal);
                    total = precio - descuentoTotal;
                    txtTotal.Text = Convert.ToString(total);
                }
            }

    éste método lo aplico en el evento TextChanged de mi TextBox descuento pero cuando mi caja de texto queda vacía es decir si borro los números me bota mi programa.

    ¿Cómo puedo validarlo? o ¿Hay otra forma mas adecuada para calcular este tipo de valores?

    Gracias y Saludos.


    wilO Frias WY

    Wednesday, September 12, 2012 10:01 PM

Answers

  • pero ese metodo devuel el total, no el iva, y si lo estas volviendo a calcular, salvo que hagas

    public double CalcularIVA(double precio, double iva)
    {
    	iva = (iva / 100) * precio;
    	double total = iva + precio;
    	
    	return new IvaResult()
    	{
    		iva = iva,
    		total = total
    	};
    }

    define la clase

    public class IvaResult
    {
    	public double iva {get; set;}
    	public double total {get; set;}
    }
    

    y lo usarias

    public void CalcularIVA()
    {
      double iva = 0;
      double precio = 0;
      double.TryParse(txtSubtotal.Text, out precio);
      double.TryParse(txtIVAPor.Text, out iva);
      
      IvaResult result = operaciones.CalcularIVA(precio, iva);
      
      txtIVA.Text = string.Format("{0:0%}", result.iva);
      txtTotal.Text=Convert.ToString(result.total);
    }

    o sea el metod devuelve dos resultados


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marked as answer by WilO Frias Thursday, September 13, 2012 2:26 PM
    Thursday, September 13, 2012 2:21 PM

All replies

  • éste método lo aplico en el evento TextChanged de mi TextBox descuento pero cuando mi caja de texto queda vacía es decir si borro los números me bota mi programa.

    eso es porque un vacio del textbox no puede convertirse a numerico

    es logico que si haces esto

    descuento = Convert.ToDouble(txtDescuentoPor.Text);

    tengas problemas, deberias usar

     double descuento = 0;

    double.TryParse(txtDescuentoPor.Text, out descuento );

    en ese caso si se deja sin nada el textbox dejara el cero en la variable


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Wednesday, September 12, 2012 10:19 PM
  • Si eso ya lo había analizado, pero es adecuado el método que estoy utilizando para calcularlo o puedo hacer más eficiente?

    Gracias.


    wilO Frias WY

    Wednesday, September 12, 2012 10:25 PM
  • Pues de primera entrada le doy un consejo:  No mezcle interfase gráfica con cálculos.  Por ejemplo, en su caso yo comenzaría creando una función que calcule el descuento a partir de ciertos datos:

    private double Descuento(double precio, double descuento)
    {
        return precio * descuento; // divida por 100 si 'descuento' no es fracción.
    }

    Luego nada más hay que externar el valor devuelto por esta función como una reacción de algún evento, como la adición de un nuevo componente a la lista.  Tendría yo un método que se encargaría de actualizar todos los totales y descuentos:

    private void ActualizarTotales()
    {
        //Obtenga el precio a partir de la suma de los componentes,
        //no a partir de una casilla de texto.
        double precio = SumarColeccionDeCompnentes();
        //Obtenga el pocentaje de descuento:
        double desc = 0;
        //Si la siguiente línea falla porque el valor digitado
        //no es válido de alguna forma, la variable 'desc' será cero.
        double.TryParse(txtDescuento.Text, out desc);
        double descuento = Descuento(precio, desc);
        double subtotal = precio - descuento;
        double total = subtotal * ( 1 + iva);
        //Listo.  Asigne las variables calculadas a sus respectivas casillas.
        ...
    }

    NOTA:  Puede también crear otras funciones para el cálculo del subtotal y del total para ser más consistentes con la separación entre datos e interfase gráfica.

    Entonces como verá el código se vuelve un poco más legible y organizado.  En el caso específico de conversión de texto a número, se utiliza TryParse().


    Jose R. MCP
    Code Samples

    Wednesday, September 12, 2012 10:28 PM
  • Ok supongamos que a la variable precio le asigno el valor  del método "SumarColeccionDeComponentes". 

    private void ActualizarTotales()
    {
        double precio = SumarColeccionDeCompnentes();
    }

    para el resto ¿está bien obtenerlos a partir de las cajas de texto?

    también tengo un poco de complicación en como utilizar el consejo de separar los cálculos de la aplicación.

    Gracias.


    wilO Frias WY

    Wednesday, September 12, 2012 10:49 PM
  • pero es adecuado el método que estoy utilizando para calcularlo o puedo hacer más eficiente?

    si es correcto

    realzias los calculos tomando la info de los controles, no veo que este incorrecto

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Wednesday, September 12, 2012 11:13 PM
  • Ok muchas gracias por los consejos.

    wilO Frias WY

    Wednesday, September 12, 2012 11:44 PM
  • No encuentro como realizar la operaciones con métodos diferentes.

    wilO Frias WY


    • Edited by WilO Frias Thursday, September 13, 2012 2:02 AM
    Thursday, September 13, 2012 2:01 AM
  • No encuentro como realizar la operaciones con métodos diferentes.

    no entendi

    a que llamas metodos diferentes ?


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Thursday, September 13, 2012 5:32 AM
  • Por qué no usas el evento Validating? 

    Haces las comprobaciones necesarias, y si no pasan la validación que hagas, pues cancelas la edición y lanzas un error.


    Programador en entornos Microsoft
    Blog
    Twitter

    Thursday, September 13, 2012 9:52 AM
  • Muy buenos días...!!!

    Como me puso el otro chavo hacer las operaciones por separado.

    Estoy haciendo esto:

    Cree una clase que se llama operaciones y tengo éste método

     public double CalcularIVA(double precio, double iva)
     {
       double total;
       //valor del iva
       iva = (iva / 100) * precio;
       //iva incluido en el precio
       total = iva + precio;
       return total;
     }

    entonces en la la clase de mi formulario primero hago la instancia

    Formulas.Operaciones operaciones = new Formulas.Operaciones();

    Luego creo el método que obtendrá los valores para asignarlos a la fórmula:

    public void CalcularIVA()
    {
      double iva = 0;
      double precio = 0;
      double.TryParse(txtSubtotal.Text, out precio);
      double.TryParse(txtIVAPor.Text, out iva);
      //txtIVA.Text = no puedo mostrar el iva del precio
      txtTotal.Text=Convert.ToString(operaciones.CalcularIVA(precio, iva);
    }

    éste método lo pongo en el evento textchanged de mi txtIVA.

    El resultado queda así:

    La operación es correcta.

    La operación es correcta, ahora me pregunto cómo muestro el valor del iva osea el 10% de 1500, porque aquí solo me muestra el total.

    Espero estar bien con mi programación.

    Saludos y gracias.


    wilO Frias WY

    Thursday, September 13, 2012 1:42 PM
  • Pues si al total solo le sumas el IVA, entonces TOTAL - SUBTOTAL.



    Programador en entornos Microsoft
    Blog
    Twitter
    LinkedIn

    Thursday, September 13, 2012 1:49 PM
  • podria ser

    public void CalcularIVA()
    {
      double iva = 0;
      double precio = 0;
      double.TryParse(txtSubtotal.Text, out precio);
      double.TryParse(txtIVAPor.Text, out iva);
      txtIVA.Text = string.Format("{0:0%}", precio / iva);
      txtTotal.Text=Convert.ToString(operaciones.CalcularIVA(precio, iva);
    }

    C# Percentage

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Thursday, September 13, 2012 1:52 PM
  • Leandro solo una duda, aquí está calculando nuevamente el iva o lo obtiene a partir del primer método??

    wilO Frias WY

    Thursday, September 13, 2012 2:07 PM
  • pero ese metodo devuel el total, no el iva, y si lo estas volviendo a calcular, salvo que hagas

    public double CalcularIVA(double precio, double iva)
    {
    	iva = (iva / 100) * precio;
    	double total = iva + precio;
    	
    	return new IvaResult()
    	{
    		iva = iva,
    		total = total
    	};
    }

    define la clase

    public class IvaResult
    {
    	public double iva {get; set;}
    	public double total {get; set;}
    }
    

    y lo usarias

    public void CalcularIVA()
    {
      double iva = 0;
      double precio = 0;
      double.TryParse(txtSubtotal.Text, out precio);
      double.TryParse(txtIVAPor.Text, out iva);
      
      IvaResult result = operaciones.CalcularIVA(precio, iva);
      
      txtIVA.Text = string.Format("{0:0%}", result.iva);
      txtTotal.Text=Convert.ToString(result.total);
    }

    o sea el metod devuelve dos resultados


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    • Marked as answer by WilO Frias Thursday, September 13, 2012 2:26 PM
    Thursday, September 13, 2012 2:21 PM
  • Ok muchas gracias =)

    wilO Frias WY

    Thursday, September 13, 2012 2:29 PM