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)
-   -   Insertar en Un Stored Procedure (https://www.clubdelphi.com/foros/showthread.php?t=76997)

DasGrun 13-12-2011 00:12:36

Insertar en Un Stored Procedure
 
Hola, Tengo este SP, con la Finalidad que tiene que almacenar los datos Retornados a una tabla HIST_EVA_PROVEE por medio de un parámetro de Un Campo PROVEEDOR_ID.
este es el código:
Código SQL [-]
CREATE PROCEDURE SP_HIST_EVA_PROVEE(
  ID_PROVEEDOR SMALLINT DEFAULT NULL)
RETURNS(
  PROVEEDOR_ID SMALLINT,
  PROVEEDOR VARCHAR(255) CHARACTER SET ISO8859_1,
  RTN VARCHAR(10) CHARACTER SET ISO8859_1,
  CREADO_POR VARCHAR(255) CHARACTER SET ISO8859_1,
  FECHA_CLAS DATE,
  PRECIO NUMERIC(18, 2),
  CUMPLIMIENTO NUMERIC(18, 2),
  DISPONIBILIDAD NUMERIC(18, 2),
  TIEMPO_ENTREGA NUMERIC(18, 2))
AS
BEGIN
  /* Procedure body */
FOR
  SELECT
               PROVEEDORES.PROVEEDOR_ID,
               PROVEEDORES.PROVEEDOR,
               PROVEEDORES.RTN,
               MAESTRO_USUARIO.NOMBRE_COMPLETO,
               PROVEEDORES.FECHA_CLASIFI,
               PROVEEDORES.PREG_PRECIO_COMP,
               PROVEEDORES.PREG_CUMP_ESPECIF,
               PROVEEDORES.PREG_DISP_PRODUC,
               PROVEEDORES.PREG_TIEM_REPTA
     FROM
               PROVEEDORES
     INNER JOIN MAESTRO_USUARIO ON (PROVEEDORES.MAESTRO_USUARIO_ID = MAESTRO_USUARIO.MAESTRO_USUARIO_ID)
 WHERE
 PROVEEDORES.PROVEEDOR_ID = :ID_PROVEEDOR
INTO
  :PROVEEDOR_ID,
  :PROVEEDOR,
  :RTN,
  :CREADO_POR,
  :FECHA_CLAS,
  :PRECIO,
  :CUMPLIMIENTO,
  :DISPONIBILIDAD,
  :TIEMPO_ENTREGA
DO
 BEGIN
     --Agregar nuevo Registro Historico
       INSERT INTO HIST_EVA_PROVEE(HIST_ID, PROVEEDOR_ID, PROVEEDOR, RTN, CREADO_POR, FECHA_CREACION, PRECIO, CUMPLIMIENTO, DISPONIBILIDAD, TIEMPO_ENTREGA)
      VALUES (0, :PROVEEDOR_ID, :PROVEEDOR, :RTN, :CREADO_POR, :FECHA_CLAS, :PRECIO, :CUMPLIMIENTO, :DISPONIBILIDAD, :TIEMPO_ENTREGA);
  END
 END;

me Presenta este Mensaje de error:

Invalid Token
Invalid Request BLR at offset 68.
Procedure SP_HIST_EVA_PROVEE is no selectable(it does not contain a SUSPEND Statement)


esperando de Su Ayuda.

Gracias

Casimiro Notevi 13-12-2011 00:28:18

Pues, así por encima, diría que el mensaje informa de que no has puesto un "suspend", concretamente aquí, al final:
Código SQL [-]
  DO
  BEGIN     --Agregar nuevo Registro Historico     
    INSERT INTO HIST_EVA_PROVEE(HIST_ID, PROVEEDOR_ID, PROVEEDOR, RTN, 
                                                CREADO_POR, FECHA_CREACION, PRECIO, CUMPLIMIENTO, DISPONIBILIDAD, TIEMPO_ENTREGA)
    VALUES (0, :PROVEEDOR_ID, :PROVEEDOR, :RTN, :CREADO_POR, :FECHA_CLAS, :PRECIO, :CUMPLIMIENTO, :DISPONIBILIDAD, :TIEMPO_ENTREGA);

    SUSPEND;    /*   <<--------------    */

  END
END

DasGrun 13-12-2011 17:04:19

Gracias Casimiro, he modificado el Codigo,

ahora tengo este Mensaje de error:

Arthmetic overflow or division by zero or haz ocurred aritmetic exception, numeric owerflow or string trunation. At procedure SP_HIST_EVA_PROVEE line 16


este es el codigo de la creacion de la Tabla HIST_EVA_PROVEE:

Código SQL [-]
CREATE TABLE HIST_EVA_PROVEE (
  HIST_ID BIGINT NOT NULL,
  PROVEEDOR_ID SMALLINT,
  RTN VARCHAR(10) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  PROVEEDOR DESCRIPTION,
  CREADO_POR DESCRIPTION,
  FECHA_CREACION FECHA,
  PRECIO CLASIFICACION,
  CUMPLIMIENTO CLASIFICACION,
  DISPONIBILIDAD CLASIFICACION,
  TIEMPO_ENTREGA CLASIFICACION,
  CALCULADO COMPUTED BY (((PRECIO + CUMPLIMIENTO + DISPONIBILIDAD + TIEMPO_ENTREGA) / 16) * 100),
  EVALUACION COMPUTED BY (iif((CALCULADO >= 0) and (CALCULADO <60), 'DEFICIENTE',
    (iif((CALCULADO >59) and (CALCULADO <80), 'BUENO', iif((CALCULADO >79) and (CALCULADO <90), 'MUY BUENO', iif((CALCULADO >89), 'EXCELENTE', '')))))));


ALTER TABLE HIST_EVA_PROVEE ADD PRIMARY KEY (HIST_ID);


SET TERM ^ ;

CREATE TRIGGER BI_HIST_EVA_PROVEE FOR HIST_EVA_PROVEE
ACTIVE BEFORE INSERT
POSITION 0
AS
BEGIN
  IF (NEW.HIST_ID IS NULL OR NEW.HIST_ID = 0) THEN
      NEW.HIST_ID = GEN_ID(HIST_EVA_PROVEE_HIST_ID_GEN, 1);
END^

SET TERM ; ^

Gracias Nuevamente

Casimiro Notevi 13-12-2011 17:34:22

Pero eso es otro procedure.
Recuerda nuestra guía de estilo, preguntas distintas en hilos distintos.

DasGrun 13-12-2011 21:52:36

No es otro Procedure es el Mismo. siempre Utilizando el SP del Inicio, luego que realize los cambios que me dijo, me produce este Mensaje de error,

Gracias

Casimiro Notevi 13-12-2011 21:58:45

Ejecuta cada parte por separado, para ver dónde está el problema.
Primero el create table. Si no hay error, entonces el alter table. Y así, uno a uno.

guillotmarc 13-12-2011 22:30:23

Hola.

Como dice el mensaje de error. En algún momento ocurre un overflow numérico, una división por cero, una excepción numérica o un truncamiento de cadena.

Lo más habitual suele ser el último caso (truncamiento de cadena), aunque no puedes descartar los otros hasta revisar todas las operaciones aritméticas que se hacen y todos los tipos implicados.

Resumiendo, o bien en algún momento haces una división de algo dividido por cero (que matemáticamente es infinito y por tanto no es manejable en ninguna variable), o bien intentas asignar a una variable un tipo numérico con más precisión del que el tipo de la variable te permite, o bien intentas asignar a una variable una cadena más larga que el tipo en el que está definida la variable.

Tienes que revisar los tipos de los campos de la tabla PROVEEDORES para ver si caben en los tipos de las variables que has definido para ellos en el procedimiento almacenado.

Saludos.

DasGrun 13-12-2011 23:46:20

Gracias Por Su Ayuda,

Tenias la razón Guillotmarc, es truncamiento de cadena en los campos de RTN, Origen de Varchar 20, y en la tabla destino había Varchar 10, esto me estaba complicando.

Gracias Nuevamente.


La franja horaria es GMT +2. Ahora son las 08:20:17.

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