Beispiel #1
0
 private void CbConductorHabitual_Leave(object sender, EventArgs e)
 {
     if (CbConductorHabitual.FindStringExact(CbConductorHabitual.Text) == -1)
     {
         LblConductorHabitualEncontrado.Visible = true;
     }
     else
     {
         LblConductorHabitualEncontrado.Visible = false;
     }
 }
Beispiel #2
0
        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);
            }
        }