Jump to content


Photo

Problema con Procedimiento en Firebird


  • Please log in to reply
10 replies to this topic

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 24 November 2012 - 11:46 AM

Pues eso tengo problemas con una línea de un procedimiento, tengo lo siguiente:

CREATE OR ALTER PROCEDURE REPORTEDETALLADORANGO (
    listar integer,
    desde varchar(10),
    hasta varchar(10),
    comb integer,
    dpto varchar(1),
    consumidor integer)
returns (
    sdespid integer,
    sfecha date,
    sdesptipo varchar(5),
    scant numeric(15,2),
    sveid integer,
    srecibido varchar(60),
    scomb integer,
    scons integer,
    sconsnombre varchar(150),
    skm integer,
    sdficha varchar(10),
    svficha varchar(10),
    scategoria integer,
    sasignadoa varchar(60),
    splaca varchar(10),
    stipoveh varchar(50),
    scombnombre varchar(20))
as
declare variable sql varchar(1000);
declare variable edespid integer;
declare variable efecha date;
declare variable edesptipo varchar(5);
declare variable ecant numeric(15,2);
declare variable eveid integer;
declare variable erecibido varchar(60);
declare variable ecomb integer;
declare variable econs integer;
declare variable econsnombre varchar(150);
declare variable ekm integer;
declare variable edficha varchar(10);
declare variable evficha varchar(10);
declare variable ecategoria integer;
declare variable easignadoa varchar(60);
declare variable eplaca varchar(10);
declare variable etipoveh varchar(50);
declare variable ecombnombre varchar(20);
BEGIN

    SQL = 'select d.desp_id, d.desp_fecha, d.desp_tipo, d.desp_cant, d.ve_id, d.desp_recibido, d.desp_comb, d.desp_consumidor,
            d.desp_consnombre, d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_categoria, v.ve_asignadoa,v.ve_placa, t.tv_nombre, c.comb_nombre
            from despachos d
            join vehiculos v on v.ve_id = d.ve_id
            join tipos_vehiculos t on t.tv_id = v.ve_tipo
            join combustibles c on c.comb_id = d.desp_comb';

    if (LISTAR = 0) then
        SQL = SQL || '
        where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB || ' AND d.desp_estado = 1
        group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
        d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
        order by d.desp_tipo, d.desp_consnombre';

    if (LISTAR = 1) then
        SQL = SQL || '
        where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB || ' AND d.desp_estado = 1
        group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
        d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
        order by d.desp_tipo, d.desp_consnombre';

    if (LISTAR = 2) then
        SQL = SQL || '
        where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB || '
        group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
        d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
        order by d.desp_tipo, d.desp_consnombre';

    if (dpto = 'T') then
        SQL = SQL || '
        where d.desp_comb = ' || :COMB || ' AND d.desp_estado = 1 AND d.desp_consumidor = ' || :CONSUMIDOR || ' and d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || '''
        group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
        d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
        order by d.desp_tipo, d.desp_consnombre';

    for execute statement SQL into :EDESPID, :EFECHA, :EDESPTIPO, :ECANT, :EVEID, :ERECIBIDO, :ECOMB,
    :ECONS, :ECONSNOMBRE, :EKM, :EDFICHA, :EVFICHA, :ECATEGORIA, :EASIGNADOA, :EPLACA, :ETIPOVEH, :ECOMBNOMBRE do
    begin
        SDESPID = :EDESPID;
        SFECHA = :EFECHA;
        SDESPTIPO = :EDESPTIPO;
        SCANT = :ECANT;
        SVEID = :EVEID;
        SRECIBIDO = :ERECIBIDO;
        SCOMB = :ECOMB;
        SCONS = :ECONS;
        SCONSNOMBRE = :ECONSNOMBRE;
        SKM = :EKM;
        SDFICHA = :EDFICHA;
        SVFICHA = :EVFICHA;
        SCATEGORIA = :ECATEGORIA;
        SASIGNADOA = :EASIGNADOA;
        SPLACA = :EPLACA;
        STIPOVEH = :ETIPOVEH;
        SCOMBNOMBRE = :ECOMBNOMBRE;

        SUSPEND;
    end
END


El error que me da es:



delphi
  1. Arithmetic overflow or division by Zero has occurred.
  2. arithmetic exception, numeric overflow, or string truncation.
  3. string rigth truncation.
  4. at procedure 'REPORTEDETALLADORANGO' line: 75, col: 21.



el error está en la línea:

 if (dpto = 'T') then


Ya tengo una mañana entera tratando de ver cual es el problema  8o|

Saludos.

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 24 November 2012 - 01:01 PM

¿Seguro que le pasas algo en ese parámetro? Creo que recibe un varchar vació y ese es el problema.

Por cierto, la linea 77 creo que deberia empezar por AND y no por WHERE, porque temrinarias con dos where!
  • 0

#3 lbuelvas

lbuelvas

    Member

  • Miembros
  • PipPip
  • 20 posts
  • LocationColombia

Posted 25 November 2012 - 08:06 AM

Hola, lo que sucede es que tu parametro listar es de tipo entero y en la parte donde dices

IF (dpto = 'T') THEN

estas comparando una variable de tipo entero contra un caracter.
  • 0

#4 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1092 posts
  • LocationMurcia, España

Posted 26 November 2012 - 03:00 AM

Hola, lo que sucede es que tu parametro listar es de tipo entero y en la parte donde dices

IF (dpto = 'T') THEN

estas comparando una variable de tipo entero contra un caracter.


Según yo lo leo "dpto VARCHAR(1)" no es un entero, y es la única variable que sale en esa línea... ¿que pinta la variable "listar" en todo esto?
  • 0

#5 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 26 November 2012 - 04:50 AM

Buenas,

Aunque te diga esa linea..... ¿seguro que es esa línea? Es decir, ¿has probado a quitar ese "if" y comprobar que compile correctamente el SP?


  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 26 November 2012 - 05:28 AM

Hola a todos, si no pongo nada en la variable DPTO, el procedimiento se ejecuta perfectamente, sólo pasa cuando le pongo 'T' y un valor entero en CONSUMIDOR. A mi parecer tiene que ver con la concatenación de la consulta con el parámetro de entrada COnsumidor.

Saludos.
  • 0

#7 lbuelvas

lbuelvas

    Member

  • Miembros
  • PipPip
  • 20 posts
  • LocationColombia

Posted 26 November 2012 - 07:13 AM

Hola, hay algunos problemas.  El primero es que cuando  el problema está en que cuando se cumple la condicón  "IF (dpto = 'T') THEN" debes adicionar un espacio en blanco para que no queden pegadas las palabras de la sentencia anterior con la nueva, además me parece que abres comillas y saltas de linea, tal vez eso te este afectando.

Segundo si se cumple la condicón  "IF (dpto = 'T') THEN" te quedaria un order by y luego un where y en SQL no esta permitido, es decir dos where.
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 posts
  • LocationEspaña

Posted 26 November 2012 - 10:04 AM

Buenas,

A parte de lo que te comenta lbuelvas (que tiene razón siempre y cuando no sean excluyentes las variables de entrada "listar" y "dpto", el error que marca es como si la variable SQL (varchar de 1000) se quedara corta. Quizás se le va la olla con esos saltos de línea dentro de la cadena de la sentencia. Compruébalo por ahí
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 26 November 2012 - 10:51 AM

Vaya, veré detalladamente ese asunto como comentan ambos. ya les dejaré mis resultados.

Saludos.
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7419 posts
  • LocationRepública Dominicana

Posted 26 November 2012 - 12:31 PM

Vaya, tuve que hacerlo por bloques If..Then Begin ...end para cada caso y todo arranca perfectamente, el code quedó de esta manera:

CREATE OR ALTER PROCEDURE REPORTEDETALLADORANGO (
    listar integer,
    desde varchar(10),
    hasta varchar(10),
    comb integer,
    dpto varchar(1),
    consumidor integer)
returns (
    sdespid integer,
    sfecha date,
    sdesptipo varchar(5),
    scant numeric(15,2),
    sveid integer,
    srecibido varchar(60),
    scomb integer,
    scons integer,
    sconsnombre varchar(150),
    skm integer,
    sdficha varchar(10),
    svficha varchar(10),
    scategoria integer,
    sasignadoa varchar(60),
    splaca varchar(10),
    stipoveh varchar(50),
    scombnombre varchar(20))
as
declare variable sql varchar(1000);
BEGIN

    if (LISTAR = 0) then begin
            SQL = 'select d.desp_id, d.desp_fecha, d.desp_tipo, d.desp_cant, d.ve_id, d.desp_recibido, d.desp_comb, d.desp_consumidor,
            d.desp_consnombre, d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_categoria, v.ve_asignadoa,v.ve_placa, t.tv_nombre, c.comb_nombre
            from despachos d
            join vehiculos v on v.ve_id = d.ve_id
            join tipos_vehiculos t on t.tv_id = v.ve_tipo
            join combustibles c on c.comb_id = d.desp_comb
            where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB || ' AND d.desp_estado = 1
            group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
            d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
            order by d.desp_tipo, d.desp_consnombre';
    end

    if (LISTAR = 1) then begin
            SQL = 'select d.desp_id, d.desp_fecha, d.desp_tipo, d.desp_cant, d.ve_id, d.desp_recibido, d.desp_comb, d.desp_consumidor,
            d.desp_consnombre, d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_categoria, v.ve_asignadoa,v.ve_placa, t.tv_nombre, c.comb_nombre
            from despachos d
            join vehiculos v on v.ve_id = d.ve_id
            join tipos_vehiculos t on t.tv_id = v.ve_tipo
            join combustibles c on c.comb_id = d.desp_comb
            where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB || ' AND d.desp_estado = 1
            group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
            d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
            order by d.desp_tipo, d.desp_consnombre';
    end

    if (LISTAR = 2) then begin
            SQL = 'select d.desp_id, d.desp_fecha, d.desp_tipo, d.desp_cant, d.ve_id, d.desp_recibido, d.desp_comb, d.desp_consumidor,
            d.desp_consnombre, d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_categoria, v.ve_asignadoa,v.ve_placa, t.tv_nombre, c.comb_nombre
            from despachos d
            join vehiculos v on v.ve_id = d.ve_id
            join tipos_vehiculos t on t.tv_id = v.ve_tipo
            join combustibles c on c.comb_id = d.desp_comb
            where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB ||
            'group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
            d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
            order by d.desp_tipo, d.desp_consnombre';
    end

    if (dpto = 'T') then begin
            SQL = 'select d.desp_id, d.desp_fecha, d.desp_tipo, d.desp_cant, d.ve_id, d.desp_recibido, d.desp_comb, d.desp_consumidor,
            d.desp_consnombre, d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_categoria, v.ve_asignadoa,v.ve_placa, t.tv_nombre, c.comb_nombre
            from despachos d
            join vehiculos v on v.ve_id = d.ve_id
            join tipos_vehiculos t on t.tv_id = v.ve_tipo
            join combustibles c on c.comb_id = d.desp_comb
            where d.desp_fecha >= ''' || :DESDE || ''' AND d.desp_fecha <= ''' || :HASTA || ''' and d.desp_comb = ' || :COMB || ' AND d.desp_estado = 1 AND D.DESP_CONSUMIDOR = ' || :consumidor ||
            'group by d.desp_tipo, d.desp_consnombre, d.desp_consumidor, v.ve_categoria, d.desp_fecha, d.desp_id, d.desp_cant, d.ve_id,
            d.desp_recibido,d.desp_comb,d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_asignadoa, t.tv_nombre, c.comb_nombre, v.ve_placa
            order by d.desp_tipo, d.desp_consnombre';
    end

    for execute statement SQL into :SDESPID, :SFECHA, :SDESPTIPO, :SCANT, :SVEID, :SRECIBIDO, :SCOMB,
    :SCONS, :SCONSNOMBRE, :SKM, :SDFICHA, :SVFICHA, :SCATEGORIA, :SASIGNADOA, :SPLACA, :STIPOVEH, :SCOMBNOMBRE do
    begin
        SUSPEND;
    end
END


Saludos.
  • 0

#11 lbuelvas

lbuelvas

    Member

  • Miembros
  • PipPip
  • 20 posts
  • LocationColombia

Posted 26 November 2012 - 05:47 PM

Hola ya hice una prueba y el tamaño de la variable sql puede ser insuficiente.  La forma en que usas la variable puede hacerse un poco mejor porque no estas delimitando cada fila, entonces se llena de espacios en blanco innecesarios desde la primera columna hasta la primera letra de cada fila.  Podrias hacerlo asi:


  sql = 'select d.desp_id, d.desp_fecha, d.desp_tipo, d.desp_cant, d.ve_id, d.desp_recibido, d.desp_comb, d.desp_consumidor, '          ||
        'd.desp_consnombre, d.desp_km, d.ve_ficha, v.ve_ficha, v.ve_categoria, v.ve_asignadoa,v.ve_placa, t.tv_nombre, c.comb_nombre '  ||
        'from despachos d '                                                                                                            ||
        ...
        'order by d.desp_tipo, d.desp_consnombre ';



  • 0




IP.Board spam blocked by CleanTalk.