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
, que al actualizar la ficha ya existe.
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
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.