Hola
edgwin, buenas tardes. La función tiene un problema de concepto

, me explico.
Supón una tabla con 10 registros.
- Eliminamos cuatro
- LLamamos a tu función, con SUMA = CERO
- CUENTA devuelve seis
- Siguiente número vale SIETE (probablemente ya ha sido utilizado, por lo que existirá)
Deberías utilizar MAX en vez de COUNT, para que devuelva el MAYOR valor de CODI
Código Delphi
[-]
function fncSiguNume:Integer;
var
vValoReto : Integer;
begin
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select MAX(codi) as Cuenta from tabla');
Query1.Open;
if Query1.IsEmpty then
vValoReto := 0
else
vValoReto := Query1.FieldByName('Cuenta').AsInteger;
Query1.Close;
Result := vValoReto + 1
end;
Cita:
Empezado por edgwin
Bueno me respondo a mi mismo. Si alguien sabe como optimizar esta funcion, es bienvenida.
Saludos
Código Delphi [-]function fncSiguNume(suma : Integer = 0):Integer;
var
vValoReto : Integer;
begin
//
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('select count(codi) as Cuenta from tabla');
Query1.Open;
Query1.First;
vValoReto := Query1.FieldByName('Cuenta').AsInteger + suma;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(format('select count(codi) as Cuenta from tabla where codi = %s',[IntToStr(vValoReto)]));
Query1.Open;
if Query1.FieldByName('Cuenta').AsInteger > 0 then
vValoReto := fncSiguNume(suma+1);
Result := vValoReto;
end;
|