Как сравнить похожие строки (неполное совпадение строк)? Ниже привожу пример функции нечеткого сравнения строк. Возвращаемое значение - от 0 (вообще не совпадает) до 1 (совпадает полностью)
По опыту, результат сравнения можно считать достоверным при совпадении больше 0.8 (80%)
Код CREATE FUNCTION fn_FuzzyCompareStr ing(
@Str i1 varchar(250),
@Str i2 varchar(250),
@MaxLen int)
RETURNS float
AS
BEGIN
DECLARE @Str 1 varchar(250), @Str 2 varchar(250), @SCountVar int,
@SCountEq int, @LenStr int, @Res float
DECLARE @NumSymbStr 2 int
DECLARE @Cnt1 int, @Cnt2 int
DECLARE @SubStr varchar(250)
SELECT
@LenStr =1,
@SCountVar=0 ,
@SCountEq=0,
@res=0
Set @Str 1 = replace(LTRIM(RTRIM(upper(@Str i1))),'.',' ')
Set @Str 2 = replace(LTRIM(RTRIM(upper(@Str i2))),'.',' ')
if ((@MaxLen <= 0) or (Len(@Str 1)=0) or (Len(@Str 2)=0))
Begin
Set @Res=0
End
else
begin
While (@LenStr <=@MaxLen)
BEGIN
Set @NumSymbStr 2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr )<=LEN(@Str 2))
BEGIN
Set @SubStr = '%'+SUBSTR ING(@Str 2,@NumSymbStr 2,@LenStr )+'%'
if (PATINDEX(@SubStr , @Str 1)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr 2=@NumSymbStr 2+1
Set @Cnt2 = @Cnt2+1
END
Set @NumSymbStr 2=1
Set @Cnt2=0
While ((@Cnt2+@LenStr )<=LEN(@Str 1))
BEGIN
Set @SubStr = '%'+SUBSTR ING(@Str 1,@NumSymbStr 2,@LenStr )+'%'
if (PATINDEX(@SubStr , @Str 2)<>0)
begin
Set @SCountEq=@SCountEq+1
end
Set @SCountVar=@SCountVar+1
Set @NumSymbStr 2=@NumSymbStr 2+1
Set @Cnt2 = @Cnt2+1
END
Set @LenStr =@LEnStr +1
END
end
if @SCountVar=0
SET @Res=0
Else
BEGIN
SET @Res=Convert(Numeric (10,5),@SCountEq)/Convert(Numeric (10,5),@SCountVar)
END
RETURN @Res
END
Использование этой функции (на примере прямого запроса к справочнику ФизЛица для 1С:ТиС 7.7): в выборку попадут все физлица, у которых релевантность выше 0.8
Код DECLARE @FIO varchar(250)
Set @FIO = 'Иванов Петр'
SELECT
Спр.Code as [ФизЛицоКод],
Спр.ID as [ФизЛицо],
Спр.DESCR as [ФИО],
dbo.fn_FuzzyCompareStr ing(dbo.fn_FIO(Спр.DESCR),@FIO,3) As [Релевантность]
FROM
SC503 as Спр (nolock)
where
ISMARK = 0
and
ISFOLDER = 2
and
dbo.fn_FuzzyCompareStr ing(dbo.fn_FIO(Спр.DESCR),@FIO,3)>=0.8
GO
Категория:
Полезные, Универсальные Функции Как перевести 36-ричное число в десятичное Код create function base36_to_base10 (@base36 char(6))
returns char(10)
as
begin
if @base36 is null return null
if rtrim(@base36)='0' return ' 0'
declare @base10 char(10)
declare @ch char(1)
declare @int int
declare @bigint bigint
declare @len int
declare @por bigint
declare @c int
set @base36=ltrim(@base36)
set @len=len(@base36)
set @por=1
set @bigint=0
set @c=@len
while @c>0
begin
set @ch=substr ing(@base36,@c,1)
if (@ch<'A')
set @int=ascii(@ch)-ascii('0')
else
set @int=ascii(@ch)-ascii('A')+10
set @bigint=@bigint+@int*@por
set @c=@c-1
set @por=@por*36
end
set @base10=right(' '+rtrim(cast(@bigint as char(10))),10)
return (@base10)
end
Категория:
Полезные, Универсальные Функции Очистка базы от документов и остатков, оставляет только справочники 1Cv7 Иногда возникает ситуация, когда необходимо очистить базу от документов, это либо открытие нового периода с чистой базой, либо чистая копия для филиала или отдела.
Вот скрипт для частичной очистки базы, закройте программу "1С:Предприятие", ОБЯЗАТЕЛЬНО СДЕЛАЙТЕ КОПИЮ, поместите файл в рабочую папку базы и запустите на выполнение, запустите программу в монопольном режиме и удалите помеченные объекты.
Есть возможность очистить информационную базу, не удаляя при этом остатки товаров, долги и взаиморасчёты с клиентами. Для этого, прежде чем запустить скрипт удалите в нём строку "del rg*.*. Но такую очистку можно делать только в начале месяца, сразу после открытия нового периода. Обязательно проверьте получившуюся базу данных перед использованием.
Скрипт:
Код DOS Batch File rem ВНИМАНИЕ !!!
rem Не храните эту программу вместе с файлами базы,
rem при случайном удалении восстановление практически невозможно,
rem файлы удаляются минуя корзину. Если Вы случайно запустите её,
rem то перед выполнением очистки программа попросит два раза нажать
rem любую клавишу. Для отмены выполнения закройте окошко,
rem не нажимая на клавиатуру.
Pause
Pause
rem Очищаем служебные папки
del New_Str u
del Syslog
rem Удаляем индексы, списки и шаблоны программиста
del *.cdx
del *.lst
del 1cv7srct.st
rem Удаляем документы
del dt*.*
del dh*.*
del 1sjourn.dbf
del 1scrdoc.dbf
del 1sdnlock.dbf
rem Очищаем регистры и последовательности (для компоненты Оперативный учёт)
del 1sstr eam.dbf
del rg*.*
del ra*.*
rem Удаляем проводки, операции сальдо и остатки (для компоненты Бухгалтерский учет)
del 1SOPER.dbf
del 1SENTRY.dbf
del 1SBKTTLC.dbf
del 1SBKTTL.dbf
del 1SACCSEL.dbf
del 1SSBSEL.dbf
rem Очищаем журнал регистрации УРИБ
del 1supdts.dbf
del 1sdwnlds.dbf
del 1sdbset.dbf
Категория:
Администрирование