Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-08-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 23
VRO Va por buen camino
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,EPOSITO,: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.

Última edición por VRO fecha: 04-08-2005 a las 19:32:50.
Responder Con Cita
  #2  
Antiguo 05-08-2005
Avatar de Osorio
Osorio Osorio is offline
Miembro
 
Registrado: may 2003
Ubicación: Colombia
Posts: 252
Poder: 24
Osorio Va por buen camino
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, OMICILIO

Espero haberte servido.

Saludos,
Responder Con Cita
  #3  
Antiguo 05-08-2005
VRO VRO is offline
Miembro
 
Registrado: abr 2004
Posts: 230
Poder: 23
VRO Va por buen camino
Ciertamente he puesto tantos campos que me habís perdido.

Gracias Osorio hallaste mi estupido error.


Thankssssssss
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:22: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
Copyright 1996-2007 Club Delphi