AXForum  
Go Back   AXForum > Microsoft Dynamics AX > Axapta FAQ > FAQ: Программирование
All
Forgotten Your Password?
Register Forum Rules FAQ Members List Today's Posts Search

 
 
Thread Tools Search this Thread Display Modes
Prev Previous Post   Next Post Next
Old 07.08.2005, 20:07   #1  
mazzy is offline
mazzy
Участник
mazzy's Avatar
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Join Date: 29.11.2001
Location: Москва
Blog Entries: 10
inventDim хранит комбинации складских аналитик.
По-умолчанию, аксапта никогда не удаляет значения из inventDim.
Вы не можете удалить строчки при помощи Обозревателя таблиц или при помощи формы InventDim.

Однако, при попытках настройки или при массовых вмешательствах программистов inventDim может хранить множество значений, которые никогда не используются.

Приведенный ниже job анализирует InventDim и информирует вас о значениях, которые не используются. Если вы установите forceDelet = true, то job будет инорфмировать и удалять.

PHP Code:
// Выполняет поиск неиспользуемых 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 tidfieldId fidInventDimId dimId)
    {
        
Query                   q;
        
QueryBuildDataSource    qbds;

        
= 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(recIdfrom 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(
1; (<= 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
Attached Files
File Type: xpo mazClearInventDim.xpo (9.3 KB, 888 views)
__________________
полезное на axForum, github, vk, coub.
This post has been rated by: Ace of Database (2), Sergey Petrov (1).
Tags
inventdim

 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Forum Jump

Рейтинг@Mail.ru
All times are GMT +3. The time now is 19:46.
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Contacts E-mail, Advertising.