Pues sobre las llaves no te sabria decir como es el modelo de tu base de datos, aunque me asalta una duda, porq autonumerico si no quieres que se repita???
No se con el motor que tu utilizas con el BDE funciona asi
Código Delphi
[-]
try
Dataset.Post;
except
on E: EDBEngineError do
begin
ErrorCode := E.Errors[0].ErrorCode;
case ErrorCode of
DBIERR_SYSFILEOPEN,
DBIERR_SYSFILEIO,
DBIERR_SYSCORRUPT,
DBIERR_NOCONFIGFILE,
DBIERR_CFGCANNOTWRITE,
DBIERR_CFGMULTIFILE,
DBIERR_REENTERED,
DBIERR_CANTFINDIDAPI,
DBIERR_CANTLOADIDAPI,
DBIERR_CANTLOADLIBRARY,
DBIERR_TEMPFILEERR,
DBIERR_MULTIPLEIDAPI,
DBIERR_SHAREDMEMCONFLICT:
msgError( msErrorSistema + NT );
DBIERR_LOCKED,
DBIERR_UNLOCKFAILED,
DBIERR_FILEBUSY,
DBIERR_DIRBUSY,
DBIERR_FILELOCKED,
DBIERR_DIRLOCKED,
DBIERR_ALREADYLOCKED,
DBIERR_NOTLOCKED,
DBIERR_LOCKTIMEOUT,
DBIERR_GROUPLOCKED,
DBIERR_LOSTTBLLOCK,
DBIERR_LOSTEXCLACCESS,
DBIERR_NEEDEXCLACCESS,
DBIERR_RECGROUPCONFLICT,
DBIERR_DEADLOCK,
DBIERR_ACTIVETRAN,
DBIERR_NOACTIVETRAN,
DBIERR_RECLOCKFAILED,
DBIERR_OPTRECLOCKFAILED,
DBIERR_OPTRECLOCKRECDEL,
DBIERR_ENLISTFAILED,
DBIERR_NETFILELOCKED,
DBIERR_NETMULTIPLE:
msgError( msTablaBloqueada + NT );
DBIERR_WRITEERR: msgError(msErrordeEscritura + NT);
DBIERR_FILECORRUPT: msgError(msTablaCorrupta + NT);
DBIERR_INDEXCORRUPT: msgError(msIndiceCorrupto + NT);
DBIERR_READERR: msgError(msErrordeLectura + NT);
DBIERR_DIRNOACCESS: msgError(msSinAccesoaDirectorio + NT);
DBIERR_FILENOACCESS: msgError(msSinAccesoaArchivo + NT);
DBIERR_NOMEMORY: msgError(msSinMemoria + NT);
DBIERR_OPENTBLLIMIT: msgError(msMuchasTablasAbiertas + NT);
DBIERR_NOSHAREDMEMORY: msgError(msSinMemoriaCompartida + NT);
DBIERR_INVALIDFILENAME: msgError(msNombreArchivoIncorrecto + NT);
DBIERR_NOSUCHINDEX: msgError(msNombreIndiceIncorrecto + NT);
DBIERR_KEYVIOL: msgError(msRegistroDuplicado + ' ' + NT);
DBIERR_FIELDISBLANK: msgError(msCampoenBlanco + ' ' + NT);
DBIERR_READONLYDIR: msgError(msDirectorioSoloLectura + ' ' + NT);
DBIERR_READONLYFLD: msgError(msCampoSoloLectura + ' ' + NT);
else msgError(msErrorDesconocido + E.Message);
end;
Result := False;
end;
end;
Seria cuestion de adaptarlo al motor