Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   MS SQL Server (https://www.clubdelphi.com/foros/forumdisplay.php?f=23)
-   -   Ctrl Flujo en Transact SQL (https://www.clubdelphi.com/foros/showthread.php?t=77090)

Cabanyaler 20-12-2011 10:56:52

Ctrl Flujo en Transact SQL
 
Hola amigos, una duda que he probado mil veces y no consigo implementar con éxito y no me reporta ningún tipo de error de sintaxis, ni en compilación, ni en el servidor SQL Server.

Deseo por medio de una llamada a un Store Procedure SP, la ejecución de un código o parte del mismo controlándolo con sentencias IF.
En otras ocasiones he mandado un parametro de tipo bit y con una sentencia IF ELSE al ser los tipos de valor a tomar por el tipo bit [0,1] ha funcionado, pero con el siguiente SP, no lo consigo.
Mi duda es si puedo utilizar dentro del Transct-SQL y en sus sentencias IF valores pasados por parámetro, en este ejemplo el @TipoInforme para este cometido que se observa en el código.
El tipo del parámetro en el ADOSP es ftString, mientras que en en lado servidor dentro del SP como se observa es del tipo char.
Lo he probado también con tipo Varchar(1) en el SP, e incluso en el modo int en el servidor y como ftInteger en el ADOSP, pero tampoco me funcionó.

Si sabéis como condicionar el flujo dentro del SP a raíz del valor de algun parámetro, en este ejemplo el @TipoInforme, os lo agradecería.

Código SQL [-]
/* Retorna tots els articles i tots els seus atributs d'un centre
A rao del valor del parametre  @TipoInforme retorna:
@TipoInforme = 0 Articles que tenen el valor del preu mitjà  = 0
@TipoInforme = 1 Articles que tenen el valor del preu mitjà <> 0
@TipoInforme = 2 Tots els Articles independientment del valor del preu mitjà */

CREATE PROCEDURE ADOSP_InventarioArticulos
@TipoInforme char, @Centro_sp varchar(3)
AS

if (@TipoInforme = '0')    -- Articles que tenen el valor del preu mitjà  = 0
begin
    SELECT DISTINCT *
    FROM Artic
    WHERE
        (Pvp_art = 0) AND
        (Centro_Art = @Centro_sp)
end

else
   begin

      if (@TipoInforme = '1')    -- Articles que tenen el valor del preu mitjà <> 0
      begin
        SELECT DISTINCT *
        FROM Artic
        WHERE
            (Pvp_art <> 0   )  AND
            (Centro_Art = @Centro_sp)
      end 

      else
      begin 

         if (@TipoInforme = '2')    -- Tots els Articles independientment del valor del preu mitjà */
         begin
            SELECT DISTINCT *
            FROM Artic
            WHERE
                (Centro_Art = @Centro_sp)
         end
      
       end
   end
GO

abelg 20-12-2011 21:50:58

Hola Cabanyaler, porque mejor no planteas tu procedimiento de esta forma.
Código SQL [-]
CREATE PROCEDURE ADOSP_InventarioArticulos
@TipoInforme int, @Centro_sp varchar(3)
AS
Begin

    Select Distinct *
    from Artic
    where (
              ((Pvp_art = 0) AND
                (Centro_Art = @Centro_sp))
               and @TipoInforme = 0
             ) 
         or (
              ((Pvp_art <> 0   )  AND
                (Centro_Art = @Centro_sp))
              and @TipoInforme = 1            
             )
         or (
                (Centro_Art = @Centro_sp and @TipoInforme = 2) 
             )
end
ahora sobre tu procedure creo esta correcto, puede que sea la anidación de if lo que causa el error, pero segun se ve esta correcto.

salu2.

Cabanyaler 21-12-2011 10:50:04

Correcto!!!! Gracias. :D

Ayer por no estar más tiempo estancado con esto, "tiré por la calle del medio" y lo solucioné de otro modo. Pero esta mañana al volver a retomar la tarea he leído tu mensaje abelg y he decido que merecía la pena investigar que pasaba y probar tu sugerencia, además de ser esta más acertada por la simplicidad y quedar más escueta que la mía, y además funciona de maravilla.

¿Donde estaba el fallo? SOLUCIÓN AL CASO:
El fallo no residía, ni en los tipos, ni en el envío de los parámetros, ni mucho menos en cualquiera de los SP diseñados y presentados en este hilo, si no en el propio código del programa.
Por lo visto para que se visualicen los resultados correctamente de la ejecución de un SP que retorna un conjunto de datos mediane cualquier SELECT, los pasos en su ejecución deben ser por este orden:

1) Cierre del ADOSP
2) Asignación de los valores a los parametros
3) Apertura del ADOSP
4) Ejecución del ADOSP


El fallo lo tenía en que no cerraba el ADOSP (me saltaba el 1er paso), por lo que aunque cambiase de parametros y ejecutase otro SELECT según los IF del ADOSP, el conjunto de datos que se mostraban en el lado cliente siempre era el mismo y daba la sensación de no funcionar o siempre ejecutarse el mismo SELECT.
Al cerrar el ADOSP y seguir los pasos enumerados anteriormente, hay que ver lo bien que funciona todo.

MORALEJA DEL CUENTO:

Si !!, se pueden controlar los flujos dentro de los ADOSP en el servidor mediante bifurcaciones IF o CASE si se necesita a partir de valores pasados por parámetro, pero siempre siguiendo el orden de los pasos en azul mencionados.

Gracias a todos y en especial a abelg.
Espero sirva en un futuro a alguien este hilo... como siempre. ;)


La franja horaria es GMT +2. Ahora son las 02:38:53.

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