Hola,
Yo también creo que lo mejor es tener un tabla de contadores separado para esta situación y para ejecutarlo podrias crear un stored procedure que haria todo el proceso en una sola llamada (sin transacciones):
Código SQL
[-]
CREATE PROCEDURE [dbo].[ReservarCodigoAsiento]
@Anyo int,
@NumeroAsiento int OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET @NumeroAsiento = -1;
UPDATE ContadorAsientos
SET @NumeroAsiento = Contador = Contador + 1
FROM ContadorAsientos C
WHERE C.Anyo = @Anyo
if @NumeroAsiento = -1
BEGIN
-- No existe contador para este año, lo creo
SET @NumeroAsiento = 1
INSERT INTO Contadores Values(@Anyo, @NumeroAsiento)
END
INSERT INTO TABLA (CODIGO, CODIGO_LINEA, ANYO, OTROS CAMPOS ....)
VALUES(@NumeroAsiento, 0, @Anyo, ...)
END
y desde Delphi podrias hacer una llamada al store procedure parecido a esto
Código Delphi
[-]
var Anyo: Integer := YearOf(Date);
StoredProc.StoredProcName := 'ReservarCodigoAsiento';
StoredProc.Params(ftInteger, -1, ptInput);
StoredProc.Params(ftInteger, -1, ptOutput);
StoredProc.Params[0].AsInteger := Anyo;
StoredProc.ExecProc;
var NumeroAsiento: Integer := StoredProc.Params[1].asInteger;