-- Шаблон создан мастером бланков
-- 03.11.2003 10:22:19
--
БланкСШаблоном "Библиотека SQL";

Proc ШаблонПриОткрытии(l:l);
 Message('Библиотека SQL^MТБ-БЮДЖЕТ 2009г');
 close;
end;

Proc UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL(crd:s;префикс:s); --добавляет префикс вида [??.] в признак НФА во всей базе данных, независимо от фильтра в сервере ТБ если признак не соответствует маске "НФА.???.??.??.%"
  var SQLquery:ls;
  var ncrd,t:i;
  var dbo,crdsql,SetUpdateTime:s;
  crd=up(crd);
  префикс="'"+префикс+".'";
  ncrd=Раб.SQL.GetNomCRD(crd);
  dbo=up(Раб.SQL.SQLcrdlist[ncrd]);
  dbo=ВыделитьСлово(1,dbo,'.')+'.[dbo].';
  crdsql='['+crd+']';
  SetUpdateTime=' ,UpdateTime=DATEADD(second,1,getdate()) ';
  if crd='РПО_НФА':crdsql='['+crd+']';
     SQLquery="UPDATE "+dbo+crdsql+" SET ПРИЗНАК="+префикс+"+upper(ltrim(ПРИЗНАК))"+SetUpdateTime+"WHERE not [ПРИЗНАК] like '__.%'";
     ExecuteSQL('',SQLquery,crd);
   | crd='РПО_ОПЕРАЦИИДНФА':
     crdsql='['+crd+'@ПОЗИЦИИ]';
--     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ОСТНФА,PATINDEX('%(НФА.___.__.%',ОСТНФА)+11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11) WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ltrim(НФА),11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11) WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
     SQLquery="UPDATE "+dbo+crdsql+" SET ОСТНФА=left(ОСТНФА,PATINDEX('%(НФА.___.__.%',ОСТНФА)+11)+"+префикс+"+substring(ОСТНФА,PATINDEX('%(НФА.___.__.%',ОСТНФА)+12,LEN(ОСТНФА)-PATINDEX('%(НФА.___.__.%',ОСТНФА)-11) WHERE ОСТНФА like '%(НФА.___.__.%' and not ОСТНФА like '%(НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
   | crd='РПО_ОСТ_НФА':
     crdsql='['+crd+'@ПОЗИЦИИ]';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ltrim(НФА),11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11) WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
     crdsql='['+crd+'@ПОЗИЦИИОС]';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ltrim(НФА),11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11) WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
   | crd='РПО_НФА_СПРАВКА_ПРОВОДКИ' or crd='РПО_НФА_СПРАВКА':
     crd='РПО_НФА_СПРАВКА_ПРОВОДКИ';
     crdsql='['+crd+']';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА_КОД=left(ltrim(НФА_КОД),11)+"+префикс+"+substring(ltrim(НФА_КОД),12,LEN(ltrim (НФА_КОД))-11)"+SetUpdateTime+"WHERE ltrim(НФА_КОД) like 'НФА.___.__.%' and not ltrim(НФА_КОД) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
   | crd='РПО_НАЧ_АМОРТ' or crd='РПО_НАЧ_АМОРТ_TR':
     crd='РПО_НАЧ_АМОРТ';
     crdsql='['+crd+'@ПОЗИЦИИ]';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ltrim(НФА),11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11) WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
     crd='РПО_НАЧ_АМОРТ_TR';
     crdsql='['+crd+']';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ltrim(НФА),11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11)"+SetUpdateTime+"WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
   | crd='РПО_ИНВКАРТ_ОС':
     crdsql='['+crd+']';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА=left(ltrim(НФА),11)+"+префикс+"+substring(ltrim(НФА),12,LEN(ltrim (НФА))-11),ИНВ_ВЕД="+префикс+"+ltrim(ИНВ_ВЕД)"+SetUpdateTime+"WHERE ltrim(НФА) like 'НФА.___.__.%' and not ltrim(НФА) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
   | crd='РПО_ВНУТР_ПЕРЕМ_МОЛ':
     crdsql='['+crd+'@ПОЗИЦИИ]';
     SQLquery="UPDATE "+dbo+crdsql+" SET НФА_КОД=left(ltrim(НФА_КОД),11)+"+префикс+"+substring(ltrim(НФА_КОД),12,LEN(ltrim (НФА_КОД))-11),ИНВ_КОД="+префикс+"+ltrim(ИНВ_КОД) WHERE ltrim(НФА_КОД) like 'НФА.___.__.%' and not ltrim(НФА_КОД) like 'НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
     SQLquery="UPDATE "+dbo+crdsql+" SET УСЛОСТНФА=left(УСЛОСТНФА,PATINDEX('%[{&]НФА.___.__.%',УСЛОСТНФА)+11)+"+префикс+"+substring(УСЛОСТНФА,PATINDEX('%[{&]НФА.___.__.%',УСЛОСТНФА)+12,LEN(УСЛОСТНФА)-PATINDEX('%[{&]НФА.___.__.%',УСЛОСТНФА)-11) WHERE УСЛОСТНФА like '%[{&]НФА.___.__.%' and not УСЛОСТНФА like '%[{&]НФА.___.__.__.%'";
     ExecuteSQL('',SQLquery,crd);
  fi;
--   UPDATE [db_nfa2_2014].[dbo].[РПО_ОПЕРАЦИИДНФА@ПОЗИЦИИ]
--   SET [ОСТНФА] = left(ОСТНФА,PATINDEX('%(НФА.___.__.%',ОСТНФА)+11)+'01.'+substring(ОСТНФА,PATINDEX('%(НФА.___.__.%',ОСТНФА)+12,LEN(ОСТНФА)-PATINDEX('%(НФА.___.__.%',ОСТНФА)-11)
--    WHERE ОСТНФА like '%(НФА.___.__.%' and
--	not ОСТНФА like '%(НФА.___.__.__.%'
--GO
--UPDATE [db_nfa2_2014].[dbo].[РПО_ВНУТР_ПЕРЕМ_МОЛ@ПОЗИЦИИ]
--   SET [УСЛОСТНФА] = left(УСЛОСТНФА,PATINDEX('%(НФА.___.__.%',УСЛОСТНФА)+11)+'01.'+substring(УСЛОСТНФА,PATINDEX('%(НФА.___.__.%',УСЛОСТНФА)+12,LEN(УСЛОСТНФА)-PATINDEX('%(НФА.___.__.%',УСЛОСТНФА)-11)
--    WHERE УСЛОСТНФА like '%(НФА.___.__.%' and
--	not УСЛОСТНФА like '%(НФА.___.__.__.%'
--GO

end;
Proc UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL_all(префикс:s);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_НФА',префикс);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_ОПЕРАЦИИДНФА',префикс);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_ОСТ_НФА',префикс);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_НФА_СПРАВКА',префикс);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_НАЧ_АМОРТ',префикс);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_ИНВКАРТ_ОС',префикс);
 UPDATE_ADD_ПРЕФИКС_ПРИЗНАК_НФА_SQL('РПО_ВНУТР_ПЕРЕМ_МОЛ',префикс);
end;

--UPDATE [db_nfa2_2014].[dbo].[РПО_НФА]
--   SET [ПРИЗНАК] = '01.'+upper(ltrim ([ПРИЗНАК]))
--	,[UpdateTime] = DATEADD(second, 1, getdate())
--    WHERE not [ПРИЗНАК] like '__.%'
--GO


--UPDATE [db_nfa2_2014].[dbo].[РПО_ОПЕРАЦИИДНФА@ПОЗИЦИИ]
--   SET [НФА] = left(ltrim([НФА]),11)+'01.'+substring(ltrim ([НФА]),12,LEN(ltrim ([НФА]))-11)
--    WHERE ltrim([НФА]) like 'НФА.___.__.%' and
--	not ltrim([НФА]) like 'НФА.___.__.__.%'
--GO
--UPDATE [db_nfa2_2014].[dbo].[РПО_ОСТ_НФА@ПОЗИЦИИ]
--   SET [НФА] = left(ltrim([НФА]),11)+'01.'+substring(ltrim ([НФА]),12,LEN(ltrim ([НФА]))-11)
--    WHERE ltrim([НФА]) like 'НФА.___.__.%' and
--	not ltrim([НФА]) like 'НФА.___.__.__.%'
--GO

--UPDATE [db_nfa2_2014].[dbo].[РПО_ОСТ_НФА@ПОЗИЦИИОС]
--   SET [НФА] = left(ltrim([НФА]),11)+'01.'+substring(ltrim ([НФА]),12,LEN(ltrim ([НФА]))-11)
--    WHERE ltrim([НФА]) like 'НФА.___.__.%' and
--	not ltrim([НФА]) like 'НФА.___.__.__.%'
--GO
--UPDATE [db_nfa2_2014].[dbo].[РПО_НФА_СПРАВКА_ПРОВОДКИ]
--   SET [НФА_КОД] = left(ltrim([НФА_КОД]),11)+'01.'+substring(ltrim ([НФА_КОД]),12,LEN(ltrim ([НФА_КОД]))-11)
--	,[UpdateTime] = DATEADD(second, 1, getdate())
--    WHERE ltrim([НФА_КОД]) like 'НФА.___.__.%' and
--	not ltrim([НФА_КОД]) like 'НФА.___.__.__.%'
--GO

--UPDATE [db_nfa2_2014].[dbo].[РПО_НАЧ_АМОРТ_TR]
--   SET [НФА] = left(ltrim([НФА]),11)+'01.'+substring(ltrim ([НФА]),12,LEN(ltrim ([НФА]))-11)
--	,[UpdateTime] = DATEADD(second, 1, getdate())
--    WHERE ltrim([НФА]) like 'НФА.___.__.%' and
--	not ltrim([НФА]) like 'НФА.___.__.__.%'
--GO
--UPDATE [db_nfa2_2014].[dbo].[РПО_НАЧ_АМОРТ@ПОЗИЦИИ]
--   SET [НФА] = left(ltrim([НФА]),11)+'01.'+substring(ltrim ([НФА]),12,LEN(ltrim ([НФА]))-11)
--    WHERE ltrim([НФА]) like 'НФА.___.__.%' and
--	not ltrim([НФА]) like 'НФА.___.__.__.%'
--GO
--UPDATE [db_nfa2_2014].[dbo].[РПО_ИНВКАРТ_ОС]
--   SET [НФА] = left(ltrim([НФА]),11)+'01.'+substring(ltrim ([НФА]),12,LEN(ltrim ([НФА]))-11)
--	,[UpdateTime] = DATEADD(second, 1, getdate())
--	,[ИНВ_ВЕД] ='01.'+ltrim([ИНВ_ВЕД])
--    WHERE ltrim([НФА]) like 'НФА.___.__.%' and
--	not ltrim([НФА]) like 'НФА.___.__.__.%'
--GO
--UPDATE [db_nfa2_2014].[dbo].[РПО_ВНУТР_ПЕРЕМ_МОЛ@ПОЗИЦИИ]
--   SET [НФА_КОД] = left(ltrim([НФА_КОД]),11)+'01.'+substring(ltrim ([НФА_КОД]),12,LEN(ltrim ([НФА_КОД]))-11)
--	,[ИНВ_КОД] ='01.'+ltrim([ИНВ_КОД])
--    WHERE ltrim([НФА_КОД]) like 'НФА.___.__.%' and
--	not ltrim([НФА_КОД]) like 'НФА.___.__.__.%'
--GO



--IF OBJECT_ID ('[db_NFA2_2014].dbo.T1', 'U') IS NOT NULL
--    DROP TABLE [db_NFA2_2014].dbo.T1;
--GO
--CREATE TABLE [db_NFA2_2014].dbo.T1
--(
--    rep_from [varchar](256),
--    rep_to [varchar](256)
-- );
--GO
--INSERT INTO [db_NFA2_2014].dbo.T1 (rep_from, rep_to)
--    VALUES
--('189.0306.0013100.001','189.0306.3210039.244'),
--('189.0306.1000399.212','189.0306.3259999.212'),
--('189.0306.1000399.412','189.0306.3259999.413'),
--('189.0306.1001499.242','189.0306.1099999.242'),
--('187.0201.2026700.242','189.0501.3244031.442'),
--('189.1202.4559900.244','189.0000.3240059.244');
--select * from [db_NFA2_2014].dbo.T1


--UPDATE [db_NFA2_2014].[dbo].[РПО_ОСТ_НФА@ПОЗИЦИИ]
--SET СЧНФА=REPLACE(СЧНФА,rep_from,rep_to)
--	,ДОПАН=REPLACE(ДОПАН,rep_from,rep_to)
--	,ФКР0=SUBSTRING(СЧНФА,1,20)
--from [db_NFA2_2014].dbo.T1 t1, [db_NFA2_2014].[dbo].[РПО_ОСТ_НФА@ПОЗИЦИИ] t0

--where CHARINDEX(rep_from,СЧНФА+' '+ДОПАН+' '+ФКР0)>0


--select distinct СЧНФА,ФКР0 from [db_NFA2_2014].[dbo].[РПО_ОСТ_НФА@ПОЗИЦИИ]

func  LoadRowsCRD(crd_tbb:s;crd_sql:s;filter:s;show_msg:l;row1:i;row2:i;sortfields:s;field_to_field:ls;fields:s;fields0:s;bln_name:s):i; -- загружает данные картотеки в массивы бланка, возвращает кол загруженных строк
 -- обязательное условие - наличие поля UKEY
-- crd_tbb	  -- имя картотеки ТБ для коннекта с sql
-- crd_sql	  -- реальное имя картотеки в базе данных
-- filter	  -- sql фильтр на картотеку crd_sql
-- show_msg	  -- флаг показывать градусник отработки запроса (удобно при длительном исполнении)
-- row1,row1	  -- вывод диопазона строк в соответствии с сортировкой полями сортировки sortfields
-- sortfields	  -- имена полей сортировки
-- field_to_field -- строка вида массив_бланка1=ИмяСтолбцаТаблицы1|массив_бланка2=ИмяСтолбцаТаблицы2|массив_бланка3=ИмяСтолбцаТаблицы3
-- fields	  -- список столбцов таблицы для загрузки через запятую (он же нужен для корректной отработки field_to_field) a,b,c,d
-- fields0	  -- список итоговых столбцов таблицы для загрузки через запятую (он же нужен для корректной отработки field_to_field) a+b as ИмяСтолбцаТаблицы1,c+d as ИмяСтолбцаТаблицы2
-- bln_name	  -- имя бланка в который будут грузится данные(пустая строка - грузим в текущий бланк)
 var rez:i;
 var waSQL:i;
 var lst:LS;
 var ll:L;
 var lnlst:i;
 if trim(sortfields)<>'':sortfields=sortfields+',';fi;
 lst='';lnlst=0;rez=-1;

 if  row1<1:-- возврат всей таблицы до row2 включительно
--     if row2>0:
     lst=lst+' '+trim('SELECT '+fields0 					       );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('        (SELECT TOP '+str(row2)+' UKEY [u k]		      ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	ORDER BY '+sortfields+' UKEY ASC		      ');
     lst=lst+' '+trim('        ) s0						      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.ukey=s1.[u k]		      ');
     lst=lst+' '+trim('order by '+sortfields+' UKEY ASC 			      ');
  |  row2>0 and row2>row1: -- row1<окно<=row2

     lst=lst+' '+trim('SELECT '+fields0 					       );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('       ( 						      ');
     lst=lst+' '+trim('       SELECT [u k]					      ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row1)+' UKEY [u k]		      ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 ORDER BY '+sortfields+' UKEY ASC		      ');
     lst=lst+' '+trim(' 	) s01						      ');
     lst=lst+' '+trim('       UNION ALL 					      ');
     lst=lst+' '+trim('       SELECT [u k]					      ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row2)+' UKEY [u k]		      ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 ORDER BY '+sortfields+' UKEY ASC		      ');
     lst=lst+' '+trim(' 	) s02						      ');
     lst=lst+' '+trim('    ) s0 						      ');
     lst=lst+' '+trim('    group by [u k]					      ');
     lst=lst+' '+trim('    HAVING count(*) =1					      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.ukey=s1.[u k]		      ');
     lst=lst+' '+trim('order by '+sortfields+' ukey ASC 			      ');

 fi;

 ^Раб.SQL.LoadRowsSelect(crd_tbb,lst,show_msg,field_to_field,bln_name);

end;

func  LoadRowsCRD_id(crd_tbb:s;crd_sql:s;filter:s;show_msg:l;row1:i;row2:i;sortfields:s;field_to_field:ls;fields:s;fields0:s;bln_name:s;ukey_alias:s):i; -- загружает данные картотеки в массивы бланка, возвращает кол загруженных строк
 -- обязательное условие - наличие поля UKEY
-- crd_tbb	  -- имя картотеки ТБ для коннекта с sql
-- crd_sql	  -- реальное имя картотеки в базе данных
-- filter	  -- sql фильтр на картотеку crd_sql
-- show_msg	  -- флаг показывать градусник отработки запроса (удобно при длительном исполнении)
-- row1,row1	  -- вывод диопазона строк в соответствии с сортировкой полями сортировки sortfields
-- sortfields	  -- имена полей сортировки
-- field_to_field -- строка вида массив_бланка1=ИмяСтолбцаТаблицы1|массив_бланка2=ИмяСтолбцаТаблицы2|массив_бланка3=ИмяСтолбцаТаблицы3
-- fields	  -- список столбцов таблицы для загрузки через запятую (он же нужен для корректной отработки field_to_field) a,b,c,d
-- fields0	  -- список итоговых столбцов таблицы для загрузки через запятую (он же нужен для корректной отработки field_to_field) a+b as ИмяСтолбцаТаблицы1,c+d as ИмяСтолбцаТаблицы2
-- bln_name	  -- имя бланка в который будут грузится данные(пустая строка - грузим в текущий бланк)
 var rez:i;
 var waSQL:i;
 var lst:LS;
 var ll:L;
 var lnlst:i;
 var sortfields_desc:s;
 if fields0<>'':fields0=','+fields0;fi;
 if trim(sortfields)<>'':
    sortfields_desc=sortfields+' desc,';
    sortfields=sortfields+',';
 fi;
 lst='';lnlst=0;rez=-1;

 if  row1<1:-- возврат всей таблицы до row2 включительно
--     if row2>0:
     lst=lst+' '+trim('SELECT [u k] UKEY'+fields0						 );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('        (SELECT TOP '+str(row2)+' '+ukey_alias+' [u k] ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	ORDER BY '+sortfields+' '+ukey_alias+'');
     lst=lst+' '+trim('        ) s0						      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.'+ukey_alias+'=s1.[u k] 		');
--     lst=lst+' '+trim('order by '+sortfields+' '+ukey_alias+' ASC  ');
     lst=lst+' '+trim('order by '+sortfields+' UKEY ASC 			      ');
  |  row2>0 and row2>row1: -- row1<окно<=row2

     lst=lst+' '+trim('SELECT [u k] UKEY'+fields0						 );
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('       ( 						      ');
     lst=lst+' '+trim('       SELECT TOP '+str(row2-row1)+' [u k]	 ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row2)+' '+sortfields+ukey_alias+' [u k]	 ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 order by '+sortfields+' [u k] ');
     lst=lst+' '+trim(' 	) s01						      ');
     lst=lst+' '+trim(' 	 order by '+sortfields_desc+' [u k] desc ');
     lst=lst+' '+trim('       ) s1						   ');

     lst=lst+' '+trim('    left join '+crd_sql+' a on a.'+ukey_alias+'=s1.[u k] 		');
     lst=lst+' '+trim('order by '+sortfields+' UKEY				   ');


     if 1=0:
     lst=lst+' '+trim('SELECT [u k] UKEY'+fields0						 );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('       ( 						      ');
     lst=lst+' '+trim('       SELECT [u k]					      ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row1)+' '+ukey_alias+' [u k]	      ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 order by '+sortfields+' [u k] ASC  ');
     lst=lst+' '+trim(' 	) s01						      ');
     lst=lst+' '+trim('       UNION ALL 					      ');
     lst=lst+' '+trim('       SELECT [u k]					      ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row2)+' '+ukey_alias+' [u k]	      ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 order by '+sortfields+' [u k] ASC  ');
     lst=lst+' '+trim(' 	) s02						      ');
     lst=lst+' '+trim('    ) s0 						      ');
     lst=lst+' '+trim('    group by [u k]					      ');
     lst=lst+' '+trim('    HAVING count(*) =1					      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.'+ukey_alias+'=s1.[u k] 		');
     lst=lst+' '+trim('order by '+sortfields+' UKEY ASC 			      ');
--     lst=lst+' '+trim('order by '+sortfields+' '+ukey_alias+' ASC  ');

     fi;
 fi;

 ^Раб.SQL.LoadRowsSelect(crd_tbb,lst,show_msg,field_to_field,bln_name);

end;

func  LoadRowsCRD_id_group_(crd_tbb:s;crd_sql:s;filter:s;show_msg:l;GROUPDOC:s;GROUPDOC_name:s;GroupAttr:s;sortfields:s;field_to_field:ls;fields:s;fields0:s;bln_name:s;ukey_alias:s):i; -- загружает данные картотеки в массивы бланка, возвращает кол загруженных строк
--  GROUPDOC	    :ПОДРАЗДЕЛЕНИЯ(ПОДРАЗ); --GroupAttr   :Integer;
--  GroupAttr	    :INTEGER;

 -- обязательное условие - наличие поля UKEY
-- crd_tbb	  -- имя картотеки ТБ для коннекта с sql
-- crd_sql	  -- реальное имя картотеки в базе данных
-- filter	  -- sql фильтр на картотеку crd_sql
-- show_msg	  -- флаг показывать градусник отработки запроса (удобно при длительном исполнении)
-- row1,row1	  -- вывод диопазона строк в соответствии с сортировкой полями сортировки sortfields
-- sortfields	  -- имена полей сортировки
-- field_to_field -- строка вида массив_бланка1=ИмяСтолбцаТаблицы1|массив_бланка2=ИмяСтолбцаТаблицы2|массив_бланка3=ИмяСтолбцаТаблицы3
-- fields	  -- список столбцов таблицы для загрузки через запятую (он же нужен для корректной отработки field_to_field) a,b,c,d
-- fields0	  -- список итоговых столбцов таблицы для загрузки через запятую (он же нужен для корректной отработки field_to_field) a+b as ИмяСтолбцаТаблицы1,c+d as ИмяСтолбцаТаблицы2
-- bln_name	  -- имя бланка в который будут грузится данные(пустая строка - грузим в текущий бланк)
 var row1,row2:i;
 var rez:i;
 var waSQL:i;
 var lst:LS;
 var ll:L;
 var lnlst:i;
 if trim(sortfields)<>'':sortfields=sortfields+',';fi;
 lst='';lnlst=0;rez=-1;
     lst=lst+' '+trim('SELECT [u k] '+fields0						     );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('        (SELECT TOP '+str(row2)+' '+ukey_alias+' [u k] ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	ORDER BY '+sortfields+' '+ukey_alias+' ASC  ');
     lst=lst+' '+trim('        ) s0						      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.'+ukey_alias+'=s1.[u k] 		');
     lst=lst+' '+trim('order by '+sortfields+' UKEY ASC 			      ');

 if  row1<1:-- возврат всей таблицы до row2 включительно
--     if row2>0:
     lst=lst+' '+trim('SELECT [u k] '+fields0						     );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('        (SELECT TOP '+str(row2)+' ID [u k]		    ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	ORDER BY '+sortfields+' ID ASC			    ');
     lst=lst+' '+trim('        ) s0						      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.id=s1.[u k]		    ');
     lst=lst+' '+trim('order by '+sortfields+' UKEY ASC 			      ');
  |  row2>0 and row2>row1: -- row1<окно<=row2

     lst=lst+' '+trim('SELECT [u k] '+fields0						     );
     lst=lst+' '+trim('FROM							      ');
     lst=lst+' '+trim('    (SELECT [u k]					      ');
     lst=lst+' '+trim('       FROM						      ');
     lst=lst+' '+trim('       ( 						      ');
     lst=lst+' '+trim('       SELECT [u k]					      ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row1)+' ID [u k]		    ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 ORDER BY '+sortfields+' ID ASC 		    ');
     lst=lst+' '+trim(' 	) s01						      ');
     lst=lst+' '+trim('       UNION ALL 					      ');
     lst=lst+' '+trim('       SELECT [u k]					      ');
     lst=lst+' '+trim('        FROM						      ');
     lst=lst+' '+trim(' 	(						      ');
     lst=lst+' '+trim(' 	 SELECT TOP '+str(row2)+' ID [u k]		    ');
     lst=lst+' '+trim(' 	 FROM '+crd_sql+' WITH (NOLOCK) 		      ');
     if filter<>'':
     lst=lst+' '+trim(' 	 WHERE '+filter 				       );
     fi;
     lst=lst+' '+trim(' 	 ORDER BY '+sortfields+' ID ASC 		    ');
     lst=lst+' '+trim(' 	) s02						      ');
     lst=lst+' '+trim('    ) s0 						      ');
     lst=lst+' '+trim('    group by [u k]					      ');
     lst=lst+' '+trim('    HAVING count(*) =1					      ');
     lst=lst+' '+trim('    ) s1 						      ');
     lst=lst+' '+trim('    left join '+crd_sql+' a on a.id=s1.[u k]		    ');
     lst=lst+' '+trim('order by '+sortfields+' ukey ASC 			      ');

 fi;

 ^Раб.SQL.LoadRowsSelect(crd_tbb,lst,show_msg,field_to_field,bln_name);

end;

func  Open_waSQL_НарушениеУникальности(crd_tbb:s;show_msg:l;fields_UNIQUE:s;OUT_fields:s;filter:s):i; --
 var rez:i;
 var waSQL:i;
 var ll:L;
 var crd_sql,SQLFilter:s;
 var select_sql:ls;
 rez=-1;
  crd_sql=GetRealCardfileName(crd_tbb);
  ll=CardFilterToSQL(crd_tbb, '', filter, SQLFilter);
  select_sql="SELECT "+fields_UNIQUE+" from (SELECT "+fields_UNIQUE+",count(*) col_count from "+crd_sql+" WITH (NOLOCK) "+if(ll,"where "+SQLFilter,"")+" group by "+fields_UNIQUE+") s1 where col_count>1 order by "+fields_UNIQUE ;
  if show_msg:ОкноВыполненияПоказать(2, "Запрос к базе данных...");fi;
  try
  waSQL=ОткрытьРабочуюОбластьSQL('',select_sql,crd_tbb);
   ll=true;
   if show_msg:ОкноВыполненияЗакрыть;fi;
  except
   ll=false;
   if show_msg:ОкноВыполненияЗакрыть;fi;
   CloseWorkArea(waSQL);
   Raise;
  end;
  if ll:
     ^waSQL;
  fi;
  ^rez;
end;
func  Open_waSQL_Оставить_СтарыеУникальные(crd_tbb:s;show_msg:l;fields_UNIQUE:s;filter:s):i; -- сортированная область по fields_UNIQUE,CreateTime
 var rez:i;
 var waSQL,z,j:i;
 var ll:L;
 var crd_sql,ss,SQLFilter,where_fields_UNIQUE:s;
 var select_sql:ls;
 rez=-1;
  crd_sql=GetRealCardfileName(crd_tbb);
  filter=trim(filter);
  if filter<>'':
    ll=CardFilterToSQL(crd_tbb, '', filter, SQLFilter);
    if ll:SQLFilter=trim(SQLFilter);
      if SQLFilter<>'':SQLFilter="("+SQLFilter+")";
       | true:ll=false;
      fi;
    fi;
   | true:ll=false;
  fi;
  where_fields_UNIQUE='';
  z=WordsCount(fields_UNIQUE,',');
  for j=1..z do
   ss=ВыделитьСлово(j,fields_UNIQUE,',');
   if j>1:where_fields_UNIQUE=where_fields_UNIQUE+" and ";fi;
   where_fields_UNIQUE=where_fields_UNIQUE+"crd_tbb."+ss+"=s0."+ss;
  od;
  where_fields_UNIQUE="("+where_fields_UNIQUE+")";

  select_sql="SELECT s0.*,crd_tbb.ukey from (SELECT "+fields_UNIQUE+" from (SELECT "+fields_UNIQUE+",count(*) col_count from "+crd_sql+" WITH (NOLOCK) "+if(ll,"where "+SQLFilter,"")+" group by "+fields_UNIQUE+") s1 where col_count>1 ) s0 left join "+crd_sql+" crd_tbb on "+where_fields_UNIQUE+if(ll," and "+SQLFilter,"")+" order by "+fields_UNIQUE+",crd_tbb.createtime,crd_tbb.ukey" ;
--  select_sql="SELECT s0.*,crd_tbb.ukey ,replace(convert(varchar,crd_tbb.createtime,121),'-','') createtime from (SELECT "+fields_UNIQUE+" from (SELECT "+fields_UNIQUE+",count(*) col_count from "+crd_sql+" WITH (NOLOCK) "+if(ll,"where "+SQLFilter,"")+" group by "+fields_UNIQUE+") s1 where col_count>1 ) s0 left join "+crd_sql+" crd_tbb on "+where_fields_UNIQUE+if(ll," and "+SQLFilter,"")+" order by "+fields_UNIQUE+",crd_tbb.createtime" ;
  if show_msg:ОкноВыполненияПоказать(2, "Запрос к базе данных...");fi;
  try
  waSQL=ОткрытьРабочуюОбластьSQL('',select_sql,crd_tbb);
   ll=true;
   if show_msg:ОкноВыполненияЗакрыть;fi;
  except
   ll=false;
   if show_msg:ОкноВыполненияЗакрыть;fi;
   CloseWorkArea(waSQL);
   Raise;
  end;
  if ll:
     ^waSQL;
  fi;
  ^rez;
end;
func  Оставить_СтарыеУникальные(crd_tbb:s;show_msg:l;fields_UNIQUE:s;filter:s):s; -- сортированная область по fields_UNIQUE,CreateTime 
-- удаляются в crd_tbb записи с равными текстовыми значениями по каждому полю из списка полей fields_UNIQUE
-- остается запись с наименьшим значением поля CreateTime
-- при равных CreateTime остается запись с меньшим UKEY
-- результат "кол удаленных","кол не удаленных по ошибке"
 var waSQL,rs,j,z,k,j0,j1,nrec0,nrec1,nrec,wa,rez,rez_error:i;
 var ss:s;
 var ll:l;
     rez=0;rez_error=0;
     waSQL=Open_waSQL_Оставить_СтарыеУникальные(crd_tbb,show_msg,fields_UNIQUE,filter);
     z=WordsCount(fields_UNIQUE,',');
     if waSQL>0:
	rs=records(waSQL);
	if rs>0:
	  wa=openworkarea(crd_tbb,'',filter);
	  for j=1..rs do
	   ll=false;
--	     nrec=GetRecordKey
	   nrec=GetRecordNumber(wa,getfieldr(waSQL,j,'ukey'));
	   if nrec>0:
	     if j0=0:
		j0=j;
		nrec0=nrec;
	     fi;
	     if j1=0:
		j1=j;
		nrec1=nrec;
	     fi;
	     if j>j1:
		j0=j1;
		nrec0=nrec1;-- запоминаем последнюю запись (даже если она удалена в оригинале wa -не критично,т.к. сравнение идет по waSQL)
		j1=j;
		nrec1=nrec;
	     fi;
	     if j1>j0:-- есть две реальные записи для проверки
	       for k=1..z do
		ll=getfields(waSQL,j0,ВыделитьСлово(k,fields_UNIQUE,','))=getfields(waSQL,j1,ВыделитьСлово(k,fields_UNIQUE,','));
		if not ll: break;fi;
	       od;
	       if ll:-- нашли две равные по уникальным полям записи, надо удалять дубль
		  try
		   beginchanging(wa);
		   УдалитьЗапись(wa, nrec1);
		   endchanging(wa);
		   rez=rez+1;
		  except
		   rez_error=rez_error+1;
		   cancelchanging(wa);
		  end;
	       fi;
	     fi;
	   fi;
	  od;
	  CloseWorkArea(wa);
	fi;
	CloseWorkArea(waSQL);
     fi;
 ^str(rez)+','+str(rez_error);
end;


Конец

