Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Stored Procedure con un If después de un Select

Hola Compañer@s !

No me aclaro con esto de los Stored Procedures en Interbase.

Quiero más o menos crear esta Stored Procedure :
Código SQL [-]
begin
  Select BOJ.BOOKINGNO
  from BOOKINGS_OBJECTS BOJ
  left join BOOKINGS BO
    on BO.BOOKINGNO = BOJ.BOOKINGNO
  where
    BOJ.BUILDINGNO = :"BUILDING_NO" and
    BOJ.OBJECTNO = :"OBJECT_NO" and 
    BOJ.DATETO <= :"DATE_SP" and
    BO.STATUS = 3
    Into BOOK_NO;
  if (not BOJ.BOOKINGNO is Null) then 
    SUSPEND;
  else begin
    Select BOJ.BOOKINGNO 
    from BOOKINGS_OBJECTS BOJ
    left join BOOKINGS BO
      on BO.BOOKINGNO = BOJ.BOOKINGNO
    where
      BOJ.BUILDINGNO = :"BUILDING_NO" and
      BOJ.OBJECTNO = :"OBJECTNO" and
      BOJ.DATEFROM >= :"DATE_SP" and
      BOJ.DATETO <= :"DATE_SP" and
      BO.STATUS <= 2
      Into BOOK_NO;
  end
end

Pero me da error en la línea subrayada.

Lo que quiero hacer es buscar un registro determinado, pero si no cumple la condición que pregunto después (en mi caso concreto, si se produjo un EOF del primer Select), ejecutar otro Select diferente con otras condiciones para devolver un valor diferente.

Lo que necesito es saber como preguntar si el primer Select encontró o no un registro (o varios), y en caso contrario (preguntando por EOF ? ), sjecutar el segundo Select con otras condiciones.

Gracias por vuestra ayuda.
__________________
Piensa siempre en positivo !
Responder Con Cita
  #2  
Antiguo 08-08-2007
Avatar de eduarcol
[eduarcol] eduarcol is offline
Miembro Premium
 
Registrado: ago 2003
Ubicación: En los estados Zulia y Merida de Venezuela
Posts: 4.151
Poder: 25
eduarcol Va por buen camino
Aclarando que no tengo mucha experiencia en el asunto de los SP yo trabajo directamente sobre la variable del resultado

o sea if (not Book_No is Null) then

pues quizas sea una idea sin sentido....
__________________
...Yo naci en esta ribera del arauca vibr@d0r
Soy hermano de la espuma,
de la garza, de la rosa y del sol...
Viva Venezuela
Responder Con Cita
  #3  
Antiguo 08-08-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
En un procedure el suspend devuelve los resultados

en este caso
Código SQL [-]
FOR Select BOJ.BOOKINGNO
  from BOOKINGS_OBJECTS BOJ
  left join BOOKINGS BO
    on BO.BOOKINGNO = BOJ.BOOKINGNO
  where
    BOJ.BUILDINGNO = :"BUILDING_NO" and
    BOJ.OBJECTNO = :"OBJECT_NO" and 
    BOJ.DATETO <= :"DATE_SP" and
    BO.STATUS = 3
    Into BOOK_NO 
do suspend;
Te devolvería los registros encontrados y además creo que el concepto del EOF es esquivoco.
FOR xxx DO hace que accedas a cada valor del select y tal como cita eduarcol has de preguntar a los valores hallados (:BOOk_NO)
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO

Última edición por ArdiIIa fecha: 08-08-2007 a las 18:01:00.
Responder Con Cita
  #4  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Gracias a los dos por responder.

De momento me lo acepta así
Código SQL [-]
begin
  for Select BOJ.BOOKINGNO
  from BOOKINGS_OBJECTS BOJ
  left join BOOKINGS BO
    on BO.BOOKINGNO = BOJ.BOOKINGNO
  where
    BOJ.BUILDINGNO = :"BUILDING_NO" and
    BOJ.OBJECTNO = :"OBJECT_NO" and 
    BOJ.DATETO <= :"DATE_SP" and
    BO.STATUS = 3
    Into BOOK_NO
  do
    begin
      if (not :"BOOK_NO" is Null) then
        SUSPEND;
      else begin
        Select BOJ2.BOOKINGNO 
        from BOOKINGS_OBJECTS BOJ2
        left join BOOKINGS BO2
          on BO2.BOOKINGNO = BOJ2.BOOKINGNO
        where
          BOJ2.BUILDINGNO = :"BUILDING_NO" and
          BOJ2.OBJECTNO = :"OBJECT_NO" and
          BOJ2.DATEFROM >= :"DATE_SP" and
          BOJ2.DATETO <= :"DATE_SP" and
          BO2.STATUS <= 2
          Into BOOK_NO;
      end
    end
end

Ahora tengo que probar si me hace correctamente lo que quiero obtener
__________________
Piensa siempre en positivo !
Responder Con Cita
  #5  
Antiguo 08-08-2007
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Código SQL [-]
 else begin
        FOR Select BOJ2.BOOKINGNO 
        from BOOKINGS_OBJECTS BOJ2
        left join BOOKINGS BO2
          on BO2.BOOKINGNO = BOJ2.BOOKINGNO
        where
          BOJ2.BUILDINGNO = :"BUILDING_NO" and
          BOJ2.OBJECTNO = :"OBJECT_NO" and
          BOJ2.DATEFROM >= :"DATE_SP" and
          BOJ2.DATETO <= :"DATE_SP" and
          BO2.STATUS <= 2
          Into BOOK_NO
        do suspend;
      end

Si la primera falla, devuelveme lo segundo....
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #6  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Pues no, no funciona !

Debo entender que para aquellos registros que no cumplen la primera condición, al hacer un Select, si no encuentra ninguno que cumpla la condición impuesta para el primer Select, (repito) al no haber ningún registro válido, tampoco me ejecuta el bloque de después dentro del 'Do', ese decir, el siguiente Select con la nueva condición.

Es por ello, que para los registros que cumplen la primera condición si me devuelve el valor que quiero correctamente, pero para los que no cumplen esa primera condición no me devuelve nada (=null) ya que de hecho no entra al segundo Select.

Por ello os pido de nuevo ayudita !
__________________
Piensa siempre en positivo !
Responder Con Cita
  #7  
Antiguo 08-08-2007
Avatar de gluglu
[gluglu] gluglu is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Málaga - España
Posts: 1.455
Poder: 21
gluglu Va por buen camino
Ya parece que sí funciona !

Código SQL [-]
begin

  Select BOJ.BOOKINGNO
  from BOOKINGS_OBJECTS BOJ
  left join BOOKINGS BO
    on BO.BOOKINGNO = BOJ.BOOKINGNO
  where
    BOJ.BUILDINGNO = :"BUILDING_NO" and
    BOJ.OBJECTNO = :"OBJECT_NO" and 
    BOJ.DATETO <= :"DATE_SP" and
    BO.STATUS = 3
    Into BOOK_NO;

  if (not :"BOOK_NO" is Null) then
    SUSPEND;
  else begin

    Select BOJ2.BOOKINGNO 
    from BOOKINGS_OBJECTS BOJ2
    left join BOOKINGS BO2
      on BO2.BOOKINGNO = BOJ2.BOOKINGNO
    where
      BOJ2.BUILDINGNO = :"BUILDING_NO" and
      BOJ2.OBJECTNO = :"OBJECT_NO" and
      BOJ2.DATEFROM <= :"DATE_SP" and
      BOJ2.DATETO >= :"DATE_SP" and
      BO2.STATUS <= 2
      Into BOOK_NO;
    SUSPEND;

  end

end
__________________
Piensa siempre en positivo !
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Stored Procedure,Triggers Io Firebird e Interbase 8 08-01-2007 16:17:55
Problema con stored procedure dape Firebird e Interbase 11 20-10-2005 05:13:23
Ver los Stored Procedure tgsistemas SQL 0 06-04-2004 17:18:22
Stored Procedure tgsistemas SQL 1 27-02-2004 13:10:33
problema con stored procedure Markoz Firebird e Interbase 8 27-06-2003 13:46:31


La franja horaria es GMT +2. Ahora son las 06:56:45.


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
Copyright 1996-2007 Club Delphi