Ver Mensaje Individual
  #1  
Antiguo 07-11-2017
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Posts: 1.354
Reputación: 19
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.
Código:
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
Código:
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.
Responder Con Cita