inventDim хранит комбинации складских аналитик.
По-умолчанию, аксапта никогда не удаляет значения из inventDim.
Вы не можете удалить строчки при помощи Обозревателя таблиц или при помощи формы InventDim.
Однако, при попытках настройки или при массовых вмешательствах программистов inventDim может хранить множество значений, которые никогда не используются.
Приведенный ниже job анализирует InventDim и информирует вас о значениях, которые не используются. Если вы установите forceDelet = true, то job будет инорфмировать и удалять.
PHP код:
// Выполняет поиск неиспользуемых InventDim
// Удаляет неиспользуемые записи, если расскоментировать forceDelete = true;
//
// Внимание: в середине алгоритма инициализируется
// множество таблиц, в которых выполнять поиск не надо.
// Расскоментируйте или добавьте свои таблицы
static void mazClearInventDim(Args _args)
{
#avifiles
boolean forceDelete = false; // Будет только показывать записи, которые надо удалять
// boolean forceDelete = true; // Будет удалять записи!
SysOperationProgress progress = SysOperationProgress::newMultiBar(2,#aviUpdate, "Проверка");
Dictionary dictionary = new Dictionary();
DictTable dictTable;
DictField dictField;
DictType dictType;
Name tableName;
tableId tableId;
tableId tmpTableId;
fieldId fieldId;
extendedTypeId InventDimType = typeId2ExtendedTypeId(typeid(InventDimID));
set disabledTables = new set(Types::Integer);
container ids;
int i;
boolean found;
InventDimID inventDimId;
InventDim inventDim;
InventDim inventDimBlank;
//======================
Query CreateQuery(tableId tid, fieldId fid, InventDimId dimId)
{
Query q;
QueryBuildDataSource qbds;
q = new Query();
qbds = q.addDataSource(tid);
SysQuery::findOrCreateRange(qbds,fid).value(dimId);
return q;
}
//======================
;
// Указанные ниже таблицы проверять не надо
// Расскоментируйте строчки с таблицами, в которых проверка выполняться НЕ БУДЕТ!
disabledTables.add(tablenum(InventDim)); // Обязательно оставьте эту строчку!
//disabledTables.add(tablenum(BOM));
//disabledTables.add(tablenum(BOMCalcTable));
//disabledTables.add(tablenum(BOMCalcTrans));
//disabledTables.add(tablenum(BOMParmReportFinish));
//disabledTables.add(tablenum(ForecastPurch));
//disabledTables.add(tablenum(ForecastSales));
//disabledTables.add(tablenum(CustBillOfParcelsTrans));
//disabledTables.add(tablenum(SalesLine));
//disabledTables.add(tablenum(CustConfirmTrans));
//disabledTables.add(tablenum(CustInvoice4PaymTrans_RU));
//disabledTables.add(tablenum(CustInvoiceBackorderLine));
//disabledTables.add(tablenum(CustInvoiceTrans));
//disabledTables.add(tablenum(CustPackingSlipBackorderLine));
//disabledTables.add(tablenum(CustPackingSlipTrans));
//disabledTables.add(tablenum(CustPickingListTrans));
//disabledTables.add(tablenum(SalesPickingListJournalLine));
//disabledTables.add(tablenum(CustQuotationTrans));
//disabledTables.add(tablenum(CustVendExternalItem));
//disabledTables.add(tablenum(EPPriceCalc));
//disabledTables.add(tablenum(FactureTrans_RU));
//disabledTables.add(tablenum(stVendInvoiceTrans));
//disabledTables.add(tablenum(ForecastInvent));
//disabledTables.add(tablenum(ForecastItemAllocationLine));
//disabledTables.add(tablenum(InventSum));
//disabledTables.add(tablenum(InventCountJour));
//disabledTables.add(tablenum(InventJournalTrans));
//disabledTables.add(tablenum(TmpWMSOnlineCounting));
//disabledTables.add(tablenum(InventTrans));
//disabledTables.add(tablenum(InventItemBarcode));
//disabledTables.add(tablenum(InventItemLocation));
//disabledTables.add(tablenum(InventJournalTrans));
//disabledTables.add(tablenum(InventJournalTrans_Tag));
//disabledTables.add(tablenum(InventPackagingMaterialTrans));
//disabledTables.add(tablenum(InventPackagingUnit));
//disabledTables.add(tablenum(InventQuarantineOrder));
//disabledTables.add(tablenum(InventQuarantineOrder));
//disabledTables.add(tablenum(InventSumLogTTS));
//disabledTables.add(tablenum(WMSJournalTrans));
//disabledTables.add(tablenum(TmpInventTransMark));
//disabledTables.add(tablenum(PriceDiscAdmTrans));
//disabledTables.add(tablenum(PriceDiscTable));
//disabledTables.add(tablenum(VendPackingSlipTrans));
//disabledTables.add(tablenum(ProdBOM));
//disabledTables.add(tablenum(ProdJournalBOM));
//disabledTables.add(tablenum(ProdCalcTrans));
//disabledTables.add(tablenum(ProdJournalProd));
//disabledTables.add(tablenum(ProdTable));
//disabledTables.add(tablenum(ProdJournalRoute));
//disabledTables.add(tablenum(ProdParmReportFinished));
//disabledTables.add(tablenum(ProjInvoiceItem));
//disabledTables.add(tablenum(ProjItemTrans));
//disabledTables.add(tablenum(PurchLine));
//disabledTables.add(tablenum(VendInvoice4PaymTrans_RU));
//disabledTables.add(tablenum(VendInvoiceTrans));
//disabledTables.add(tablenum(VendPurchOrderTrans));
//disabledTables.add(tablenum(PurchLineDelete));
//disabledTables.add(tablenum(PurchParmLine));
//disabledTables.add(tablenum(RAssetScrap));
//disabledTables.add(tablenum(ReqItemJournalTrans));
//disabledTables.add(tablenum(ReturnActionDefaults));
//disabledTables.add(tablenum(SalesBasketLine));
//disabledTables.add(tablenum(SalesLineDelete));
//disabledTables.add(tablenum(SalesParmLine));
//disabledTables.add(tablenum(smmQuotationLine));
//disabledTables.add(tablenum(SuppItemTable));
//disabledTables.add(tablenum(VendReceiptsListTrans));
//disabledTables.add(tablenum(WMSJournalTable));
//disabledTables.add(tablenum(WMSOrderTrans));
//disabledTables.add(tablenum(WMSOrder));
//disabledTables.add(tablenum(ReqPO));
//disabledTables.add(tablenum(ReqTrans));
//disabledTables.add(tablenum(ReqItemTable));
// Сначала создаем контейнер из таблиц и полей, в которых используется ссылка на DimId
for (tableId = dictionary.tableNext(0);
tableId;
tableId = dictionary.tableNext(tableId))
{
if (disabledTables.in(tableId)) continue;
tableName = tableId2Name(tableId);
tmpTableId = tableName2Id(tableName);
if (!tmpTableId) continue;
dictTable = new DictTable(tableId);
if (dictTable.isTmp()) continue;
for(fieldId = dictTable.fieldNext(0);
fieldId;
fieldId = dictTable.fieldNext(fieldId))
{
dictField = new DictField(tableId,fieldId);
if (!dictField) continue;
for (dicttype = new dicttype(dictField.typeId());
dictType;
dicttype = new dicttype(dicttype.extend()))
if (InventDimType == dicttype.id())
{
ids += [[tableid,fieldid]];
break;
}
}
}
//=====================================================
// смотрим, используются ли где-нибудь inventDim
// Если выше указано, то удаляем
InventDimBlank = InventDim::findOrCreateBlank(false);
select count(recId) from inventDim
where inventDim.inventDimId != inventDimBlank.inventDimId;
progress.setTotal(inventDim.RecId,1);
ttsbegin;
while select forupdate inventDim
where inventDim.inventDimId != inventDimBlank.inventDimId
{
progress.incCount(1,1);
progress.setText(strfmt('%1: %2',inventDim.inventDimId,inventDim.preFix()),1);
progress.update(true);
progress.setTotal(conlen(ids),2);
progress.setCount(1,2);
found = false;
for(i = 1; (i <= conlen(ids)) && !found; ++i)
{
[tableid,fieldid] = conpeek(ids,i);
progress.setText(tableId2Name(tableId),2);
progress.update(true);
if( SysQuery::countTotal(new QueryRun(CreateQuery(tableId,FieldId,InventDim.inventDimId))) )
{
found = true;
break;
}
progress.setCount(i,2);
}
if( !found )
{
info(strfmt('%1: %2',inventDim.inventDimId,inventDim.preFix()));
InventDim.delete(forceDelete);
}
}
ttscommit;
}
Добавлено 10.04.2011:
job в Аксапте по-умолчанию выполняется на клиенте. Для данной задачи это очень плохо.
Чтобы запустить job на сервере, создайте menuItem, в свойствах укажите данный job и поставьте свойство RunOn = server