none
No puedo entrar al ciclo for RRS feed

  • Question

  • Buenas tardes a todos... Resulta que necesito guardar una Factura donde en el formulario he agregado un datagridview que en ese hay varios productos para almacenarlos en una tabla llamada Factura y en otra tabla llamada detalle_factura, pero primero debería de guardar en Factura y posteriormente en detalle_factura. No se si me estoy equivocando en las llaves, este es mi código:

                NegFactura fact = new NegFactura();
                NegDetalle_Factura detall = new NegDetalle_Factura();
                DetalleFactura deta = new DetalleFactura();

                if (txtNumFactura.Text.Length > 0 && txtNombre.Text != "" && txtProducto.Text != "" && txtCodigo.Text != "" && TXT_Iva.Text != "" && TXT_Total.Text != "")
                {
                    int NumFactura = Convert.ToInt32(txtNumFactura.Text);
                    int idfactura;
                    if (fact.ValidaNumFactura(NumFactura))
                    {
                        MessageBox.Show("Repetida...");

                    }
                    else
                    {

                        Factura f = new Factura();
                        f.Id_Cliente = Convert.ToInt32(lbIdCliente.Text);
                        f.Id_Usuario = _Identificador;
                        f.Numero_Factura = Convert.ToInt32(txtNumFactura.Text);
                        f.IVA = Convert.ToDouble(TXT_Iva.Text);
                        f.Fecha = Convert.ToDateTime(dtpFecha.Text);
                        idfactura = fact.guardarFactura(f);

            --->(No logro entrar al ciclo)-->  for (int i = 0; i < DGV_Factura.Rows.Count -1; i++)
                        {
                            deta.Id_Producto = Convert.ToInt32(DGV_Factura.Rows[i].Cells[0].Value);
                            deta.Cantidad = Convert.ToInt32(DGV_Factura.Rows[i].Cells[1].Value);
                            deta.Descuento = Convert.ToDouble(txtDescuento.Text);
                            deta.Monto = Convert.ToDouble(txtFacturado.Text);

                            detall.guardarDetalleFactura(deta);
                            MessageBox.Show("Factura Guardada.");
                        }
                        
                    }

                }
                else
                {
                    MessageBox.Show("Verifique que todos los campos estén llenos");
                }
            }

    Solo me está guardando Factura y Nó detalle_factura, por qué será? Mi trabajo es en capas... ojo.

    Thursday, January 16, 2020 1:10 AM

All replies

  • Hola Ramiro

    Hay 2 posibilidades: 1) Que no entre al else en donde está el for, o 2) que DGV_Factura.Rows.Count - 1 sea igual a 0

    No veo otras posibilidades

    Vos decis que no entra al for, o que no te guarda el detalle? Lo ejecutaste con el Debugger para ver bien donde entra y los valores de las variables? Así se hace más fácil detectar errores ...

    Saludos

    Pablo

    Thursday, January 16, 2020 2:07 AM
  • hola

    Si vas a iteras las rows de un grid recomendaria uses el foreach, o sea

    foreach (var row in DGV_Factura.Rows)
    {
    	deta.Id_Producto = Convert.ToInt32(row.Cells[0].Value);
    	deta.Cantidad = Convert.ToInt32(row.Cells[1].Value);
    	deta.Descuento = Convert.ToDouble(txtDescuento.Text);
    	deta.Monto = Convert.ToDouble(txtFacturado.Text);
    
    	// ?
    }


    Lo que no entiendo es donde usas la variable "f" que define la factura?

    no se supones que cuando grabas la factura y sus detalles debas realizarlo todo como una sola operacion, porque si es asi el

    detall.guardarDetalleFactura(deta);

    dentro del loop no aplica

    Deberias ser algo como esto

    Factura f = new Factura();
    f.Id_Cliente = Convert.ToInt32(lbIdCliente.Text);
    f.Id_Usuario = _Identificador;
    f.Numero_Factura = Convert.ToInt32(txtNumFactura.Text);
    f.IVA = Convert.ToDouble(TXT_Iva.Text);
    f.Fecha = Convert.ToDateTime(dtpFecha.Text);
    
    
    foreach(var row in DGV_Factura.Rows.Count)
    {
    	DetalleFactura deta = new DetalleFactura();
    
    	deta.Id_Producto = Convert.ToInt32(row.Cells[0].Value);
    	deta.Cantidad = Convert.ToInt32(row.Cells[1].Value);
    	deta.Descuento = Convert.ToDouble(txtDescuento.Text);
    	deta.Monto = Convert.ToDouble(txtFacturado.Text);
    
    	f.Items.Add(deta);
    }
    
    
    fact.guardarFactura(f);
    
    MessageBox.Show("Factura Guardada.");

    cuando persistes la factura alli tambien iteras la lista del detalle que deberia tener con una propiedad como ser

    public Factura{
    
       //otras propiedades
    
       public List<DetalleFactura> Items {get;set;}
    
    }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    Thursday, January 16, 2020 5:18 AM
  • Hola Lenadro, me da el siguiente error al agregar tu código:

    Error 1 'object' no contiene una definición de 'Cells' ni se encontró ningún método de extensión 'Cells' que acepte un primer argumento de tipo 'object' (¿falta una directiva de uso o una referencia de ensamblado?)

    A qué se debe?


    Thursday, January 16, 2020 6:37 PM