none
Como restar a una tabla sql server RRS feed

  • Pregunta

  • El resultado de $1420 pesos es de la columna

    fakonnan


    • Editado Fakonnan sábado, 3 de diciembre de 2016 4:14 La cantidad de "El vendedor debe"  es el resultado de la suma de la columna "faltante" del numero del vendedor "1", quisiera que al momento de ingresar la cantidad a abonar se los restara al faltante y se actualizara en sql server
    sábado, 3 de diciembre de 2016 3:08

Todas las respuestas

  • Fakonnan,

    Te recomiendo que plantees el requerimiento con mayor detalle dejando claro que es lo que necesitas obtener. Es posible que para ti es suficiente el título del hilo y la imagen que adjuntas sin embargo para los miembros del foro no nos es suficiente, no conocemos de tu proyecto, danos una mano para poder ayudarte con precisión y rapidez.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 3 de diciembre de 2016 3:24
  • A si amigo había insertado el texto pero no había visto

    La cantidad de "El vendedor debe"  es el resultado de la suma de la columna "faltante" del numero del vendedor "1", quisiera que al momento de ingresar la cantidad a abonar se los restara al faltante y se actualizara en sql server


    fakonnan

    sábado, 3 de diciembre de 2016 4:14
  • Fakonnan,

    La sumatoria de la columna 'faltante' es simple, es acumular los valores de todas las filas de la columna:

    lblFaltante.Text = dataGridView1.Rows.Cast<DataGridViewRow>()
                                .Where(r => Convert.ToInt32(r.Cells["no_vendedor"]) == 1)
                                .Sum(r => Convert.ToDecimal(r.Cells["faltante"].Value)).ToString("N2");

    Respecto a actualizar, no mencionas el nombre de la tabla ni el de la columna, así que pondré un ejemplo con nombre ficticios:

    private void btnAbonar_Click(object sender, EventArgs e)
    {
    	using (SqlConnection cn = new SqlConnection("Cadena de conexion"))
    	{
    		string consultaSQL = @"UPDATE NombreTabla SET Abono = @Abono 
    						WHERE idVendedor = @idVendedor";
    
    		SqlCommand cmd = new SqlCommand(consultaSQL, cn);
    
    		cmd.Parameters.AddWithValue("@Abono", Convert.ToDecimal(lblFaltante.Text) -
    					Convert.ToDecimal(txtAbono.Text));
    		cmd.Parameters.AddWithValue("@idVendedor", 1);
    
    		cn.Open();
    
    		cmd.ExecuteNonQuery();
    	}
    }



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 3 de diciembre de 2016 4:52
  • Gracias por responder, el nombre de la tabla es "tabla_recepcion" la columna "faltantes"; pero quiero que se le abonen a todo lo que debe (que son los "faltantes"), no se como hacerle para que de alguna manera se lo reste a todos los registros de "faltantes" o solo a donde debe, porque algunos registros de "faltante" son de cero y el vendedor no siempre será "1" bro, se escribe en un textbox

    fakonnan


    • Editado Fakonnan sábado, 3 de diciembre de 2016 5:08
    sábado, 3 de diciembre de 2016 5:04
  • Fakonnan,

    La actualización se dará para cada una de las operaciones de un determinado vendedor -mostradas en la grilla-, sin embargo, para que el abono se haga efectivo para cada operación debe de haber una columna que lo identifique, algo como 'idVenta'. Analiza el código propuesto y -en caso sea necesario- realiza las correctivas del caso:

    private void btnAbonar_Click(object sender, EventArgs e)
    {
    	using (SqlConnection cn = new SqlConnection("Cadena de conexion"))
    	{
    		cn.Open();
    
    		//Consulta SQL para actualizar la columna 'faltantes'
    		string consultaSQL = @"UPDATE tabla_recepcion SET faltantes = @Pago
    			WHERE idVendedor = @idVendedor AND idVenta = @idVenta";
    
    		//Monto total que abona el cliente
    		decimal montoAbonado = Convert.ToDecimal(txtAbono.Text);
    
    		//Seleccionar todas las ventas de un vendedor "x" con 'faltante' mayor a 0
    		foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow>()
    			.Where(r => Convert.ToString(r.Cells["no_vendedor"].Value) == txtVendedor.Text 
    						&& Convert.ToDecimal(r.Cells["faltantes"].Value) > 0))
    		{
    			decimal faltante = Convert.ToDecimal(row.Cells["faltantes"].Value);
    			decimal amortizacion = faltante <= montoAbonado ? faltante : montoAbonado;
    
    			SqlCommand cmd = new SqlCommand(consultaSQL, cn);
    
    			cmd.Parameters.AddWithValue("@Pago", amortizacion);
    			cmd.Parameters.AddWithValue("@idVendedor", (int)row.Cells["no_vendedor"].Value);
    			cmd.Parameters.AddWithValue("@idVenta", (int)row.Cells["idVenta"].Value);
    
    			//Se ejecuta la consulta
    			cmd.ExecuteNonQuery();
    
    			//Se decrementa el abono total
    			montoAbonado -= amortizacion;
    		}
    	}
    }




    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 3 de diciembre de 2016 17:19
  • El campo idVenta debe estar vacío? o lo hago autoincrement?

    fakonnan

    sábado, 3 de diciembre de 2016 17:39
  • El campo idVenta debe estar vacío? o lo hago autoincrement?

    fakonnan

    A ver, la tabla [tabla_recepcion] contiene operaciones de venta, ¿verdad?, cada venta debe de tener un identificador, yo coloco para el ejemplo la columna 'idVenta', tú debes de colocar la columna que tienes definida como clave primaria, quizá tengas algo como 'NumDocumento', en caso no tengas un identificador para cada operación (que sería raro) agrega la columna 'idVenta' con la propiedad IDENTITY (auto-incremental).

    Olvidé -en el ejemplo anterior- actualizar la columna 'tot-liquidar' que entiendo es el monto amortizado, considera el siguiente código:

    private void btnAbonar_Click(object sender, EventArgs e)
    {
    	using (SqlConnection cn = new SqlConnection("Cadena de conexion"))
    	{
    		cn.Open();
    
    		//Consulta SQL para actualizar la columna 'faltantes'
    		string consultaSQL = @"UPDATE tabla_recepcion 
    			SET faltantes = @faltantes, sobrante = 0, tot_liquidar = @tot_liquidar
    			WHERE idVenta = @idVenta";
    
    		//Monto total que abona el cliente
    		decimal montoAbonado = Convert.ToDecimal(txtAbono.Text);
    
    		//Seleccionar todas las ventas de un vendedor "x" con 'faltante' mayor a 0
    		foreach (DataGridViewRow row in dataGridView1.Rows.Cast<DataGridViewRow>()
    			.Where(r => Convert.ToString(r.Cells["no_vendedor"].Value) == txtVendedor.Text
    						&& Convert.ToDecimal(r.Cells["faltantes"].Value) > 0))
    		{
    			decimal faltante = Convert.ToDecimal(row.Cells["faltantes"].Value);
    			decimal tot_liquidar = Convert.ToDecimal(row.Cells["tot_liquidar"].Value);
    			decimal amortizacion = faltante <= montoAbonado ? faltante : montoAbonado;
    
    			SqlCommand cmd = new SqlCommand(consultaSQL, cn);
    
    			cmd.Parameters.AddWithValue("@faltantes", faltante - amortizacion);
    			cmd.Parameters.AddWithValue("@tot_liquidar", tot_liquidar + amortizacion);                    
    			cmd.Parameters.AddWithValue("@idVenta", (int)row.Cells["idVenta"].Value);
    
    			//Se ejecuta la consulta
    			cmd.ExecuteNonQuery();
    
    			//Se decrementa el abono total
    			montoAbonado -= amortizacion;
    		}
    	}
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 3 de diciembre de 2016 17:54
  • El campo tot_liquidar no tiene nada que ver en esta operación carnal, solo la columna ''faltante'

    fakonnan

    sábado, 3 de diciembre de 2016 17:59
  • 'tot_liquidar' es el dinero que tendrá que pagar al momento de entregue el dinero de lo que vendió y que trae, es decir; si tiene que pagar $1500 y solo trae $1000, el total a liquidar son $1000 y $500 se van a 'faltante', porque al final del día el usuario tendrá que reportar solo el dinero que recibió que es 'tot_liquidar'

    fakonnan


    • Editado Fakonnan sábado, 3 de diciembre de 2016 18:08
    sábado, 3 de diciembre de 2016 18:05
  • Fakonnan,

    ¿Seguro? Yo creo que la columna 'faltantes' debe restar su valor al monto amortizado y la columna 'tot_liquidar' debe sumar su valor al monto amortizado, caso contrario los valores de ambas columnas quedarán inconsistentes, fíjate que el monto de la columna 'venta_neta' debe resultar de:

    venta_neta = faltante + tot_liquidar - sobrante

    En cualquier caso, queda en ti realizar los ajustes pertinentes según consideres necesario.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 3 de diciembre de 2016 18:08
  • Gracias bro, ah funcionado

    fakonnan

    sábado, 3 de diciembre de 2016 18:36