Advertisement
Valik888

Untitled

Feb 20th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PL/SQL 28.81 KB | None | 0 0
  1. CREATE OR REPLACE PROCEDURE dev_NachislenieH(HsID       k_House.ID%TYPE,
  2.                                              Data_Start DATE,
  3.                                              Prm        NUMBER) AS
  4.   finmonth      DATE;
  5.   data_end_nach DATE;
  6.   data_beg_nach DATE;
  7.  
  8.   data_accountchange  DATE;
  9.   data_accountchange1 DATE;
  10.   data_accountchange2 DATE;
  11.   date_tmp            DATE;
  12.  
  13.   TYPE KoefsInTimeRange IS RECORD(
  14.     dayAnchor           DATE, -- Указатель на день месяца, показывает промежуток с этого дня, и до следуйщего указателя
  15.     caculatedKoeficient NUMBER(10, 5) -- Коефициент работающий в этот промежуток времени
  16.     );
  17.  
  18.   TYPE tMonthChanges IS TABLE OF KoefsInTimeRange INDEX BY BINARY_INTEGER;
  19.   monthchanges tmonthchanges;
  20.  
  21.   TYPE TAccountSpread IS RECORD(
  22.     koeff NUMBER);
  23.  
  24.   TYPE tabAccountSpread IS TABLE OF TAccountSpread INDEX BY BINARY_INTEGER;
  25.   accountSpreadTable tabAccountSpread;
  26.  
  27.   TYPE TAcc IS RECORD(
  28.     acc VARCHAR2(12),
  29.     ID  VARCHAR2(12));
  30.   TYPE TAccountsWithIndic IS TABLE OF TAcc INDEX BY BINARY_INTEGER;
  31.   AccountsWithIndic TAccountsWithIndic;
  32.  
  33.   housevolume        NUMBER(20);
  34.   month_part         NUMBER;
  35.   summ_nach          NUMBER;
  36.   volume_nach        NUMBER;
  37.   tmp_numb           NUMBER;
  38.   AvgPeoplsCount     NUMBER;
  39.   curr_tarif         NUMBER;
  40.   Area_Izl           NUMBER;
  41.   commonKoef         NUMBER := 0;
  42.   spread_amount      NUMBER;
  43.   spread_tmp         NUMBER;
  44.   ActiveServiceDays  NUMBER;
  45.   all_norm           NUMBER;
  46.   avg_koeff          NUMBER;
  47.   avg_norm           NUMBER;
  48.   volume_social_nach NUMBER;
  49.   normno             BINARY_INTEGER;
  50.   serviceno          BINARY_INTEGER;
  51.   dayinmonthnach     INTEGER;
  52.  
  53.   -- Услуги.
  54.   TYPE TService IS RECORD(
  55.     Formula   spr_Services.Formula%TYPE,
  56.     Params    n_AccountService.Params%TYPE,
  57.     Norm_ID   n_AccountService.Norm_ID%TYPE,
  58.     State_Srv n_HouseService.State_Srv%TYPE);
  59.   TYPE tservices IS TABLE OF tservice INDEX BY BINARY_INTEGER;
  60.   Services TServices;
  61.  
  62.   -- Нормы.
  63.   TYPE TNorm IS RECORD(
  64.     norm               spr_norms.norm%TYPE,
  65.     norm_social        spr_norms.norm_social%TYPE,
  66.     Norm_Slave_Persons spr_Norms.Norm_Slave_Persons%TYPE,
  67.     Period             spr_Norms.Period%TYPE);
  68.   TYPE TNorms IS TABLE OF TNorm INDEX BY BINARY_INTEGER;
  69.   Norms TNorms;
  70.  
  71.   -- Тарифы общие и домовые.
  72.   TYPE TTarif IS RECORD(
  73.     Tarif   spr_Tarifs.Tarif%TYPE,
  74.     Dotacya spr_Tarifs.Dotacya%TYPE);
  75.   TYPE TTarifs IS TABLE OF TTarif INDEX BY BINARY_INTEGER;
  76.   tarifs  ttarifs;
  77.   TarifsH TTarifs;
  78.  
  79.   s_ VARCHAR2(10);
  80.  
  81.   FUNCTION Tarif(ServiceNo      BINARY_INTEGER,
  82.                  SrvNorm_ID     BINARY_INTEGER,
  83.                  OnlyHouseTarif BOOLEAN DEFAULT FALSE)
  84.     RETURN spr_Tarifs.Tarif%TYPE -- Для услуги вернуть тариф (домовой или общий).
  85.    AS
  86.     Rslt NUMBER;
  87.   BEGIN
  88.     -- Взять тариф из домовых тарифов.
  89.     BEGIN
  90.       Rslt := TarifsH(ServiceNo * 1000000 + NVL(SrvNorm_ID, 0) * 100).Tarif;
  91.     EXCEPTION
  92.       WHEN NO_DATA_FOUND THEN
  93.         BEGIN
  94.           IF NOT onlyhousetarif THEN
  95.             Rslt := Tarifs(ServiceNo * 1000000 + NVL(SrvNorm_ID, 0) * 100 /*+ Category*/
  96.                     ).Tarif;
  97.           ELSE
  98.             Rslt := 0;
  99.           END IF;
  100.         EXCEPTION
  101.           WHEN NO_DATA_FOUND THEN
  102.             -- Если тарифа для услуги среди общегородских нет.
  103.             Rslt := 0;
  104.         END;
  105.     END;
  106.     RETURN Rslt;
  107.   EXCEPTION
  108.     WHEN NO_DATA_FOUND THEN
  109.       RETURN 0;
  110.   END;
  111.  
  112. BEGIN
  113.   s_             := '    ';
  114.   housevolume    := 0;
  115.   dayinmonthnach := EXTRACT(DAY FROM LAST_DAY(data_beg_nach));
  116.  
  117.   SELECT FinMonth INTO FinMonth FROM System;
  118.   data_end_nach := LAST_DAY(finmonth) + 1 - 1 / (24 * 60 * 60);
  119.   data_beg_nach := TRUNC(data_start, 'MM');
  120.  
  121.   DBMS_OUTPUT.put_line(data_beg_nach || '-' || data_end_nach);
  122.   FOR counter IN (SELECT DISTINCT k.*, s.vid
  123.                     FROM c_House      c1,
  124.                          c_House      c2,
  125.                          k_Counters   k,
  126.                          spr_counters s
  127.                    WHERE c1.Status = 1
  128.                      AND c2.House_ID = c1.House_ID
  129.                      AND c2.Status = 1
  130.                      AND k.ID = c2.counter_id
  131.                      AND s.ID = k.counter_id
  132.                      AND k.Data BETWEEN Data_Beg_Nach AND Data_End_Nach
  133.                      AND c1.House_ID = LPAD(Hsid, 12, '0')) LOOP
  134.     DBMS_OUTPUT.put_line('');
  135.     DBMS_OUTPUT.put_line('домовой счётчик№ ' || counter.id || ' vid=' ||
  136.                          counter.vid);
  137.     FOR idict IN (SELECT A.indication,
  138.                          a.indication_old,
  139.                          a.volume,
  140.                          a.data,
  141.                          a.counter_id
  142.                     FROM n_indications A
  143.                     LEFT JOIN n_indications b
  144.                       ON (A.counter_id = b.counter_id AND A.DATA < b.DATA)
  145.                    WHERE b.counter_id IS NULL
  146.                      AND A.counter_id = counter.ID
  147.                      AND A.Data BETWEEN Data_Beg_Nach AND Data_End_Nach) LOOP
  148.       DBMS_OUTPUT.put_line(s_ || 'квартирные счётчики: ');
  149.       houseVolume := 0;
  150.       commonKoef  := 0;
  151.       FOR apartcounter IN (SELECT DISTINCT acc.id account_id,
  152.                                            kc.apart_id,
  153.                                            ni.indication,
  154.                                            ni.data_ins,
  155.                                            NVL(ni.indication_old, 0) indication_old,
  156.                                            CASE
  157.                                              WHEN ni.vid_old = 1 THEN
  158.                                               (ni.data_old + 1)
  159.                                              ELSE
  160.                                               ni.data_old
  161.                                            END data_old,
  162.                                            CASE
  163.                                              WHEN ni.vid = 1 THEN
  164.                                               0
  165.                                              ELSE
  166.                                               ni.indication -
  167.                                               NVL(ni.indication_old, 0)
  168.                                            END summa,
  169.                                            ni.vid,
  170.                                            ni.counter_id
  171.                              FROM k_counters kc
  172.                              JOIN K_Accounts acc
  173.                                ON Acc.Apart_Id = Kc.Apart_Id
  174.                              JOIN spr_counters s
  175.                                ON s.ID = kc.counter_id
  176.                              JOIN a_counters ac
  177.                                ON ac.house_counter_id = kc.house_counter_id
  178.                              JOIN n_indications ni
  179.                                ON ni.counter_id = kc.id
  180.                             WHERE ac.house_counter_id = counter.ID
  181.                               AND ni.vid = 2
  182.                               AND ni.data_ins BETWEEN data_beg_nach AND
  183.                                   data_end_nach
  184.                             ORDER BY ni.vid, ni.counter_id, ni.data_ins) LOOP
  185.         houseVolume := houseVolume + apartcounter.summa;
  186.         -- если есть показания - запоминаем что бы не начислять по норме
  187.         AccountsWithIndic(apartcounter.account_id).id := apartcounter.account_id;
  188.         DBMS_OUTPUT.put_line(s_ || s_ || 'аккаунт№ ' ||
  189.                              apartcounter.account_id || ' счетчик№' ||
  190.                              apartcounter.counter_id || '[' ||
  191.                              apartcounter.data_old || '-' ||
  192.                              apartcounter.data_ins || '][' ||
  193.                              apartcounter.vid || ']' || ' показания ' ||
  194.                              apartcounter.indication_old || '-' ||
  195.                              apartcounter.indication || '=' ||
  196.                              (apartcounter.summa));
  197.       END LOOP;
  198.       DBMS_OUTPUT.put_line(s_ || 'сумма V по квартирным счетчикам=' ||
  199.                            housevolume);
  200.       DBMS_OUTPUT.put_line(s_ || 'V по домовому счётчику         =' ||
  201.                            idict.volume);
  202.       DBMS_OUTPUT.put_line(s_ || 'Дельта для разброса            =' ||
  203.                            (idict.volume - housevolume));
  204.       DBMS_OUTPUT.put_line(s_ || 'Список акаунтов для разброса:');
  205.       FOR clnt IN (SELECT DISTINCT ah.Account_ID Account_ID
  206.                      FROM c_AccountHouse ah
  207.                     WHERE ah.Counter_ID = counter.id
  208.                       AND ah.Data =
  209.                           (SELECT MAX(Data)
  210.                              FROM c_AccountHouse
  211.                             WHERE Account_ID = ah.Account_ID
  212.                               AND Data <= data_end_nach
  213.                               AND Counter_ID = ah.Counter_ID)
  214.                       AND ah.status = 1) LOOP
  215.         IF NOT AccountsWithIndic.EXISTS(clnt.account_id) THEN
  216.           -- мы не можем начислить по норме человеку, у которого етсь счетчик и показаниями
  217.           DBMS_OUTPUT.put_line(s_ || 'Account_ID[' || clnt.account_id ||
  218.                                '] x ->');
  219.        
  220.           data_accountchange := data_end_nach;
  221.           AvgPeoplsCount     := 0;
  222.           DBMS_OUTPUT.put_line(s_ || s_ || '|---' || 'История людей');
  223.           FOR acounthist IN (SELECT DATA,
  224.                                     NVL(count_inhabit, 0) count_inhabit,
  225.                                     NVL(COUNT_WANTING, 0) COUNT_WANTING
  226.                                FROM a_accounts
  227.                               WHERE account_id = clnt.account_id
  228.                                 AND DATA BETWEEN data_beg_nach AND
  229.                                     data_end_nach
  230.                               ORDER BY DATA DESC) LOOP
  231.             -- Считаем слюдей в среднемза месяц
  232.             month_part := TRUNC(data_accountchange - CASE
  233.                                   WHEN data_accountchange = data_end_nach THEN
  234.                                    acounthist.DATA - 1
  235.                                   ELSE
  236.                                    acounthist.DATA
  237.                                 END);
  238.          
  239.             DBMS_OUTPUT.put_line(s_ || s_ || '|   ' || s_ ||
  240.                                  '|[Л]Диапазон с ' || acounthist.DATA ||
  241.                                  ' по ' || data_accountchange || '=' ||
  242.                                  Month_Part || 'дней / ' ||
  243.                                  EXTRACT(DAY FROM data_end_nach) || '*' ||
  244.                                  (acounthist.count_inhabit -
  245.                                  acounthist.COUNT_WANTING) ||
  246.                                  '(человеков)' || '=' ||
  247.                                  TO_CHAR((Month_Part /
  248.                                          EXTRACT(DAY FROM data_end_nach)) *
  249.                                          (acounthist.count_inhabit -
  250.                                          acounthist.COUNT_WANTING),
  251.                                          '99D99') || ' человек за период ');
  252.          
  253.             data_accountchange := CASE /*when EXTRACT(DAY from acounthist.DATA) = 1 then acounthist.DATA-1*/
  254.                                     WHEN EXTRACT(DAY FROM acounthist.DATA) =
  255.                                          EXTRACT(DAY FROM data_end_nach) THEN
  256.                                      acounthist.DATA
  257.                                     ELSE
  258.                                      acounthist.DATA
  259.                                   END;
  260.             AvgPeoplsCount     := AvgPeoplsCount +
  261.                                   (Month_Part /
  262.                                   EXTRACT(DAY FROM data_end_nach)) *
  263.                                   (acounthist.count_inhabit -
  264.                                   acounthist.COUNT_WANTING);
  265.           END LOOP; -- Считаем слюдей в среднемза месяц
  266.           FOR iservice IN (SELECT DISTINCT nacc.service_id,
  267.                                            s.formula,
  268.                                            DECODE(nacc.service_id,
  269.                                                   28,
  270.                                                   1,
  271.                                                   5,
  272.                                                   1,
  273.                                                   6,
  274.                                                   2,
  275.                                                   35,
  276.                                                   2,
  277.                                                   27,
  278.                                                   3,
  279.                                                   44,
  280.                                                   3,
  281.                                                   25,
  282.                                                   4,
  283.                                                   10,
  284.                                                   5) vid,
  285.                                            nacc.state_srv
  286.                            --              ,nvl(acc.area_polezn, 0) area_polezn,
  287.                            --              nvl(acc.count_inhabit, 0) count_inhabit,
  288.                            --              nvl(acc.count_wanting, 0) count_wanting,
  289.                            --              acc.area_addsan
  290.                            --              ,acc.DATA
  291.                              FROM n_accountservice nacc
  292.                              JOIN spr_services s
  293.                                ON s.ID = nacc.service_id
  294.                              JOIN a_accounts acc
  295.                                ON acc.account_ID = nacc.account_id
  296.                             WHERE nacc.state_srv = 1
  297.                               AND DECODE(nacc.service_id,
  298.                                          28,
  299.                                          1,
  300.                                          5,
  301.                                          1,
  302.                                          6,
  303.                                          2,
  304.                                          35,
  305.                                          2,
  306.                                          27,
  307.                                          3,
  308.                                          44,
  309.                                          3,
  310.                                          25,
  311.                                          4,
  312.                                          10,
  313.                                          5) = counter.vid
  314.                               AND nacc.account_id = clnt.account_id) LOOP
  315.             DBMS_OUTPUT.put_line(s_ || s_ || '|---' || 'История норм');
  316.             tmp_numb := 0;
  317.             --            IF Iservice.formula = 0 THEN  -- Услуга не подходит под формулу.
  318.             --              IF iservice.vid = 4 AND nvl(iservice.state_srv,1) = 1 THEN  -- АГВ.
  319.             --                normno := nvl(services(Iservice.service_id).norm_id,0);
  320.             --                Volume_Nach := Iservice.Area_Polezn * Norms(NormNo).Norm * Month_Part;
  321.             --                Volume_Social_Nach := Iservice.Area_Polezn * Norms(NormNo).Norm_Social * Month_Part;
  322.             --                IF Norms(NormNo).Period = 1 THEN  -- Норма в сутки, а не в месяц.
  323.             --                  Volume_Nach := Volume_Nach * DayInMonthNach;
  324.             --                  Volume_Social_Nach := Volume_Social_Nach * DayInMonthNach;
  325.             --                END IF;
  326.             --                summ_nach := volume_nach * curr_tarif;
  327.             --                area_izl := iservice.area_polezn - (iservice.count_inhabit*norms(1).norm/*Норма площади на человека*/ + iservice.area_addsan + norms(2).norm/*Норма площади на семью*/);
  328.             --                IF Area_Izl > 0 /*AND Surplus = 'Y'*/ THEN  -- Есть излишки по площади и они учитываются.
  329.             --                  IF Iservice.Area_Polezn <> 0 THEN
  330.             --                    tmp_numb := Summ_Nach*(Area_Izl/Iservice.Area_Polezn);
  331.             --                  ELSE          
  332.             --                    tmp_numb := 0;
  333.             --                  END IF;
  334.             --                  Summ_Nach := Summ_Nach - tmp_numb + tmp_numb * Norms(21).Norm;
  335.             --                END IF;
  336.             --              END IF;
  337.             --            elsif Iservice.formula = 21 THEN  -- Люди - проживающие минус отсутствующие.
  338.             --              volume_nach := greatest(iservice.count_inhabit - iservice.count_wanting,1);
  339.             avg_norm            := 0;
  340.            
  341.             data_accountchange2 := data_end_nach;
  342.             ActiveServiceDays   := 0;
  343.             FOR serviceState IN (SELECT n.data, N.State_Srv, N.Service_Id
  344.                                    FROM n_accountservice n
  345.                                   WHERE N.Account_Id = clnt.account_id
  346.                                     AND DECODE(n.service_id,
  347.                                                28,
  348.                                                1,
  349.                                                5,
  350.                                                1,
  351.                                                6,
  352.                                                2,
  353.                                                35,
  354.                                                2,
  355.                                                27,
  356.                                                3,
  357.                                                44,
  358.                                                3,
  359.                                                25,
  360.                                                4,
  361.                                                10,
  362.                                                5) = counter.vid
  363.                                   ORDER BY n.data DESC) LOOP
  364.               date_tmp := serviceState.DATA;
  365.                              
  366.               month_part := TRUNC(CASE        
  367.                                    WHEN EXTRACT(DAY FROM data_accountchange2)=30 THEN
  368.                                      data_accountchange2+1
  369.                                    ELSE data_accountchange2 END
  370.                                     -
  371.                                    CASE WHEN EXTRACT(DAY FROM date_tmp)=1 THEN
  372.                                      date_tmp
  373.                                    ELSE date_tmp END);
  374.               DBMS_OUTPUT.put_line(s_ || s_ || '|   ' || s_ ||
  375.                                          CASE WHEN
  376.                                    serviceState.State_Srv = 1 THEN
  377.                                    '\[ON]' ELSE '/[OFF]' END || ' ' ||
  378.                                   data_accountchange2  || '-' || date_tmp ||
  379.                                    ' = ' ||' month_part='||month_part);                          
  380.               IF serviceState.State_Srv = 1 OR 1=1 THEN
  381.                 ActiveServiceDays := ActiveServiceDays + month_part;
  382.                 --/////////////////////////////////////////////////////////////////////////////////////////
  383.                 data_accountchange1 := data_end_nach;
  384.                 BEGIN
  385.                   FOR normHist IN (SELECT norm, Data, sub
  386.                                      FROM (SELECT norms.norm, Norms.Data,
  387.                                      
  388.                                           --extract(day from date_tmp) - extract(day from Norms.Data)
  389.                                           -- + extract(day from data_accountchange2) - extract(day from data_accountchange1)
  390.                                           CASE WHEN EXTRACT(DAY FROM Norms.Data) > EXTRACT(DAY FROM data_accountchange2) AND EXTRACT(DAY FROM Norms.Data) < EXTRACT(DAY FROM date_tmp) THEN
  391.                                              EXTRACT(DAY FROM date_tmp)
  392.                                           END  
  393.                                       sub
  394.                                              FROM spr_norms norms
  395.                                             WHERE norms.DATA BETWEEN date_tmp AND
  396.                                                   data_accountchange2
  397.                                               AND norms.srvnorm_id =
  398.                                                   (SELECT DISTINCT s.norm_id
  399.                                                      FROM n_accountservice s
  400.                                                     WHERE s.account_id =
  401.                                                           clnt.account_id
  402.                                                       AND s.service_id =
  403.                                                           iservice.service_id)
  404.                                            UNION ALL
  405.                                            SELECT norms.norm,
  406.                                                   data_beg_nach data,
  407.                                                   0 sub
  408.                                              FROM spr_norms norms
  409.                                             WHERE Norms.Srvnorm_Id =
  410.                                                   (SELECT DISTINCT s.norm_id
  411.                                                      FROM n_accountservice s
  412.                                                     WHERE s.account_id =
  413.                                                           clnt.account_id
  414.                                                       AND s.service_id =
  415.                                                           iservice.service_id)
  416.                                               AND norms.DATA =
  417.                                                   (SELECT MAX(DATA)
  418.                                                      FROM spr_norms
  419.                                                     WHERE srvnorm_id =
  420.                                                           (SELECT DISTINCT s.norm_id
  421.                                                              FROM n_accountservice s
  422.                                                             WHERE s.account_id =
  423.                                                                   clnt.account_id
  424.                                                               AND s.service_id =
  425.                                                                   iservice.service_id)))
  426.                                     ORDER BY Data DESC
  427.                                    
  428.                                    ) LOOP
  429.                     -- История норм
  430.                     DBMS_OUTPUT.put_line(s_ || s_ || '|   ' || s_ ||'  date_tmp='||EXTRACT(DAY FROM date_tmp)||' normHist.Data='||EXTRACT(DAY FROM normHist.Data)
  431.                                            ||' data_accountchange2='|| EXTRACT(DAY FROM data_accountchange2)||' data_accountchange1='||EXTRACT(DAY FROM data_accountchange1)
  432.                                            ||' sub='||(EXTRACT(DAY FROM date_tmp) - EXTRACT(DAY FROM normHist.Data)
  433.                                            + EXTRACT(DAY FROM data_accountchange2) - EXTRACT(DAY FROM data_accountchange1)));
  434.                     tmp_numb   := normHist.norm;
  435.                     month_part := TRUNC(data_accountchange1 - CASE
  436.                                           WHEN data_accountchange1 = data_end_nach THEN
  437.                                            normHist.DATA - 1
  438.                                           ELSE
  439.                                            normHist.DATA
  440.                                         END);
  441.                  
  442.                     all_norm := (Month_Part /
  443.                                 EXTRACT(DAY FROM data_end_nach)) *
  444.                                 normHist.norm;
  445.                     avg_norm := avg_norm + all_norm;
  446.                  
  447.                     DBMS_OUTPUT.put_line(s_ || s_ || '|   ' || s_ ||
  448.                                          '|[Н]Диапазон с ' ||
  449.                                          normHist.DATA || ' по ' ||
  450.                                          data_accountchange1 || '=' ||
  451.                                          Month_Part || 'дней / ' ||
  452.                                          EXTRACT(DAY FROM data_end_nach) || '*' ||
  453.                                          (normHist.norm) || '(норма)' || '=' ||
  454.                                          TO_CHAR(all_norm, '99D99') ||
  455.                                          ' норма за период ');
  456.                  
  457.                     data_accountchange1 := CASE
  458.                                              WHEN EXTRACT(DAY FROM normHist.DATA) =
  459.                                                   EXTRACT(DAY FROM data_end_nach) THEN
  460.                                               normHist.DATA
  461.                                              ELSE
  462.                                               normHist.DATA
  463.                                            END;
  464.                  
  465.                   END LOOP; -- История норм
  466.                   --            END IF;
  467.                 END;
  468.                 --/////////////////////////////////////////////////////////////////////////////////////////
  469.                 --/////////////////////////////////////////////////////////////////////////////////////////
  470.               END IF;
  471.               data_accountchange2 := serviceState.DATA;
  472.             END LOOP;
  473.          
  474.             avg_koeff := ActiveServiceDays /
  475.                          EXTRACT(DAY FROM data_end_nach) * tmp_numb;
  476.          
  477.             DBMS_OUTPUT.Put_Line(s_ || s_ ||
  478.                                  '+---Средняя норма за месяц=Дней с включенной услугой(' ||
  479.                                  ActiveServiceDays || ') / ' ||
  480.                                  EXTRACT(DAY FROM data_end_nach) ||
  481.                                  '*Коефициент(' ||
  482.                                  TO_CHAR(avg_norm, '99D999') || ')=' ||
  483.                                  TO_CHAR(avg_koeff, '99D99') ||
  484.                                  ' Людей в среднем за месяц-' ||
  485.                                  TO_CHAR(AvgPeoplsCount, '99D99') ||
  486.                                  'человек * ' ||
  487.                                  TO_CHAR(avg_koeff, '99D99') || ' НОРМА=' ||
  488.                                  TO_CHAR(AvgPeoplsCount * avg_koeff,
  489.                                          '999D999'));
  490.             accountSpreadTable(TO_NUMBER(clnt.account_id)).koeff := AvgPeoplsCount *
  491.                                                                     avg_koeff;
  492.          
  493.             commonKoef := commonKoef + AvgPeoplsCount * avg_koeff;
  494.             IF commonKoef = 0 THEN
  495.               commonKoef := 1;
  496.               SYS.DBMS_OUTPUT.Put_Line('[ERROR]: commonKoef = 0');
  497.             END IF;
  498.           END LOOP;
  499.         END IF; -- мы не можем начислить по норме человеку, у которого етсь счетчик и показаниями
  500.       END LOOP;
  501.       DBMS_OUTPUT.put_line(s_ || s_ || s_ ||
  502.                            'Коефициент = Объем разброса/сумму норм = ' ||
  503.                            (idict.volume - housevolume) || ' /' ||
  504.                            TO_CHAR(commonKoef, '999D999') || '=' ||
  505.                            TO_CHAR(((idict.volume - housevolume) /
  506.                                    commonKoef),
  507.                                    '99D999'));
  508.       spread_amount := 0;
  509.       FOR indx IN accountSpreadTable.FIRST .. accountSpreadTable.LAST LOOP
  510.         IF accountSpreadTable.EXISTS(indx) THEN
  511.           spread_tmp := accountSpreadTable(indx)
  512.                         .koeff * ((idict.volume - housevolume) / commonKoef);
  513.           DBMS_OUTPUT.Put_Line(s_ || s_ || '|' || indx || '=' ||
  514.                                TO_CHAR(accountSpreadTable(indx).koeff,
  515.                                        '99D999') || ' *' ||
  516.                                TO_CHAR(((idict.volume - housevolume) /
  517.                                        commonKoef),
  518.                                        '9D999') || ' =' ||
  519.                                TO_CHAR(spread_tmp, '99D999'));
  520.           spread_amount := spread_amount + spread_tmp;
  521.         END IF;
  522.         IF indx = accountSpreadTable.LAST THEN
  523.           DBMS_OUTPUT.Put_Line(s_ || s_ || '+-----------------------' ||
  524.                                TO_CHAR(spread_amount, '999D999'));
  525.         END IF;
  526.       END LOOP;
  527.       accountSpreadTable.DELETE();
  528.     END LOOP;
  529.   END LOOP;
  530. END;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement