Advertisement
Valik888

Untitled

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