Ver Mensaje Individual
  #4  
Antiguo 11-02-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Reputación: 20
cuburu Va por buen camino
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
          //Conexión a la BD
          Barra_Estado.SimpleText := 'Consultando la Base de datos...';
          Close;
            //Asignación de la BD y transacción
            Database := DMBaseDeDatos.BDConexion;
            Transaction := DMBaseDeDatos.BDTransaccion;

            //Armado de Consulta para la llamada al procedimiento en la BD.
            SQL.Clear;
            SQL.Add('SELECT * FROM alta_pacientes(' +
                    //Datos de la tabla PACIENTES.
                    ':Fecha, :Nombre, :Apellidos, :Edad, :Sexo, ir, :Tel, :Fax, :Correo, ' +
                    //Datos de la tabla EXPEDIENTES.
                    ':FechaAlta, iagnostico, :AntecedenteEmb, :AntecedentePar, :Alergias, :Motivo, ' +
                    //Datos de la tabla REFERENCIAS.
                    ':NombreRef, :ApellidosRef, :SexoRef, irRef, :CorreoRef, :TelRef, :FaxRef)');

            //Datos de la tabla PACIENTES.
            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;

            //Datos de la tabla EXPEDIENTES.
            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;

            //Datos de la tabla REFERENCIAS.
            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
          //Muestra un mensaje error de inserción
          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;
    //Desconexión de la BD
    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.

Última edición por cuburu fecha: 11-02-2006 a las 07:33:42.
Responder Con Cita