Ответить

 

Опции темы
Старый 04.07.2011, 12:28   #1
undermind
Пользователь
 
Аватар для undermind
 
Регистрация: 09.05.2010
Сообщений: 182
Благодарности: 0
Поблагодарили 12 раз(а) в 12 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

Пост дополняется по мере поступления новой информации.
(1-99) Ошибки, влияющие на процесс конвертации.
Критические ошибки. Исправлять обязательно. Наличие ошибок этой группы приведёт к аварийному завершению конвертации.
Код:
1. ИП с одинаковым номером   select distinct IP1.NUM_IP as NUMBER from IP IP1, IP IP2 where (IP1.NUM_IP = IP2.NUM_IP) and (IP1.PK <> IP2.PK)
нужно ручками думать и править номера производств.

Код:
2. ИД, ссылающиеся на одинаковые ИП. select ip1.num_in as NUMBER from ID IP1 where (select count(1) from ID ID1 where ID1.fk = IP1.fk and ID1.pk <> IP1.pk) > 0
Не очень представляю как такое можно получить... по логике вещей два различных исполнительных документа порождают собой одно исполнительное производство. Как я понимаю один документ - фиктивный. Гуру, выкурившие с кировскими разработчиками не одну пачку этого дела, подскажут точнее.

Код:
3. Задублированный USCODE в таблице S_USERS select distinct s1.uscode as NUMBER from s_users s1, s_users s2 where s1.uscode = s2.uscode and s1.pk <> s2.pk
тут всё банально - есть два юзера с одинаковым идентификатором - работать эти два пользователя не могут уже по определению - т.е. работать может только один, у которого uscode меньше. правится в IBexpert - особых усилий не требуется. Был не прав. Своими очами видел базу, в которой успешно работал начальник с USCODE=100 и была учётная запись PHANTOM с таким же USCODE. Но тут есть ньюанс: разработчики из Кирова показали себя во всей красе. Производство связывается с приставом аж в двух местах - IP.USCODE=S_USERS.USCODE и IP.FIO_SPI=S_USERS.FULL_NAME. "Бред!" -скажете вы? не могу не согласится. А если учесть, что реальная связка работает по строковому индексу ФИО... нет слов. Итог- вместе с изменением USCODE требуется чинить исполнительные производства, относящиеся к одному из неудачников. USCODE так же завязан на AKT_IP, AKT_IPSEND (FIO_SPI и FIO2 внутри - чтобы жизнь мёдом не казалась), AR_IM(FIO_SPI - для тех же целей), AR_IM_INFO(PK_IM - связывает с AR_IM), мля, кировцы вообще в курсе про реляционные БД!? проектировать заставили школьника Васю, да ещё напоили его перед этм!? AR_MOVE_IM(в связях уже чёрт ногу сломит, по всей видимости хотели сделать какой-то связанный список...), BOOKSVOD, BOOKZONE,DATECHANGE, DOCIP_IN_SUM, DOCS_OUT, DOCUMENT, DONESELF, ID, IM,IN_DOC,IN_ID и другие... нет смысла перечислять... если оба пользователя умудрились как-то поработать в базе - откапывать тут нечего - лучше похоронить. Автоматизировать процесс лечения этой ошибки в данной ситуации не представляется возможным в разумные трудозатраты.


Код:
4. В таблицах отключен первичный ключ 
   select IP1.rdb$relation_name as NUMBER from rdb$relation_constraints IP1 join rdb$indices i on i.rdb$index_name = IP1.rdb$index_name where IP1.rdb$constraint_type = 'PRIMARY KEY' and i.rdb$index_inactive <> 0
если правильно понимаю - какой-то идиот отключил первичный ключ. по-идее запрос должен быть такой (сразу)
Код:
update rdb$indices set rdb$indices.rdb$index_inactive=0 where (rdb$indices.rdb$index_name in (select rdb$index_name from rdb$relation_constraints where rdb$constraint_type = 'PRIMARY KEY')) and (rdb$indices.rdb$index_inactive<>0)
гы, как-то не очень элегантно получилось, но вроде как запрос делает своё дело - включает все выключенные первичные ключи.

Код:
5. В таблицах отсутствует первичный ключ 
   select distinct ip1.rdb$relation_name as NUMBER from rdb$relation_fields ip1 left join rdb$relation_constraints rc on ip1.rdb$relation_name = rc.rdb$relation_name and rc.rdb$constraint_type = 'PRIMARY KEY' where rc.rdb$constraint_name is null and ip1.rdb$relation_name not starting with 'RDB$' and ip1.rdb$relation_name not starting with 'R$' and ip1.rdb$relation_name not starting with 'MON$' and ip1.rdb$relation_name not starting with 'RPL$'
я, честно сказать, не представлял, что существуют базы с гордым именем реляционные, в которых для долгосрочного хранения не используются первичные ключи (да и возможность их отключить - тоже бред какой-то). По-этому сильно удивился, что в живых базах ПК СП такая ситуация может являться своеборазной нормой.
Решение, для кажлой такой таблицы запрос:
Код:
update RDB$RELATION_FIELDS set RDB$NULL_FLAG = 1 where (RDB$FIELD_NAME = 'PK') and (RDB$RELATION_NAME = '{0}') 
alter table {0} add constraint pk_{0} primary key (pk)
{0} - заменить на имя таблицы из проверочного запроса.
на сим покамест закончим.

(101-199) Ошибки, влияющие на сходимость статистики.
Важные ошибки. Исправлять обязательно. Ошибки этой группы влияют на сходимость статистической отчётности.
ИМХО, если они были - то статотчётность и так бы не сошлась - при чем тут конвертация?

Код:
101. ИП окончено, но не указан пункт статьи окончания   select IP1.NUM_IP as NUMBER from IP IP1 where (IP1.SSD is null)and(IP1.SSV is null)and(IP1.DATE_IP_OUT is not null) and (IP1.NUM_PP is null)
Решение простое - бить приставов по рукам.

Код:
102. Для сумм "Исполнительского сбора" установлен вид назначения платежа в IP_IN_SUM (Ошибка в кировском учете: исп.сбор списывается как основной долг)   select distinct IP1.NUM_IP as NUMBER from IP IP1 join IP_IN_SUM on IP1.PK = IP_IN_SUM.FK where IP_IN_SUM.VID_SUM = 'исполнительский сбор' and IP_IN_SUM.FK_VID_PLAT is not null and IP_IN_SUM.ISERROR is null and IP_IN_SUM.RETURNFLAG = 0
Название говорит само за себя. Исправление - приставом изменять назначение платежа.

Код:
103. У атомарного ИП заполнен номер сводного, но нет ссылки на само сводное ИП select ip1.num_ip as NUMBER from ip ip1 where nullif(trim(ip1.svod_num), '') is not null and ip1.pk_svod is null
так, вот тут, как я понял, это кусок сводного, которое [s]прое[/s] утеряло ссылку на сводное.
приходит в голову
Код:
update ip set ip.pk_svod=(select pk from ip where num_ip={0}) where svod_num={0} 
{0}=select ip1.svod_num as NUMBER from ip ip1 where nullif(trim(ip1.svod_num), '') is not null and ip1.pk_svod is null
но проверить не могу, ибо, тфу-тфу, такую ошибку пока не встречал.

Код:
104. Сумма взыскания в основном экземпляре отлична от суммы солидарного ИП 
   select distinct IP1.NUM_IP as NUMBER from IP IP1 join IP IPS on IP1.PK = IPS.PK_SVOD and IPS.MAIN_D = 1 where coalesce(IP1.SUM_, 0) <> coalesce(IPS.SUM_, 0)
Вроде всё логично - нужно исправить где-то сумму.

исправляем ошибки 207,208,201,202 - спасибо Sirius34
рекомендуемый порядок исправления: деактивация всех триггеров, 207, 208, 201, 202, активация всех триггеров

NB! если юзвери сами ручками меняли в карточке ИП ФИО/наименование должника или взыскателя, то есть очень большая вероятность, что эти изменения накроются большим медным тазом, но это единственный, скажем так, "побочный эффект" данных коррекций

ПЕРЕД ИСПОЛЬЗОВАНИЕМ ПРОВЕРИТЬ СОСТОЯНИЕ ТАБЛИЦЫ entity!!!

Код:
    select distinct 
        IP1.num_in, IP1.name_d, e.e_name, e.pk 
        from 
        ID IP1 join counterparts c on ip1.pk = c.fk_id and c.c_kind = 1 left join entity e 
        on c.fk_entity = e.pk 
        where 
            upper(coalesce(IP1.name_d, '')) <> upper(coalesce(e.e_name, ''))
и
Код:
    select distinct 
        IP1.num_in, IP1.name_v, e.e_name 
        from 
        ID IP1 join counterparts c on ip1.pk = c.fk_id and c.c_kind = 0 left join entity e 
        on c.fk_entity = e.pk 
        where 
            upper(coalesce(IP1.name_v, '')) <> upper(coalesce(e.e_name, ''))
на наличие строк со значением null. при их наличии в базе появятся производства с должниками/взыскателями NULL - что не очень радует.


201. Должник в ИП отличен от должника в ИД
Код:
update ip 
set ip.name_d = (select id.name_d from id where ip.pk_id = id.pk) 
where ip.name_d <> (select id.name_d from id where ip.pk_id = id.pk)
202. Взыскатель в ИП отличен от взыскателя в ИД
Код:
update ip 
set ip.name_v = (select id.name_v from id where ip.pk_id = id.pk) 
where ip.name_v <> (select id.name_v from id where ip.pk_id = id.pk)
207. Наименование контрагента в справочнике отлично от наименования контрагента-должника в ИД
Код:
CREATE OR ALTER PROCEDURE dolzh 
as 
declare variable numin varchar(50); 
declare variable named varchar(500); 
declare variable ename varchar(200); 
begin 
for 
    select distinct 
        IP1.num_in, IP1.name_d, e.e_name 
        from 
        ID IP1 join counterparts c on ip1.pk = c.fk_id and c.c_kind = 1 left join entity e 
        on c.fk_entity = e.pk 
        where 
            upper(coalesce(IP1.name_d, '')) <> upper(coalesce(e.e_name, '')) 
        into 
            :numin, :named, :ename 
        do 
        begin 
            update id 
            set 
                id.name_d = :ename 
            where 
                id.num_in = :numin; 
        end 
end; 
 
execute procedure dolzh; 
drop procedure dolzh; 
commit;
208. Наименование контрагента в справочнике отлично от наименования контрагента-взыскателя в ИД
Код:
CREATE OR ALTER PROCEDURE vzysk 
as 
declare variable numin varchar(50); 
declare variable namev varchar(500); 
declare variable ename varchar(200); 
begin 
for 
    select distinct 
        IP1.num_in, IP1.name_v, e.e_name 
        from 
        ID IP1 join counterparts c on ip1.pk = c.fk_id and c.c_kind = 0 left join entity e 
        on c.fk_entity = e.pk 
        where 
            upper(coalesce(IP1.name_v, '')) <> upper(coalesce(e.e_name, '')) 
        into 
            :numin, :namev, :ename 
        do 
        begin 
            update id 
            set 
                id.name_v = :ename 
            where 
                id.num_in = :numin; 
        end 
end; 
 
execute procedure vzysk; 
drop procedure vzysk; 
commit;

Кстати, ПК СП toolbox позволяет проверять базы на ошибки и автоматически править ошибки №4 и 5.
З.Ы. Прицепил чекстат от кировцев (в архиве)
З.Ы.Ы. Тулбокс более кошерно правит 207-208. Перед исправлением рекомендуется РУЧКАМИ удалить из справочника дубликаты (например ООО "РЖД" и ООО "Российские Железные Дороги" - и т.п.), проверить правильность написания наименований из справочника. Сама система при запуске исправления предложит сопоставить висяки (т.е. производства в которых нулёвые ссылки на контрагентов). После - магия
 
В Минюст Цитата Спасибо
Старый 04.07.2011, 15:28   #2
raus
Модератор ФССП
 
Аватар для raus
 
Регистрация: 16.01.2009
Адрес: Россия / /
Сообщений: 3,373
Благодарности: 153
Поблагодарили 548 раз(а) в 528 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

разделил тему в виду важности вопроса...
__________________
Yo Way Yo, Home Va-Ray,
Yo Ay-Rah, Jerhume Brunnen-G
 
В Минюст Цитата Спасибо
Старый 05.07.2011, 20:03   #3
scalesmann
Пользователь
 
Аватар для scalesmann
 
Регистрация: 05.07.2011
Адрес: Россия / Ульяновская обл. / Новоульяновск
Сообщений: 2
Благодарности: 0
Поблагодарили 0 раз(а) в 0 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

интересно наименее затратное по времени исправление ошибок, начиная с 200й, связанных с несовпадением наименования должника/взыскателя в исполнительном производстве, исполнительном документе и справочнике контрагентов.
есть мнение, что если принудительно sql-командами заменить данные в колонке e_name таблицы entity на данные из name_d таблицы id, то может быть счастье. правда, не могу сделать рабочий скрипт для этого
 
В Минюст Цитата Спасибо
Старый 06.07.2011, 00:42   #4
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76 раз(а) в 76 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

исправляем ошибки (рекомендуемый порядок исправления: деактивация всех триггеров, 207, 208, 201, 202, активация всех триггеров)

201. Должник в ИП отличен от должника в ИД
Код:
update ip 
set ip.name_d = (select id.name_d from id where ip.pk_id = id.pk) 
where ip.name_d <> (select id.name_d from id where ip.pk_id = id.pk)
202. Взыскатель в ИП отличен от взыскателя в ИД
Код:
update ip 
set ip.name_v = (select id.name_v from id where ip.pk_id = id.pk) 
where ip.name_v <> (select id.name_v from id where ip.pk_id = id.pk)
207. Наименование контрагента в справочнике отлично от наименования контрагента-должника в ИД
Код:
CREATE OR ALTER PROCEDURE dolzh 
as 
declare variable numin varchar(50); 
declare variable named varchar(500); 
declare variable ename varchar(200); 
begin 
for 
    select distinct 
        IP1.num_in, IP1.name_d, e.e_name 
        from 
        ID IP1 join counterparts c on ip1.pk = c.fk_id and c.c_kind = 1 left join entity e 
        on c.fk_entity = e.pk 
        where 
            upper(coalesce(IP1.name_d, '')) <> upper(coalesce(e.e_name, '')) 
        into 
            :numin, :named, :ename 
        do 
        begin 
            update id 
            set 
                id.name_d = :ename 
            where 
                id.num_in = :numin; 
        end 
end; 
 
execute procedure dolzh; 
drop procedure dolzh; 
commit;
208. Наименование контрагента в справочнике отлично от наименования контрагента-взыскателя в ИД
Код:
CREATE OR ALTER PROCEDURE vzysk 
as 
declare variable numin varchar(50); 
declare variable namev varchar(500); 
declare variable ename varchar(200); 
begin 
for 
    select distinct 
        IP1.num_in, IP1.name_v, e.e_name 
        from 
        ID IP1 join counterparts c on ip1.pk = c.fk_id and c.c_kind = 0 left join entity e 
        on c.fk_entity = e.pk 
        where 
            upper(coalesce(IP1.name_v, '')) <> upper(coalesce(e.e_name, '')) 
        into 
            :numin, :namev, :ename 
        do 
        begin 
            update id 
            set 
                id.name_v = :ename 
            where 
                id.num_in = :numin; 
        end 
end; 
 
execute procedure vzysk; 
drop procedure vzysk; 
commit;
p.s. чуть не забыл: если юзвери сами ручками меняли в карточке ИП ФИО/наименование должника или взыскателя, то есть очень большая вероятность, что эти изменения накроются большим медным тазом, но это единственный, скажем так, "побочный эффект" данных коррекций
 
В Минюст Цитата Спасибо
Старый 06.07.2011, 10:26   #5
undermind
Пользователь
 
Аватар для undermind
 
Регистрация: 09.05.2010
Сообщений: 182
Благодарности: 0
Поблагодарили 12 раз(а) в 12 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

Цитата:
Сообщение от Sirius34 Посмотреть сообщение
рекомендуемый порядок исправления: деактивация всех триггеров
Спасибо! Есть sql по отключению разом всех триггеров? Для 100% автоматизации процесса..
 
В Минюст Цитата Спасибо
Старый 06.07.2011, 13:18   #6
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76 раз(а) в 76 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

Цитата:
Сообщение от undermind Посмотреть сообщение
Спасибо! Есть sql по отключению разом всех триггеров? Для 100% автоматизации процесса..
спасибо не мне - я только чуть-чуть подправил скрипты, а изначально со мной один добрый человек ими поделился
по триггерам
общий принцип отключения / включения такой
Код:
alter trigger TRIGGER_NAME inactive; 
... 
alter trigger TRIGGER_NAME active;
теоретически, в приведенных мной скриптах будет актуально только два триггера:
UPD_ID
UPD_IP
но я не проверял, поэтому результат гарантировать не могу...
 
В Минюст Цитата Спасибо
Старый 06.07.2011, 15:31   #7
undermind
Пользователь
 
Аватар для undermind
 
Регистрация: 09.05.2010
Сообщений: 182
Благодарности: 0
Поблагодарили 12 раз(а) в 12 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

По триггерам про id IBExpert видит на update для id
UPD_IP
UPD_IP_NAMEID
UPD_IP_NAMEORGID
на update для ip
before:
UPD_IP_BZ
after:
UPDATE_IM_IP
UPD_DATE_IP_OUT
UPD_ID
UPD_IP_BOOKSVOD
UPD_IP_BOOKZONE
UPD_IP_DO_PARENT_LINK
UPD_IP_RECALLSUM_SV
UPD_IP_REGISTERORDERS

для уверенности остановлю их все

Sirius34, если не возражаете, прилеплю ваши наработки в головной пост.

PS. почему я не удивляюсь, что на update для ip висит триггер upd_id, а для id - upd_ip?
 
В Минюст Цитата Спасибо
Старый 06.07.2011, 19:12   #8
Sirius34
Пользователь
 
Аватар для Sirius34
 
Регистрация: 19.07.2010
Сообщений: 392
Благодарности: 0
Поблагодарили 76 раз(а) в 76 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

Цитата:
Сообщение от undermind Посмотреть сообщение
Sirius34, если не возражаете, прилеплю ваши наработки в головной пост.
как пожелаете

Цитата:
PS. почему я не удивляюсь, что на update для ip висит триггер upd_id, а для id - upd_ip?
не понял...
 
В Минюст Цитата Спасибо
Старый 07.07.2011, 00:39   #9
undermind
Пользователь
 
Аватар для undermind
 
Регистрация: 09.05.2010
Сообщений: 182
Благодарности: 0
Поблагодарили 12 раз(а) в 12 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

Цитата:
Сообщение от Sirius34 Посмотреть сообщение
не понял...
это как тест Айзенка:
Код:
найди лишнее: 
триггеры update для ip 
UPD_IP_BZ 
UPDATE_IM_IP 
UPD_DATE_IP_OUT 
UPD_ID 
UPD_IP_BOOKSVOD 
UPD_IP_BOOKZONE 
UPD_IP_DO_PARENT_LINK 
UPD_IP_RECALLSUM_SV 
UPD_IP_REGISTERORDERS
так понятней?
 
В Минюст Цитата Спасибо
Старый 07.07.2011, 02:48   #10
sergon
Пользователь
 
Аватар для sergon
 
Регистрация: 28.01.2010
Адрес: Россия / Сахалин / Тымовское
Сообщений: 19
Благодарности: 0
Поблагодарили 0 раз(а) в 0 сообщениях

Обратиться по нику
Цитата выделенного
По умолчанию

В помощь вам Коллеги утилита от Сахалинской области по исправлению ошибок, незнаю может у кого и есть она...Автор просил не называтся. Нам очень помогла. будут вопросы пишите. В ней вроде все просто и понятно.
 
В Минюст Цитата Спасибо
Ответить


Быстрый ответ

Сообщение:
Опции

Опции темы

Ваши права в разделе