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)
-   -   Procedimiento almacenado con consultas distintas (https://www.clubdelphi.com/foros/showthread.php?t=24005)

VRO 04-08-2005 19:26:01

Procedimiento almacenado con consultas distintas
 
Hola, haber si vosotros me resolveís esta duda,
seguro que si ya que siempre lo haceis.


Tengo un procedimiento almacenado con varias
consultas independientes, es decir, tengo un bloque
FOR....DO con un begin end; dentro del dicho
begin end + código;., y despues tengo otro bloque FOR DO
, con su correspondiente begin end
y su codigo; y al final de los 2 bloques un suspend.

Lo que pretedo comentaros es que no puedo meter el 2º bloque
dentro del primero, porque son consultas que no estan relacionadas.
Yo pretendo que de una llamada al procedimiento me saque todos los resultados de una y de ptra consulta.

No se si me he explicado con claridad. Os pongo el código a continuacion

Código Delphi [-]
 SET TERM!!;
CREATE PROCEDURE PLANNING (FI DATE, FF DATE)
 RETURNS(COD_R INTEGER,NOMBRE_CLIR VARCHAR(50),
NOMBRE_EMPR VARCHAR(50),FECHAIR DATE,FECHAFR DATE,
FECHA_SUSR DATE,REGIMENR VARCHAR(20),ENTRADA_REGR
 VARCHAR(10),ADULTOR INTEGER,NINOR INTEGER,BEBER 
INTEGER,COD_HABR INTEGER,ESTADOR VARCHAR(20),
COD_HABE INTEGER,REGIMENE VARCHAR(20),DEPOSITO
 INTEGER,FIE DATE,FFE DATE, NOMBRE_CLIE VARCHAR(50)
,NOMBRE_EMPE VARCHAR(50))
AS
 DECLARE VARIABLE CLI VARCHAR(50);
 DECLARE VARIABLE EMP VARCHAR(50);
 DECLARE VARIABLE CLIE VARCHAR(50);
 DECLARE VARIABLE EMPE VARCHAR(50);
 DECLARE VARIABLE COD_RE INTEGER;
BEGIN

  FOR SELECT DISTINCT RESERVA.COD_R,RESERVA.FECHAI,
RESERVA.FECHAF,
RESERVA.FECHA_SUS,REGIMEN.TIPO,RESERVA.ENTRADA_REG,
RESERVA.ADULTO,RESERVA.NINO,RESERVA.BEBE,RESERVA.ESTADO
,HAB_RESERVADA.COD_HAB,RESERVA.DIFMES,
HAB_RESERVADA.HABOBLI
  FROM RESERVA,CLIENTE,EMPRESA,REGIMEN,HAB_RESERVADA
  WHERE RESERVA.COD_R=HAB_RESERVADA.COD_R
  AND RESERVA.COD_REG=REGIMEN.COD_REG
  AND ((RESERVA.FECHAI>=:FI) AND (RESERVA.FECHAF<=:FF)) 
OR ((RESERVA.DIFMES>=:FI) AND (RESERVA.DIFMES<=:FF))
  ORDER BY RESERVA.FECHAI,RESERVA.DIFMES ASC  INTO :COD_R,:FECHAIR,:FECHAFR,
:FECHA_SUSR,:REGIMENR,
:ENTRADA_REGR,:ADULTOR,:NINOR,:BEBER,
:ESTADOR,:COD_HABR DO
     BEGIN
                      SELECT CLIENTE.NOMBRE
                      FROM RESERVA, CLIENTE
                      WHERE CLIENTE.COD_CLI=RESERVA.COD_CLI
                      AND CLIENTE.LETRA_CLI=RESERVA.LETRA_CLI
                      AND RESERVA.COD_R=:COD_R
                      INTO :CLI;
                       IF (:CLI<>'') THEN
                         NOMBRE_CLIR=:CLI;
                       ELSE
                         NOMBRE_CLIR='';
                         
                     SELECT EMPRESA.NOMBRE
                     FROM RESERVA,EMPRESA
                     WHERE RESERVA.COD_EMP=EMPRESA.COD_EMP
                     AND EMPRESA.LETRA_EMP=EMPRESA.LETRA_EMP
                     AND RESERVA.COD_R=:COD_R
                     INTO :EMP;
                     
                     IF (:EMP<>'') THEN
                        NOMBRE_EMPR=:EMP;
                     ELSE
                      NOMBRE_EMPR='';

                END
 FOR  SELECT ESTANCIA.COD_HAB,ESTANCIA.FECHAI,
ESTANCIA.FECHAF,
ESTANCIA.DEPOSITO,ESTANCIA.COD_R
  FROM ESTANCIA,REGIMEN
  WHERE ESTANCIA.COD_REG=REGIMEN.COD_REG
  AND ((ESTANCIA.FECHAI>=:FI) AND (ESTANCIA.FECHAF<=:FF))
OR ((ESTANCIA.DIFMES>=:FI) AND (ESTANCIA.DIFMES<=:FF))
  ORDER BY ESTANCIA.FECHAI ASC
  INTO :COD_HABE,:FIE,:FFE,:DEPOSITO,:REGIMENE,:COD_RE DO
    BEGIN
                      SELECT CLIENTE.NOMBRE
                      FROM ESTANCIA, CLIENTE
                      WHERE CLIENTE.COD_CLI=ESTANCIA.COD_CLI
                      AND ESTANCIA.COD_R=:COD_RE
                      INTO :CLIE;
                       IF (:CLIE<>'') THEN
                         NOMBRE_CLIE=:CLIE;
                       ELSE
                         NOMBRE_CLIE='';

                     SELECT EMPRESA.NOMBRE
                     FROM ESTANCIA,EMPRESA
                     WHERE ESTANCIA.COD_EMP=EMPRESA.COD_EMP
                     AND ESTANCIA.COD_R=:COD_RE
                     INTO :EMPE;

                     IF (:EMPE<>'') THEN
                        NOMBRE_EMPE=:EMPE;
                     ELSE
                      NOMBRE_EMPE='';

    END
        SUSPEND;
END!!
SET TERM;!!

El error que me da cuando ejecuto esto es:SQL error code =-313
"count of column list and variable list do not match"

¿Cual sería la solución?¿Será que no lo puedo hacerlo en un sólo procedimiento?

Por favor espero su respuesta.
Gracias antetodo por su ayuda.

Osorio 05-08-2005 15:37:29

El inconveniente es que la cantidad de campos seleccionados supera la cantidad de variables.

si miras el primer bloque For SELECT encuentras que estas seleccionando 13 campos y cuando dices INTO solo tienes 10 variales donde almacenar la informacion.

La solucion es tener en la seccion INTO tantas variables como campos seleccionados.

En el siguiente ejemplo selecciona tres campos y los guarda en 3 variables.

FOR SELECT IDEMPLEADO, EMPLEADO, DIRECCION
FROM TBL_EMPLEADOS
WHERE IDEMPLEADO = '50935257'
INTO :CODIGO, :NOMBRE, :DOMICILIO

Espero haberte servido.

Saludos,

VRO 05-08-2005 16:13:13

Ciertamente he puesto tantos campos que me habís perdido.

Gracias Osorio hallaste mi estupido error.


Thankssssssss


La franja horaria es GMT +2. Ahora son las 10:23:10.

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