private void CbConductorHabitual_Leave(object sender, EventArgs e) { if (CbConductorHabitual.FindStringExact(CbConductorHabitual.Text) == -1) { LblConductorHabitualEncontrado.Visible = true; } else { LblConductorHabitualEncontrado.Visible = false; } }
private void vehiculoBindingNavigatorSaveItem_Click(object sender, EventArgs e) { if (conductor_idTextBox.Text == null) { MessageBox.Show($"{CbConductorHabitual.Text} tiene un id nulo. " + "Por favor, compruebe que esta en la lista.", "ERROR: conductor_id nulo", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } if (CbConductorHabitual.FindStringExact(CbConductorHabitual.Text) == -1) { MessageBox.Show($"El conductor {CbConductorHabitual.Text} no esta en la base de datos. " + "Por favor, seleccione un conductor que este en la lista.", "ERROR: Conductor inválido.", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } /* * * Usamos transacción porque vamos a hacer dar de alta, borrar o modificar en diferentes tablas y * * si se produce un error en mitad del proceso la base de datos se quedaría con datos inconsistentes. * */ SqlTransaction transaction; transaction = Globals.conn.BeginTransaction("AltaVehiculos"); try { SqlCommand cmd = Globals.conn.CreateCommand(); /* * * Comprueba que el conductor habitual es conductor habitual de menos de diez vehículos. * */ cmd.Connection = Globals.conn; cmd.Transaction = transaction; cmd.CommandText = "SELECT (SELECT COUNT(*) FROM vehiculo WHERE conductor_id = @count_veh)" + " + (SELECT COUNT(*) FROM vehiculo_conductor WHERE conductor_id = @count_veh_con) as SUMA"; cmd.Parameters.Add("@count_veh", SqlDbType.Int); cmd.Parameters["@count_veh"].Value = conductor_idTextBox.Text; cmd.Parameters.Add("@count_veh_con", SqlDbType.Int); cmd.Parameters["@count_veh_con"].Value = Convert.ToInt32(conductor_idTextBox.Text); int iCount_vehiculo = (int)cmd.ExecuteScalar(); string sConductorAnterior = ""; if (iCount_vehiculo >= 10) { /* * * Lee el conductor de este vehículo en la base de datos porque se puede dar el caso de que * * otro usuario cambie el registro mientras se esta editando. * */ cmd.Parameters.Clear(); cmd.CommandText = "SELECT conductor_id FROM vehiculo WHERE vehiculo_id = @veh_id"; cmd.Parameters.Add("@veh_id", SqlDbType.Int); cmd.Parameters["@veh_id"].Value = Convert.ToInt32(vehiculo_idTextBox.Text); SqlDataReader reader = cmd.ExecuteReader(); try { if (reader.HasRows) { while (reader.Read()) { sConductorAnterior = reader.GetInt32(0).ToString(); } } reader.Close(); } catch (Exception ex) { // Hay que cerrar reader si occurre una excepción y está abierto. reader.Close(); throw new Exception(ex.Message); } if (sConductorAnterior != conductor_idTextBox.Text) { transaction.Rollback(); MessageBox.Show($"{CbConductorHabitual.Text}" + " ya es conductor habitual de 10 vehículos.", "ERROR: Máximo 10 vehiculos por conductor", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } /* * * Comprueba el número de vehiculos de cada conductor habitual de la list view * */ foreach (ListViewItem lvi in LvConductoresHabituales.Items) { cmd.Parameters.Clear(); cmd.CommandText = "SELECT (SELECT COUNT(*) FROM vehiculo WHERE conductor_id = @count_veh)" + " + (SELECT COUNT(*) FROM vehiculo_conductor WHERE conductor_id = @count_veh_con) as SUMA"; cmd.Parameters.Add("@count_veh", SqlDbType.Int); cmd.Parameters["@count_veh"].Value = Convert.ToInt32(lvi.Text); cmd.Parameters.Add("@count_veh_con", SqlDbType.Int); cmd.Parameters["@count_veh_con"].Value = Convert.ToInt32(lvi.Text); int iCount_vehiculo_conductor = (int)cmd.ExecuteScalar(); if ((iCount_vehiculo_conductor) >= 10) { transaction.Rollback(); MessageBox.Show($"{lvi.SubItems[1].Text} ya es conductor" + " habitual de 10 vehículos.", "ERROR: Máximo 10 vehiculos por conductor", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } /* * * Borro la lista de conductores añadidos en la list view * */ cmd.Parameters.Clear(); cmd.CommandText = "SELECT COUNT(*) FROM vehiculo_conductor WHERE vehiculo_id = @veh_id"; cmd.Parameters.Add("@veh_id", SqlDbType.Int); cmd.Parameters["@veh_id"].Value = Convert.ToInt32(vehiculo_idTextBox.Text); int iCount_vehiculo_conductor_vehiculo = (int)cmd.ExecuteScalar(); if (iCount_vehiculo_conductor_vehiculo > 0) { cmd.Parameters.Clear(); cmd.CommandText = "DELETE FROM vehiculo_conductor WHERE vehiculo_id = @veh_id"; cmd.Parameters.Add("@veh_id", SqlDbType.Int); cmd.Parameters["@veh_id"].Value = Convert.ToInt32(vehiculo_idTextBox.Text); int iCount_vehiculo_conductor_vehiculo_borrados = (int)cmd.ExecuteNonQuery(); if (iCount_vehiculo_conductor_vehiculo != iCount_vehiculo_conductor_vehiculo_borrados) { transaction.Rollback(); MessageBox.Show($"Solo han borrado {iCount_vehiculo_conductor_vehiculo_borrados} " + "conductores habituales de {iCount_vehiculo_conductor_vehiculo}", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } this.Validate(); this.vehiculoBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.dGTdbDataSet); /* * * Ahora añade los conductores habituales de la list view * */ foreach (ListViewItem lvi in LvConductoresHabituales.Items) { cmd.Parameters.Clear(); cmd.CommandText = "INSERT INTO vehiculo_conductor (vehiculo_id, conductor_id)" + " VALUES (@vehiculo_id, @conductor_id)"; cmd.Parameters.Add("@vehiculo_id", SqlDbType.Int); cmd.Parameters["@vehiculo_id"].Value = Convert.ToInt32(vehiculo_idTextBox.Text); cmd.Parameters.Add("@conductor_id", SqlDbType.Int); cmd.Parameters["@conductor_id"].Value = Convert.ToInt32(lvi.SubItems[0].Text); cmd.ExecuteNonQuery(); } transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error); } }