Ver Mensaje Individual
  #3  
Antiguo 30-10-2011
Avatar de salvica
salvica salvica is offline
Miembro
 
Registrado: mar 2004
Ubicación: Albacete (España) ... En un lugar de la Mancha ...
Posts: 304
Reputación: 23
salvica Va por buen camino
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 Ver Mensaje
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;
Responder Con Cita