Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-10-2011
Avatar de edgwin
edgwin edgwin is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guadalajara Jal. Mex
Posts: 163
Poder: 19
edgwin Va por buen camino
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)
Responder Con Cita
  #2  
Antiguo 22-10-2011
Avatar de edgwin
edgwin edgwin is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guadalajara Jal. Mex
Posts: 163
Poder: 19
edgwin Va por buen camino
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
  #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
Poder: 21
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
  #4  
Antiguo 31-10-2011
Avatar de edgwin
edgwin edgwin is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guadalajara Jal. Mex
Posts: 163
Poder: 19
edgwin Va por buen camino
Muchas gracias, creeme que me di cuenta de ese error, jajajaja!

Saludos!
Responder Con Cita
  #5  
Antiguo 01-11-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
Poder: 21
salvica Va por buen camino
Hola edgwin, buenas noches
Cita:
Empezado por edgwin Ver Mensaje
Muchas gracias, creeme que me di cuenta de ese error, jajajaja!

Saludos!
Solo es una pregunta ¿Para qué utilizas la variable Suma?

Saludos
salvica
Responder Con Cita
  #6  
Antiguo 01-11-2011
Avatar de edgwin
edgwin edgwin is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guadalajara Jal. Mex
Posts: 163
Poder: 19
edgwin Va por buen camino
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!
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Menor tiempo de Ejecucion para una funcion Informix pelacuaz Conexión con bases de datos 4 01-04-2009 23:54:40
campo autoinc teclilla Tablas planas 3 14-06-2008 02:10:52
Utileria para Informix cacuna Varios 2 19-08-2006 01:21:59
Firebird : Llamado para probadores de Firebird 2.0 JOSEPE Firebird e Interbase 0 12-03-2005 20:33:18
Migrar de Informix a FireBird 1.5 injavies Firebird e Interbase 13 30-03-2004 19:32:27


La franja horaria es GMT +2. Ahora son las 07:28:57.


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