После перехода с Б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.
Синхронизация справочника в Б5 с файлом bnkseek.dbf.
Источник - http://www.pvision.ru/bik.htm Скачиваем архив, раскрываем в любую папку.
Запускаем функцию, получаем справочник с обновленными реквизитами по справочнику БИК.
Код минимален, перед применением тестировать на копии рабочей базы.
Код
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.
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
itman пишет:
Если библиотека будет лежать на сервере, следует предусмотреть функцию, ограничивающую доступ.
Доступ к чему? К dll'ке или нововведенным функциям-менюшкам?
По поводу ограничений для вновь введенных меню разработчики обещали дать возможность ставить ограничения на доступ через менеджера пользователей.
А вот по поводу того, чтобы класть эту длл в папку клиент на сервере не совсем понятно каким образом она к остальным попадет.
Я, кстати собирался об этом спросить. Дело в том, что для того, чтобы написанная dll работала у всех надо на каждой клиентской машине её ставить. Ну, это еще пол беды. Один раз такое сделать можно. А вот что делать если эту дллку обновили? Каждый раз после внесения изменений придется по новой всем таскать эту длл... Это не очень-то удобно, даже в случае полного доступа по сети к папке bin всех клиентских машин.
Итак, по порядку.
Доступ следует ограничить для запуска, в случае использования терминального подключения и расположения библиотеки в общедоступной папке client\bin.
По поводу того, что класть утилиту в одну папку на одной станции - в данном случае запуск функций РАЗОВЫЙ, совсем не за чем делать запуск кому-то, кроме администратора, для других случаев следует править код.
По поводу поддержания "свежести" библиотек разработчика:
ПРАВИЛО - размещать свои проекты в папке - \BEST5_34\Server\DATA\Pro\userlibs\
В этом случае, при запуске клиента библиотека ляжет в папку Client\Bin\userlibs
В этом случае не надо обновлять клиентов, все будет происходить автоматом, bdll rc файлы автоматом копируются и загружаются в память при запуске клиента Б5.
При использовании такой схемы следует откорректировать путь в userbdll.txt, который размещается в корневой папке базы данных.
itman пишет:
Итак, по порядку.
Доступ следует ограничить для запуска, в случае использования терминального подключения и расположения библиотеки в общедоступной папке client\bin.
У нас не терминальный режим, но этот тоже интересует. (чтобы "лишних" меню не было у др пользователей)
Цитата
По поводу того, что класть утилиту в одну папку на одной станции - в данном случае запуск функций РАЗОВЫЙ, совсем не за чем делать запуск кому-то, кроме администратора, для других случаев следует править код.
У нас просто уже появилась новая менюшка. С ней 3 человека работает. С 3х разных клиентских машин, поэтому для нас это актуально.
Цитата
По поводу поддержания "свежести" библиотек разработчика:
ПРАВИЛО - размещать свои проекты в папке - \BEST5_34\Server\DATA\Pro\userlibs\
В этом случае, при запуске клиента библиотека ляжет в папку Client\Bin\userlibs
В этом случае не надо обновлять клиентов, все будет происходить автоматом, bdll rc файлы автоматом копируются и загружаются в память при запуске клиента Б5.
При использовании такой схемы следует откорректировать путь в userbdll.txt, который размещается в корневой папке базы данных.
По-моему, вообще, проще всего ставить Бэст в ДЕмо-режиме на отдельной машине, а все плагины и длл уже в рабочую базу подбрасывать, как я и делаю.