Posted: 09 Jun 2004 08:49 Post subject: Записи в SH_FACT.DBF с одинаковым TEK_NOMER (номер сч.ф)
Обнаружил в REAL\SH_FACT.DBF записи с одинаковм значением поля TEK_NOMER (номер сч.ф, который видно в Б4) - идут парами, но пары не у всех записей. Причем другие поля различаются. Насколько я понял, поле TEK_NOMER должно быть уникальным или необязательно? К тому же Б4 в реестре сч.ф. отображает только одну запись из каждой пары - уже непорядок.
Что делать с такими "задвоенными" записями?
Многие из них имеют дату 2000,2001г. Можно ли их смело удалять (например через BRO)?
Как можно просто удалить из SH_OP.DBF строки (состав) удаляемой сч.ф. (это что, для каждой сч.ф вручную ) ? _________________ http://v32.ru - печать и экспорт в Excel отчетов БЕСТ4.
Joined: 13 Oct 2003 Posts: 97 Location: КИА Occupation: СТ Interests: Москва
Posted: 09 Jun 2004 09:47 Post subject:
Проверенная 100%-ная метода. Пишу ОЧЕНЬ подробно.
1. Выбирается в БД пустое, или не используемое поле, или временно создаётся ещё одно служебное, только для данной задачи, поле.
2. Значение этого поля для ВСЕХ записей (т.е. желательно в физ. последовательности, чтобы ничего не пропустить) делается, например, пустым.
3. Делается дополнительный индекс на БД. В ключевое выражение вносятся те поля (или одно поле), которые вместе (или "единолично") определяют УНИКАЛЬНОСТЬ записей БД.
4. Этот индекс делают текущим.
5. Заполняют поле-жертву (см. п.1) неким значением.
6. Переключаемся на физ. последовательность.
7. Ставим фильтр на пустое (см. п.2) значение поля или делаем произвольный индекс с таким же условием.
Итог: имеем список всех записей, для которых в БД есть дубли с точностью до "ключа" уникального индекса (см.п. 3).
А дальше по вкусу - можно их "мочить" или ещё что-нибудь делать с ними.
Проделав данное с SH_FACT.DBF можно отфильтровать в SH_OP.DBF данные по этим сч/ф. Т.о., можно удалить строки сначала в SH_OP.DBF, а затем в SH_FACT.DBF.
Я сделал все один в один и в конце "в остатке" получил "задвоенные" записи, которые нужно было оставить, а не удалить, т.к, похоже, при построении уникального индекса, если есть двойные записи, то остается только первая в физическом порядке, а у меня первая запись каждой пары имеет более раннюю дату - именно эту запись и хочется удалить, то есть, при построени уникального индекса нужно, чтобы оставалсь запись с более поздней датой. Для этого я отсортировал по дате в убывающем порядке, выполнил команду CopyTo - создался новый файл, в котором физический порядок записией соответстует убыванию даты. Сделал уникальный фильтр на поле TEK_NOMER, вот теперь остались только нужны записи, которым я в поле STATUS прописал *, убрал индекс, профильтровал по STATUS<>"*" - получил записи, которые нужно удалить.
Мне нужно чистить не только SH_FACT, но и SH_OP.
Как в BRO сделать аналог операции (с вложенным подзапросом):
DELETE FROM SH_OP
WHERE NNOPER_ IN
== SELECT NNOPER
== FROM SH_FACT
== WHERE STATUS<>"*" _________________ http://v32.ru - печать и экспорт в Excel отчетов БЕСТ4.
Joined: 13 Oct 2003 Posts: 97 Location: КИА Occupation: СТ Interests: Москва
Posted: 10 Jun 2004 14:44 Post subject:
Quote:
Как в BRO сделать аналог операции (с вложенным подзапросом)
Точно ответить трудно, т.к. языком запросов не владею.
Отвечу как понял.
Вопрос: как чистить не только SH_FACT, но и SH_OP.
1. Открываются в BRO обе БД. Первая SH_FACT (основная), и вторая SH_OP - дочерняя. Осн. БД ДОЛЖНА содержать индекс, по которому будут найдены заголовки сч/ф для строк из БД SH_OP.
2. Далее
вариант 1:фильтр на БД SH_OP по выражению SH_FACT->(DBSEEK(SH_OP->(здесь_выражение_из_полей_SH_OP_по_значению_которого_будет_найден_её_заголовок)))
вариант 2: строится индекс SH_OP с условием FOR как указано в вар.1.
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum