AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > Axapta FAQ > FAQ: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.08.2005, 20:07   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
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 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
Вложения
Тип файла: xpo mazClearInventDim.xpo (9.3 Кб, 682 просмотров)
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Ace of Database (2), Sergey Petrov (1).
Старый 01.04.2011, 05:32   #2  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
В ax2009 появился класс InventUnusedDimCleanUp.
Используйте его.

См. обсуждение http://axforum.info/forums/showthread.php?t=37308
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: Cathome (1).
Теги
inventdim

 

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 02:17.