:: Visual Foxpro, Foxpro for DOS
Проверка счета без БИК
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Взял из решений процедуру проверки счета. Которую сделал Jimmy а подправил Владимир Максимов.

Так вот вопрос проверить счет можно не зная БИК банка?




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Гаврош

Сообщений: 5
Откуда: Украина
Дата регистрации: 02.04.2005
кинь, пожалуйста, ссылку на процедуру... а, вообще, вероятность совпадения 20-ти значного счета стремится к нулю, даже при совпадении БИК.
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Блин неохота искать. А вообще у меня совпадало всегда если БИК задан. Так что...

Вот код:
*!* ---------------------------------------- /*
FUNCTION CheckAccount
*!* ---------------------------------------- /*
*!* Проверка корректности 20-и разрядного банковского счета
*!* Данная процедура анализирует ЛЮБОЙ 20-разрядный банковский счет
*!* (корреспондирующиий, расчетный, бюджетный и т.п.)
*!* ---------------------------------------- /*
*!* Параметры
*!* 1. tcAccount - 20-и разрядный банковский счет (символьный тип)
*!* 2. tcBIK - 9-и разрядный БИК. Может быть как символьного, так и числового типа
*!* 3. tlIsCorAccount- осуществляется ли проверка корреспондирующего счета или нет
*!* .T. - Да, проверяется Кор.счет
*!* .F. - Нет (по-умолчанию), проверяется НЕ Кор.счет
*!* !ВНИМАНИЕ !
*!* В процессе выполнения функции значение параметров может меняться, поэтому
*!* не следует использовать передачу параметров по ссылке
*!* ---------------------------------------- /*
*!* Выполняемые проверки
*!* - БИК - это всегда число, количество разрядов которого не превышает 9
*!* Использование в нем символов отличных от цифр недопустимо.
*!* - счет всегда имеет 20 знаков
*!* - в счете присутствуют только цифры, но в 6 разряде возможно наличие буквы из
*!* фиксированного набора - это возможно при использовании клиринговой валюты (редкий случай)
*!* - при расчете контрольных сумм используется фрагмент из БИК
*!* - первая контрольная цифра содержится в 9 разряде счета
*!* - итоговое контрольное число должно оканчиваться нулем
*!* ---------------------------------------- /*
*!* Возвращает .T. - если счета записаны корректно и .F. - если нет
*!* ---------------------------------------- /*
*!* Замечания
*!* Исходный код программы предоставил Орлов Дмитрий Георгиевич (Jimmy), поэтому о методике расчета
*!* контрольных сумм я ничего сказать не могу. Я лишь немного изменил стиль кода не меняя
*!* его содержимого и немного подправил выбор для расчет контрольной суммы БИК
*!* ---------------------------------------- /*
PARAMETERS tcAccount,tcBIK,tlIsCorAccount
IF EMPTY(m.tcAccount)
RETURN .t.
ENDIF
LOCAL llIsCorrect
llIsCorrect = .T.
* Проверка правильности ТИПА и длины переданных параметров
* и приведение их к нужному типу если это необходимо
IF TYPE("tlIsCorAccount")<>"L"
tlIsCorAccount=.F.
ENDIF
DO CASE
CASE TYPE("tcBIK")="C"
tcBIK=AllTrim(m.tcBIK)
CASE TYPE("tcBIK")="N"
tcBIK=LTRIM(STR(m.tcBIK,20))
OTHERWISE
llIsCorrect = .F.
ENDCASE
IF LEN(m.tcBIK)>9
llIsCorrect = .F.
ELSE
tcBIK=PADL(m.tcBIK,9,"0")
ENDIF
IF TYPE("tcAccount")="C"
tcAccount = UPPER(AllTrim(m.tcAccount))
IF LEN(m.tcAccount)<>20
llIsCorrect = .F.
ENDIF
ELSE
llIsCorrect = .F.
ENDIF
LOCAL lnI
* Проверка содержимого БИК
IF m.llIsCorrect = .T.
FOR lnI=1 TO LEN(m.tcBIK)
IF IsDigit(SubStr(m.tcBIK,m.lnI,1))=.F.
llIsCorrect = .F.
ENDIF
ENDFOR
ENDIF
* Символы, допустимые в 6 разряде счета, с учетом возможного их написания как
* на латинской, так и на русской раскладке (Lat+Рус) и цифры на которые их следует заменить
LOCAL lcPossibleCharacters, lcChangingDigits
lcPossibleCharacters = 'ABCEHKMPTXАВСЕНКМРТХ'
lcChangingDigits = '01234567890123456789'
* Проверка содержимого Счета
IF llIsCorrect = .T.
FOR lnI=1 TO LEN(m.tcAccount)
IF IsDigit(SubStr(m.tcAccount,m.lnI,1))=.F.
IF m.lnI=6 AND SubStr(m.tcAccount,m.lnI,1) $ m.lcPossibleCharacters
* Если в 6 разряде оказался один из допустимых символов, то
* заменяю символ буквы на соответсвующую цифру
tcAccount = LEFT(m.tcAccount,5)+;
SubStr(m.lcChangingDigits,AT(SubStr(m.tcAccount,m.lnI,1),m.lcPossibleCharacters),1)+;
RIGHT(m.tcAccount,14)
ELSE
llIsCorrect = .F.
ENDIF
ENDIF
ENDFOR
ENDIF
* Массив весовых коэффициентов каждой позиции символа в счете
LOCAL laVes(20)
laVes(1)=7
laVes(2)=1
laVes(3)=3
laVes(4)=7
laVes(5)=1
laVes(6)=3
laVes(7)=7
laVes(8)=1
laVes(9)=3
laVes(10)=7
laVes(11)=1
laVes(12)=3
laVes(13)=7
laVes(14)=1
laVes(15)=3
laVes(16)=7
laVes(17)=1
laVes(18)=3
laVes(19)=7
laVes(20)=1
* Расчет контрольных сумм
IF m.llIsCorrect = .T.
* Выбор строки из БИК для расчета контрольной суммы
* При расчете контрольной суммы корреспондирующего счета
* всегда используется условный номер РКЦ
LOCAL lcCheckStringBIK
IF VAL(SUBSTR(m.tcBIK,7,3)) < 10 OR m.tlIsCorAccount=.T.
lcCheckStringBIK = '0'+SUBSTR(m.tcBIK,5,2) && Условный номер РКЦ
ELSE
lcCheckStringBIK = SUBSTR(m.tcBIK,7,3) && Условный номер кредитной организации
ENDIF
* Расчет 2 контрольных сумм собственно счета
LOCAL lnCheckSum9, lnCheckSumAccount
STORE 0 TO m.lnCheckSum9, m.lnCheckSumAccount
FOR lnI=1 TO 3
lnCheckSum9 = m.lnCheckSum9 + VAL(SubStr(m.lcCheckStringBIK,m.lnI,1))*laVes(m.lnI)
lnCheckSumAccount = m.lnCheckSumAccount + VAL(SubStr(m.lcCheckStringBIK,m.lnI,1))*laVes(m.lnI)
ENDFOR
FOR lnI=1 TO 20
IF m.lnI<>9
lnCheckSum9 = m.lnCheckSum9 + VAL(SubStr(m.tcAccount,m.lnI,1))*laVes(m.lnI)
ENDIF
lnCheckSumAccount = m.lnCheckSumAccount + VAL(SubStr(m.tcAccount,m.lnI,1))*laVes(m.lnI)
ENDFOR
lnCheckSum9 = MOD(MOD(m.lnCheckSum9,10)*laVes(9),10)
lnCheckSumAccount = MOD(m.lnCheckSumAccount,10)
* Проверка правильности найденных контрольных сумм счета
IF VAL(SubStr(m.tcAccount,9,1))<>m.lnCheckSum9 OR m.lnCheckSumAccount<>0
llIsCorrect=.F.
ENDIF
ENDIF
RETURN (m.llIsCorrect)




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
Гаврош
а, вообще, вероятность совпадения 20-ти значного счета стремится к нулю, даже при совпадении БИК.

Совпадения с чем? Там же контрольная сумма... Неочень понял о чем Вы.




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Sergey Fadeev

Сообщений: 106
Откуда: Чебоксары
Дата регистрации: 07.02.2005
В номере счета есть контрольный разряд, который вычисляется по БИК банка, где открыт этот счет, и остальным разрядам этого счета. Поэтому НЕ бывает (в России) проверок счета без знания БИК.
А вероятность ошибки (ошиблись в БИК или счете, но контрольный разряд, к несчастью, совпал) - в среднем 10% (контрольный разряд имеет значения от 0 до 9 и только одно из них является правильным).




------------------
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Петров Андрей
Автор

Сообщений: 2506
Откуда: Химки (М.О.)
Дата регистрации: 17.04.2002
2 Sergey Fadeev

Ок. Жалко.




------------------
PS Недочитал тему до конца...
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Alv

Сообщений: 259
Дата регистрации: 27.10.2002
Ну вы ребята и проги пишете.
*cont_key(Bic,Ls)
func cont_key
lpara CKeybik,CKeyS
local CKeySum_ves
CKeySum_ves=0
CKeyS=iif(substr(CKeybik,7,2)=='00','0'+substr(CKeybik,5,2),substr(CKeybik,7,3))+CKeyS
for CKeyCount=1 to 23
CKeySum_ves=CKeySum_ves+val(right(str(val(subs(CKeyS,CKeyCount,1))*val(subs('71371371371371371371371',CKeyCount,1))),1))
endf
retu mod(CKeySum_ves,10)=0




------------------
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
Alv

Сообщений: 259
Дата регистрации: 27.10.2002
Ну вы ребята и проги пишете.
*cont_key(Bic,Ls)
func cont_key
lpara CKeybik,CKeyS
local CKeySum_ves
CKeySum_ves=0
CKeyS=iif(substr(CKeybik,7,2)=='00','0'+substr(CKeybik,5,2),substr(CKeybik,7,3))+CKeyS
for CKeyCount=1 to 23
CKeySum_ves=CKeySum_ves+val(right(str(val(subs(CKeyS,CKeyCount,1))*val(subs('71371371371371371371371',CKeyCount,1))),1))
endf
retu mod(CKeySum_ves,10)=0
Ratings: 0 negative/0 positive
Re: Проверка счета без БИК
AleksM

Сообщений: 17881
Дата регистрации: 11.11.2003
Клавиша запала




------------------
Лучше переесть, чем недоспать.
Не спеши, а то успеешь.
Ratings: 0 negative/0 positive


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

On-line: 26 (Гостей: 26)

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