Z1, ну весь так весь. Напомню только, что на SQL2000 работает. На сколько он оптимален, не знаю. Ну что могу... Ах да, запрос собственно ищет дубли контрагентов по номерам телефона.
Процедура СоздатьФункцииТелефонов(RS) // CREATE сделал до этого ТекстФункции = " |ALTER FUNCTION dbo.NormalPhone5(@s1 varchar(80)) RETURNS varchar(80) as |BEGIN | declare @a varchar(80) | declare @c varchar(1) | declare @i int | declare @j int | declare @l int | set @a = substring(@s1,1,80) | set @a = replace(@a,')','') | set @a = replace(@a,'(','') | set @a = replace(@a,'/','') | set @a = replace(@a,'-','') | if (charindex(',',@a) > 5) set @a = left(@a,charindex(',',@a)-1) | else | if (charindex(';',@a) > 5) set @a = left(@a,charindex(';',@a)-1) | else | if (charindex(' ',@a) > 5) set @a = left(@a,charindex(' ',@a)-1) | set @a = replace(@a,',','') | set @a = replace(@a,';','') | set @a = replace(@a,' ','') | set @a = replace(@a,'.','') | set @a = ltrim(@a) | set @i = 1 | set @l = len(@a) | while (@i<=@l) | begin | set @c = substring(@a,@i,1) | set @j = charindex(@c,'абвгдеёжзийклмнопрстуфхцчшъщьэюя') | if (@j > 0) | begin | set @a = left(@a,@i-1) | set @i = @l | end | set @i = @i + 1 | end | return @a |END |"; RS.Открыть(ТекстФункции); ТекстФункции = " |ALTER FUNCTION dbo.NormalPhone4(@s1 varchar(80)) RETURNS int as |BEGIN | return len(ltrim(rtrim(@s1))) |END |"; RS.Открыть(ТекстФункции); КонецПроцедуры // СоздатьФункцииТелефонов() Процедура ПроверитьДублиТелефонов2() ТЗ.Очистить(); RS = СоздатьОбъект("ODBCRecordset"); СоздатьФункцииТелефонов(RS); ТекУсловие = ""; ТекстТаблицы = " |SELECT Спр.IsMark as С | ,Спр.ID as [Элемент $Справочник.Контрагенты] | ,$Спр.ДатаСозд as ДатаСозд | ,$Спр.Автор as [Автор $Справочник.Пользователи] | ,$Спр.ЮрФизЛицо as [ЮрФизЛицо $Справочник] | ,CAST(COALESCE($СпрЮ.Телефоны, $СпрФ.Телефоны) as varchar(80)) as Телефоны | ,dbo.NormalPhone5(COALESCE($СпрЮ.Телефоны, $СпрФ.Телефоны)) as Нормал |INTO #TMP_1 |FROM $Справочник.Контрагенты as Спр WITH (nolock) |LEFT JOIN $Справочник.ЮрЛица СпрЮ ON $ВидСправочника36.ЮрЛица + СпрЮ.ID = $Спр.ЮрФизЛицо |LEFT JOIN $Справочник.ФизЛица СпрФ ON $ВидСправочника36.ФизЛица + СпрФ.ID = $Спр.ЮрФизЛицо |WHERE dbo.NormalPhone4(COALESCE($СпрЮ.Телефоны, $СпрФ.Телефоны)) > 5 |"; Если ДобавитьФильтрПоКонтрагентам(RS,ТекУсловие) = 0 Тогда ТекстТаблицы = ТекстТаблицы + " AND "+ТекУсловие; КонецЕсли; ТекстТаблицы = ТекстТаблицы + " | |SELECT dbo.NormalPhone5($СпрЮ.Телефоны) as Нормал2 |INTO #TMP_3 |FROM $Справочник.ЮрЛица as СпрЮ |WHERE dbo.NormalPhone4($СпрЮ.Телефоны) > 5 |UNION ALL |SELECT dbo.NormalPhone5($СпрФ.Телефоны) as Нормал2 |FROM $Справочник.ФизЛица as СпрФ |WHERE dbo.NormalPhone4($СпрФ.Телефоны) > 5 | |SELECT TMP3.Нормал2 as Нормал2 |INTO #TMP_2 |FROM #TMP_3 as TMP3 |GROUP BY TMP3.Нормал2 |HAVING COUNT(*) > 1 |"; //RS.Отладка(1); RS.Открыть(ТекстТаблицы); ТекстЗапроса = " |SELECT * FROM #TMP_1 |INNER JOIN #TMP_2 ON #TMP_1.Нормал = #TMP_2.Нормал2 |WHERE LEN(#TMP_1.Нормал) > 5 AND #TMP_1.Нормал <> '2404040' |ORDER BY #TMP_1.Нормал |"; RS.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ); //УдалитьФункцииТелефонов(RS); ТекстТаблицы = " |DROP table #TMP_1 |DROP table #TMP_2 |DROP table #TMP_3 |"; RS.Открыть(ТекстТаблицы); ТЗ.УстановитьПараметрыКолонки("С",,,,,3,,); ТЗ.ВыводитьПиктограммы("С"); ТЗ.ВидимостьКолонки("Нормал2",0); КолвоСтрок = ТЗ.КоличествоСтрок(); КонецПроцедуры // ПроверитьДублиТелефонов2()
|