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 31-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Problema con un generador

Estoy trabajando con FB 2.5. En una tabla tengo definidos un procedimeinto y un generador de la siguiente forma:

Código:
IbSql->Close();
IbSql->SQL->Text = "CREATE GENERATOR Id_poblacion";
try
{
     IbSql->ExecQuery();
     Query->Transaction->Commit();
}
catch(Exception *Exc)
{
     Query->Transaction->Rollback();
}

IbSql->Close();
IbSql->SQL->Text = "CREATE PROCEDURE Gen_poblacion RETURNS (Codigo INTEGER) AS BEGIN Codigo = GEN_ID(Id_poblacion, 1); END";
try
{
     IbSql->ExecQuery();
     Query->Transaction->Commit();
}
catch(Exception *Exc)
{
     Query->Transaction->Rollback();
}
Al cargar la tabla sobre la que trabaja actualizo el valor del generador así:

Código:
Query->Close();
Query->SQL->Text = "SELECT MAX(Codigo) Codigo FROM Poblacion";
Query->Open();

if (!Query->Transaction->InTransaction)
     Query->Transaction->StartTransaction();

IbSql->Close();
IbSql->SQL->Text = "SET GENERATOR Id_poblacion TO " + FormatFloat("0", Query->FieldByName("Codigo")->AsInteger);
try
{
     IbSql->ExecQuery();
     Query->Transaction->Commit();
}
catch(Exception *Exc)
{
     Query->Transaction->Rollback();
}
Esto me deja un valor, correcto, en el mismo de 58657. Sin embargo si trato de obtener el nuevo valor para una ficha nueva, al ejecutar el TIBStoredProc así:
Código:
spPoblacion->Close();
spPoblacion->UnPrepare();
spPoblacion->Prepare();
spPoblacion->ExecProc();
Poblacion->Tag = spPoblacion->ParamByName("Codigo")->Value;
El valor que me devuelve es el 22779, 22780, etc. en vez de 58658 como debiera ser. Y me tiene total. ¿Alguna idea de que puede estar pasando?
Responder Con Cita
  #2  
Antiguo 31-07-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
No he dicho nada. Estaba definiendo mal el TIBStoredProc.
Responder Con Cita
  #3  
Antiguo 31-07-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Angel.

Solo una sugerencia para no redundar el código del TIBSQL:
Código PHP:
void execIBSQL(TIBSQL *isqString strSQL
{
  if (!
isq->Transaction->InTransaction)
    
isq->Transaction->StartTransaction();

  
isq->SQL->Text strSQL;
  try {
    
isq->ExecQuery();
    
isq->Transaction->Commit();
  } catch(...) {
    
isq->Transaction->Rollback();
  }
}

...
{
   
TIBQuery *qy static_cast<TIBQuery*>(IBQuery1);

  
qy->Close();
  
qy->SQL->Clear();
  
qy->SQL->Add("SELECT RDB$GENERATOR_ID FROM RDB$GENERATORS");
  
qy->SQL->Add("WHERE RDB$GENERATOR_NAME = :GEN");
  
qy->ParamByName("GEN")->AsString "G_POBLACION";
  
qy->Open();

  if (
qy->IsEmpty())
   
execIBSQL(IBSQL1"CREATE SEQUENCE G_POBLACION");

  
qy->Close();
  
qy->SQL->Text "SELECT MAX(CODIGO) AS MAXIMO FROM POBLACION";
  
qy->Open();

  
execIBSQL(IBSQL1String("ALTER SEQUENCE G_POBLACION RESTART WITH ") +
    
qy->FieldByName("MAXIMO")->AsString);

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #4  
Antiguo 01-08-2015
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.350
Poder: 19
Angel.Matilla Va por buen camino
Gracias por la respuesta ecfisa. El código que pones no lo había visto nunca; me surgen algunas dudas:
Entiendo que el código que pones al final es una función que se llama para crear y actualizar el valor del generador
Código:
{    TIBQuery *qy = static_cast<TIBQuery*>(IBQuery1);
   [...] 
¿Reemplazaría al que uso yo ahora?
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
Resetear generador novaten Conexión con bases de datos 2 08-04-2010 19:15:42
Generador en DBExpress brakaman Conexión con bases de datos 2 27-03-2008 14:58:23
generador de factura megaredoxk Conexión con bases de datos 6 28-11-2007 23:33:31
generador novaten Conexión con bases de datos 1 09-04-2005 21:29:44
Ver un generador Rabata Conexión con bases de datos 4 17-09-2003 15:31:01


La franja horaria es GMT +2. Ahora son las 13:18:34.


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