Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Problemas con pasos de parametros de Delphi a un SP (https://www.clubdelphi.com/foros/showthread.php?t=30054)

cuburu 07-02-2006 21:28:08

Problemas con pasos de parametros de Delphi a un SP
 
Saludos,

Primero describamos con qué estoy trabajando.

SO: Win2000
Delphi 5
IBDatabase
IBQuery
IBDataSet
IBTransaction
Firebird 1.5

Ahora lo que debería de hacer en teoria:

Desde delphi mando llamar a un SP que realiza una inserción de datos en la BD. Éste obtiene los parametros de entrada, los procesa y en base a una serie de operaciones actualiza las tablas correspondientes, sencillo ¿no?.

El problema:

El problema es que cuando envío datos tipo varchar, char o blob que contengan caracteres como ú, ó, é, entre otros, me marca un error de inserción. Cabe aclarar que a veces lo hace y otras no, además, en ocasiones al enviarme el error de todas formas ingresa los datos en la BD.

Alguien tiene alguna idea de por que me pasa esto.

Lo he probado en WIN NT 4.0 y no me ha marcado problema alguno hasta el momento pero pienso implantarlo en una maquina con Win XP. Todavía no lo he probado XP y no se si pudiesen venirse más problemas con ello.

AGAG4 08-02-2006 02:00:10

Checa Esto....
 
En Primero lugar Revisa si tu Base de datos esta creada con el Charset ISO8859_1 y revisa que en tus campos de tipo Char y Varchar contengan lo mismo agregando el Collate a ES_ES.

Espero te haya ayudado.

Saludos....

cuburu 08-02-2006 04:05:59

PArece ser que el formato de la tabla es WIN1251 y el de los campos también, ¿podrían recomendarme algúna url en la que pueda consultar la diferencia entre estos formatos?

Gracias, lo revisaré.

cuburu 11-02-2006 07:30:29

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, :Dir, :Tel, :Fax, :Correo, ' +
                    //Datos de la tabla EXPEDIENTES.
                    ':FechaAlta, :Diagnostico, :AntecedenteEmb, :AntecedentePar, :Alergias, :Motivo, ' +
                    //Datos de la tabla REFERENCIAS.
                    ':NombreRef, :ApellidosRef, :SexoRef, :DirRef, :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.


La franja horaria es GMT +2. Ahora son las 19:30:17.

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