Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   JvUIB..! Consulta sobre un problemita..! (https://www.clubdelphi.com/foros/showthread.php?t=49239)

CrystalBlood 16-10-2007 22:54:15

JvUIB..! Consulta sobre un problemita..!
 
JvUIB: Alguien tiene idea de como usar estos componentes? (UIB = Unified Interbase)

Hice una clase (TMetadataManager) compuesta de funciones ke permite crear una tabla.. agregar PK y FK, etc(metadata en general) y todos comparten el mismo query y la misma transaccion.. con eso quiero decir ke el query y la transaccion esta definida en el private del UNIT y cada una de las funciones devuelve TRUE si es ke fue exitosa la operacion.. a su vez.. todas las funciones para poder definir su "exito" dependen de una funcion "EjecutarSQL"

un ejemplo:
Código Delphi [-]
function TMetadataManager.CrearFK(NombreTabla, NombreFK, CampoForaneo, TablaReferencia, 
CampoReferencia: string; OnDelete:string = 'NO ACTION'; OnUpdate: string = 'NO ACTION'):boolean;
begin
qManejador.SQL.Clear;
  qManejador.SQL.Add('ALTER TABLE ' + NombreTabla + ' ADD CONSTRAINT ' + NombreFK + 
' FOREIGN KEY (' + CampoForaneo + ') REFERENCES ' + TablaReferencia + 
'(' + CampoReferencia + ') ON DELETE '+ Ondelete + ' ON UPDATE ' + OnUpdate + ';');
Result := EjecutarSQL;
end;

La funcion EjecutarSQL:
Código Delphi [-]
function TMetadataManager.EjecutarSQL: boolean;
var
  E: EUIBException;
  i:integer;
begin
  Result := True;
  FLastFbError := '';
  FLastFbErrorNo := 0;
try
    qManejador.ExecSQL;          //<--- esta es la parte donde desconosco
    qManejador.Close(etmCommit); //como funciona el componente (estoy acostumbrado al IBX en donde se le hacia un OPEN y luego un COMMIT a la   
except                           //TRANS.. en este componente no tengo ideaaa!)
    on E: EUIBException do
begin
      FTrans.RollBack;
      FLastFbError := e.Message;
      FLastFbErrorNo := e.SQLCode;
      Result := False;
    end
end; //try
end;

A continuacion la implementacion:
Código Delphi [-]
ManejadorDeTabla.CrearFK(NombreTablaFormateada,'FK_HISTORICO_ID' + CodigoDeLaSeccion, 
'HISTORICO_ID', 'HISTORICO', 'CODIGO_HISTORICO');


Esa es justamente la funcion que me esta dando problema.. (crear clave foranea)
bueno.. se crea una TABLA en tiempo de ejecucion (sin problemas) con sus correspondientes campos, luego se fija el PK (sin problemas) pero despues al kerer agregar el FK me da un:

RAISED EXCEPTION Class EUIBerror with message 'unsuccessful metadata update object HISTORICO is in use
This operation is not defined for system tables.
Error code: 31'

y como pueden ver HISTORICO es la tabla de donde se hace la referencia del campo foraneo... intente emular el comportamiento en un proyecto aparte sin ningun otro "obstaculo".. y no me dio ningun error.. a lo ke me da a entender de que existe algun conflicto con otra transaccion PERO ya intente de todoooo no le veo el conflicto en ningun lado.. y de repente funciona como de repente no.. justamente por alguna transaccion que quedo flotando..
inclusive durante la ejecucion entre en la tabla del sistema RDB$TRANSACTIONS para ver si hay transacciones pendientes y nada..

y c
omo siempre no hay NINGUNA DOCUMENTACION y solo ejemplos ambiguos..

concluyo ke es simplemente la mala utilizacion del componente.. por que estoy acostumbrado a otra forma de aplicar las sentensias y no como este componente que acepta parametros en su OPEN y en su CLOSE
del query ..

otra curiosidad es ke navegando entre las clases del componente encontre una clase donde maneja METADATA exclusivamente.. pero el codigo es muy dificil de entender.. alguien conoce esa zona oscura del componente..? porke me parece que estoy reinventando la rueda con mi funcion siendo que ya existe una clase exclusiva para el hecho... alguna idea ?

leyendo en la web pude enterarme de que es uno de los mas rapidos y completos.. en freeware y opensource.. pero bastante complicado de usar..

si alguien usa este componente por favor que den alguna señal de vida..!


CrystalBlood 17-10-2007 19:54:55

alguna alma con piedad?

CrystalBlood 20-10-2007 15:30:03

bueno.. cuando uno desea agregar campos a una tabla o crear una tabla no influye las cantidades de conexiones ke tienen a una base de datos.. pero aparentemente cuando se crea el foreign key solo debe haber una conexion activa.. ese era el problema.. ¬¬


La franja horaria es GMT +2. Ahora son las 03:53:13.

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