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)
-   -   Problema con un parámetro de salida en un Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=11238)

taote 09-06-2004 09:35:54

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

Nuria 09-06-2004 18:07:05

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! ;)

taote 09-06-2004 18:18:57

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.

guillotmarc 09-06-2004 18:35:51

¿ 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.

taote 09-06-2004 18:54:08

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.

guillotmarc 09-06-2004 20:41:38

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.


La franja horaria es GMT +2. Ahora son las 07:40:16.

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