:: Visual Foxpro, Foxpro for DOS
Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
В процессе перевода на VFP одной Clipper-программы, подкинутой начальством, я с прискорбием, но и с большим интересом для себя обнаружил, что в Clipper-программе использовалась строковая функция StrDiff() из библиотеки Clipper Tools для вычисления так называемой "редактируемых" (или "Левенштейновских") различий между двумя строками, аналога которой в VFP я совсем не нашел. Поискав по сайтам и полазав немного по Help'у, обнаружил, что в VFP все же есть функция Difference(), которая возвращает целое число от 0 до 4, характеризующее относительное фонетическое различие между двумя символьными строками. Но эта функция совсем не подходит для воспроизведения на VFP труда DOS Clipper-программистов, которые лет 10 назад, умело воспользовавшись функцией StrDiff() делали вывод, что, например, введенные впрограмму имена "ВАЛЕНТНА" и "ВАЛЕНТиНА", фамилии "БиЗЮКОВА" и "БоЗЮКОВА", "МАЧИН" и "МАтЧИН" - есть ни что иное как грамматические ошибки и полностью соответствуют друг другу!
Следующий замечательный кусок CA-кода показывает, как легко можно ловить все подобные опечатки (честно признаюсь, я о таком использовании функции, программируя на Clipper'е не знал):
IF (p1:=STRDIFF(Left(Upper(privileg->fam),8),Left(Upper(pFM),8),1,1,1))<=2
IF (p2:=STRDIFF(Left(Upper(privileg->im),7),Left(Upper(pIM),7),1,1,1))<=2 ;
.and. (p3:=STRDIFF(Left(Upper(privileg->ot),7),Left(Upper(pOT),7),1,1,1))<=2
* ФИО ВВЕДЕННОГО И СВЕРЯЕМОГО СОТРУДНИКА СОВПАДАЮТ,
* А p1>0, p2>0 и p3>0 ПОКАЗЫВАЮТ ГДЕ ИМЕННО БЫЛА ОПЕЧАТКА
Else
* ФИО ВВЕДЕННОГО И СВЕРЯЕМОГО СОТРУДНИКА НЕ СОВПАДАЮТ
EndIF
EndIF
Для этого счастья, необходимо, как минимум, реализовать на VFP функцию STRDIFF()
Когда-то я сам пытался переводить на VFP особенно удобные строковые функции из библиотеки Clipper Tools, которых мне не хватало в VFP. Но эту функцию, почему-то раньше проглядел.
Так, на этом сайте, приводился пример реализации функции AfterAtNum(), но сейчас катастрофически не хватает времени...
Помогите, если сможете!
Здесь www.koders.com приводятся исходники этой функции на языке Си. Нет ли у кого-нибудь ее реализации на VFP или еще каких наводок? Очччень нужно было и еще вчера!
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Знатокам C#:
Помогите перевести программу Leven.cs c С# на VFP (код см. во вложении и на экране)
Это и есть реализация "Левенштейновской дистанции" между двумя строками с сайта:
www.codeproject.com
ISimilarity.cs (класс или интерфейс (?)) находится также во вложении.
Запись return 1.0F, возможно означает 1 типа "float"?
--
Заранее благодарен!

/*
Matching two strings
Author: Thanh Ngoc Dao - ''.phorum_html_encode('Thanh.dao@gmx.net').''
Copyright (c) 2005 by Thanh Ngoc Dao.
*/
using System;
namespace WordsMatching
{
/// <summary>
/// Summary description for Leven.
/// </summary>
internal class Leven: ISimilarity
{
private int Min3(int a, int b, int c)
{
return System.Math.Min(System.Math.Min(a, b), c);
}
private int ComputeDistance (string s, string t)
{
int n=s.Length;
int m=t.Length;
int[,] distance=new int[n + 1, m + 1]; // matrix
int cost=0;
if(n == 0) return m;
if(m == 0) return n;
//init1
for(int i=0; i <= n; distance[i, 0]=i++);
for(int j=0; j <= m; distance[0, j]=j++);
//find min distance
for(int i=1; i <= n; i++)
{
for(int j=1; j <= m;j++)
{
cost=(t.Substring(j - 1, 1) == s.Substring(i - 1, 1) ? 0 : 1);
distance[i,j]=Min3(distance[i - 1, j] + 1,
distance[i, j - 1] + 1,
distance[i - 1, j - 1] + cost);
}
}
return distance[n, m];
}
public float GetSimilarity(System.String string1, System.String string2)
{
float dis=ComputeDistance(string1, string2);
float maxLen=string1.Length;
if (maxLen < (float) string2.Length)
maxLen = string2.Length;
float minLen=string1.Length;
if (minLen > (float) string2.Length)
minLen = string2.Length;
if (maxLen == 0.0F)
return 1.0F;
else
{
return maxLen - dis;
//return 1.0F - dis/maxLen ;
//return (float) Math.Round(1.0F - dis/maxLen, 1) * 10 ;
}
}
public Leven()
{
//
// TODO: Add constructor logic here
//
}
}
}



Исправлено 2 раз(а). Последнее : rvc44, 05.06.07 16:52
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Так, кажется в основном идея целиком понятна. Сейчас попробую самостоятельно реализовать на VFP приведенные здесь три функции: GetSimilarity, ComputeDistance, Min3. Если не возникнет неожидонностей, то должно все работать как надо!
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Вместо функция Min3 замечательно подходит имеющаяся в VFP функция
MIN(eExpression1, eExpression2 [, eExpression3 ...])

Для решения показанной выше задачи функция GetSimilarity вовсе не нужна.
Она возвращает удельный вес (действительное число), показывающий насколько строки схожи.

А вот аналог функции CA Clipper функции StrDiff на VFP. Это переписанная функция ComputeDistance, возвращающая как и в Clipper'е в качестве результата целое число, показывающее количество несовпадающих символах в двух строках, указанных в качестве первого и второго параметров. Вроде-бы работает!
В качестве проверки возьмем реальные чудовищные ошибки из жизни Тамбовских юзеров:
? StrDiff("МАЧИН","МАТЧИН") && 1
? StrDiff("МАЧИН","МАТCЧИН") && 2
? StrDiff("МАЧИН","МАЧИН") && 0
? StrDiff("БИЗЮКОВА","БОЗЮКОВА") && 1
? StrDiff("СЕМЕНОВНА","СЕМЁНОВНА") && 1
? StrDiff("АЛЕКСАНДРОВНА","АЛЕКСАННДРОВНА") && 1
? StrDiff("МЕДЫНИН","МЕДИНИН") && 1
? StrDiff("МАТЫЦИНА","МАТЫЦЫНА") && 1
? StrDiff("ЛУКАШОВА","ЛУКАШРВА") && 1
? StrDiff("МЕНЬШИКОВА","МЕНЬЩИКОВА") && 1
? StrDiff("КЛЕМЕНТЬЕВИЧ","КЛИМЕНТЬЕВИЧ") && 1
? StrDiff("ВАЛЕНТИНА","ВАЛЕНТНА") && 1
? StrDiff("ОБЪЕДКОВ","ОБЬЕДКОВ") && 1
? StrDiff("ЕГОРОВА","ФОМИН") && 5
? StrDiff("adresse","address") && 2
* Finds similarity between two strings
* Аналог функции STRDIFF() CA-Clipper, но только с двумя параметрами
* Реализация алгоритма обработки строк "Levenshtein Distance"
* цель которого - нахождение кратчайшего пути для преобразования одной строки в другую.
* (с) Авторы: Thanh Ngoc Dao, Peter Kleiweg, 2005
* (с) VFP версия от 05.06.2007, Кольцов Р.В., Россия, Тамбов
* FUNCTION StrDiff
LPARAM cString1 AS String, cString2 AS String
LOCAL ln AS Integer, lm AS Integer, liCost AS Integer
ln = Len(cString1)
lm = Len(cString2)
LOCAL ARRAY laDistance[ln+1, lm+1] && matrix
liCost = 0
If ln = 0
Return lm
EndIf
If lm = 0
Return lm
EndIf
&& init1
For i=1 To ln+1 && Было от 0 до ln
laDistance[i, 1] = i-1
EndFor
For j=1 To lm+1 && Было от 0 до lm
laDistance[1, j] = j-1
EndFor
&& find min distance
For i=2 To ln+1
For j=2 To lm+1
liCost = IIF(SubStr(cString2, j - 1, 1) == ;
SubStr(cString1, i - 1, 1), 0, 1)
laDistance[i, j] = Min(laDistance[i - 1, j] + 1, ;
laDistance[i, j - 1] + 1, ;
laDistance[i - 1, j - 1] + liCost)
EndFor
EndFor
Return laDistance[ln, lm]
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
Naomi

Сообщений: 1796
Дата регистрации: 09.10.2003
fox.wikis.com
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Есть еще в России люди, которыми можно гордиться!

Владимир Иосифович Левенштейн (родился в 1935 году) - российский ученый, доктор физико-математических наук. Окончил Московский Государственный Университет им. М.В. Ломоносова, Механико-математический факультет МГУ, в 1958 г. После окончания Университета работает ведущим научным сотрудником в 10 отделе Института Прикладной Математики имени Мстислава Всеволодовича Келдыша РАН, Российская Федерация. Благодаря введенному им в 1965 году понятию дистанции редактирования, названной его именем, доктор Левенштейн стал известен всему миру.

Дистанция Левенштейна (также функция Левенштейна или алгоритм Левенштейна) в теории информатики и компьютерной лингвистики является мерой разницы двух последовательностей символов (строк) относительно минимального количества операций Вставки, Удаления и Замены, необходимых для перевода одной строки в другую.
Пример:
Чтоб перевести слово Конь в слово Кот необходимо совершить одно удаление и одну замену, соответственно дистанция Левенштейна составляет 2:
1. Конь
2. Коть (Заменяем н на т)
3. Кот (Удаляем ь)
Практическим применением дистанции Левенштейна является определение похожести последовательностей символов, к примеру в коррекции орфографии или при поиске дубликатов.

В 2006 году VLADIMIR I. LEVENSHTEIN, Leading Scientific Researcher, Keldysh Institute for Applied Mathematics, Moscow, Russia получил медаль Хэмминга (IEEE Richard W. Hamming Medal) за вклад в теорию кодов с исправлением ошибок и теорию информации (For contributions to the theory of error-correcting codes and information theory, including the Levenshtein distance). Подробнее на сайте www.ieee.org

Домашняя страница: www.keldysh.ru
Адрес E-mail: ''.phorum_html_encode('leven@keldysh.ru').''
Рабочий телефон: +7 (495) 250-78-34
Научные интересы: комбинаторная оптимизация
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
andrush

Сообщений: 57
Откуда: Ахтубинск
Дата регистрации: 07.11.2003
К сожалению должен огорчить. Данную ф-ю нельзя применять к фамилиям, так как различие в одной букве - это уже ДРУГАЯ фамилия. И это в действительности - по паспортам. Имя - тоже надо осторожно, т.к. Наталья и Наталия и т.п. это разные имена и есно люди. Так что к ФИО эти ф-и нельзя применять
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Да ну? Это все зависит от конкретной задачи и поставленной цели. Данный алгоритм широко используется во всем мире. Есть ряд задач, например, выгрузка в ПФР, где им пользоваться естественно нельзя. Но если отойти в сторону от пресловутых задач автоматизации бухучета, то мне известны государственные организации, где уже на протяжении более 10 лет эти функции УСПЕШНО применяются для синхронизации баз данных разных организаций и идентификации людей.
Работает просто великолепно! Отлавливает всякого рода опечатки и выдает их в протокол, чтобы сторона допустившая опечатки их исправляла! Но такая проверка, естественно, не ограничивается только сверкой ФИО. Должен совпадать еще как минимум какой-либо другой параметр (например, адрес, номер служебного удостоверения и т.п.)
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
andrush

Сообщений: 57
Откуда: Ахтубинск
Дата регистрации: 07.11.2003
Ха, адрес у человека может меняться.Сталкивались. Есть адрес регистрации, проживания. Тем более, что КЛАДР от выпуска к выпуску менятся, не глобально, но морока есть. Я говорил про сравнение ФИО. Даже если дало, совпадение, то это не значит что ФИО верно. Идентификация идет по другим параметрам, а фио только в качестве, как правило информационных(уточняющих). Про бухучет, я вообще не упоминал. И честно, говоря меня берут сомнения в достоверности синхронизации баз в этих организациях (по такому признаку)
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Цитата:
Так что к ФИО эти ф-и нельзя применять
Действительно, есть сильно похожие имена, фамилии, названия организаций и т.п.
Но это не значит, что функцию нельзя применять. Если подходить строго к формулировке, то для программы что имя, что фамилия - это просто тектсовые строки. Описанная функция работает с двумя строками, а значит она может быть применена .
Другое дело, если говорить о целесообразности, как верно отметил rvc44. Все хорошо в меру. Одно дело, если эту функцию использовать в полностью автономном алгоритме, который, например, считает слова с дистанцией 1 совершенно идентичными. И совсем другое дело, когда программа просто предупреждает пользователя и предлагает варианты, как например это сделано в MS Word. При правильном применении такие функции безусловно полезны.
Особенно удобно нечеткое сравнение в задачах поиска - это IMHO очевидно.
Ну, наконец о синхронизации. Разумеется, строгое сравнение более детерминированно. С другой стороны, как правило, идентификацию объектов (если нет искусственного надежного UID) выполняют по нескольким полям, что существенно снижает вероятность ошибочной идентификации.
Так, вероятность того, что в БД встретятся два человека с одинаковой датой рождения одинаковым именем и отчеством и фамилией, различающейся только в одной букве ничтожно мала.
Кроме того, ошибки при наборе это скорее исключение из правила, поэтому при синхронизации только часть записей требует идентификации по нечеткому алгоритму. И как правило, процент таких записей невысок, что вполне позволяет применять нечеткое сравнение для формирования эффективного диалога с оператором, выполняющим синхронизацию.
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
2matod:
Спасибо за поддержку! Я полностью разделяю Вашу позицию. В качестве примера, приведу следующие реальные цифры: после первого прохода сверки из 3955 записей, оператору было предложено уточнить 151 запись, в следующем месяце уточнять всего пришлось 15 записей.

Еще пара замечаний по поводу приведенного мной выше кода VFP. Необходимо небольшое уточнение! Сколько меня не учили уважаемые Гуру этого форума, старые привычки - неистребимы.
Так, в приведенном коде, для исключения ОШИБОК, лучше заменить названия переменных - параметров цикла. i и j заменить соответственно на liRow и liCol и описать их как локальные (при спешке пропустил - не пинайте!). Тогда функцию StrDiff можно вставлять прямо в условие WHERE запроса SELECT. Но для повышения быстродействия лучше функцию StrDiff использовать после запроса примерно так:
lCurVerify = "CurV" + SYS(2015)
SELECT D.* ;
FROM [СписокДел] AS D ;
WHERE D.[НомерДела]==m.lcDelo ;
INTO CURSOR &lCurVerify.
If _TALLY > 0
llOk = .F.
SCAN
*-- Проверим совпадение фамилии, имени, отчества
*-- Заодно p1, p2 и p3 покажут где и в чем ошибка
p1 = StrDiff(Upper(AllT(&lCurVerify..Fm)), m.lcFam)
p2 = StrDiff(Upper(AllT(&lCurVerify..Im)), m.lcIm)
p3 = StrDiff(Upper(AllT(&lCurVerify..Ot)), m.lcOt)
If p1<=2 AND p2<=2 AND p3<=2
*-- ...
llOk = .T.
EXIT
EndIf
ENDSCAN
If !llOk
_TALLY = 0
EndIf
EndIf
*-- Далее анализ, если _TALLY=0, то выборка по другим критериям (адресу, удост-нию и т.п.),
*-- т.к. в принципе даже номер дела m.lcDelo может оказаться неверным, устаревшим, либо
*-- пустым, т.е. номер дела придется вычислять на основе других параметров.
*-- ...
Use In Select(lCurVerify)
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
Sawradym

Сообщений: 2244
Откуда: Винница
Дата регистрации: 15.05.2007
Близняшек Сашу, Машу и Дашу родившихся в один день и живущих по одному адресу придется уточнять ВСЕГДА


------------------
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
Snick
Автор

Сообщений: 5949
Откуда: Москва
Дата регистрации: 21.05.2001
Цитата:
честно признаюсь, я о таком использовании функции, программируя на Clipper'е не знал
Я этой функции и вообще не помню!
А про Левенштейна очень интересно, спасибо.


------------------
www.sngsnick.com





Исправлено 1 раз(а). Последнее : Snick, 08.06.07 11:25
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
2Snick
Эта функция входила в мощную Clipper-библиотеку Clipper Tools 2.
Вот пример ее использования в файле *.RMK при сборке *.EXE
.PRG.OBJ:
CLIPPER $< /b
privdbf.OBJ : prg\privdbf.PRG
privfun.OBJ : prg\privfun.PRG
PRIVDBF.EXE :
RTLINK @PRIVDBF.LNK
Этот файл использует для сборки файл *.LNK
А вот тот самый PRIVDBF.LNK файла для сборки *.EXE
OUTPUT PRIVDBF.EXE
FILE PRIVDBF,PRIVFUN,P_SHADOW,view,print,errpens
LIB CT250
В последней строке, собственно, и есть ссылка на указанную библиотеку.
Для сборки *.EXE достаточно дать команду rmake PRIVDBF.RMK
Может кому пригодится, хотя прошу прощения, т.к. это не форум по Clipper,
но считаю (и не без оснований), что VFP не только наследник FPD, но и Clipper тоже,
т.к. многие мои знакомые, в т.ч. и я пересели на VFP именно с Clipper'а

P.S. Интересно, а разработчики коммерческого продукта Clipper Tools отстегнули автору?



Исправлено 1 раз(а). Последнее : rvc44, 08.06.07 13:24
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
XAndy

Сообщений: 3803
Откуда: Киев
Дата регистрации: 05.02.2004
Цитата:
С другой стороны, как правило, идентификацию объектов (если нет искусственного надежного UID) выполняют по нескольким полям, что существенно снижает вероятность ошибочной идентификации.
Так, вероятность того, что в БД встретятся два человека с одинаковой датой рождения одинаковым именем и отчеством и фамилией, различающейся только в одной букве ничтожно мала

Вспоминаю, когда году в 95-м люди начали получать денежную компенсацию от немцев (остарбайтеры и др.), попались особо "счастливые", имевшие одинаковые фамилии, имена, отчества, даты рождения и адрес! Село, улиц и домов нет, фамилия у половины села одна, имя - да модно было, вот и плодились в одно и то-же время Иваны да Марии. Одна бабулька получила деньги, а другая раз подала документы, программа предложила отфутболить, оператор согласился, второй раз - то же самое, несколько лет доказывала. А люди то немолодые... А если бы инвалид? И это не исключительный случай, много подобных было.

Другой вариант - серии и номера паспортов, удостоверений и т.п. Есть люди, которые имеют одинаковые серии и номера паспортов, по ошибке. Есть люди, в идентификационном налоговом коде которых зашит код женщины, а он мужчина, и пол не менял. И т.д. и т.п.
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
matod

Сообщений: 3062
Откуда: Иркутск
Дата регистрации: 31.10.2001
Цитата:
имевшие одинаковые фамилии, имена, отчества, даты рождения и адрес
и сколько реально таких случаев 1 или 2? ;) В данном случае, дело же не в программе, а в ошибке оператора. Именно человек должен принимать решения в подобных случаях.
Насчет номеров паспортов и ИНН - согласен бывают такие случаи, надеятся на уникальность или правильность этих данных в общем случае нельзя. Именно поэтому в задачах поиска, синхронизации, идентификации объектов предпочтительнее нечеткий поиск.
Например, оператор вводит данные по новому клиенту. Программа может просто сохранить эти данные как новую запись, что как правило и делается в большинстве программ. Ответственность полностью на операторе, вроде как он должен перед вводом выполнить поиск по фамилии в БД из 10000 записей, да еще убедиться, что кто-то раньше не ввел этого человека с ошибкой например в фамилии, т.е. вручную выполнить нечеткий поиск. Разумеется оператору некогда этим заниматься. В результате со временем справочники и картотеки превращаются в свалку. По моему лучше, если программа вежливо сообщит, что в БД например присутствуют несколько очень похожих записей, выведет полные данные для сравнения...

Цитата:
Близняшек Сашу, Машу и Дашу родившихся в один день и живущих по одному адресу придется уточнять ВСЕГДА
Ага, а если вводить инициалы, то вообще ужас
А вот если полные имена - проблем практически не будет.

PS Я это все не ради того, что бы поспорить, и понимаю, что на этом пути есть свои сложности, исключения, ограничения. Просто мне кажется, что сомнения в полезности подобных методик могут отпугнуть людей, которые впервые об этом услышат, и даже не попытаются реализовать в своих программах. А опыт покаывает, что пользователи с огромным удовольствием принимают подобные сервисы. Их поймет тот, кто хоть раз искал наименование организации в огромном справочнике, где названия вводились как попало: ООО Заря, Заря ООО, ООО "Заря", "ООО "Заря" и т.п.
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
andrush

Сообщений: 57
Откуда: Ахтубинск
Дата регистрации: 07.11.2003
Никто и не говорит про полезность или бесполезность эитх фунцкий. При сравнении текста, еще как нужны. Я только указал, на НЕВОЗМОЖНОСТЬ их применимости для идентификации людей (что было в первом посте). Здесь, как выше, замечено и денежные вопросы и еще ряд других. Поэтому используют ИНН или пенсионный номер(СНИЛС) или подобные, чтобы исключить хотя бы даже одного совпадения. В эти же номера еще и вводят контрольные суммы, чтоб не было искажений.
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
MichaelD

Сообщений: 7578
Дата регистрации: 14.05.2005
matod
...поймет тот, кто хоть раз искал наименование организации в огромном справочнике, где названия вводились как попало: ООО Заря, Заря ООО, ООО "Заря", "ООО "Заря" и т.п.

Созвучно: metla.zip [16.02.2004] (27,1KB) - если вас достало множество эквивалентных названий одного и того же, вводимых искусными на выдумку пользователями (например в номенклатуре), то можете попробовать воспользоваться библиотекой metla.vcx. См. подробности в readme.txt, а также пример использования. Автор: Голосовская Ольга (на http://vfpdev.narod.ru/util_r.html)


------------------
С уважением,
Михаил Дроздов, Пермь, Россия
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
rvc44

Сообщений: 2211
Откуда: Тамбов
Дата регистрации: 06.12.2005
Никто не спорит, что по ИНН и номеру ПФР проверять гораздо удобнее, поэтому везде где это возможно проверка по ним и идет. Но если вы не являетесь сотрудником ИМНС, либо ПФР, то собрать эти данные с людей достаточно проблематично. Мы пытались сделать это неоднократно, но добровольно предоставляют данные далеко не все! Некоторые люди вообще не любят, чтобы их "считали" (как в известном мульте), а некоторые намеренно не признают свой ИНН, т.к. запрещает религия. И заставить их невозможно, пока он не будет прописан в паспорте! ПФР - вообще как жуки, не идут ни на какие контакты ни с одной конторой и жмут любую информацию, ссылаясь на соответствующий закон. До сих пор, кстати, алгоритмы проверки правильности ввода ИНН, ПФР и ОГРН по контрольным суммам являются официально "закрытой" информацией, но благодаря очевидно "человеческому фактору" широко известны среди разработчиков ПО.
Думаю, что ИНН и ПФР умеют проверять уже все. Функция проверки ОГРН появилась чуть позже:
* Функция CheckOGRN для проверки корректности ввода ОГРН
* Параметры: pcOGRN - номер ОГРН
* pnTipLi - тип лица: 1-Юр.лицо, 2-Физ.лицо, 3-Лицо не указано
* plMsg - необходимость вывода сообщения об ошибке ввода
* FUNCTION CheckOGRN
LPARAM pcOGRN, pnTipLi, plMsg
LOCAL lcOGRN, llOk, lnLen, lnTipLi
If Parameters()=1
lnTipLi = 3
Else
lnTipLi = pnTipLi
EndIf
lcOGRN = pcOGRN
lnLen = LEN(lcOGRN)
DO Case
Case (lnTipLi=1 OR lnTipLi=3) AND lnLen=13
llOk = Right(lcOGRN, 1)=Right(AllT(Str(Mod(Val(Left(lcOGRN, 12)), 11))), 1)
Case (lnTipLi=2 OR lnTipLi=3) AND lnLen=15
llOk = Right(lcOGRN, 1)=Right(AllT(Str(Mod(Val(Left(lcOGRN, 14)), 13))), 1)
Otherwise
llOk = .F.
EndCase
If !llOk AND plMsg
If MessageBox('ОГРН указан неправильно.'+Chr(13)+'Продолжить?', 4+32, 'Ошибка ввода')=6
llOk = .T.
EndIf
EndIf
Return llOk
ENDFUNC
Ratings: 0 negative/0 positive
Re: Функции VFP Difference() vs CA Clipper StrDiff()
alextash

Сообщений: 2281
Откуда: НСК
Дата регистрации: 03.05.2006
2 matod
Цитата:
Так, вероятность того, что в БД встретятся два человека с одинаковой датой рождения одинаковым именем и отчеством и фамилией, различающейся только в одной букве ничтожно мала.
У нас в Узбекистане у узбеков близнецов мальчиков называют Хасан и Хусан. Так что они имеют одинаковую фамилию, отчество, дату рождения и даже номер паспорта незначительно отличаются (сдают документы одновременно и в один ОВИР). По статистике каждые сотые роды - близнецы. Значит вероятность 0,49% (Мальчики-ж).



Исправлено 2 раз(а). Последнее : alextash, 09.06.07 22:10
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 30 Владимир Максимов Nike  (Гостей: 28)

© 2000-2024 Fox Club 
Яндекс.Метрика