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)
-   -   XSQLDA Index out of range (https://www.clubdelphi.com/foros/showthread.php?t=22595)

RESP 3.0 21-06-2005 06:59:37

XSQLDA Index out of range
 
Mucha me da este error al momento de ejecutar un procedimiento almacenado utilizo: D6, FB, 1.5.2, IBX 6.08, y la verdad no doy por que me da este error, ya probe eliminando y volviendo a colocar el componente y haciendo lo mismo en la BD y no puedo resolverlo.

Gracias por su ayuda

cahp 21-06-2005 11:46:29

Hola

Si lo ejecutas dirctamente en la BD, tambien te da el error?

Saludos.

RESP 3.0 21-06-2005 16:26:42

Fijate que solamente me da al ejecutarlo desde delphi y lo he hecho con muchos procedimientos este es el codigo.


Código SQL [-]
  
SET TERM ^ ;
CREATE PROCEDURE SER_CALCULA_PRECIO_MANO_OBRA(
    MANO_OBRA INTEGER,
    TIPO_PRECIO CHAR(2))
RETURNS (
    PRECIO_VENTA NUMERIC(15,2))
AS
   DECLARE VARIABLE VCOSTO DECIMAL(15,2);
   DECLARE VARIABLE VFACTOR DECIMAL(15,4);
   DECLARE VARIABLE VPRECIO DECIMAL(15,2);
   DECLARE VARIABLE VBASE_PRECIO CHAR(1);
   DECLARE VARIABLE VTIPO CHAR(1);
   DECLARE VARIABLE VVALOR NUMERIC(15,2);
   DECLARE VARIABLE VPORCENTAJE NUMERIC(15,2);
   DECLARE VARIABLE VVALOR_BASE NUMERIC(15,2);
begin
  SELECT COSTO_HORA, FACTOR_GANANCIA, PRECIO_HORA
  FROM SER_MANO_OBRA
  WHERE CODIGO = :MANO_OBRA
  INTO :VCOSTO, :VFACTOR, :VPRECIO;
  PRECIO_VENTA = 0.0;
  IF (VPRECIO = 0) THEN
  BEGIN
     IF (VFACTOR > 1) THEN
        PRECIO_VENTA = REDONDEAR(VCOSTO * VFACTOR,2);
     ELSE           
       IF (VFACTOR < 1) THEN
          PRECIO_VENTA = REDONDEAR(VCOSTO / VFACTOR,2);
       ELSE
          PRECIO_VENTA = VCOSTO;
  END
  ELSE
     PRECIO_VENTA = :VPRECIO;
  IF (RTRIM(:TIPO_PRECIO) <> '') THEN
  BEGIN
      SELECT BASE_COSTO_PRECIO, TIPO, PORCENTAJE, 0.0
      FROM FAC_TIPO_PRECIO
      WHERE (CODIGO = :TIPO_PRECIO)
      INTO :VBASE_PRECIO, :VTIPO, :VPORCENTAJE, :VVALOR;
      IF ((:VVALOR = 0) AND (RTRIM(:VBASE_PRECIO) <> '') AND (RTRIM(:VTIPO) <> '')) THEN
      BEGIN
          IF (:VBASE_PRECIO = 'C') THEN
             VVALOR_BASE = :VCOSTO;
          IF (:VBASE_PRECIO = 'P') THEN
             EXECUTE PROCEDURE SER_CALCULA_PRECIO_MANO_OBRA :MANO_OBRA, ' ' RETURNING_VALUES :VVALOR_BASE;
             
          IF (VTIPO = '+') THEN
             PRECIO_VENTA = :VVALOR_BASE + REDONDEAR(:VVALOR_BASE * (:VPORCENTAJE / 100),2);
          IF (VTIPO = '-') THEN
             PRECIO_VENTA = :VVALOR_BASE - REDONDEAR(:VVALOR_BASE * (:VPORCENTAJE / 100),2);
      END
      ELSE
         PRECIO_VENTA = :VVALOR;
   END
   PRECIO_VENTA = REDONDEAR(PRECIO_VENTA,2);
  suspend;
end
^
SET TERM ; ^
y la forma de ejecutarlo es la siguiente:

Código:


function TdmServicio_Proc.Calcula_Precio_Mano_Obra(Mano_Obra : LongInt; Tipo_Precio : String) : Double;
begin
  SPCalcula_Precio_Mano_Obra.ParamByName('MANO_OBRA').Value := Mano_Obra;
  SPCalcula_Precio_Mano_Obra.ParamByName('TIPO_PRECIO').Value := Tipo_Precio;
  SPCalcula_Precio_Mano_Obra.ExecProc;
  Result := SPCalcula_Precio_Mano_Obra.ParamByName('PRECIO_VENTA').Value;
end;

No entiendo he hecho esto un sin numero de veces y nunca me habia dado este error, y al buscar el la web es muy poca la informacion que aparece sobre esto.

Hasta pronto

RESP 3.0 21-06-2005 17:32:16

Asunto resuelto
 
Señores encontre MI problema y es que el mensaje de error da cuando se define un procedimiento con n parametros y se ejecuta con mas de esos parametros, a mi me paso porque lo defini cuando estaba conectado a una BD y luego lo ejecute sobre otra base de datos (sin percatarme) y bueno ese fue mi gran error.

Gracias y hasta luego

kikecg 02-02-2006 10:34:25

Mismo error, diferente solución
 
Hola.

Yo me he encontrado con el mismo error al hacer un Insert, sin ningún procedimiento de por medio.

Desde Delphi aparecía el mismo error, desde IBExpert, por ejemplo, se ejecutaba la sentencia correctamente.

El problema era que la sentencia en Delphi se ejecutaba desde un TIBQuery. Cambiando este componente por un TIBSQL, la misma sentencia se ejecuta sin problemas.

Saludos a tod@s.

fcios 15-12-2006 15:14:34

A mi me ocurrio cuando no tenia definido el procedimiento almacenado, no se porque no me mostraba el error comun de "procedimiento desconocido", y a su vez me faltaba actualizar la sentencia SQL de WHERE en el componente ya que le habia agregado un campo mas a la clave primaria.
Saludos


La franja horaria es GMT +2. Ahora son las 01:07:05.

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