30.01.2018, 00:42 | #10 |
Участник
|
Может есть еще какой-то критерий, по которому можно отсортировать записи? Например, я удалял данные из неактуальных компаний (наследие предков) таким вот кодом
X++: protected void deleteAllNotCurCompany() { str sqlStr; Dictionary dict = new Dictionary(); SysDictTable dictTable; tableId tableId; int64 recordCount, recordSum, tableCount; Common common; Connection connection = new Connection(); SqlSystem sqlSystem = new SqlSystem(); Statement statement; int i; ; progressBar.setText(strfmt("Удаляю таблицы неактуальных компаний (%1) ...", dict.tableCnt())); progressBar.setTotal(dict.tableCnt(), 2); for (i=1; i<=dict.tableCnt(); i++) { progressBar.incCount(1, 2); tableId = dict.tableCnt2Id(i); dictTable = new SysDictTable(tableId); if (!dictTable || dictTable.isMap() || dictTable.isTmp() || dictTable.isView() || !dictTable.dataPrCompany()) continue; common = dictTable.makeRecord(); common.disableCache(true); while select crosscompany count(RecId) from common group by dataAreaId { recordCount = common.RecId; if (recordCount && !this.isInCurCompany(common.dataAreaId)) { sqlStr = 'DELETE FROM ' + dictTable.name(DbBackend::Sql); sqlStr += ' WHERE (' + dictTable.fieldName(fieldnum(common, DataAreaId),DbBackend::Sql); sqlStr += ' = ' + sqlSystem.sqlLiteral(common.dataAreaId) + ') '; connection.ttsbegin(); statement = connection.createStatement(); new SqlStatementExecutePermission(sqlStr).assert(); statement.executeUpdate(sqlStr); connection.ttscommit(); CodeAccessPermission::revertAssert(); recordSum += recordCount; tableCount++; } } } info(strfmt("Удалено %1 записей в %2 таблицах неактуальных компаний", recordSum, tableCount)); } X++: //BAH Да, если компания текущая или виртуальная в текущей private boolean isInCurCompany(DataAreaId _dataAreaId) { ; if (this.getCompanyFromVirtual(_dataAreaId) == curExt()) return true; return false; } X++: //BAH186 26.01.2018 Возвращает первую попавшуюся компанию, входящую в состав виртуальной private DataAreaId getCompanyFromVirtual(DataAreaId _virtual) { VirtualDataAreaList virtualDataAreaList; ; if (this.isVirtual(_virtual)) { select firstonly virtualDataAreaList where virtualDataAreaList.virtualDataArea == _virtual; return virtualDataAreaList.Id ? virtualDataAreaList.Id : ""; } else return _virtual; } X++: //BAH186 Да, если компания виртуальная private boolean isVirtual(DataAreaId _dataAreaId) { DataArea dataArea; boolean ret; ; select firstonly id from dataArea where dataArea.id == _dataAreaId && dataArea.isVirtual == NoYes::Yes; if (dataArea) { ret = true; } return ret; } ) за 1-2 часа (точнее не засекал, отслеживал каждый шаг в дебаггере). И то на тестовой базе, которая в 3-5 раз медленнее рабочей.
__________________
Я прибыл к вам из Кантемировской дивизии. А там, как известно, дураков не держат! |
|
Теги |
batch, inventtable, multithreading, полезное, удаление |
|
Похожие темы | ||||
Тема | Ответов | |||
Отображение распаковки, запаковки и переупаковки товаров | 9 | |||
Удаление товаров | 4 | |||
Группы товаров. | 4 | |||
Удаление проекта | 0 |
|