Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

A pesar de la excepción, el registro se graba

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: A pesar de la excepción, el registro se graba Responder citando

Con C++ Builde 6. Tengo una tabla en FB 2.5 con esta estructura:
Código:
CREATE TABLE Bancos (Codigo VARCHAR(4) NOT NULL, Nombre VARCHAR(65), Bic VARCHAR(11), CONSTRAINT PK_Bancos PRIMARY KEY (Codigo))

E inserto los datos por ejemplo así:
Código:
Query->Close();
Query->SQL->Text = "INSERT INTO Bancos (Codigo, Nombre, Bic) VALUES (:Codigo, :Nombre, :Bic)";
Query->ParamByName("Codigo")->AsString = "003";
Query->ParamByName("Nombre")->AsString = "BANCO DE DEPOSITOS";
Query->ParamByName("Bic")->AsString = "BDEPESM1XXX";
Query->ExecSQL();

El campo Codigo necesariamente tiene que tener cuatro posiciones. Para controlarlo he definido un trigger y una excepción así:
Código:
CREATE EXCEPTION CodBan_erroneo 'El código de entidad es incorrecto. Verifíquelo.';

SET TERM ^ ;

CREATE TRIGGER BANCO_VERIFICA FOR BANCOS
ACTIVE BEFORE INSERT OR UPDATE
POSITION 0
AS
BEGIN
  IF (INSERTING AND CHAR_LENGTH(TRIM(NEW.Codigo)) <> 4) THEN
    EXCEPTION CodBan_erroneo;
    WHEN GDSCODE except DO BEGIN
    END
END ^
SET TERM ; ^

Tengo también definido una función de gestión de errores. Al ejecutarse el query con esos datos lógicamente salta la excepción porque al código le falta una carácter.

    1. Si no pongo la claúsula WHEN salta el gestor de errores, el registro no se graba y se detiene la ejecución del programa.
    2. Si pongo la claúsula WHEN como está ahí ni salta el gestor de errores ni se detiene la ejecución y le registro sí se graba.

Por más documentación que he leído no veo como "combinar" las dos cosas; es decir: que salte la excepción, que no se grabe el registro erróneo y que continúe la ejecución del programa.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Esto tendras que hacerlo ya desde el programa que ejecuta la sentencia SQL, si te da una excepcion controlarla y continuar con el bucle.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

A veces no es necesario programarlo en la base de datos, puedes generarlo del lado del cliente, usando una función como esta.

Código:

enum TccsgLados { ccLeft, ccRight};


String __fastcall Rellena(String Cadena,char Caracter,int ancho, enum TccsgLados Valor)
{
   String Resultado = "\0";
   int blancos = ancho - Cadena.Trim().Length();
   String ccsgCadena="\0";
   for(  int  i = 0;  i < blancos ; i++)
   {
     Application->ProcessMessages();
     ccsgCadena += Caracter;
   }
   if(Valor == (TccsgLados) ccLeft)
      Resultado = ccsgCadena + Cadena.Trim();
   if(Valor == (TccsgLados) ccRight)
      Resultado = Cadena.Trim() + ccsgCadena ;
   return( this->Resultado);
}


y para usarla

Código:

String Codigo = Rellena("3",'0',4,ccLeft);  ==> "0003"
String Codigo = Rellena("3",'0',4,ccRight);  ==> "3000"


Saludos!!
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.