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 Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-06-2004
taote taote is offline
Miembro
 
Registrado: feb 2004
Posts: 23
Poder: 0
taote Va por buen camino
Question Problema con un parámetro de salida en un Stored Procedure

Hola:

Estoy programando una aplicación utilizando Delphi 6 y DBExpress, accediendo con un servidor Firebird 1.5.

El problema lo tengo con un procedimiento almacenado, que lo tengo montado de la manera siguiente: un componente de tipo TSQLStoredProcedure, conecto a este componente un TDataSetProvider, y por un ultimo hay un TClientDataSet accediendo al proveedor, es decir, que la ejecución del procedimiento se realiza a través del ClientDataSet.

Pues bien el problema está en cuando el parámetro de salida del procedimiento es de tipo VARCHAR, en concreto está definido como VARCHAR(10) y en el componente de Delphi el parámetro es de tipo string.

Al hacer el Execute del ClientDataSet obtengo una excepción que dice:

Código:
  
'arithmetic exception, numeric overflow, or string truncation'
el problema no está en el desarrollo del procedimiento porque falla incluso con un procedimiento donde lo unico que hago es asignar directamente un valor al parámetro.

Sin embargo si el parámetro es de tipo Integer y devuelvo el entero, el procedimiento no hay ningun problema, por lo que creo que el tema está en la definición de los parámetros.

¿Alguien puede echarme una mano? Gracias de antemano
Responder Con Cita
  #2  
Antiguo 09-06-2004
Avatar de Nuria
Nuria Nuria is offline
Miembro
 
Registrado: may 2003
Posts: 531
Poder: 21
Nuria Va por buen camino
Hola taote!

¿Y por qué no pones el código del procedimiento y la definición de los parámetros? Así igual te podíamos ayudar...

Un saludillo!
Responder Con Cita
  #3  
Antiguo 09-06-2004
taote taote is offline
Miembro
 
Registrado: feb 2004
Posts: 23
Poder: 0
taote Va por buen camino
Hola:

Lo que queria decir es que con un codigo tan simple como

Código SQL [-]
CREATE PROCEDURE PRUEBA 
RETURNS (
    CODIGO VARCHAR(10))
AS
begin
  CODIGO = '0000000001';
  suspend;
end

me falla el procedimiento al llamarlo desde Delphi. En Delphi está configurado tal y como se dice en el primer mensaje.
Venga, gracias por las respuestas.
Responder Con Cita
  #4  
Antiguo 09-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
¿ Porqué utilizas un DatasetProvider y un ClientDataset ?, hasta donse yo sé no puedes utilizar el ClientDataset así.
Simplemente ejecuta el Execute en el TSQLStoredProc.

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
  #5  
Antiguo 09-06-2004
taote taote is offline
Miembro
 
Registrado: feb 2004
Posts: 23
Poder: 0
taote Va por buen camino
Hola:

Claro que es posible. De esta manera mantengo aislado el programa de la capa de acceso a datos (donde tengo los componentes DBExpress), accediendo a través de la capa intermedia. Y puedo tratar las capas de manera independiente.

Si se configura tal y como he puesto en el primer mensaje, puede hacerse, de una manera similar a

Código Delphi [-]
function TDMDatos.GetNuevoCodigo(CDS: TClientDataSet): string;
var
    P : TParams;
    Tipo : integer;
begin
    Result:='';
    P := TParams.Create;
    try
        P.Assign(CodNuevo.Params);
        if CDS = Facturas then
           Tipo := 0
        else if CDS = Clientes then
           Tipo := 1
        else
           exit;

        CodNuevo.Params.ParamByName('TIPO').AsInteger := Tipo;
        CodNuevo.Execute;
        Result := CodNuevo.Params.ParamByName('Codigo').AsString;
    finally
        CodNuevo.Params.Assign(P);
    end;
end;

En este caso CodNuevo es el TClientDataSet, enlazado a un proveedor que a su vez está enlazado al componente de procedimiento almacenado, que tiene un parámetro de entrada Tipo, y uno de salida Codigo del tipo VARCHAR(10).

Lo utilizo para obtener un nuevo código para la tabla. Si lo que devuelvo es un entero no hay problema, pero con el VARCHAR si falla.
Responder Con Cita
  #6  
Antiguo 09-06-2004
Avatar de guillotmarc
guillotmarc guillotmarc is offline
Miembro
 
Registrado: may 2003
Ubicación: Huelva
Posts: 2.638
Poder: 23
guillotmarc Va por buen camino
Hola.

¿ Estás seguro que el problema es el parámetro ?. Por el mensaje de error también pueden ser 2 cosas :

a) Tienes una asignación en tu procedimiento, que intenta pasar una cadena dentro de una variable más corta (un varchar(12) a un varchar(10)). En lugar de truncar la cadena te salta esta excepción.

b) Numeric overflow o arithmetic exception : Tienes alguna operación cuyo resultado falla (tipo división por 0), o no cabe en la variable destino (tipo asignar a un entero el resultado de una división, que puede ser un valor decimal).

Asegúrate, ejecutando este procedimiento desde IBConsole, IBExpert, IBAccess, ... o similar.

NOTA : Comprueba también que los parámetros, tanto en en el SQLStoredProc como en el ClientDataset sean varchar(10).

PD : Piensa que el driver dbExpress de Borland es para Interbase. A medida que Firebird sigue su evolución te puedes encontrar con problemas de incompatibilidad de este tipo. En este caso, se soluciona instalando un driver dbExpress específico para Firebird, como por ejplo. : http://www.upscene.com/products/dbx/dbx_fb.htm

Saludos.
__________________
Marc Guillot (Hi ha 10 tipus de persones, els que saben binari i els que no).
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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


La franja horaria es GMT +2. Ahora son las 12:09:45.


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