Входные параметры
Параметр  | Тип  | Описание  | 
|---|---|---|
OWNERID  | 
    INTEGER  | 
    
  | 
  
ACLASSID  | 
    INTEGER  | 
    
  | 
  
DATE1  | 
    DATE  | 
    
  | 
  
DATE2  | 
    DATE  | 
    
  | 
  
CONTRACTID  | 
    INTEGER  | 
    
  | 
  
PARTYID  | 
    INTEGER  | 
    
  | 
  
DOCROP  | 
    INTEGER  | 
    
  | 
  
ACROPID  | 
    INTEGER  | 
    
  | 
  
PARTYDATE  | 
    DATE  | 
    
  | 
  
ISWEIGHT  | 
    INTEGER  | 
    
  | 
  
PRICEPERMONTH  | 
    INTEGER  | 
    
  | 
  
Выходные параметры
Параметр  | Тип  | Описание  | 
|---|---|---|
REINCOME  | 
    INTEGER  | 
    
  | 
  
INCOME  | 
    INTEGER  | 
    
  | 
  
INITIAL_REMINDER  | 
    INTEGER  | 
    
  | 
  
REOUTCOME  | 
    INTEGER  | 
    
  | 
  
OUTCOME  | 
    INTEGER  | 
    
  | 
  
TEMPDATE  | 
    DATE  | 
    
  | 
  
RESTS  | 
    INTEGER  | 
    
  | 
  
STORAGECOST  | 
    DECIMAL(15,2)  | 
    
  | 
  
CONTRACTCOSTDATE  | 
    DATE  | 
    
  | 
  
RESTCALCULATION  | 
    INTEGER  | 
    
  | 
  
STORINGWEIGHT  | 
    DECIMAL(15,9)  | 
    
  | 
  
STORING_WEIGHT  | 
    DECIMAL(15,3)  | 
    
  | 
  
TEMPMONTH  | 
    INTEGER  | 
    
  | 
  
CROPID  | 
    INTEGER  | 
    
  | 
  
CLASSID  | 
    INTEGER  | 
    
  | 
  
Описание
Расчет стоимости хранения зерна
Определение
CREATE PROCEDURE COSTSCALCULATION(
    OWNERID INTEGER,
    ACLASSID INTEGER,
    DATE1 DATE,
    DATE2 DATE,
    CONTRACTID INTEGER,
    PARTYID INTEGER,
    DOCROP INTEGER,
    ACROPID INTEGER,
    PARTYDATE DATE,
    ISWEIGHT INTEGER,
    PRICEPERMONTH INTEGER)
RETURNS (
    REINCOME INTEGER,
    INCOME INTEGER,
    INITIAL_REMINDER INTEGER,
    REOUTCOME INTEGER,
    OUTCOME INTEGER,
    TEMPDATE DATE,
    RESTS INTEGER,
    STORAGECOST DECIMAL(15,2),
    CONTRACTCOSTDATE DATE,
    RESTCALCULATION INTEGER,
    STORINGWEIGHT DECIMAL(15,9),
    STORING_WEIGHT DECIMAL(15,3),
    TEMPMONTH INTEGER,
    CROPID INTEGER,
    CLASSID INTEGER)
AS
declare variable REGDATE date;
declare variable OPERATIONID integer;
declare variable OPERATIONSUBTYPE smallint;
declare variable NET integer;
declare variable WEIGHT integer;
declare variable INVOICEID integer;
declare variable ASTORINGWEIGHT decimal(18,9) = 0;
declare variable DAYCOUNT integer;
declare variable TEMP_MONTH integer;
begin
  if (DATE2 > current_date) then
    PARTYDATE = current_date;
  STORINGWEIGHT = 0;
  TEMPDATE = :DATE1;
  TEMPMONTH = extract(month from :TEMPDATE);
  STORING_WEIGHT = 0;
  while (TEMPDATE <= DATE2) do begin
    INITIAL_REMINDER = 0;
--    OUTCOMEbefore = 0;
--    INCOMEbefore = 0;
    INCOME = 0;
    OUTCOME = 0;
    REINCOME = 0;
    REOUTCOME = 0;
    for
      select
          coalesce(sum(IT.NET), 0), coalesce(sum(IT.WEIGHT), 0), OPERATION.OPERATIONSUBTYPE,
          IT.OPERATIONID, IT.REGDATE, IT.INVOICEID, QUALITY.CROPID, QUALITY.CLASSID
        from IT
          join GETWORKPARTIES(:PARTYID, :PARTYDATE, null, null, null) on (GETWORKPARTIES.PARTYID = IT.PARTYID)
          inner join QUALITY  on (QUALITY.QUALITYID = IT.BUHQUALITYID)
          inner join OPERATION on (OPERATION.OPERATIONID = IT.OPERATIONID)
        where (IT.STATE >= 0)
          and (IT.PARENTID >= 0)
          and (OPERATIONSUBTYPE in (0,1,3,4))
          and ((((QUALITY.CLASSID = :ACLASSID) and (:DOCROP = 0))
               or ((QUALITY.CROPID = :ACROPID) and (:DOCROP = 1))
               or ((coalesce(:ACROPID,0) = 0) and (coalesce(:ACLASSID,0) = 0))))
          and (IT.OWNERID = :OWNERID)
          and ((IT.CONTRACTID = :CONTRACTID) or (:CONTRACTID = 0))
      group by IT.REGDATE, OPERATION.OPERATIONSUBTYPE, IT.OPERATIONID, IT.INVOICEID, QUALITY.CROPID, QUALITY.CLASSID
      into :NET, :WEIGHT, :OPERATIONSUBTYPE, :OPERATIONID, :REGDATE, :INVOICEID, :CROPID, :CLASSID
    do begin
      if (:OPERATIONSUBTYPE = 0) then begin
        if (:REGDATE = :TEMPDATE) then begin
          if (:OPERATIONID = 17) then begin
            if (:NET > 0) then
              if (:ISWEIGHT = 0) then
                REINCOME = :REINCOME + :NET;
              else REINCOME = :REINCOME + :WEIGHT;
            else
              if (:ISWEIGHT = 0) then
                REOUTCOME = :REOUTCOME - :NET;
              else REOUTCOME = :REOUTCOME - :WEIGHT;
          end
          else begin
            if (:ISWEIGHT = 0) then
              INCOME = :INCOME + :NET;
            else INCOME = :INCOME + :WEIGHT;
          end
        end
        if (:REGDATE < :TEMPDATE) then begin
          if (:ISWEIGHT = 0) then
            INITIAL_REMINDER = :INITIAL_REMINDER + :NET;
          else INITIAL_REMINDER = :INITIAL_REMINDER + :WEIGHT;
        end
      end
      if (:OPERATIONSUBTYPE in (1,4)) then begin
        if (:ISWEIGHT = 0) then begin
          if (:REGDATE < :TEMPDATE) then
            INITIAL_REMINDER = :INITIAL_REMINDER - :NET;
          if (:REGDATE = :TEMPDATE) then
            OUTCOME = :OUTCOME + :NET;
        end
        else begin
          if (not (:OPERATIONID in (9,13,22,24,25))) then begin
            if (:REGDATE < :TEMPDATE) then
              INITIAL_REMINDER = :INITIAL_REMINDER - :WEIGHT;
            if (:REGDATE = :TEMPDATE) then
              OUTCOME = :OUTCOME + :WEIGHT;
          end
        end
      end
/*
      if (:OPERATIONSUBTYPE = 1) then begin
        if (:REGDATE < :TEMPDATE) then begin
          if ((not OPERATIONID in (9, 24, 25, 64, 65)) and (:ISWEIGHT = 0)) then
            INITIAL_REMINDER = :INITIAL_REMINDER - :NET;
          else INITIAL_REMINDER = :INITIAL_REMINDER - WEIGHT;
--          OUTCOMEbefore = :OUTCOMEbefore + :NET;
        end
        if (:REGDATE = :TEMPDATE) then begin
          if (:ISWEIGHT = 0) then
            OUTCOME = :OUTCOME + :NET;
          else OUTCOME = :OUTCOME + :WEIGHT;
        end
      end
      if (:OPERATIONID in (9, 13, 24, 25)) then begin
        if (:REGDATE = :TEMPDATE) then begin
          if (:ISWEIGHT = 0) then
            OUTCOME = :OUTCOME + (:WEIGHT * -1);
          else OUTCOME = :OUTCOME + (:WEIGHT * -1);
        end
        if (:REGDATE < :TEMPDATE) then begin
          INITIAL_REMINDER = :INITIAL_REMINDER + (:WEIGHT * -1);
--          OUTCOMEbefore = :OUTCOMEbefore + :WEIGHT*-1;
        end
      end
*/
    end
    RESTS = INITIAL_REMINDER + INCOME + REINCOME - OUTCOME - REOUTCOME;
    select distinct GET_CONTRACT_COSTS.COST, GET_CONTRACT_COSTS.CONTRACTCOSTDATE
      from GET_CONTRACT_COSTS(:TEMPDATE, :CONTRACTID, 1, :CROPID, :CLASSID)
    into :STORAGECOST, :CONTRACTCOSTDATE;
    if (STORAGECOST > 0) then
      RESTCALCULATION = RESTS;
    else RESTCALCULATION = 0;
/*
    if ((TEMPDATE = DATE2) or (TEMPMONTH <> extract(month from :TEMPDATE))) then begin
      if (TEMPDATE = DATE2) then begin
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE)
        into DAYCOUNT;
        ASTORINGWEIGHT = ASTORINGWEIGHT + RESTS;
      end
      else
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE - 1)
        into DAYCOUNT;
      if (PRICEPERMONTH = 0) then
        STORING_WEIGHT = STORING_WEIGHT + (:ASTORINGWEIGHT / 1000);
      else
        if (PRICEPERMONTH = 1) then
          ASTORINGWEIGHT = ASTORINGWEIGHT + cast(:RESTS as numeric(18,9)) / 1000 / DAYCOUNT;
        else STORING_WEIGHT = STORING_WEIGHT + (:ASTORINGWEIGHT / 1000 / 30);
      ASTORINGWEIGHT = 0;
    end
*/
    if (PRICEPERMONTH = 0) then
      ASTORINGWEIGHT = ASTORINGWEIGHT + (cast(:RESTS as numeric(18,9)) / 1000);
    else
      if (PRICEPERMONTH = 1) then begin
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE)
        into DAYCOUNT;
        ASTORINGWEIGHT = ASTORINGWEIGHT + (cast(:RESTS as numeric(18,9)) / 1000 / DAYCOUNT);
      end
      else ASTORINGWEIGHT = ASTORINGWEIGHT + (cast(:RESTS as numeric(18,9)) / 1000 / 30);
    STORING_WEIGHT = cast(cast(ASTORINGWEIGHT as numeric(15,4)) as numeric(15,3));
    TEMPMONTH = extract(month from :TEMPDATE);
    if (PRICEPERMONTH = 0) then
      STORINGWEIGHT = RESTS / 1000;
    else
      if (PRICEPERMONTH = 1) then begin
        select DAYS_IN_MONTH.DAYCOUNT
          from DAYS_IN_MONTH(:TEMPDATE)
        into DAYCOUNT;
        STORINGWEIGHT = cast(RESTS as decimal(15,9)) / 1000 / DAYCOUNT;
      end
      else STORINGWEIGHT = RESTS / 1000 / 30;
/*
      if (abs(STORINGWEIGHT) < 0.1) then
        STORINGWEIGHT = STORINGWEIGHT * 6;
*/
    if ((STORINGWEIGHT <= -0.019) and (STORINGWEIGHT <= -0.019)) then
      STORINGWEIGHT = -0.1;
    suspend;
    TEMPDATE = :TEMPDATE + 1;
  end
end
         
         
         
       |