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:
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;
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!
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:
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;
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.