Forum > Databases

[RISOLTO] Eccezione non gestita

(1/2) > >>

sanric:
Salve a tutti,

chiedo scusa per la banalità della domanda ma sono un 'niubbo' alle prime armi con Lazarus/FPC.
In una dbGrid che mostra solo il codice cliente e la sua anagrafica, provo appositamente a modificare il valore del codice rendendolo uguale a quello di un altro cliente. Chiaramente tale codice è UNIVOCO per definizione e la mia routine deve generare un'eccezione che provo a gestire.
Tuttavia non riesco nell'intento:


--- Codice: ---
procedure TmainWind.aggiornaClienti(Sender: TObject);
begin
 
     if SQLTrans.Active then  // Controllo che la transaction sia attiva
        try
          SQLQuery.ApplyUpdates();  // Questa procedura non dovrebbe andare a buon fine...
        except
          on E: ESQLDatabaseError do  // ... sollevando questa eccezione che tuttavia non riesco ad intercettare
          begin
             ShowMessage(E.Message);
             Exit();
          end;
        end;
end;
--- Termina codice ---

Convinto che mi sto perdendo in un bicchiere d'acqua, vi chiedo se potete farmi capire meglio dove sbaglio.
Grazie mille per tutti gli aiuti!

slapshot:

--- Citazione ---Chiaramente tale codice è UNIVOCO per definizione e la mia routine deve generare un'eccezione che provo a gestire.
--- Termina citazione ---

Ciao, credo che in ciò che affermi ci sia un errore concettuale. Se il codice è univoco non dovrebbe esserci la possibilità per l'operatore di modificare tale codice. La chiave primaria di una tabella di un db sql non può essere violata e l'eccezione (ma qui attendo la smentita dei più esperti) è gestita nel componente di accesso al db che la intercetta e la manifesta.

sanric:
Comprendo che ci sia un errore concettuale ma la mia piccola applicazione è costruita per imparare ad usare il linguaggio ed il suo ecosistema, non certo per un utilizzo professionale.
Mi sono dimenticato di specificarlo.  ;D

slapshot:
Siamo tutti principianti, non ti preoccupare. Io per primo LOL :D

Allora se hai un id univoco nella tabella che identifica un record univocamente, questo deve essere, generalmente, un campo che ha poco senso per l'utente e prevalentemente nascosto. Per cui un campo di autoincremento, un GUID ecc..

Se la modifica che devi effettuare è necessariamente su una dbgrid potresti usare l'evento ondbediting. Ho interrogato al volo chatgpt, verifica se quanto scrive è corretto:
----------------------------------
Per gestire la modifica di un campo in una DBGrid in Free Pascal Lazarus per impedire all'utente di inserire un codice che è già presente in altre righe della tabella del database, puoi utilizzare l'evento OnEditingDone della DBGrid. In questo evento, puoi controllare se il valore inserito dall'utente esiste già nel database e, in caso affermativo, annullare la modifica o mostrare un messaggio di avviso.

Ecco un esempio di codice che mostra come gestire questa situazione:


--- Codice: ---
procedure TForm1.DBGrid1EditingDone(Sender: TObject);
var
  FieldValue: string;
  i: Integer;
begin
  // Otteniamo il valore modificato dalla colonna specifica
  FieldValue := DBGrid1.DataSource.DataSet.FieldByName('NomeCampo').AsString;

  // Controlliamo se il valore è già presente in altre righe della tabella
  for i := 0 to DBGrid1.DataSource.DataSet.RecordCount - 1 do
  begin
    // Saltiamo la riga attualmente modificata
    if i <> DBGrid1.DataSource.DataSet.RecNo - 1 then
    begin
      // Se troviamo un valore uguale, avvisiamo l'utente e annulliamo la modifica
      if DBGrid1.DataSource.DataSet.FieldByName('NomeCampo').AsString = FieldValue then
      begin
        ShowMessage('Il valore inserito è già presente nella tabella.');
        DBGrid1.DataSource.DataSet.Cancel;
        Exit;
      end;
    end;

    // Passiamo alla riga successiva
    DBGrid1.DataSource.DataSet.Next;
  end;

  // Riportiamo il cursore alla riga modificata
  DBGrid1.DataSource.DataSet.First;
  DBGrid1.DataSource.DataSet.MoveBy(DBGrid1.DataSource.DataSet.RecNo - 1);
end;
--- Termina codice ---

Assicurati di adattare il codice sostituendo 'NomeCampo' con il nome del campo effettivo della tabella che desideri controllare. Questo codice controlla se il valore inserito è già presente in altre righe della tabella e, in caso affermativo, annulla la modifica e avvisa l'utente.

sanric:
Grazie mille slapshot per la routine che provvederò a controllare ed implementare quanto prima.
Tuttavia la domanda resta: perché non riesco a gestire l'eccezione che il programma solleva?
In quello scampolo di codice che ho mandato dove si annida l'errore?

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa