 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Mar 17 Nov, 2015 6:13 pm Asunto: A pesar de la excepción, el registro se graba |
|
|
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 |
|
 |
Bitman Lt

Registrado: 30 Mar 2004Mensajes: 80
|
Publicado: Sab 28 Nov, 2015 5:29 pm Asunto: |
|
|
| 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 |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 15 Dic, 2015 10:02 pm Asunto: |
|
|
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!! _________________
 |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|