Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-02-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 08-02-2006
Avatar de AGAG4
AGAG4 AGAG4 is offline
Miembro
 
Registrado: ago 2004
Ubicación: Los Mochis, Sinaloa, México
Posts: 1.420
Poder: 21
AGAG4 Va por buen camino
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....
Responder Con Cita
  #3  
Antiguo 08-02-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 20
cuburu Va por buen camino
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é.
Responder Con Cita
  #4  
Antiguo 11-02-2006
cuburu cuburu is offline
Miembro
 
Registrado: mar 2005
Posts: 63
Poder: 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
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problemas con codigo en delphi Nelly Varios 3 07-11-2005 22:08:09
Problemas con el Instalshield con ejecutable de DELPHI 2005 Ainbazter Varios 5 24-10-2005 10:01:06
problemas delphi 2005 .NET maikelazo Varios 2 15-09-2005 16:39:21
Problemas con CORBA y Delphi 6 FerPetrei Providers 0 30-01-2004 17:51:33
Problemas con Delphi 5 y windows ME skullkid01 Windows 4 09-06-2003 19:22:09


La franja horaria es GMT +2. Ahora son las 16:43:32.


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
Copyright 1996-2007 Club Delphi