Saludos.
He realizado el cambio de formato de la BD, y los campos de las tablas al Formato ISO_8851_1 y me sigue apareciendo el mismo error
Cita:
"aritmetic excepcion, numeric overflow, or string truncation Cannot transliterate character between character sets"
|
Alguien me puede decir por qué me manda esto, se que es algo relacionado a la conversión entre los caracteres cuando son recibidos en la BD, ésta no los puede interpretar, ¿alguno de ustedes les ha sucedido algo así?. Apelo a su experiencia para tratar de resolver esto.
Como les comentaba, cuando terminé de realizar la conversión me funcionó perfectamente la primera vez, pero al volver a ejecutarlo me mandó el error que les mencioné anteriormente. El procedimiento es el siguiente.
Código:
CREATE PROCEDURE ALTA_PACIENTES (
FECHANAC CHAR (10) CHARACTER SET ISO8859_1,
NOMBRE VARCHAR (25) CHARACTER SET ISO8859_1,
APELLIDOS VARCHAR (40) CHARACTER SET ISO8859_1,
EDAD INTEGER,
SEXO CHAR (1) CHARACTER SET ISO8859_1,
DIR VARCHAR (80) CHARACTER SET ISO8859_1,
TEL VARCHAR (20) CHARACTER SET ISO8859_1,
FAX VARCHAR (20) CHARACTER SET ISO8859_1,
CORREO VARCHAR (100) CHARACTER SET ISO8859_1,
FECHAALTA CHAR (10) CHARACTER SET ISO8859_1,
DIAGNOSTICO VARCHAR (254) CHARACTER SET ISO8859_1,
ANTECEDENTEEMB VARCHAR (128) CHARACTER SET ISO8859_1,
ANTECEDENTEPAR VARCHAR (128) CHARACTER SET ISO8859_1,
ALERGIAS VARCHAR (128) CHARACTER SET ISO8859_1,
MOTIVO BLOB sub_type 0 segment size 80,
NOMBREREF VARCHAR (25) CHARACTER SET ISO8859_1,
APELLIDOSREF VARCHAR (40) CHARACTER SET ISO8859_1,
SEXOREF CHAR (1) CHARACTER SET ISO8859_1,
DIRREF VARCHAR (80) CHARACTER SET ISO8859_1,
EMAILREF VARCHAR (100) CHARACTER SET ISO8859_1,
TELREF VARCHAR (20) CHARACTER SET ISO8859_1,
FAXREF VARCHAR (20) CHARACTER SET ISO8859_1)
RETURNS (
RESULTADO VARCHAR (5) CHARACTER SET ISO8859_1)
AS
/*Variables de conversión de fecha*/
declare variable FECHA date;
declare variable FECHA_ALTA date;
/*Variables temporales de llave primaria*/
declare variable FECHA_TEMP date;
declare variable NOMBRE_TEMP varchar(25);
declare variable APELLIDOS_TEMP varchar(40);
BEGIN
/*Conversión del dato tipo char a fecha*/
FECHA = :FECHANAC;
FECHA_ALTA = :FECHAALTA;
/*Comparación de datos vacios*/
if ((:FechaNac <> '') and (:Nombre <> '') and
(:Apellidos <> '') and (:Fechaalta <> '') and
(:Diagnostico <> '') and (:NombreRef <> '') and
(:ApellidosRef <> '')) then
begin
/*Busqueda de algun registro con la misma llave primaria, de
encontrarse envía el mensaje al usuario para su corrección,
de no ser así almacena todos los datos de las tablas,
PACIENTES, EXPEDIENTES y REFERENCIAS.*/
select distinct FECHA_NAC_PAC, NOMBRE_PAC, APELLIDOS_PAC
from pacientes
where FECHA_NAC_PAC = :FECHA and NOMBRE_PAC = :NOMBRE and
APELLIDOS_PAC = :APELLIDOS
into :FECHA_TEMP, NOMBRE_TEMP, APELLIDOS_TEMP;
/*Verificación de registro inexistente. Como la tabla EXPEDIENTES
contiene un campo autoincremental de PK y la tabla REFERENCIAS no
tiene PK, solo FK, no es necesario establecer una condición de
validación de inserción.*/
if ((:FECHA_TEMP is null) and (:NOMBRE_TEMP is null) and
(:APELLIDOS_TEMP is null)) then
begin
/*Almacenamiento en la tabla PACIENTES*/
insert into pacientes(FECHA_NAC_PAC, NOMBRE_PAC,
APELLIDOS_PAC, EDAD_PAC,
SEXO_PAC, DIR_PAC, TEL_PAC,
FAX_PAC, EMAIL_PAC)
values(:FECHA, :Nombre, :Apellidos, :Edad,
:Sexo, :Dir, :Tel, :Fax, :Correo);
/*Almacenamiento en la tabla EXPEDIENTES*/
insert into expedientes(FECHA_ALTA_PAC, FECHA_NAC_PAC,
NOMBRE_PAC, APELLIDOS_PAC,
DIAG_PAC, ANT_EMB_PAC,
ANT_PARTO_PAC, ALERGIAS_PAC,
MOTIVO_PAC)
values(:FECHA_ALTA, :FECHA, :Nombre, :Apellidos, :Diagnostico,
:AntecedenteEmb, :AntecedentePar, :Alergias, :Motivo);
/*Almacenamiento en la Tabla REFERENCIA*/
insert into referencias(FECHA_NAC_PAC, NOMBRE_PAC,
APELLIDOS_PAC, NOMBRE_REF,
APELLIDOS_REF, SEXO_REF,
DIR_REF, EMAIL_REF,
TEL_REF, FAX_REF)
values(:FECHA, :Nombre, :Apellidos, :NombreRef,
:ApellidosRef, :SexoRef, :DirRef, :EMailRef,
:TelRef, :FaxRef);
RESULTADO = 'OK';
end
else
/*De encontrarse información le notifica al usuario*/
exception datos_existentes;
end
else
begin
RESULTADO = 'ERROR';
exception alta_de_datos;
end
END
y esta es la función que utilizo para enviar los datos al procedimiento.
Código Delphi
[-]
function Tfrm_Paciente.AltaDePaciente(): Boolean;
Var
QryAltaPac: TIBQuery;
begin
QryAltaPac := TIBQuery.Create(nil);
try
with QryAltaPac do
begin
try
if VerificaFmtoDato('I',EdadPac.Text) then
begin
Barra_Estado.SimpleText := 'Consultando la Base de datos...';
Close;
Database := DMBaseDeDatos.BDConexion;
Transaction := DMBaseDeDatos.BDTransaccion;
SQL.Clear;
SQL.Add('SELECT * FROM alta_pacientes(' +
':Fecha, :Nombre, :Apellidos, :Edad, :Sexo, ir, :Tel, :Fax, :Correo, ' +
':FechaAlta, iagnostico, :AntecedenteEmb, :AntecedentePar, :Alergias, :Motivo, ' +
':NombreRef, :ApellidosRef, :SexoRef, irRef, :CorreoRef, :TelRef, :FaxRef)');
ParamByName('Fecha').AsString := FormatDateTime('MM"/"DD"/"YYYY', Fech_NacPac.Date);
ParamByName('Nombre').AsString := NombrePac.Text;
ParamByName('Apellidos').AsString := ApellidosPac.Text;
if EdadPac.Text <> EmptyStr then
ParamByName('Edad').AsInteger := StrToInt(EdadPac.Text)
else
ParamByName('Edad').AsInteger := 0;
ParamByName('Sexo').AsString := SexoPac.Text;
ParamByName('Dir').AsString := DirPac.Text;
ParamByName('Tel').AsString := TelPac.Text;
ParamByName('Fax').AsString := FaxPac.Text;
ParamByName('Correo').AsString := MailPac.Text;
ParamByName('FechaAlta').AsString := FormatDateTime('MM"/"DD"/"YYYY', Fech_AltaPac.Date);
ParamByName('Diagnostico').AsString := DiagPac.Text;
ParamByName('AntecedenteEmb').AsString := AntEmbPac.Text;
ParamByName('AntecedentePar').AsString := AntParPac.Text;
ParamByName('Alergias').AsString := AlergiasPac.Text;
ParamByName('Motivo').AsBlob := MotivoPac.Text;
ParamByName('NombreRef').AsString := NombreRef.Text;
ParamByName('ApellidosRef').AsString := ApellidosRef.Text;
ParamByName('SexoRef').AsString := SexoRef.Text;
ParamByName('DirRef').AsString := DirRef.Text;
ParamByName('TelRef').AsString := TelRef.Text;
ParamByName('FaxRef').AsString := FaxRef.Text;
ParamByName('CorreoRef').AsString := MailRef.Text;
Open;
Barra_Estado.SimpleText := 'Datos del paciente ingresados...';
Result := True;
end;
except
on E: Exception do
begin
Barra_Estado.SimpleText := 'Error de inserción de información...';
MessageBox(Handle,
PChar('Error de inserción de información' + #13 +
'"' + E.Message + '"'),
'ERROR',
MB_OK + MB_ICONERROR);
Result := False;
end;
end;
end;
finally
QryAltaPac.Free;
DMBaseDeDatos.DesconectarBD();
end;
end;
Ya le he dado vuelas a esto una y otra vez y no encuentro el error, confio en que alguno de ustedes se percate de mi error y me lo haga saber.
De antemano gracias.