Cuando estás añadiendo o modificando un registro de una tabla no debes provocar que el cursor se mueva del registro, que es lo que pasa cuando haces un FindKey: El registro actual que estás insertando se posteará automáticamente y siempre te dará que existe... claro, acabas de grabarlo...
Lo más rápido, sin entrar en validaciones a nivel de registros y etc, es que antes de lanzar tu MD.tbCompra.Post, hagas la búsqueda en otra tabla que contenga el mismo conjunto de datos, es decir, haz el FindKey sobre TbBuscaCompra (por ejemplo) que debe apuntar a la misma tabla de compras:
Código:
// OnClick del Boton Grabar
// Comprobamos que estoy en insercción, pues si estoy modificando un
// registro y es lógico e irrefutable que ya exista ;-)
if MD.tbCompra.State = dsInsert then begin
cRut := Md.tbCompra.FieldByName('Rut').AsString;
cTipDoc := Md.tbCompra.FieldByName('TipDoc').AsString;
nDoc := Md.tbCompra.FieldByName('NumDoc').AsInteger;
Md.tbBuscaCompra.Open; // abro justo antes de buscar
Md.tbBuscaCompra.IndexName:='CompCom';
If MD.tbBuscaCompra.FindKey([cRut,cTipDoc,nDoc]) THEN begin
ShowMessage('El registro ya existe');
end else begin
MD.tbCompra.Post;
ShowMessage('Registro grabado');
end;
md.tbBuscaCompra.Close;
end else begin
MD.tbCompra.Post;
// Se supone que si estamos modificando no se han modificado los
// campos claves.
end;
He reutilizado lo que has escrito, espero que te sirva.