Creare un gestionale per strutture ricettive in C# – 22 – Correzione Query: Correzione dei problemi della query e del form per le prenotazioni.
In questa lezione andremo a correggere i problemi lasciati in sospeso nella precedente lezione.
Andremo quindi ad inserire correttamente le date, il prezzo finale e l’apostrofo.
Correggeremo inoltre il caricamento delle camere ad ogni apertura della scheda Dati Prenotazione, e l’errato calcolo del prezzo totale che in alcuni casi mostrava 4 numeri decimali invece di 2.
Creare un gestionale per strutture ricettive in C# – 22 – Correzione Query
Iniziamo dal bug del caricamento delle camere, che non è strettamente collegato alla query.
Infatti questo bug si presenta quando apriamo la scheda “Dati Prenotazione” selezioniamo la camera, poi cambiando scheda ritorniamo alla scheda “Dati Prenotazione” e la camera selezionata viene resettata.
Questo succede perchè abbiamo impostato il caricamento dell’elenco delle camere all’apertura della scheda.
Per risolverlo possiamo scegliere una di queste 2 soluzioni:
- Spostare il caricamento delle camere al click del tasto “Aggiungi Prenotazione”
- Aggiungere un If che verifica che siano già presenti delle camere nell’elenco
La scelta che ho adottato è la seconda, quindi il codice dell’evento Enter della scheda Dati Prenotazione diventa:
if (cmbCamera.Items.Count == 0)
{
CaricaDatabaseCamere();
}
In questo modo vengono ricaricate le camere solo se non ci sono elementi presenti nella Combobox.
Fix bug delle date
Passiamo ora al bug delle date, per risolvere questo bug andremo a creare una nuova funzione che prendendo in Input anno, mese e giorno, andrà a creare una stringa preformattata per il database.
String ConvertiData(int AnnoInput, int MeseInput, int GiornoInput)
{
String DataFinale = AnnoInput + "/" + MeseInput + "/" + GiornoInput;
return DataFinale;
}
Basterà poi scrivere:
ConvertiData(datePartenza.Value.Year, datePartenza.Value.Month, datePartenza.Value.Day);
Per inviare i dati corretti alla funzione.
Fix bug apostrofo
Il problema dell’uso dell’apostrofo è un dei più comuni quando si inviano dei dati ad un database.
Infatti il simbolo del singolo apice viene utilizzato per delimitare le stringhe, e inserendolo all’interno di una stringa va a spezzarne il contenuto.
Per questo motivo dovremo andare a creare una funzione che, trovando un singolo apice all’interno di una stringa lo converte in due singoli apici.
E’ importante ricordare che la conversione deve essere fatta in 2 singoli apici ” e non in un doppio apice “.
La funzione quindi sarà:
String CorreggiApici(string StringaDaControllare)
{
string StringaCorretta = StringaDaControllare.Replace("'", "''");
StringaCorretta = StringaCorretta.Trim();
return StringaCorretta;
}
Ho aggiunto alla funzione anche il comando Trim, che rimuove eventuali spazi ad inizio e fine stringa.
Fix bug prezzo
Il bug del prezzo è quello che richiede maggiori modifiche.
Infatti prima di preparare il prezzo per il caricamento nel database, dovremo assicurarci che venga visualizzato correttamente nella TextBox.
Non dovranno essere presenti 4 valori decimali ma solo 2.
Quindi la prima correzione da fare riguarda il tasto “Aggiorna Prezzo”, la parte finale diventerà:
//TOTALE
decimal PrezzoFinaleDecimale = PrezzoCameraTotale + TotaleCostiExtra - TotaleScontiExtra + TotaleTasseSoggiorno;
PrezzoFinaleDecimale = Decimal.Round(PrezzoFinaleDecimale, 2);
PrezzoFinale = Convert.ToString(PrezzoFinaleDecimale);
return PrezzoFinale;
Andremo quindi ad arrotondare il prezzo finale con 2 numeri decimali e poi lo convertiremo in stringa per mostrarlo nella TextBox.
Fatto ciò, possiamo creare la funzione che andrà a verificare il contenuto della TextBox per inviarlo alla query.
string ConvertiPrezzoFinale(TextBox TextInput)
{
if (System.Text.RegularExpressions.Regex.Match(TextInput.Text, @"^[0-9,.€]*$").Success is true)
{
if (TextInput.Text.Contains("€"))
{
TextInput.Text = TextInput.Text.Replace("€", "");
}
if (TextInput.Text.Contains(","))
{
TextInput.Text = TextInput.Text.Replace(",", ".");
}
}
string PrezzoFinale = TextInput.Text;
return PrezzoFinale;
}
Andiamo a rimuovere un eventuale simbolo dell’euro e andiamo a convertire la virgola in punto.
In seguito a queste modifiche la query finale sarà:
string sqlQuery = "";
if (btnAggiungi.Tag.ToString() == "aggiungi")
{
sqlQuery = "INSERT INTO [Prenotazioni] ([Id], [Nome], [Cognome], [Indirizzo], [Citta], [CAP], [Nazione], [DataNascita],"+
"[Nazionalita], [Telefono], [Email], [TipoDocumento], [CodiceDocumento], [Documento],"+
" [DataArrivo], [DataPartenza], [NumeroNotti], [NumeroOspiti], [Camera], [Note], [CostiExtra], [Sconti],"+
"[TasseSoggiorno], [MotivoEsenzione], [MetodoPagamento], [Totale]) VALUES ('" + IdCliente
+ "', '" + CorreggiApici(txtNome.Text) + "', '" + CorreggiApici(txtCognome.Text) + "','" + CorreggiApici(txtIndirizzo.Text) + "','" + CorreggiApici(txtCitta.Text)
+ "','" + txtCap.Text + "','" + CorreggiApici(cmbNazione.Text) + "','" + ConvertiData(dateNascita.Value.Year, dateNascita.Value.Month, dateNascita.Value.Day) + "','" + CorreggiApici(cmbNazionalita.Text) +
"','" + txtTelefono.Text + "','" + txtEmail.Text + "','" + CorreggiApici(cmbTipoDocumento.Text) + "','" +
txtCodiceDocumento.Text + "','" + txtCaricaDocumento.Text + "','" + ConvertiData(dateArrivo.Value.Year, dateArrivo.Value.Month, dateArrivo.Value.Day) + "','" +
ConvertiData(datePartenza.Value.Year, datePartenza.Value.Month, datePartenza.Value.Day) + "','" + numNotti.Value + "','" + numOspiti.Value + "','" + CorreggiApici(cmbCamera.Text) + "','" + CorreggiApici(txtNote.Text) +
"','" + CorreggiApici(StringaCostiExtra) + "','" + CorreggiApici(StringaScontiExtra) + "','" + SwitchTasseSoggiorno + "','" + CorreggiApici(txtMotivoEsenzione.Text) +
"','" + cmbMetodoPagamento.Text + "','" + ConvertiPrezzoFinale(txtTotale) + "')";
}
Nel seguente video il tutorial completo.