Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Go Back   Foros Club Delphi > Bases de datos > Firebird e Interbase
Register FAQ Members List Calendar Guía de estilo Search Today's Posts Mark Forums Read

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 07/11/2017
Angel.Matilla's Avatar
Angel.Matilla Angel.Matilla is offline
Miembro
 
Join Date: Jan 2007
Location: Toledo - España
Posts: 1,418
Poder: 21
Angel.Matilla Va por buen camino
Problema al grabar en FB

Antes que nada perdón por el tocho de código. Tengo este código que uso para grabar registros nuevos o actualizaciones en un tabla FB.
Code:
Query->Close();
if (lNuevo)
{
     Query->SQL->Text = "INSERT INTO Persona (Apellidos, Nombre, Nif, Sexo, F_nacim, Domicilio, Cpostal, Poblacion, Provincia, Profesion, "
                        "C_electronico, Telefono_1, Telefono_2, Telefono_3, Situacion, Correo, Lo1599, F_alta, N_afiliado, Afiliacion, "
                        "Junta, Referencia, PerPago, Forpago, Cuota, Iban, Cuenta, Bic, Observaciones, UsuMod, FecMod) VALUES (:Apellidos, "
                        ":Nombre, :Nif, :Sexo, :F_nacim, :Domicilio, :Cpostal, :Poblacion, :Provincia, :Profesion, :C_electronico, "
                        ":Telefono_1, :Telefono_2, :Telefono_3, :Situacion, :Correo, :Lo1599, :F_alta, :N_afiliado, :Afiliacion, :Junta, "
                        ":Referencia, :PerPago, :Forpago, :Cuota, :Iban, :Cuenta, :Bic, :Observaciones, :UsuMod, :FecMod)";
}
else
{
     Query->SQL->Text = "UPDATE Persona SET Apellidos = :Apellidos, Nombre = :Nombre, Nif = :Nif, Sexo = :Sexo, F_nacim = :F_nacim, "
                        "Domicilio = :Domicilio, Cpostal = :Cpostal, Poblacion = :Poblacion, Provincia = :Provincia, Profesion = :Profesion, "
                        "C_electronico = :C_electronico, Telefono_1 = :Telefono_1, Telefono_2 = :Telefono_2, Telefono_3 = :Telefono_3, "
                        "Situacion = :Situacion, Correo = :Correo, Lo1599 = :Lo1599, F_alta = :F_alta, N_afiliado = :N_afiliado, "
                        "Afiliacion = :Afiliacion, Junta = :Junta, Referencia = :Referencia, PerPago = :PerPago, ForPago = :ForPago, "
                        "Cuota = :Cuota, Iban = :Iban, Cuenta = :Cuenta, Bic = :Bic, Observaciones = :Observaciones, UsuMod = :UsuMod, "
                        "FecMod = :FecMod WHERE CodPrv = (SELECT Literal FROM Instalacion WHERE Etiqueta = 'Provincia') AND Codigo = :Codigo";
}

Query->ParamByName("Apellidos")->AsString = Apellidos->Text;
Query->ParamByName("Nombre")->AsString    = Nombre->Text;
try
{
     Query->ParamByName("Codigo")->AsInteger = GroupBox1->Tag;
}
catch(...)
{
}
Query->ParamByName("Nif")->AsString           = Nif->Text;
Query->ParamByName("Sexo")->AsInteger         = Sexo->ItemIndex;
Query->ParamByName("F_nacim")->AsDateTime     = StrToDateDef(F_nacim->Text, dFechaNula) > dFechaNula ? StrToDate(F_nacim->Text) : NULL;
Query->ParamByName("Domicilio")->AsString     = Domicilio->Text;
Query->ParamByName("Cpostal")->AsString       = Cpostal->Text;
Query->ParamByName("Poblacion")->AsInteger    = Poblacion->Tag < 1 ? 1 : Poblacion->Tag;
Query->ParamByName("Provincia")->AsInteger    = Provincia->ItemIndex < 0 || (int)(TObject*)Provincia->Items->Objects[Provincia->ItemIndex] < 1 ? 99 : (int)(TObject*)Provincia->Items->Objects[Provincia->ItemIndex];
Query->ParamByName("Profesion")->AsInteger    = Profesion->ItemIndex < 0 || (int)(TObject*)Profesion->Items->Objects[Profesion->ItemIndex] < 1 ? 1 : (int)(TObject*)Profesion->Items->Objects[Profesion->ItemIndex];
Query->ParamByName("C_electronico")->AsString = C_electronico->Text;
Query->ParamByName("Telefono_1")->AsString    = Telefono_1->Text.Trim();
Query->ParamByName("Telefono_2")->AsString    = Telefono_2->Text.Trim();
Query->ParamByName("Telefono_3")->AsString    = Telefono_3->Text.Trim();
Query->ParamByName("Situacion")->AsInteger    = Situacion->ItemIndex < 0 || (int)(TObject*)Situacion->Items->Objects[Situacion->ItemIndex] < 1 ? 1 : (int)(TObject*)Situacion->Items->Objects[Situacion->ItemIndex];
Query->ParamByName("Correo")->AsInteger       = Correo->Checked;
Query->ParamByName("Lo1599")->AsInteger       = Lo1599->Checked;
Query->ParamByName("F_alta")->AsDateTime      = StrToDateDef(F_alta->Text, dFechaNula) > dFechaNula ? StrToDate(F_alta->Text) : NULL;
Query->ParamByName("N_afiliado")->AsInteger   = StrToIntDef(N_afiliado->Text, 0);
Query->ParamByName("Afiliacion")->AsInteger   = Afiliacion->ItemIndex < 0 || (int)(TObject*)Afiliacion->Items->Objects[Afiliacion->ItemIndex] < 1 ? 1 : (int)(TObject*)Afiliacion->Items->Objects[Afiliacion->ItemIndex];
Query->ParamByName("Junta")->AsInteger        = Junta->ItemIndex < 0 || (int)(TObject*)Junta->Items->Objects[Junta->ItemIndex] < 1 ? 1 : (int)(TObject*)Junta->Items->Objects[Junta->ItemIndex];
Query->ParamByName("Referencia")->AsString    = Referencia->Text;
Query->ParamByName("PerPago")->AsInteger      = PerPago->ItemIndex < 0 || (int)(TObject*)PerPago->Items->Objects[PerPago->ItemIndex] < 1 ? 1 : (int)(TObject*)PerPago->Items->Objects[PerPago->ItemIndex];
Query->ParamByName("Forpago")->AsInteger      = ForPago->ItemIndex < 0 || (int)(TObject*)ForPago->Items->Objects[ForPago->ItemIndex] < 1 ? 1 : (int)(TObject*)ForPago->Items->Objects[ForPago->ItemIndex];
Query->ParamByName("Cuota")->AsFloat          = StrToFloatDef(StringReplace(Cuota->Text, "€", "", oReplace).Trim(), 0);
if (UpperCase(ForPago->Text) == "BANCO")
{
     Iban->Text = StringReplace(Iban->Text, " ", "", oReplace);
     if (isalpha(Iban->Text.c_str()[0]) && isalpha(Iban->Text.c_str()[1]))
     {
          Query->ParamByName("Iban")->AsString   = Iban->Text.SubString(1, 4);
          Query->ParamByName("Cuenta")->AsString = Iban->Text.SubString(5, Iban->Text.Length());
     }
     else
     {
          Query->ParamByName("Iban")->AsString   = "";
          Query->ParamByName("Cuenta")->AsString = Iban->Text;
     }
     if (!Bic->ReadOnly)
          Query->ParamByName("Bic")->AsString = Bic->Text;
     else
          Query->ParamByName("Bic")->AsString = "";
}
else
{
     Query->ParamByName("Iban")->AsString       = "";
     Query->ParamByName("Cuenta")->AsString     = "";
     Query->ParamByName("Bic")->AsString        = "";
}
Query->ParamByName("Observaciones")->Value = Observaciones->Text;
Query->ParamByName("UsuMod")->AsString     = NombreUser;
Query->ParamByName("FecMod")->AsDateTime   = Now();

try
{
     Query->ExecSQL();
     Query->Transaction->Commit();
}
catch(...)
{
     Mensaje(-1, "Se ha producido un error en la grabación del registro.", "Volver");
     Query->Transaction->Rollback();
}
Como véis en ambos querys no están exactamente los mismos parámetros ya que al grabar una ficha nueva a través de un generador y trigger añado el campo codigo, que al actualizar la ficha ya existe.

Hasta ayer mismo el primer try...catch que hay
Code:
try
{
     Query->ParamByName("Codigo")->AsInteger = GroupBox1->Tag;
}
catch(...)
{
}
estaba funcionando a la perfección y cuando era un INSERT se saltaba la línea.

Ayer, de repente y creo que sin haber tocado absolutamente nada de ese código, al pasar por esa línea concreta saltaba el mensaje de error que hay al final, en el try...catch que envuelve al ExecSQL. Me preocupa porque si he modificado algo en las especificaciones genéricas del proyecto puede que afecte a todos los INSERT/UPDATE del mismo y deben ser como unos 200.
Reply With Quote
  #2  
Old 07/11/2017
aposi aposi is offline
Miembro
 
Join Date: Dec 2006
Posts: 160
Poder: 20
aposi Va por buen camino
Si salta el error del segundo try, no tiene porque ser error en la linea que comentas.
mejor muestra el error del segundo try

Código Delphi [-]
catch(Exception e)
 {     
return "Mensaje: " + e.message; 
}
Reply With Quote
  #3  
Old 07/11/2017
duilioisola's Avatar
[duilioisola] duilioisola is offline
Miembro Premium
 
Join Date: Aug 2007
Location: Barcelona, España
Posts: 1,806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Si conoces la condición que va a dar error, deberías controlarla, antes que dejar que genere el error y tratar de subsanarlo.
Reemplaza el try..catch por if..then.


PHP Code:
/*
{}try
{
     Query->ParamByName("Codigo")->AsInteger = GroupBox1->Tag;
}
catch(...)
{
}
*/

/* Estoy seguro en este punto que solo existirá el parámetro si es un registro modificado */
if (!lNuevo) {
     
Query->ParamByName("Codigo")->AsInteger GroupBox1->Tag;

Reply With Quote
  #4  
Old 07/11/2017
Angel.Matilla's Avatar
Angel.Matilla Angel.Matilla is offline
Miembro
 
Join Date: Jan 2007
Location: Toledo - España
Posts: 1,418
Poder: 21
Angel.Matilla Va por buen camino
Gracias por las respuestas de ambos.
Quote:
Originally Posted by aposi View Post
Si salta el error del segundo try, no tiene porque ser error en la linea que comentas.
mejor muestra el error del segundo try
Eso pensaba yo, y eso me dice la lógica. Pero he comprobado con el depurador (estoy trabajando con BCB 6) corriendo el programa línea a línea que al ejecutar ese Query->ParamByName... es cuando salta el error. Soy el primero que se ha quedado perplejo al verlo.
Quote:
Originally Posted by duilioisola View Post
Si conoces la condición que va a dar error, deberías controlarla, antes que dejar que genere el error y tratar de subsanarlo.
Efectivamente. Después de calentarme la cabeza dos días con el error es la solución que he adoptado; erl problema es que, como comentaba, debe haber como unos 200 INSERT/UPDATE en la aplicación y me da vértigo pensar que tengo que repasarlos todos para comprobar que no se dé el mismo error, más que nada porque siempre se queda alguno atrás y termina siendo el que la lía más gorda. ¡En fin! Veremos que pasa.
Reply With Quote
  #5  
Old 08/11/2017
Angel.Matilla's Avatar
Angel.Matilla Angel.Matilla is offline
Miembro
 
Join Date: Jan 2007
Location: Toledo - España
Posts: 1,418
Poder: 21
Angel.Matilla Va por buen camino
¡Soy muy burro! Pero mucho
La solución era tan fácil como esta:
Code:
Query->Close();
if (lNuevo)
{
     Query->SQL->Text = "INSERT INTO Persona (Apellidos, Nombre,  Nif, Sexo, F_nacim, Domicilio, Cpostal, Poblacion, Provincia, Profesion,  "
etc.
}
else
{
     Query->SQL->Text = "UPDATE Persona SET Apellidos =  :Apellidos, Nombre = :Nombre, Nif = :Nif, Sexo = :Sexo, F_nacim =  :F_nacim, "
                        "Domicilio = :Domicilio, Cpostal = :Cpostal,  Poblacion = :Poblacion, Provincia = :Provincia, Profesion = :Profesion, "
                        "C_electronico = :C_electronico, Telefono_1 =  :Telefono_1, Telefono_2 = :Telefono_2, Telefono_3 = :Telefono_3, "
                        "Situacion = :Situacion, Correo = :Correo,  Lo1599 = :Lo1599, F_alta = :F_alta, N_afiliado = :N_afiliado, "
                        "Afiliacion = :Afiliacion, Junta = :Junta,  Referencia = :Referencia, PerPago = :PerPago, ForPago = :ForPago, "
                        "Cuota = :Cuota, Iban = :Iban, Cuenta = :Cuenta,  Bic = :Bic, Observaciones = :Observaciones, UsuMod = :UsuMod, "
                        "FecMod = :FecMod WHERE CodPrv = (SELECT Literal  FROM Instalacion WHERE Etiqueta = 'Provincia') AND Codigo = :Codigo";
      Query->ParamByName("Codigo")->AsInteger = GroupBox1->Tag;     // Lo subo aquí
}

Query->ParamByName("Apellidos")->AsString = Apellidos->Text;
Query->ParamByName("Nombre")->AsString    = Nombre->Text;
Query->ParamByName("Nif")->AsString           = Nif->Text;
etc.
Si no está declarado el parámetro en el query, ¿para qué complicarme la vida comprobando DESPUÉS si existe o no?
Reply With Quote
Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Problema al grabar con UNION 2 TABLAS pmtzg Firebird e Interbase 11 18/08/2011 19:53
Problema para grabar en access novato03 Conexión con bases de datos 5 17/10/2007 15:53
Problema (básico?) editar-grabar registro pepitu Tablas planas 2 21/09/2005 11:34
Problema al grabar muxos registros en 1 detalle User_Baja_2 Conexión con bases de datos 2 05/06/2003 19:52


All times are GMT +2. The time now is 23:07.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi