13.11.2019 10:03
Odessit
 
Добрый день. Я так понимаю, вы работаете с Домино. Скажите, вы базы в Домино когда-нибудь резали? Лет 8 назад я с доминошкой делал, все что угодно. Сейчас снова приходится с ней работать. База переполнена, срочно нужно её обрезать. Прошу помощи в том как это сделать.
13.11.2019 10:53
KirillHome
 
В своё время писал доминошные скрипты для обрезки движения (соответственно, создающие документы входящих остатков).

Но так как сами Pervasive базы не очищаются при этом - то дальше средствами Pervasive (Btrieve?) сжимал базы.
Для этого использовался такой bat-файл

Код:
@echo off
setlocal ENABLEDELAYEDEXPANSION

rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem !! Собственно, главные переменные...                          !!
rem !! еще не сообразил, как их "правильно передать"...           !!
rem !! но... В принципе - 3 строчки можно подпрравить и руками... !!
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Set OldBase=D:\DOMINO\DATABASE\ИмяКаталогаСтаройБазы
Set NewBase=E:\DATABASE\ИмяКаталогаНовойБазы
Set Error_File=Err.txt

rem OldBase - указывает, где лежит текущая база
rem NewBase - указывает, куда будем класть новую
rem Error_File - имя файла "ошибок"
rem - а дальше рекурсивно идем по "текущей базе",
rem   создаем ее полный аналог по структуре и 
rem   файлы Btrieve - переводим в новый формат
rem   прочие файлы - просто копируем....
rem   глубина "вложенности" для самого "глубоко зарытого" файла
rem    - не более 10 уровней...

if exist %Error_File% del /Q %Error_File%

FOR /F "tokens=1-10 delims=" %%b IN ('echo %OldBase%') DO (
if "%%k"=="" set /A max_num=9
if "%%j"=="" set /A max_num=8
if "%%i"=="" set /A max_num=7
if "%%h"=="" set /A max_num=6
if "%%g"=="" set /A max_num=5
if "%%f"=="" set /A max_num=4
if "%%e"=="" set /A max_num=3
if "%%d"=="" set /A max_num=2
if "%%c"=="" set /A max_num=1
)
rem echo %max_num%

if NOT EXIST %NewBase% (
md %NewBase%
if not ERRORLEVEL=0 (
echo Ошибка при создании выходного каталога %NewBase%
echo Работа - закончена неудачно!
GOTO _EOF
)
) else (
echo Выходной каталога %NewBase% уже существует
echo Работа - закончена неудачно!
GOTO _EOF
)

FOR /R %OldBase% %%a IN (.) DO CALL :_SubCat %%a
type err.txt
GOTO :_EOF

:_SubCat
Set OldPath=%1
Set NewPath=%OldPath:~0,-1%
rem echo Работаю с путем %NewPath%
rem pause
FOR /F "tokens=1-10 delims=" %%b IN ('echo %NewPath%') DO (
if "%%k"=="" set /A tek_num=9
if "%%j"=="" set /A tek_num=8
if "%%i"=="" set /A tek_num=7
if "%%h"=="" set /A tek_num=6
if "%%g"=="" set /A tek_num=5
if "%%f"=="" set /A tek_num=4
if "%%e"=="" set /A tek_num=3
if "%%d"=="" set /A tek_num=2
if "%%c"=="" set /A tek_num=1
)

IF %tek_num% GTR %max_num% (
 FOR /F "tokens=%max_num%,* delims=" %%b IN ('echo %NewPath%') DO (
  set NewNewFold=%NewBase%\%%c
  md !NewNewFold!
  if not ERRORLEVEL=0 (
   echo Ошибка при создании выходного каталога %NewNewFold%
   echo Работа - закончена неудачно!
   GOTO _EOF
  ) 
 )
)


for %%l in (%NewPath%*.*) do (  
call butil -STAT %%l >nul
if !errorlevel!==0 (
rem файл - Btrieve, Всё нормально!!
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem !! Ну, можно поставить еще проверки на правильность "клонирования", !!
rem !!  но уже лень...                                                  !!
rem !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rem Что-бы было "не скучно" - выведем имя файла
echo Работаю с файлом %%l
rem !!!!
butil -CLONE !NewNewFold!\%%~nl.dat %%l >nul
rem !!!!
BUTIL -SAVE %%l !NewNewFold!\%%~nl.txt >nul
rem !!!!
BUTIL -LOAD !NewNewFold!\%%~nl.txt !NewNewFold!\%%~nl.dat >nul
del /Q !NewNewFold!\%%~nl.txt
rem !!!!
)  else (
echo Работаю с файлом %%l
echo Файл %%l - не файл Btrieve!!! >> %Error_File%
rem На всякий случай - их просто копируем в новый каталог
if "!NewNewFold!"=="" (
copy %%l %NewBase% >nul
) else (
copy %%l !NewNewFold!%%~nxl >nul
)
)
)


:_EOF
13.11.2019 11:28
Odessit
 
Все так просто? Я раньше обрезал бьазы. Закрывал старую, все переносил и получалась чистая с база, с одной партионкой в товаре. Рабочая база сейчас работает ещё с момента моего увольнения. 8 с копейками лет. В Омске никто ничего не может подсказать. Сам уже мало что помню.
Ты где территориально располагается? Так бы пива попить.
13.11.2019 18:50
KirillHome
 
Цитата:
Odessit Закрывал старую, все переносил и получалась чистая с база, с одной партионкой в товаре.
У меня "из коробки" такого не было.
Плюс - незакрытые заказы...
Партионки - когда удалял, когда нет (некоторые хотят для истории закупочных цен).

Общая технология, на сколько помню, такая:
1. Получаем по всем складам остатки по партионным карочкам (в количественном и суммовом выражении).
2. Если номера партий - меняем, то - выгружаем в "почтовое сообщение" номенклатуру (базовые и партионные карточки, штрихкоды и прочее. Номера партий - считаем сами!!!), какие-то дополнительные справочники + документы ввода остатков; если нет - то только документы ввода остатков
3. Создаём новую базу, переписываем из старой user.dat, AGENT\*.*, CLASSIF\*.*, DOCUMENT\D_VIEW.DAT, PROJECT\*.*, создаём остальные каталоги. Если партии оставляем - то из старой берём PRODUCT\*.*
4. В новой базе загружаем это почтовое сообщение.
5. Проверяем остатки на конец в старой базе и остатки на начало в новой.

Всё вышесказанное - верно для версии 7 (7.1 - 7.7)


Цитата:
Odessit Ты где территориально
Под Москвой :)
14.11.2019 07:33
Odessit
 
Давай я тебе хорошего пива отправлю. Вчера запустил скрипт, лопатитбазу. Проблема началась летом. Там переполнился protocol.dat его до меня немного почистили. Сейчас вылезла снова эта проблема. Я не сторонник временных решений, и нужно координально решать проблему. Надеюсь после окончания процесса, база станет и легче и целее.
Спасибо.
14.11.2019 09:33
KirillHome
 
А вот Protocol - я не помню, он "сжимается" или нет...
Я частенько его вообще просто переименовывал

Ну, и перед сжатием - в протоколе, наверное, тоже можно почистить от старых записей...

Код:
integer ФлагУдаления = 0;

Дата.Запросить_Интервал;

ВЫБОР.ИНИЦИАЛИЗАЦИЯ(0);
ВЫБОР.ДОБАВИТЬ_СТРОКУ('Не удаляем');
ВЫБОР.ДОБАВИТЬ_СТРОКУ('Удаляем');

Case ВЫБОР.ВЫБРАТЬ(0,'Чистим протокол за период с '+Sformat(Дата.Начальная,'D10')+' по '+Sformat(Дата.Конечная,'D10')+'?')
{
 of 1: ФлагУдаления = 0;
 of 2: ФлагУдаления = 1;
 else  Halt;
};

if ФлагУдаления = 1
{
  Select Протокол.ЗаПериод
  {
    after Протокол.ЗаПериод.Запись:
           Протокол.Удалить();
  };
}
Можно, конечно, попробовать добавить транзакционности, сообщений в файл (что бы понять - на каком "периоде" сейчас всё работает) - но эти красивости и сам сможешь добавить.
15.11.2019 05:41
Odessit
 
Спасибо огромное! за пару часов вылечилась Доминошка! Ты волшебник
15.11.2019 11:01
KirillHome
 
Цитата:
Odessit за пару часов вылечилась Доминошка!
Ты заходи, если что.

Домино я ещё помню
15.11.2019 12:37
Odessit
 
Приветствую! Скриптом прошелся по базе, все документы перенеслись, а вот содержимое их пустое. Деакцепт - и все.
15.11.2019 13:18
Odessit
 
Сорри, пустые только приходные и расходные документы. Весь товар а месте.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.