Advertisement
Guest User

Funcion Recursiva

a guest
Mar 5th, 2012
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. CREATE OR REPLACE FUNCTION obtener_stock_desde_barcode ( IN codigo_barras bigint,
  2.                                      OUT disponible double precision)
  3. RETURNS double precision AS $$
  4. DECLARE
  5.     list record;
  6.     sub_list record;
  7.     query text;
  8.  
  9.     menor_l double precision;
  10.     unidades_l int4;
  11.     contador_l int4;
  12.    
  13.     tipo_l int4;
  14.     derivada_l int4;
  15.     compuesta_l int4;
  16.     corriente_l int4;
  17.    
  18.     cant_mud_l double precision;
  19.     stock_l double precision;
  20. BEGIN
  21.         -- Se obtiene el id del tipo de mercadería
  22.     SELECT id INTO compuesta_l FROM tipo_mercaderia WHERE UPPER(nombre) LIKE 'COMPUESTA';
  23.     SELECT id INTO corriente_l FROM tipo_mercaderia WHERE UPPER(nombre) LIKE 'CORRIENTE';
  24.  
  25.     -- Se obtiene el tipo de mercadería del producto consultado
  26.     SELECT tipo INTO tipo_l FROM producto WHERE barcode = codigo_barras;
  27.    
  28.     disponible := 0; -- Es el stock disponible
  29.  
  30.     -- SI LA MERCADERÍA ES COMPUESTA
  31.     IF (tipo_l = compuesta_l) THEN
  32.  
  33.        -- Se obtiene los componentes del producto
  34.        query := $S$ SELECT * FROM componente_mc WHERE barcode_madre = $S$ || codigo_barras;
  35.  
  36.        contador_l := 0;
  37.        menor_l := 0;
  38.  
  39.        -- Se obtiene el stock de sus componentes para ver cuantos alcanzan
  40.        FOR list IN EXECUTE query LOOP
  41.  
  42.                -- Si el componente es una mercadería corriente
  43.            IF (list.tipo_comp_der = corriente_l) THEN
  44.               stock_l := (SELECT stock FROM producto WHERE barcode = list.barcode_comp_der);
  45.               unidades_l := stock_l / list.cant_mud;
  46.  
  47.            -- Si el componente es una mercadería compuesta
  48.            ELSIF (list.tipo_comp_der = compuesta_l) THEN
  49.               stock_l := (SELECT disponible FROM obtener_stock_desde_barcode (list.barcode_comp_der));
  50.               unidades_l := stock_l / list.cant_mud;
  51.            END IF;
  52.  
  53.            -- Elige la cantidad menor como su stock
  54.            IF (contador_l = 0 OR menor_l > unidades_l) THEN
  55.               menor_l := unidades_l;         
  56.            END IF;
  57.  
  58.            contador_l := contador_l + 1;
  59.  
  60.        END LOOP;
  61.  
  62.         -- SI LA MERCADERIA CONSULTADA ES CORRIENTE
  63.     ELSIF (tipo_l = corriente_l) THEN
  64.        disponible := (SELECT stock FROM producto WHERE barcode = codigo_barras);
  65.     END IF;
  66.  
  67. RETURN; -- Retorna el valor de "disponible"
  68. END; $$ language plpgsql;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement