10 февр. 2014 г.

Циклическое сканирование таблиц документов

После упрощения задачи единственная сложность, которая осталась, поиск ссылок на документы в удаляемом периоде.

Пусть, H1, H2, H3... HN -- таблицы шапок документов и связанные с ними 1-к-1 (или "нашей" связью 1-к-1, как в USR$INV_ADDINFO). P1, P2, P3... PN -- таблицы позиций документов и связанные с ними 1-к-1. H1K1, H1K2... H1KN -- поля ссылки на документ в таблице H1. P1K1, P1K2... P1KN -- поля ссылки на документ в таблице P1.

Тогда алгоритм выглядит следующим образом:

  1. Формируем массив ИД документов, которые остаются в БД:

    SELECT SUM(g_his_add(1, id))
    FROM gd_document
    WHERE documentdate >= :D


    Обратите внимание, что и шапки и позиции сразу попадут в выборку, так как у позиции документа дата обязательно совпадает с шапкой.
  2. Организуем цикл по таблицам H. Для каждой формируем и выполняем запрос:

    SELECT
    SUM(g_his_add(1, HjK1)),
    COUNT(HjK1),
    SUM(g_his_add(1, HjK2)),
    COUNT(HjK2),
    ...
    FROM Hj
    WHERE g_his_has(1, documentkey)


    Важно собрать все поля в один запрос, чтобы обойтись только одним сканом таблицы.

  3. Для позиций:

    SELECT
    COUNT(*), SUM(g_his_add(1, documentkey)),
    SUM(g_his_add(1, PjK1)),
    COUNT(PjK1),
    SUM(g_his_add(1, PjK2)),
    COUNT(PjK2),
    ...
    FROM Pj
    WHERE g_his_has(1, masterkeykey)


  4. Если после обработки всех таблиц шапок и всех позиций, все суммы сложились в ноль, то значит ни одной записи не добавилось к сохраняемому множеству ИД. Если больше нуля, то повторяем, начиная с шага 2.
  5. Если после обработки таблицы мы получили:

    COUNT(HjKi)- SUM(g_his_add(1, HjKi)) = 0

    То такую колонку исключаем из дальнейшей обработки. Если в таблице исключены все колонки, то в дальнейшем такую таблицу не обрабатываем.

Комментариев нет:

Отправить комментарий