BEST logo логотип компании БЭСТ - программы для бизнеса ПРОДАЖИ
+7 (991) 312-04-37
trade@bestnet.ru
ПОДДЕРЖКА
+7 (495) 775-66-76
consult@bestnet.ru
СКАЧАТЬ
Обновления
Дистрибутивы
Авторизация

Логин:
Пароль:
Забыли свой пароль?
Регистрация
ВАШ ВОПРОС

Доступ к Личному кабинету закрыт!
Как получить доступ?


Главная  / Поддержка  / Форум  / Публичные форумы  / Программирование приложений  / Оптимизация справочника БАНКОВ в БЭСТ-5 3.4 и связка с bnkseek.dbf

Форум

Поиск  Пользователи  Правила 
Закрыть
Логин:
Пароль:
Забыли свой пароль?
Регистрация
Войти
 
Страницы: 1
RSS
Оптимизация справочника БАНКОВ в БЭСТ-5 3.4 и связка с bnkseek.dbf
 
После перехода с Б4+ в справочнике банков формируется много записей с одним БИКом (если в Б4+ различались наименования). Что затем усложняет использование справочника.
предлагаю простой код для оптимизации справочника, удаления дублей.
Код
/*$$$
Функция: optbank
Категория: утилита для оптимизации справочника банков, удаления дубликатов
Параметры: без параметров
Результат: обновленный справочник банков, не содержащий дубли БИКов
Пример:  добавляем запись в userbdll.txt:
Дополнительно\Утилиты пользователя;Оптимизация справочника БАНКОВ;optbank;tools;1;
Примечания:
$$$*/

Function optbank()
Private t_bnk_id, t_bnk_code // переменные для сравнения значений соседних строк по индексу TAG_CODE
Use (Loadpath()+"prt_acnt.dbf") Index('prt_acnt.cdx') New Alias prt_acnt shared
prt_acnt->(ordSetFocus(0))
Use (Loadpath()+"bank.dbf") Index('bank.cdx') New Alias bank shared
bank->(ordSetFocus('tag_code')) // выбираем сортировку по БИКу
DbGoTop() // перемещаем указатель на начало сортированного списка
Do While !EoF() // цикл на перебор записей справочника банков
  If Len(AllTrim(bnk_code))<>9 // проверка на корректность значения БИК (9 символов)
    //действия при некорректном коде
    bank->(DbSkip())
  Else //иначе, код равен 9 символам
    //действия при корректном коде (по количеству символов)
    t_bnk_id:=bank->bnk_id ; t_bnk_code:=bank->bnk_code //Запоминаем значения текущей записи для сравнения с последующими
    bank->(DbSkip()) //идем дальше
    Do While  bank->bnk_code=t_bnk_code // проверка, если по этому БИКу запись повторяется
      Select prt_acnt
      //замена значения банка в справочнике счетов партнеров
      FLock()
      Replace prt_acnt->bnk_id With t_bnk_id ;
              For prt_acnt->bnk_id=bank->bnk_id
      DbUnLock()
      Select bank
      //Отмечаем запись для удаления в справочнике банков
      RLock()
      Delete
      DbUnLock()
      bank->(DbSkip())
    EndDo   //  bank->bnk_code=t_bnk_code // проверка, если по этому БИКу запись повторяется
  EndIf   // Len(AllTrim(bnk_code))<>9 // проверка на корректность значения БИК (9 символов)
EndDo   // !EoF() // цикл на перебор записей справочника банков
messagebox("Оптимизация справочника банков завершена.")
bank->(DbCloseArea()) //закрываем таблицу
prt_acnt->(DbCloseArea()) //закрываем таблицу
Return .t.


Изменено: itman - 17.07.2008 12:04:31
С уважением,
Ильин Евгений
 
Синхронизация справочника в Б5 с файлом bnkseek.dbf.
Источник - http://www.pvision.ru/bik.htm
Скачиваем архив, раскрываем в любую папку.
Запускаем функцию, получаем справочник с обновленными реквизитами по справочнику БИК.
Код минимален, перед применением тестировать на копии рабочей базы. :funny:

Код
Function bnk_sync()
Local cFileBnkSeek
Local cPath:="c:\"
Local cMask:="*.dbf"
Local aFileFilter:={{"Базы данных","*.dbf"}}
Local cFilename:="bnkseek.dbf"// скачивать здесь http://www.pvision.ru/bik.htm
Local cMess:="Выбор файла BNKSEEK.DBF"
cFileBnkSeek:=PopFile(,cPath,cMask,cMess,aFileFilter) //ищем где находится файл
If Empty(cFileBnkSeek)
  SayAndWait("Не выбран файл")
EndIf   // Empty(cFileBnkSeek)
Use (Loadpath()+"bank.dbf") Index('bank.cdx') New Alias bank shared//открываем справочник банков БЭСТа
bank->(ordSetFocus('tag_code')) // выбираем сортировку по БИКу

DbUseArea(.T.,,(cFileBnkSeek),"bnkseek",.t.,.F.,) //открываем классификатор банков РФ
Index On newnum tag tag_bik To "bnkseek.cdx" //делаем индекс для поиска
Go top 
Select bank //встаем в справочник банков Б5
Go top //на первую запись
Do While !EoF() // перебор системного справочника банков БЭСТ-5
  Select bnkseek //перемещаемся в область справочника банков bnkseek
  If DbSeek(bank->bnk_code) // проверка на наличие записи с кодом БИК из БЭСТ-5
    Select bank // если есть такой банк в справочнике то обновляем его реквизиты в БЭСТ-5
    RLock()
    bank->bnk_name:=oemtoansi(AllTrim(bnkseek->namep))+" г."+oemtoansi(AllTrim(bnkseek->nnp)) //Название банка, город
    bank->bnk_code:=bnkseek->newnum//БИК
    bank->acnt_korr:=bnkseek->ksnp//корсчет
    bank->addr:=AllTrim(bnkseek->ind)+", ";
                        +oemtoansi(AllTrim(bnkseek->nnp))+", ";
                        +oemtoansi(AllTrim(bnkseek->adr))+", ";
                        +oemtoansi(AllTrim(bnkseek->telef))//индекс, город, адрес, телефон
    DbUnLock()
  Else // если нет такого банка в справочнике (устаревшая запись, либо ошибочная)
    Select bank //делаем отметку такой записи в справочнике Б5
    If Left(bank->bnk_name,2)<>"!("// проверка на повторный запуск этой функции,
      RLock()
      bank->bnk_name:="!(нет в спр-ке БИК) "+AllTrim(bank->bnk_name)
      DbUnLock()
    EndIf   // Left(bank->bnk_name,2)<>"!("// проверка на повторный запуск этой функции,
  EndIf   // DbSeek(bank->bnk_code) // проверка на наличие записи с кодом БИК из БЭСТ-5
  Select bank // дело сделано, идем к другой записи по справочнику банков БЭСТ-5
  bank->(DbSkip())
EndDo   // !EoF() // перебор системного справочника банков БЭСТ-5
sayandwait("Сихнронизация справочника завершена!")
bnkseek->(DbCloseArea()) //закрываем таблицу
bank->(DbCloseArea()) //закрываем таблицу
Return .t.
Изменено: itman - 17.07.2008 12:18:04
С уважением,
Ильин Евгений
 
Завершающий этап - загрузка справочника банков.
Код
Function bnk_imp()
Local cFileBnkSeek
Local cPath:="c:\"
Local cMask:="*.dbf"
Local aFileFilter:={{"Базы данных","*.dbf"}}
Local cFilename:="bnkseek.dbf"
Local cMess:="Выбор файла BNKSEEK.DBF"
cFileBnkSeek:=PopFile(,cPath,cMask,cMess,aFileFilter) //ищем где находится файл
If Empty(cFileBnkSeek)
  SayAndWait("Не выбран файл")
Else
  SayAndWait(cFileBnkSeek)
EndIf   
Use (Loadpath()+"bank.dbf") Index('bank.cdx') New Alias bank shared//открываем справочник банков БЭСТа
bank->(ordSetFocus('tag_code')) // выбираем сортировку по БИКу
Go top
DbUseArea(.T.,,(cFileBnkSeek),"bnkseek",.t.,.F.,) //открываем классификатор банков РФ
Index On newnum tag tag_bik To "bnkseek.cdx" //делаем индекс для поиска
Go top
///перенос данных
Select bnkseek
Do While !EoF()
  Select bank
  If !DbSeek(bnkseek->newnum)
    Select bank
    Append Blank
    bank->bnk_id:=XGUID()
    bank->bnk_code:=bnkseek->newnum
    bank->bnk_name:=oemtoansi(AllTrim(bnkseek->namep))+" г."+oemtoansi(AllTrim(bnkseek->nnp))
    bank->acnt_rule:="1"
    bank->acnt_korr:=bnkseek->ksnp
    bank->addr:=AllTrim(bnkseek->ind)+", ";
                        +oemtoansi(AllTrim(bnkseek->nnp))+", ";
                        +oemtoansi(AllTrim(bnkseek->adr))+", ";
                        +oemtoansi(AllTrim(bnkseek->telef))
    DbUnLock()
  Else
  EndIf   // !DbSeek(bnkseek->newnum)
  Select bnkseek
  bnkseek->(DbSkip())
EndDo   // !EoF()
sayandwait("Перенос завершен")
bnkseek->(DbCloseArea()) //закрываем таблицу
bank->(DbCloseArea()) //закрываем таблицу
Return .t.
С уважением,
Ильин Евгений
 
Для поддержания справочника в актуальном состоянии понадобится периодически скачивать файл bnkseek.dbf (именно той структуры, какая есть на сегодня).
И запускать функцию bnk_imp() для добавления новых записей.
С уважением,
Ильин Евгений
 
В связи с вопросами как запустить эти функции поясняю:
Необходимо создать программный проект в дизайнере приложений (BestIDE), назовем его, к примеру tools.
В программном файле следует разместить текст вышеприведенных функций, если необходимо - то внести изменения.
Затем скомпилировать проект, полученный файл лучше разместить на станции администратора в папке client\bin.
Для запуска через меню следует добавить строки в userbdll.txt
Код
Дополнительно\Приложения пользователя;Оптимизация справочника БАНКОВ;optbank;tools;1;
Дополнительно\Приложения пользователя;Синхронизация справочника БАНКОВ;bnk_sync;tools;1;
Дополнительно\Приложения пользователя;Загрузка из справочника БАНКОВ;bnk_imp;tools;1; 

Если библиотека будет лежать на сервере, следует предусмотреть функцию, ограничивающую доступ.
С уважением,
Ильин Евгений
 
Цитата
itman пишет:
Для запуска через меню следует добавить строки в userbdll.txt

Пожалуйста, напишите поподробнее . Где должен лежать файл и откуда его вызвать
 
Цитата
itman пишет:
Если библиотека будет лежать на сервере, следует предусмотреть функцию, ограничивающую доступ.

Доступ к чему? К dll'ке или нововведенным функциям-менюшкам?
По поводу ограничений для вновь введенных меню разработчики обещали дать возможность ставить ограничения на доступ через менеджера пользователей.
А вот по поводу того, чтобы класть эту длл в папку клиент на сервере не совсем понятно каким образом она к остальным попадет.
Я, кстати собирался об этом спросить. Дело в том, что для того, чтобы написанная dll работала у всех надо на каждой клиентской машине её ставить. Ну, это еще пол беды. Один раз такое сделать можно. А вот что делать если эту дллку обновили? Каждый раз после внесения изменений придется по новой всем таскать эту длл... Это не очень-то удобно, даже в случае полного доступа по сети к папке bin всех клиентских машин.
Изменено: Саак Шахламджян - 31.10.2008 17:06:55
 
Итак, по порядку.
Доступ следует ограничить для запуска, в случае использования терминального подключения и расположения библиотеки в общедоступной папке client\bin.

По поводу того, что класть утилиту в одну папку на одной станции - в данном случае запуск функций РАЗОВЫЙ, совсем не за чем делать запуск кому-то, кроме администратора, для других случаев следует править код.

По поводу поддержания "свежести" библиотек разработчика:
ПРАВИЛО - размещать свои проекты в папке - \BEST5_34\Server\DATA\Pro\userlibs\
В этом случае, при запуске клиента библиотека ляжет в папку Client\Bin\userlibs
В этом случае не надо обновлять клиентов, все будет происходить автоматом, bdll rc файлы автоматом копируются и загружаются в память при запуске клиента Б5.

При использовании такой схемы следует откорректировать путь в userbdll.txt, который размещается в корневой папке базы данных.

Если библиотека размещена в client\bin

Дополнительно\Приложения пользователя;Оптимизация справочника БАНКОВ;optbank;tools;1;
Дополнительно\Приложения пользователя;Синхронизация справочника БАНКОВ;bnk_sync;tools;1;
Дополнительно\Приложения пользователя;Загрузка из справочника БАНКОВ;bnk_imp;tools;1;

Если библиотека размещена в \BEST5_34\Server\DATA\Pro\userlibs\ -> ( client\bin\userlibs\)

Дополнительно\Приложения пользователя;Оптимизация справочника БАНКОВ;optbank;userlibs\tools;1;
Дополнительно\Приложения пользователя;Синхронизация справочника БАНКОВ;bnk_sync;userlibs\tools;1;
Дополнительно\Приложения пользователя;Загрузка из справочника БАНКОВ;bnk_imp;userlibs\tools;1;
С уважением,
Ильин Евгений
 
Цитата
itman пишет:
Итак, по порядку.
Доступ следует ограничить для запуска, в случае использования терминального подключения и расположения библиотеки в общедоступной папке client\bin.

У нас не терминальный режим, но этот Вопрос тоже интересует. (чтобы "лишних" меню не было у др пользователей)
Цитата

По поводу того, что класть утилиту в одну папку на одной станции - в данном случае запуск функций РАЗОВЫЙ, совсем не за чем делать запуск кому-то, кроме администратора, для других случаев следует править код.

У нас просто уже появилась новая менюшка. С ней 3 человека работает. С 3х разных клиентских машин, поэтому для нас это актуально.
Цитата

По поводу поддержания "свежести" библиотек разработчика:
ПРАВИЛО - размещать свои проекты в папке - \BEST5_34\Server\DATA\Pro\userlibs\
В этом случае, при запуске клиента библиотека ляжет в папку Client\Bin\userlibs
В этом случае не надо обновлять клиентов, все будет происходить автоматом, bdll rc файлы автоматом копируются и загружаются в память при запуске клиента Б5.

При использовании такой схемы следует откорректировать путь в userbdll.txt, который размещается в корневой папке базы данных.

По-моему, вообще, проще всего ставить Бэст в ДЕмо-режиме на отдельной машине, а все плагины и длл уже в рабочую базу подбрасывать, как я и делаю.
Страницы: 1
Читают тему (гостей: 1)