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 "multiple rous in singleton select" (https://www.clubdelphi.com/foros/showthread.php?t=60644)

Lupita 08-10-2008 19:42:03

Procedimiento "multiple rous in singleton select"
 
en el siguientes esmas facil

Lupita 08-10-2008 21:37:05

mas simple
 
bueno como mando este query a un procedimiento

Código SQL [-]
SELECT OC.FECHA,  OC.CONCEPTO2,VT.folio factura,
       OC.REFERENCIA, OC.DEBE, OC.HABER,
       OC.FOLIO,  OC.TAG,CSB.caption,OC.TIPOMOV
FROM OC inner join CC on OC.CVECUENTA=CC.C_CLAVE
                      inner join CSB on CSB.tag= OC.TAG
                      inner join VT on VT.clave= OC.CONCEPTO2
 wHERE OC.SUJETO =  '00000102'
      AND OC.Fecha between '01/01/2008' and '12/31/2008'
      AND OC.CVECUENTA = 4
      and OC.tag not in(356,440,434,550,206,525)

union all
SELECT OC.FECHA,  OC.CONCEPTO2,VT.folio factura,
       OC.REFERENCIA, OC.DEBE, OC.HABER,
       OC.FOLIO,  OC.TAG,CSB.caption,OC.TIPOMOV
FROM OC inner join CC on OC.CVECUENTA=CC.C_CLAVE
                      inner join CSB on CSB.tag= OC.TAG
                      inner join AM on AM.clavemov= OC.REFERENCIA
                      inner join AMdetalle on(AM.cons=AMdetalle.claveaplica)
                      inner join PPaux on PPaux.clave=AMdetalle.clavePPaux
                      inner join PP on(PP.clave=PPaux.clavePP)
                      inner join VT on VT.clave= PP.clvVT
WHERE OC.SUJETO =  '00000102'
      AND OC.Fecha between '01/01/2008' and '12/31/2008'
      AND OC.CVECUENTA = 4
      and OC.tag not in(356,440,434,550,206,525)

ORDER BY 1, 3

en donde el resultado son las columnas y las variables de entreda son
'00000102' y el rango de fecha como le hago?

jhonny 09-10-2008 13:56:23

Bueno, aunque no repare la logica del mismo apuesto que esto te puede servir...

Código SQL [-]
 
CREATE PROCEDURE NOMBRE_PROCEDIMIENTO (
    SUJETO varchar(10),
    FECHA_INICIAL date,
    FECHA_FINAL date)
returns (
    FECHA date,
    CONCEPTO2 varchar(10),
    FOLIO varchar(10),
    REFERENCIA varchar(255),
    DEBE double precision,
    HABER double precision,
    FOLIO_2 varchar(10),
    TAG integer,
    CAPTION varchar(255),
    TIPMOV varchar(10))
as
begin
  for SELECT OC.FECHA,  OC.CONCEPTO2,VT.folio factura,
       OC.REFERENCIA, OC.DEBE, OC.HABER,
       OC.FOLIO,  OC.TAG,CSB.caption,OC.TIPOMOV
  FROM OC inner join CC on OC.CVECUENTA=CC.C_CLAVE
                      inner join CSB on CSB.tag= OC.TAG
                      inner join VT on VT.clave= OC.CONCEPTO2
  WHERE OC.SUJETO =  :SUJETO
      AND OC.Fecha between :FECHA_INICIAL and :FECHA_FINAL
      AND OC.CVECUENTA = 4
      and OC.tag not in(356,440,434,550,206,525)
  union all
  SELECT OC.FECHA,  OC.CONCEPTO2,VT.folio factura,
         OC.REFERENCIA, OC.DEBE, OC.HABER,
         OC.FOLIO,  OC.TAG,CSB.caption,OC.TIPOMOV
  FROM OC inner join CC on OC.CVECUENTA=CC.C_CLAVE
                      inner join CSB on CSB.tag= OC.TAG
                      inner join AM on AM.clavemov= OC.REFERENCIA
                      inner join AMdetalle on(AM.cons=AMdetalle.claveaplica)
                      inner join PPaux on PPaux.clave=AMdetalle.clavePPaux
                      inner join PP on(PP.clave=PPaux.clavePP)
                      inner join VT on VT.clave= PP.clvVT
  WHERE OC.SUJETO =  :SUJETO
      AND OC.Fecha between :FECHA_INICIAL and :FECHA_FINAL
      AND OC.CVECUENTA = 4
      and OC.tag not in(356,440,434,550,206,525)
  ORDER BY 1, 3
  INTO :FECHA, :CONCEPTO2, :FOLIO, :REFERENCIA, :DEBE, :HABER, :FOLIO_2,
  :TAG, :CAPTION, :TIPMOV
  do
  begin
    suspend;
  end
end

NOTA: Por favor usa siempre las etiquetas necesarias, para que tu codigo se entienda mejor...

lbuelvas 09-10-2008 21:08:14

El emnsaje "multiple rous in singleton select" aparece cuando en un procedimiento almacenado haces un "select...into", es decir, una consulta que arroja resultados a un conjunto de variables y el conjunto de regsitros retornado por el select es mayor a uno (> 1).

Si estas utilzandolo dentro de un for select ... no habria problema, pero me imagino que lo estas utilizando fuera de una clausula for select.

Lo que pasa es que las variables esperan recibir un valor o ningun valor (considerando que la consulta no arroja resultados entonces llegarian nulos a las variables).

Pero cuando una consulta arroja mas de un registro el procedimiento almacenado no puede continuar y te arroja ese mensaje, por tanto, debes garantizar que tu consulta envie siempre un unico registro, de lo contrario el procedimiento en algunas situaciones funcionara bien y en otras situaciones no.


La franja horaria es GMT +2. Ahora son las 06:22:31.

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