Hi all,

I am new to SAP / MAX DB. I am having problem with stored procedures as
I am unable to find good documentation with detailed examples.
Can anybody guide me how to use cursor inside another cursor in a stored
procedures or what could be an equivalent to the following PostgreSQL
procedure.

Thanks

Vinod

========================================================
/*It will post the O.K. items' qty. of a production slip into 
mfg_item_stock table.*/

create or replace function mfg_item_stock_post (varchar) RETURNS integer
AS'
declare
     slip ALIAS FOR $1;           -- Production Slip to be posted
     plan_qty numeric(10, 2);     -- Planned qty. for a item
     prod_qty numeric(10, 2);     -- Actual produced qty. for a item
     item_type varchar(1);        -- Item type 
     temp_stock numeric(12, 3);   
     rm varchar(25);             
     rm_gross numeric(12, 2);    
     open_items integer;
     prod_val RECORD;
     jobcard_val RECORD;
     affected_jc_val RECORD;
     bom RECORD;                
        
begin
   --
==========================================================================
   -- post the stock in mfg_item_stock table.
   FOR prod_val IN  SELECT production_dept_code, production_item_code,  
            production_item_qty FROM mfg_production_m M,
mfg_production_d D
              WHERE M.production_slip_no=D.production_slip_no
              AND M.production_qa_flag=''A''  -- Approved by QA
              AND D.item_qa_flag=''O''
              AND M.production_slip_no=slip LOOP
              
        -- ######### RM to be reduced for #########
           
        SELECT INTO item_type item_type_flag FROM mfg_item_p
        WHERE item_item_code=prod_val.production_item_code;
            
        IF item_type = ''C'' THEN   -- reduce the Raw Material for
component
           SELECT INTO rm, rm_gross, temp_stock item_raw_material,
item_rm_gross, COALESCE(stock_item_qty, 0) 
           FROM mfg_item_p, mfg_item_stock 
           WHERE
mfg_item_p.item_item_code=mfg_item_stock.stock_item_code 
           AND item_tem_code=prod_val.production_item_code;
              
           if (temp_stock - rm_gross * prod_val.production_item_qty) < 0
then 
               RAISE EXCEPTION ''There is insufficient Raw Material to
manufacture %.\nCan not post it.'', prod_val.production_item_code;
             else 
                -- ######### reduce the raw material used #########
                UPDATE mfg_item_stock SET
stock_item_qty=COALESCE(stock_item_qty, 0) - 
                                             rm_gross *
prod_val.production_item_qty 
                WHERE stock_item_code=rm 
                AND stock_dept_code=prod_val.production_dept_code;
             end if;
                
        ELSE 
          if item_type = ''F'' or item_type = ''S'' THEN   -- reduce the
components
             FOR bom IN SELECT sub_item_code, sub_item_qty FROM
mfg_bom_m 
                WHERE main_item_code=prod_val.production_item_code 
                AND bom_version=(SELECT MAX(bom_version) FROM mfg_bom_m
B 
                             WHERE
B.main_item_code=mfg_bom_m.main_item_code) LOOP 
                                 
                SELECT INTO temp_stock COALESCE(stock_item_qty, 0) FROM
mfg_item_stock 
                WHERE stock_item_code=bom.sub_item_code;
                   
                if (temp_stock - bom.sub_item_qty *
prod_val.production_item_qty) < 0 
                    then
                      RAISE EXCEPTION ''There is insufficient stock of %
to manufacture %.\nCan not post it.''
                                    , bom.sub_item_code,
prod_val.production_item_code;
                  else
                     -- ######### reduce the components used #########
                     UPDATE mfg_item_stock SET
stock_item_qty=COALESCE(stock_item_qty, 0) - 
                                     bom.sub_item_qty *
prod_val.production_item_qty 
                     WHERE stock_item_code=bom.sub_item_code 
                     AND stock_dept_code=prod_val.production_dept_code;
                  end if;
             end loop;
          end if;
        END IF;
-- ######### add the stock of item produced #########
        UPDATE mfg_item_stock SET
stock_item_qty=COALESCE(stock_item_qty, 0) +
                                                
prod_val.production_item_qty 
        WHERE stock_item_code=prod_val.production_item_code 
        AND stock_dept_code=prod_val.production_dept_code;
   end loop;

   -- ######### set the stock posting flag and date #########
   UPDATE mfg_production_m SET stock_posting_flag=''P'', 
        stock_posting_date=current_date WHERE production_slip_no=slip;

   --
==========================================================================
   -- Close individual items in jobcards if all planned qty is produced.
   FOR jobcard_val IN SELECT production_jobcard_no,
production_item_code, 
                 production_item_qty
                 FROM mfg_production_d D, mfg_production_m M
                 WHERE D.production_slip_no=slip
                 AND M.stock_posting_flag=''P''  -- stock posted
                 AND M.production_slip_no=D.production_slip_no
                 AND D.item_qa_flag=''O'' LOOP

        UPDATE ppc_jobcard_d SET
item_production_qty=COALESCE(item_production_qty, 0) + 
                                              
jobcard_val.production_item_qty 
        WHERE jobcard_item_code=jobcard_val.production_item_code 
        AND jobcard_jobcard_no=jobcard_val.production_jobcard_no;

      -- select planned qty into plan_qty
        SELECT INTO plan_qty jobcard_item_qty FROM ppc_jobcard_d
        WHERE jobcard_item_code=jobcard_val.production_item_code 
        AND jobcard_jobcard_no=jobcard_val.production_jobcard_no;

      -- select produced qty into prod_qty
        SELECT INTO prod_qty COALESCE(item_production_qty, 0)
        FROM ppc_jobcard_d
        WHERE jobcard_item_code=jobcard_val.production_item_code 
        AND jobcard_jobcard_no=jobcard_val.production_jobcard_no;

      -- if produced qty is >= planned qty close this item
        if prod_qty >= plan_qty
          then
             UPDATE ppc_jobcard_d SET item_status_flag=''C''
             WHERE jobcard_item_code=jobcard_val.production_item_code 
             AND jobcard_jobcard_no=jobcard_val.production_jobcard_no;
        end if;

   end loop;
   --
==========================================================================
   -- Close jobcards if no item is pending.
   FOR affected_jc_val IN SELECT DISTINCT production_jobcard_no FROM
mfg_production_d 
                    WHERE production_slip_no=slip LOOP

       SELECT INTO open_items count(item_status_flag) FROM ppc_jobcard_d
       WHERE jobcard_jobcard_no=affected_jc_val.production_jobcard_no 
       AND item_status_flag=''O'';

       if open_items = 0
         then
           UPDATE ppc_jobcard_m SET jobcard_status_flag=''C'',
           jobcard_close_date=current_date
           WHERE
jobcard_jobcard_no=affected_jc_val.production_jobcard_no;
       end if;

   end loop;

   return 0;
end;' 
LANGUAGE 'plpgsql';


-- 
MaxDB Discussion Mailing List
For list archives: http://lists.mysql.com/maxdb
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to