Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   AutoInc para Firebird y para Informix (https://www.clubdelphi.com/foros/showthread.php?t=76305)

edgwin 22-10-2011 17:11:40

AutoInc para Firebird y para Informix
 
Espero me puedan echar la mano, ya que traigo seco el cerebro (no me fluyen las ideas).

Estoy trabajando con Delphi 2010, Firebird/Informix como BD. Estoy haciendo una pantalla de captura en la cual, existe un campo de "codigo", este campo el usuario lo puede teclear, pero el sistema debe sugerir un autoincrementable.

Es facil si estuviera pensado solo para firebird o para informix, pero debo hacerlos para que en ambas DB funcione. A mi se me ocurria que el codigo fuera en el programa y no a nivel de Base de Datos (para que sirva en ambas DBs)

Alguna idea!?

PD. Debo utilizar BDE (por cuestiones de la empresa)

edgwin 22-10-2011 18:00:44

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;

salvica 30-10-2011 19:39:17

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 (Mensaje 416482)
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;


edgwin 31-10-2011 17:15:31

Muchas gracias, creeme que me di cuenta de ese error, jajajaja!

Saludos!

salvica 01-11-2011 22:42:19

Hola edgwin, buenas noches
Cita:

Empezado por edgwin (Mensaje 417187)
Muchas gracias, creeme que me di cuenta de ese error, jajajaja!

Saludos!

Solo es una pregunta :) ¿Para qué utilizas la variable Suma?

Saludos
salvica

edgwin 01-11-2011 23:55:13

Bueno la idea original era la de que podias mandar llamar la funcion sin parametro (y solo te regresaba el ID actual) y si lo llamabas con un numero, te regresaba el id actual + el numero

Saludos!


La franja horaria es GMT +2. Ahora son las 20:35:27.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi