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 

Cambiar mensaje de interbase en c++ builder

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Cambiar mensaje de interbase en c++ builder Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Cita:
#include <IB.hpp>


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...
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Gracias Responder citando

Tu respuesta me fue de gran ayuda!Y agradezco la rapidez de la misma.Saludos. Smile
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
_________________
Cool


Ultima edición por Cesar C. Salazar Gonzalez el Vie 19 Ene, 2007 6:00 pm, editado 1 vez
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Algo así. Exactamente así no lo tengo; lo probaré. La función sí esta:
Código:
void __fastcall TfIniApl::CrearDB()

_________________
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
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.