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)
-   -   Problema con un generador (https://www.clubdelphi.com/foros/showthread.php?t=88792)

Angel.Matilla 31-07-2015 12:30:52

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?

Angel.Matilla 31-07-2015 12:39:27

No he dicho nada. Estaba definiendo mal el TIBStoredProc. :o:o:o

ecfisa 31-07-2015 23:35:50

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 :)

Angel.Matilla 01-08-2015 10:31:19

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?


La franja horaria es GMT +2. Ahora son las 10:03:43.

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