| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
Laura1971 Cdt

Registrado: 14 Abr 2006Mensajes: 23Ubicación: Santa Fe - Argentina
|
Publicado: Sab 15 Abr, 2006 9:15 am Asunto: Cambiar mensaje de interbase en c++ builder |
|
|
Intento cambiar el texto de los mensajes que envía interbase a mi aplicación cliente al producirse una excepción.Traducirlos a un lenguaje que el usuario final pueda entender.P.e.:"violation of PRIMARY or UNIQUE KEY constraint INTEG_2...." reemplazarlo por "Tipo y nro de doc existentes".
Para ello necesito recuperar los códigos de error de interbase y de sql.He intentado usar EIBError, EIBErrorCode y EIBInterbase error.Pero me da el siguiente error: Undefined symbol ´EIBError´ etc.
Yo pienso que me falta incluir alguna librería.
Alguien puede ayudarme con la sintaxis?
O puede explicarme cómo cambiar los mensajes? (desde mi aplicación y no mediante procedimientos almacenados otriggersen interbase).
Gracias. |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 15 Abr, 2006 11:56 am Asunto: |
|
|
Existen varias maneras, una de ellas se trata en el siguiente post, aun que el codigo usado es Delphi, puede convertirse con un poco de tiempo
a C++ builder
parte 1
http://bdn.borland.com/article/0,1410,28498,00.html
parte 2
http://bdn.borland.com/article/0,1410,28499,00.html
y la otra manera es usando la Excepcion de Interbase EIBInterBaseError de la siguiente manera
en algunos casos, es necesario usar la librerira
en el archivo .cpp
y en la parte donde creas tu form, debe ir algo como esto
| Código: | __fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnException = MiMensage;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::MiMensage(TObject *Sender, Exception *E)
{
//si es una excepcion de interbase
if(E->ClassNameIs("EIBInterBaseError"))
{
// si realmente es de interbase
// tratamos el codigo de error
String MSG;
EIBInterBaseError *ErrorIB = reinterpret_cast<EIBInterBaseError *>(E);
switch(ErrorIB->SQLCode)
{
case -836:
MSG = "Error de interbase";
break;
}
// y mostramos el mensaje.
ShowMessage(MSG);
}
else
{
// si no es de InterBase mostramos el mensaje original, jeje
ShowMessage(E->Message);
}
} |
y dentro del archivo h de tu programa debes declarar la funcion en la parte privada o publica
| Código: | private: // User declarations
void __fastcall MiMensage(TObject *Sender, Exception *E);
public: // User declarations |
Espero te sirva... _________________
 |
|
| Volver arriba |
|
 |
Laura1971 Cdt

Registrado: 14 Abr 2006Mensajes: 23Ubicación: Santa Fe - Argentina
|
Publicado: Dom 16 Abr, 2006 11:48 pm Asunto: Gracias |
|
|
Tu respuesta me fue de gran ayuda!Y agradezco la rapidez de la misma.Saludos.  |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 19 Ene, 2007 1:53 pm Asunto: |
|
|
Una pregunta César: He visto este código que has colgado aquí y estoy adaptándolo a mis necesidades, pero estoy teniendo un problema.
| Código: |
__fastcall TfIniApl::TfIniApl(TComponent* Owner)
: TForm(Owner)
{
Application->OnException = DisplayError;
}
//---------------------------------------------------------------------------
void __fastcall TfIniApl::DisplayError(TObject *Sender, Exception *E)
{
if (E->ClassNameIs("EIBInterBaseError")) // Si es una excepcion de interbase
{
String MSG;
EIBInterBaseError *ErrorIB = reinterpret_cast<EIBInterBaseError *>(E);
IniApl->Items->Item[IniApl->Items->Count - 1]->SubItems->Strings[0] = "";
switch (ErrorIB->SQLCode) // Si realmente es de interbase tratamos el codigo de error
{
case -904:
MSG = "El servidor Firebird se encuentra parado. Inicie el servicio.";
break;
case -902:
MSG = "No se ha encontrado la base de datos. Hay que crearla.";
IniApl->Items->Item[IniApl->Items->Count - 1]->SubItems->Strings[0] = "Creación";
break;
case -836:
MSG = "Error de interbase";
break;
}
ShowMessage(MSG); // Mostramos el mensaje.
if (ErrorIB->SQLCode != -902)
Application->Terminate();
}
else // Si no es de InterBase mostramos el mensaje original, jeje
{
ShowMessage(E->Message);
}
return;
}
//--------------------------------------------------------------------------- |
Lo que intento es que si el SQLCode devuelto es -902 (no existe), se lance el proceso de creación de la base de datos, pero cuando ejecuta if (ErrorIB->SQLCode != -902) con ese valor, no hace nada. Lo que voy haciendo es mostara en un ListView los pasos que va dando el programa al iniciarse y tengo esto:
| Código: | void __fastcall TfIniApl::FormActivate(TObject *Sender)
{
ConectaDB();
if (IniApl->Items->Item[IniApl->Items->Count - 1]->SubItems->Strings[0] == "Creación")
CrearDB();
}
//---------------------------------------------------------------------------
void __fastcall TfIniApl::ConectaDB()
{
pItem = IniApl->Items->Add();
pItem->Caption = "Conexión a la base de datos";
pItem->SubItems->Add("En proceso");
fGesAfi->Afiliados->Connected = false;
fGesAfi->Afiliados->Params->Clear();
fGesAfi->Afiliados->DatabaseName = fGesAfi->cTablas;
fGesAfi->Afiliados->Params->Add("user_name=sysdba");
fGesAfi->Afiliados->Params->Add("password=masterkey");
fGesAfi->Afiliados->Params->Add("lc_ctype=WIN1252");
fGesAfi->Afiliados->SQLDialect = 3;
fGesAfi->Afiliados->Connected = true;
}
//---------------------------------------------------------------------------
void __fastcall TfIniApl::CrearDB()
{
pItem = IniApl->Items->Add();
pItem->Caption = "Creación de la base de datos";
pItem->SubItems->Add("En proceso");
fGesAfi->Afiliados->Connected = false;
fGesAfi->Afiliados->Params->Clear();
fGesAfi->Afiliados->DatabaseName = fGesAfi->cTablas;
fGesAfi->Afiliados->Params->Add("user_name=sysdba");
fGesAfi->Afiliados->Params->Add("password=masterkey");
fGesAfi->Afiliados->Params->Add("lc_ctype=WIN1252");
fGesAfi->Afiliados->Params->Add("page_size=4096");
fGesAfi->Afiliados->SQLDialect = 3;
fGesAfi->Afiliados->CreateDatabase();
}
//--------------------------------------------------------------------------- |
En teoría una vez ejecutada la función ConectaDB(), si se ha producido ese error -902 debería ejecutarse CrearDB()... ¡Pero se queda parado! _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Vie 19 Ene, 2007 4:00 pm Asunto: |
|
|
Algo Asi?
| Código: |
case -902:
MSG = "No se ha encontrado la base de datos. Hay que crearla.";
IniApl->Items->Item[IniApl->Items->Count - 1]->SubItems->Strings[0] = "Creación";
CreacionDB(); <-- Veo que no la tienes
break;
|
Es decir, despues que se presenta la Excepcion, esta se libera y por ello no pueds crearla, en todo caso, puedes establecer el ShowMessage dentro de la Excepcion -902 _________________

Ultima edición por Cesar C. Salazar Gonzalez el Vie 19 Ene, 2007 6:00 pm, editado 1 vez |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|