"ВЭД-Декларант" ошибка "Выдано исключение типа System.OutOfMemoryException"

Иногда при записи xml программа зависает и выдаёт ошибку "Выдано исключение типа System.OutOfMemoryException".

Это связано с данными в таблице ED_DOCS_FOLDERS - в ней содержится огромное количество дубликатов связей ДТ+Формализованный документ.

Для решения данной проблемы необходимо сделать следующее:

1. Обязательно сделать бэкап. Взять на контроль несколько произвольных ДТ с описью с формализованными документами

2. Выполнить запрос, который посчитает количество уникальных связей ND+DocId. Результат нужно сохранить как контрольное значение.

SELECT COUNT (*)
FROM
(SELECT ND, DocId
FROM ED_DOCS_FOLDERS
GROUP BY DocId, ND
HAVING COUNT(DocId) > 0) AS tbl

3. Удалить лишнее, используя "Проводник данных".

 

Access, одним запросом

DELETE DISTINCTROW tbl1.* FROM ED_DOCS_FOLDERS tbl1 INNER JOIN (SELECT MIN(ID) AS ID2, ND, DocId FROM ED_DOCS_FOLDERS GROUP BY DocId, ND HAVING COUNT(DocId) > 1) AS tbl2 ON tbl1.ND = tbl2.ND AND tbl1.DocId = tbl2.DocId WHERE tbl1.ID <> tbl2.ID2

 

Access, через временные таблицы

-- создать временную таблицу CREATE TABLE temp (ID INTEGER PRIMARY KEY)

-- вставить во временную таблицу идентификаторы связей, которые нужно сохранить

INSERT INTO temp (ID) SELECT MIN(ID) FROM ED_DOCS_FOLDERS GROUP BY DocId, ND HAVING COUNT(DocId) > 0

-- удалить дубликаты (на приложенной базе занимает очень много времени, у меня операция заняла около 10 минут - подготовка + удаление)

DELETE FROM ED_DOCS_FOLDERS WHERE ID NOT IN (SELECT * FROM temp)

-- удалить временную таблицу

DROP TABLE temp

-- сравнить оставшееся кол-во связей с контрольным значением

SELECT COUNT(*) FROM (SELECT ND FROM ED_DOCS_FOLDERS GROUP BY DocId, ND HAVING COUNT(DocId) > 0)

 

4. Проверить состояние описи по ДТ - все документы, прикрепленные к описи должны там остаться

 

38