AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: База знаний и проекты
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 15.12.2002, 11:44   #1  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Функция проверки контрольного числа ИНН
Недавно узнал, что ИНН это оказывается не просто уникальная последовательность цифр, но и последовательность сгенерированная по определенным правилам.
Идея не моя - взял здесь: http://www.delphikingdom.com/treasury/inn_pf.htm
Я всего лишь перевел код с Дельфи на X++.

Все это дело оформлено в виде функции. Функция вычисляет контрольное число ИНН и возвращает true если ИНН введен правильно или false в противном случае.
В качестве параметра передается проверяемый ИНН:


PHP код:
 boolean checkINN(str INN)
    {
      
int factor1[9];
      
int factor2[10];
      
int factor3[11];
      
int smsm2;
      
int i;

      
factor1[1] = 2;    factor1[2] = 4;    factor1[3] = 10;    factor1[4] = 3;     factor1[5] = 5;
      
factor1[6] = 9;    factor1[7] = 4;    factor1[8] = 6;     factor1[9] = 8;

      
factor2[1] = 7;    factor2[2] = 2;    factor2[3] = 4;     factor2[4] = 10;    factor2[5]  = 3;
      
factor2[6] = 5;    factor2[7] = 9;    factor2[8] = 4;     factor2[9] = 6;     factor2[10] = 8;

      
factor3[1]  = 3;    factor3[2] = 7;    factor3[3] = 2;     factor3[4] = 4;    factor3[5]  = 10;
      
factor3[6]  = 3;    factor3[7] = 5;    factor3[8] = 9;     factor3[9] = 4;    factor3[10] = 6;
      
factor3[11] = 8;


      if (
strlen(INN) == 10)
      {
        
sm 0;
        for (
i=1i<10i++)
          
sm sm str2int(substr(INN,i,1))*factor1[i];
        
sm sm mod 11;
        
sm sm mod 10;
        if (
str2int(substr(INN,10,1)) == sm) return true;
                                      else   return 
false;
      }
      else if (
strlen(INN) == 12)
      {
        
sm 0;
        for (
i=1i<11i++)
          
sm sm str2int(substr(INN,i,1))*factor2[i];
        
sm sm mod 11;
        
sm sm mod 10;

        
sm2 0;
        for (
i=1i<12i++)
          
sm2 sm2 str2int(substr(INN,i,1))*factor3[i];
        
sm2 sm2 mod 11;
        
sm2 sm2 mod 10;
        if ((
str2int(substr(INN,11,1)) == sm) && (str2int(substr(INN,12,1)) == sm2)) return true;
                      else return 
false;
      }
      else return 
false;
    } 
Кстати, неужели в Аксапте нет более удобного способа инициализировать массивы ?
Старый 15.12.2002, 12:08   #2  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
Замечание
Если задать строку длиной 10-12 состоящую НЕ из цифр или из 0, то функция вернет true.
Старый 15.12.2002, 12:20   #3  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Согласен.

Решить можно например так:

PHP код:
.......................................
 
factor3[11] = 8;

  if ((
strlen(INN) == 10) || (strlen(INN) == 12)) INN strkeep(INN,"0123456789");
  if ((
INN == "0000000000") || (INN == "000000000000")) return false;

  if (
strlen(INN) == 10)
....................................... 
Кроме того, хорошо бы проверять уникальность ИНН в таблицах поставщиков и клиентов. Кроме явных ошибок ввода это позволит не допустить случаев, когда два разных сотрудника вводят одного и того же поставщика/клиента.
Старый 19.12.2002, 22:46   #4  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Wow! Копирайта нет?
Можно включить в базовую версию.
Старый 20.12.2002, 15:30   #5  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
Wow! Копирайта нет?
Можно включить в базовую версию.
Там где я брал идею - http://www.delphikingdom.com/treasury/inn_pf.htm вроде бы не было. Если имеется в виду моя конкретная реализация - то нет проблем, для того и выложил - чтобы каждый использовал на свое усмотрение.
Старый 20.12.2002, 15:38   #6  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
http://www.axforum.info/forums/showt...=&threadid=136
__________________
С уважением, Роман Кошелев.
Старый 20.12.2002, 16:57   #7  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
С одной стороны:

Цитата:
2.1. Проекты запрещается:
- продавать,
- обменивать,
- добавлять в качестве "бесплатного приложения"
- использовать каким-либо другим аналогичным образом, предполагающим коммерческую выгоду.
с другой:

Цитата:
Если не оговорены специальные условия для конкретных Проектов, то их использование подчиняется следующим правилам:
Поэтому мне кажется, что я имею право, снять запрет на этот проект, налагающийся пунктом 2. Если я не прав, пусть меня поправят.
Старый 20.12.2002, 17:03   #8  
Роман Кошелев is offline
Роман Кошелев
Продавец игрушек
Аватар для Роман Кошелев
 
433 / 73 (3) ++++
Регистрация: 22.11.2001
Адрес: Москва
Андрей,
Совершенно верно.
Проект Ваш - можете его хоть за деньги продавать, хоть бесплатно дорабатывать для ребят из МБС.
Лицензия прикрывает только те проекты, для которых авторы не указали правила их использования.
__________________
С уважением, Роман Кошелев.
Старый 25.12.2002, 19:53   #9  
EVGL is offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4,445 / 3001 (0) ++++++++++
Регистрация: 09.07.2002
Адрес: Parndorf, AT
Цитата:
Изначально опубликовано Андре
я имею право, снять запрет на этот проект, налагающийся пунктом 2.
OK. Будет включено в версию 3.0 CIS. Родина вас не забудет.
Старый 17.08.2004, 12:50   #10  
maxsmirnov is offline
maxsmirnov
экс-модератор
 
268 / 25 (1) +++
Регистрация: 08.07.2003
Адрес: Москва
и правда включили...
в обязательном порядке (в validateField)
пришлось лезть руками в код и отключать - иначе не вбиваются инн украинских контрагентов.
Старый 17.08.2004, 12:55   #11  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Цитата:
и правда включили... в обязательном порядке (в validateField)
Угу. Я даже в mbs писал, просил, чтобы сделали это настраиваемой опцией.
Отказали
Пришлось самому делать
Старый 17.08.2004, 18:18   #12  
maxsmirnov is offline
maxsmirnov
экс-модератор
 
268 / 25 (1) +++
Регистрация: 08.07.2003
Адрес: Москва
имхо, проще и полезнее предупреждение выводить, но ввод данных не отменять.
Старый 17.08.2004, 18:37   #13  
Андре is offline
Андре
Moderator
Сотрудники компании GMCS
 
2,375 / 464 (20) +++++++
Регистрация: 03.12.2001
Не, люди видят предупреждение - начинают нервничать. Я пытался предложить им всевозможные методики релаксации - не помогает.
Пришлось настройку сделать - проверять/не проверять.
Теги
алгоритм, инн

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
функция округления числа? MIkeFW DAX: Программирование 4 25.08.2011 12:07
Функция поиска подстроки, чувствительная к регистру . Есть ли такая в аксапте? ATimTim DAX: Программирование 4 13.02.2006 15:37
Неверный ИНН Леон DAX: Функционал 2 16.02.2005 11:16
функция Novice DAX: База знаний и проекты 1 15.08.2003 11:15
Функция "Удалить строки" Oks DAX: Функционал 1 03.07.2002 18:09

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 06:16.