Hola de nuevo Cali, si ingresas directamente los datos en el DBGrid, tienes que hacer muchos controles. El evento que debes utilizar es el OnBeforePost del CLientDataSet, que se da antes de hacer el Post, pero si pones el Locate o el recorrido de la tabla sobre ese ClientDataSet dentro de ese evento, vas a tener problemas, como no se ha hecho el Post todavía va entrar en un ciclo hasta que te de un mensaje de Stack Overflow. Lo que se me ocurre para solucionar eso, es que hagas un clon de tu ClientDataset y hacer la busqueda ahí, tu codigo quedaría así:
Código Delphi
[-]
procedure TForm1.ClientDataSet1BeforePost(DataSet: TDataSet);
var
ClientDataSetAux : TClientDataSet;
begin
Try
ClientDataSetAux := TClientDataSet.Create(Nil);
//Clonamos el ClientDataSet
ClientDataSetAux.CloneCursor(ClientDataSet1, True);
if dataSet.State = dsInsert then
if ClientDataSetAux.Locate('campo', DataSet.fieldbyname('campo').AsString, [loCaseInsensitive]) then
begin
//En este ejemplo estamos cancelando el insert
DataSet.Cancel;
Abort;
end;
Finally
FreeAndNil(ClientDataSetAux);
end;
end;
Para que insertes al final utiliza ClientDataSet1.Append
Saluditos