﻿-- =============================================
-- Author: 
-- Create date: 
-- DatabaseModel:    Metr7
-- Description: 
-- Use:
-- Changes:
--    20.05.2021  Сафонов А.Е.  DATAMODEL70-136 Исправлена ошибка с пересечением. Отформатирован код
--    12.05.2021  Седаков А.В.  DATAMODEL70-155 Отказ от физического удаления записей в экземплярах СИ.
--    13.10.2020  Седаков А.В.  ASUMS70-209. Из таблицы EKZMK удалено поле MKPRV и добавлены поля IDSPVDSBMK, PRCHNPGDN. 
--    04.09.2020  Седаков А.В.  ASUMS70-209. Добавлено новое поле MKPRV из таблицы EKZMK.
--    18.03.2020  Седаков А.В.  DATAMODEL70-28. Добавлены 2 новых поля из таблицы EKZMK: DPZNmp, HRTCmp.
--    13.02.2020  Сафонов А.Е.  ELMETRO-5 Добавлен GUID организации,
--                              убрана "звездочка" при выборке из uf_vw_FRPD_ms() и uf_vw_SPMU_ms()
--    03.02.2020  Седаков А.В.  DATAMODEL70-28. Добавлены новые поля из таблицы EKZMK.
-- =============================================

CREATE PROCEDURE dbo.up_ds_EkzmkSelect 
  @fltr varchar(MAX) = '',
  @vbr varchar(MAX) = '',
  @prm varchar(MAX) = '',
  @nmid varchar(200) = '',
  @nnid int = 0,
  @per varchar(2) = '0',  --"0" - нет пересечений, "1" - пересечение, 
                          --"-1" - НЕпересечение, "2" - заполнить таблицу пересечения.
  @idspvdd varchar(20) = '0' 
WITH EXECUTE AS 'metr6'
AS
BEGIN
  set dateformat dmy
  set nocount on

	declare @systemUser varchar(100)
	execute as caller
		select @systemUser = CAST(SYSTEM_USER AS nvarchar(MAX))
	revert

  declare @s varchar(MAX)
  declare @select varchar(MAX)

  if @per = '2' -- при заполнении данных для пересечения идентификатор в фильтре не учитывается
  begin
    set @nmid = ''
    set @nnid = 0
  end
  set @fltr = dbo.uf_GetSelectFltr_dk(@fltr, @vbr, @prm, @nmid, @nnid)

  set @s = '
IF OBJECT_ID(N''#TempFRPD'', N''U'') IS NOT NULL
DROP TABLE #TempFRPD;
CREATE TABLE #TempFRPD
(
	IDFRPD int PRIMARY KEY NOT NULL,
	IDFRPDR int,
	NMFRPD varchar(80) collate Cyrillic_General_CI_AS,
	LEVEL int,
  KDFRPDLC varchar(20) collate Cyrillic_General_CI_AS,
	PATH VARCHAR(8000) collate Cyrillic_General_CI_AS,
  GUIDFRPD UNIQUEIDENTIFIER
);
CREATE NONCLUSTERED INDEX RIndex ON #TempFRPD (IDFRPDR)
INSERT INTO #TempFRPD SELECT IDFRPD, IDFRPDR, NMFRPD, LEVEL, KDFRPDLC, PATH, GUIDFRPD FROM uf_vw_FRPD_ms();

IF OBJECT_ID (N''#TempSPMU'', N''U'') IS NOT NULL
DROP TABLE #TempSPMU;
CREATE TABLE #TempSPMU
(
	nmmu varchar(50) collate Cyrillic_General_CI_AS,
	IDSPMU int PRIMARY KEY NOT NULL,
	IDSPMUR int,
	LEVEL int,
	PATH VARCHAR(8000) collate Cyrillic_General_CI_AS,
	mu1 varchar(50) collate Cyrillic_General_CI_AS,
	mu2 varchar(50) collate Cyrillic_General_CI_AS,
	mu3 varchar(50) collate Cyrillic_General_CI_AS,
	mu4 varchar(50) collate Cyrillic_General_CI_AS
);
CREATE NONCLUSTERED INDEX RIndex ON #TempSPMU (IDSPMUR)
INSERT INTO #TempSPMU SELECT nmmu, IDSPMU, IDSPMUR, LEVEL, PATH, mu1, mu2, mu3, mu4 FROM uf_vw_SPMU_ms();

IF OBJECT_ID (N''#TempEkzmkShfkl'', N''U'') IS NOT NULL
DROP TABLE #TempEkzmkShfkl;
CREATE TABLE #TempEkzmkShfkl
(
	IDEKZMK int,
	NNNKL nvarchar(30),
	SHFKL varchar(30) collate Cyrillic_General_CI_AS,
	DTPREVMK datetime
);

insert into #TempEkzmkShfkl(idekzmk, SHFKL, NNNKL, DTPREVMK)
select IDEKZMK, SHFKL, NNNKL, DTMKFK from (
select ekzmk.IDEKZMK,  e2.SHFKL, e2.NNNKL, e2.dtmkfk,
ROW_NUMBER() over (partition by ekzmk.idekzmk order by e2.dtmkfk desc) nn
 from EKZMK 
left join EKZMK e2 on ekzmk.IDEKZ = e2.IDEKZ and e2.GDN = 1 and e2.DTMKFK < ekzmk.dtmkfk
) s
where nn = 1;

IF OBJECT_ID (N''#TempEkzmkNNDMS'', N''U'') IS NOT NULL
DROP TABLE #TempEkzmkNNDMS;
CREATE TABLE #TempEkzmkNNDMS
(
	IDEKZMK int,
	NNDMS varchar(30) collate Cyrillic_General_CI_AS,
	dtd datetime,
	nmvdd varchar(50) collate Cyrillic_General_CI_AS ,
	nmfrd  varchar(50) collate Cyrillic_General_CI_AS, 
	PTTXDMS  varchar(max) collate Cyrillic_General_CI_AS
);

insert into #TempEkzmkNNDMS(idekzmk, NNDMS, dtd, nmvdd, nmfrd, PTTXDMS)
select idod, nnd, dtd, nmvdd, nmfrd, PTTXDMS from (
select IDOD, NND, dtd, nmvdd, nmfrd, pttxdms,
ROW_NUMBER() over (partition by idod order by dtd desc) nn
from DMS 
join VDODVDD vdd on vdd.IDVDODVDD = dms.IDVDODVDD
join FRDMS on frdms.IDFRDMS = dms.IDFRDMS
join SPVDD on spvdd.IDSPVDD = frdms.IDSPVDD
where IDSPVDOD = 2 and spvdd.IDSPVDD in (2,6,8)
) s 
where nn = 1;
'
  set @s = @s + ' 
SELECT  DISTINCT
  SPOI.KDOI,
  SPNMTP.NMTP,
  SPKT.NMKT,
  SPKI.NMKI,
  TIPS.TP,
  TPRZ.DPZN,
  TPRZ.HRTC,
  EKZ.IDEKZ,
  EKZ.NNZV,
  EKZ.NNIN,
  EKZ.KLSIPR,

  SPSS.NMSS,
  SPTS.NMTS,

  VL.NMFRPD  AS FRPDVL, 
  MKF.NMFRPD AS FRPDMK,
  VL.PATH AS VL_PATH, 
  MKF.PATH AS MKF_PATH,
  VD.PRFIO AS PRSNVD,

  sD.PRFIO AS PRSNSD,
  pr.PRFIO AS PRSNPR,
  Vy.PRFIO AS PRSNVY,
  ssmp.NMSS as NMSSMP,
  tsmp.NMTS as NMTSMP,

  GRSI.NMGRSI,
  GRSI.KDGRSI,
  KSPRL.KDKSPRL,
  SPVDMK.NMVDMK,
  EKZMK.PZMC,
  SPMPOB.NMMPOB,
  PRSN.PRFIO,

  SPKMMK.KMMK,
  EKZMK.NNZVPV,
  SPVDKL.NMVDKL,
  EKZMK.NNNKL,
  EKZMK.DTMKFK,
  EKZMK.DTMKPL,
  EKZMK.DTPRM,
  EKZMK.DTVDM,
  EKZMK.GDN,
  EKZMK.STMK,
  EKZMK.STMKDP,
  EKZMK.NCSRMK,
  EKZMK.PRMK,
  EKZMK.SHFKL,
  SPVDMC.NMVDMC,
  
  MU.MU1  ''MU1'', 
  MU.MU2  ''MU2'', 
  MU.MU3  ''MU3'', 
  MU.MU4  ''MU4'',
  MU.PATH, 

  DTMAXM,
  MU.IDSPMU,
  EKZMK.IDEKZMK,
  EKZMK.IDGRSI,
  EKZMK.IDKSPRL,
  EKZMK.IDSPVDMK,
  EKZMK.IDSPVDMC,
  EKZMK.IDFRPD,
  EKZMK.IDSPMPOB,
  EKZMK.IDPRSN,
  EKZMK.IDSPKMMK,
  EKZMK.IDEKZRM,
  EKZMK.IDSPVDKL,
  EKZ.IDSPKT,
  EKZ.IDTPRZ,
  EKZ.IDSPSS,
  EKZ.IDSPTS,
  EKZ.IDFRPDV,
  EKZMK.IDPRSNVD,
  TPRZ.IDTIPS,

  ekzmk.idprsnsd,
  ekzmk.idprsnpr,
  ekzmk.idprsnvy,
  ekzmk.idsptsmp,
  ekzmk.idspssmp ,
  
  FRPDRK.FULLNAME,
  FRPDRK.ADRES,
  FRDSPV.FIORKMS,
  FRDSPV.DLRKMS,
  
  nnd.nmvdd,
  nnd.nmfrd,
  nnd.nndms,
  nnd.dtd,
  nnd.pttxdms,

  EKZMK.DSEKZMK,
  EKZMK.DTOTM,
  EKZMK.DTVZM,
  EKZMK.IDPRSNOTM,
  EKZMK.IDPRSNVZM,
  EKZMK.NRVRMNDmp,
  EKZMK.NRVRMmp,
  EKZMK.DTZVPV,
  EKZMK.VRMKFK,
  EKZMK.IDKSP,
  EKZMK.DPZNmp,
  EKZMK.HRTCmp,
  EKZMK.IDSPVDSBMK,
  SPVDSBMK.NMVDSBMK,
  EKZMK.PRCHNPGDN
	
FROM EKZMK

INNER JOIN EKZ ON EKZMK.IDEKZ=EKZ.IDEKZ and ISNULL(EKZ.IsDeleted, 0) = 0
LEFT JOIN GRSI ON EKZMK.IDGRSI=GRSI.IDGRSI
LEFT JOIN SPVDMC ON EKZMK.IDSPVDMC=SPVDMC.IDSPVDMC
LEFT JOIN KSPRL ON EKZMK.IDKSPRL=KSPRL.IDKSPRL
INNER JOIN SPVDMK ON EKZMK.IDSPVDMK=SPVDMK.IDSPVDMK
LEFT JOIN SPMPOB ON EKZMK.IDSPMPOB=SPMPOB.IDSPMPOB
LEFT JOIN PRSN ON EKZMK.IDPRSN=PRSN.IDPRSN
LEFT JOIN SPKMMK ON EKZMK.IDSPKMMK=SPKMMK.IDSPKMMK
LEFT JOIN SPVDKL ON EKZMK.IDSPVDKL=SPVDKL.IDSPVDKL

LEFT JOIN #TempSPMU MU ON  MU.IDSPMU=EKZMK.IDSPMU

INNER JOIN  #TempFRPD  MKF ON EKZMK.IDFRPD=MKF.IDFRPD
LEFT JOIN  #TempFRPD  VL ON EKZ.IDFRPDV=VL.IDFRPD

LEFT JOIN PRSN VD ON EKZMK.IDPRSNVD=VD.IDPRSN
LEFT JOIN SPKT ON EKZ.IDSPKT=SPKT.IDSPKT
LEFT JOIN SPSS ON EKZ.IDSPSS=SPSS.IDSPSS
LEFT JOIN SPTS ON EKZ.IDSPTS=SPTS.IDSPTS
LEFT JOIN EKZRM ON EKZ.IDEKZ=EKZRM.IDEKZ
INNER JOIN TPRZ ON EKZ.IDTPRZ=TPRZ.IDTPRZ
INNER JOIN TIPS ON TIPS.IDTIPS=TPRZ.IDTIPS
INNER JOIN SPNMTP ON TIPS.IDSPNMTP=SPNMTP.IDSPNMTP
LEFT JOIN SPKI ON TIPS.IDSPKI=SPKI.IDSPKI
INNER JOIN SPOI ON TIPS.IDSPOI=SPOI.IDSPOI 

LEFT JOIN PRSN sd ON EKZMK.IDPRSNsd=sd.IDPRSN
LEFT JOIN PRSN pr ON EKZMK.IDPRSNpr=pr.IDPRSN
LEFT JOIN PRSN vy ON EKZMK.IDPRSNvy=vy.IDPRSN
LEFT JOIN SPSS ssmp ON EKZmk.IDSPSSmp=ssmp.IDSPSS
LEFT JOIN SPTS tsmp ON EKZmk.IDSPTSmp=tsmp.IDSPTS

LEFT JOIN FRPDRK on FRPDRK.IDFRPD = EKZMK.IDFRPD
LEFT JOIN FRDSPV on FRDSPV.IDFRPD = EKZMK.IDFRPD
LEFT JOIN #TempEkzmkShfkl pk on pk.idekzmk = ekzmk.idekzmk
LEFT join #TempEkzmkNNDMS nnd on nnd.idekzmk = ekzmk.idekzmk
LEFT JOIN SPVDSBMK ON EKZMK.IDSPVDSBMK=SPVDSBMK.IDSPVDSBMK	 

where '

  set @select = @select + @fltr

  if @per = '1'
    set @fltr = @fltr +
      ' and  ekz.idekz in (select idekz from PS_TempFltrEkz where suser = ''' + @systemuser + ''') '

  if @per = '-1'
    set @fltr = @fltr +
      ' and ekz.idekz not in (select idekz from PS_TempFltrEkz where suser = ''' + @systemuser + ''') '

  set @s = @s + @fltr

  set @s = @s + ' 
IF OBJECT_ID(N''#TempFRPD'', N''U'') IS NOT NULL
DROP TABLE #TempFRPD;

IF OBJECT_ID (N''#TempSPMU'', N''U'') IS NOT NULL
DROP TABLE #TempSPMU;'

  if @per = '2'
    set @s = @select

  exec (@s)
END

