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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 26.04.2011, 10:56   #1  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Цитата:
Сообщение от petr Посмотреть сообщение
Кто-нибудь пробовал использовать класс InventUnusedDimCleanUp в четверке? Я имею ввиду экспортировать из 2009, импортировать в четверку и запустить?
Работает?
Были ли замечены какие-либо подводные камни?
Работает.
При переносе из 2009 в 4-ку в методе isCandidateInventDimIdTable() необходимо закомментировать строчку с упоминанием конфигурационного ключа SysDeletedObjects41, т.к. в 4-ке его нет, и тут же добавили строчку с InventSum для его исключения из проверки:
X++:
protected boolean isCandidateInventDimIdTable(SysDictTable _sysDictTable)
{
    configurationKeyId  configurationKeyId = _sysDictTable.configurationKeyId();
    tableId             tableId = _sysDictTable.id();
    ;

    // The table should only be evaluated if it has not been marked for deletion, it is
    // not a temporary table and is not InventDim nor InventDimCleanUp
    if (configurationKeyId      == configurationkeynum(SysDeletedObjects40) ||
        //configurationKeyId      == configurationkeynum(SysDeletedObjects41) ||
        _sysDictTable.isTmp()    == true                                     ||
        tableId                 == tablenum(InventDim)                      ||
        tableId                 == tablenum(InventSum)                      ||
        tableId                 == tablenum(InventDimCleanUp))
        return false;
    else
        return true;
}
О результатах работы выше писал Zabr.
Во вложении класс InventUnusedDimCleanUp для 4-ки.
Вложения
Тип файла: xpo Class_InventUnusedDimCleanUp.xpo (26.8 Кб, 325 просмотров)
За это сообщение автора поблагодарили: Logger (1), petr (8), Kabardian (4).
Старый 16.12.2011, 13:56   #2  
wolfstein is offline
wolfstein
Axapta Retail User
Axapta Retail User
 
51 / 91 (4) ++++
Регистрация: 05.07.2006
Возникла необходимость очистить неиспользуемые InventDim на AX3.0, поэтому по аналогии с AX2009 сделал класс InventUnusedDimCleanUp для трешки.
Может быть кому-то будет полезен.
AX3.0SP3
Проект во вложении.
Вложения
Тип файла: xpo InventUnusedDimCleanUp_AX30SP3.xpo (29.1 Кб, 288 просмотров)
За это сообщение автора поблагодарили: Zabr (1), Pustik (2), lev (5), Bega (3), JBOS (1).
Старый 22.12.2011, 15:22   #3  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ну, и для комплекта, код для Axapta 2.5 SP3.

Правда, просто копировать было не интересно, поэтому сделал несколько модификаций
  1. Единый многоуровневый ProgressBar
  2. Удаление выполняется прямыми командами SQL
  3. По окончании работы процедуры выводится Infolog с результатами работы (если было, что удалять)
  4. Добавлена краткая справка, вызываемая по F1 при открытой форме
  5. Добавлена опциональная возможность удаление во всех компаниях
  6. Добавлена опциональная возможность удалить складские остатки (InventSum) по окончании удаления складских аналитик
Вложения
Тип файла: xpo RTG_InventDimCleanUp.xpo (78.8 Кб, 267 просмотров)
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: Pustik (2).
Старый 22.12.2011, 17:24   #4  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,201 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
[*]Удаление выполняется прямыми командами SQL[/LIST]
Транзакционная целостность данных при этом соблюдается, если прервать процедуру?
Старый 22.12.2011, 17:31   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Zabr Посмотреть сообщение
Транзакционная целостность данных при этом соблюдается, если прервать процедуру?
Соответствующие процедуры сделаны по образу и подобию аналогичной процедуры из Axapta 2009

X++:
    connection.ttsbegin();

    statement.executeUpdate(sqlStr);

    connection.ttscommit();
Так что, да. Соблюдается.

Хотя, по большому счету, нарушить целостность выполнения одной единственной команды Delete - это надо постараться И еще, о какой целостности идет речь, если удаляются записи, на которые нет ссылок ни в одной другой таблице?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 22.12.2011, 17:51   #6  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Даешь всем желающим по модифе удаления ненужных InventDim!!!!!! Ура
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 22.12.2011, 18:28   #7  
Vadik is offline
Vadik
Модератор
Аватар для Vadik
Лучший по профессии 2017
Лучший по профессии 2015
 
3,631 / 1849 (69) ++++++++
Регистрация: 18.11.2002
Адрес: гражданин Москвы
Цитата:
Сообщение от Pustik Посмотреть сообщение
Даешь всем желающим по модифе удаления ненужных InventDim!!!!!! Ура
Может кто-то поделиться статистикой - какие аналитики используются и как, количество записей в InventDim до и после, общие впечатления (по возможности - объективные) ? Просто не очень понятно, что там такого можно понавычистить и что от этого улучшится
P.S. что можно поломать, случайно вычистив не то что надо, я в общих чертах представляю
__________________
-ТСЯ или -ТЬСЯ ?
Старый 22.12.2011, 19:35   #8  
Pustik is offline
Pustik
Участник
 
807 / 372 (14) ++++++
Регистрация: 04.06.2004
Цитата:
Сообщение от Vadik Посмотреть сообщение
Может кто-то поделиться статистикой - какие аналитики используются и как, количество записей в InventDim до и после, общие впечатления (по возможности - объективные) ? Просто не очень понятно, что там такого можно понавычистить и что от этого улучшится
P.S. что можно поломать, случайно вычистив не то что надо, я в общих чертах представляю
Я, так понимаю, это камень в мой огород.
Ну, во-первых, я просто шутил, смайлики об этом очень открыто говорят .
Если серьезно, то чистка лишних InventDim имеет имеет смысл для экономии места.
В InventDim, в будущем не нужные записи появляются если :
1) В черновике (Закупка, Заказ, Журнал, Заявки на покупку и т.д.) пользователь изначально задал не правильную аналитику. А потом ответственное лицо аналитику поменяло как надо и разнесло.
2) Проводка, связанная с Производственным заказом без партии, по мере оприходования разобьется на несколько по партиям. И если заказ одноразовый, то комбинация без партии уже не нужна.
3) В Спецификациях вообще привязок к проводкам нет. Т.е. забил пользователь сначала одно, потом поменял на другое, потом на третье. А это уже 3 комбинации.(и это не только в спецификациях). Очень похоже на первый случай, но все таки там документы готовые к разноски, а это просто справочник.
Я думаю случаев еще много. Пользователи, естественно не знают, про InventDim, и на комбинации аналитик им наплевать.Могут шуровать как хотят. В итоге добавят еще пару не нужных комбинаций.
Статистику сказать не могу. Мы этого не делали. Но думаю, что при больших разнообразиях и вариантов комбинаций аналитик, согласно настройкам системы, лишние аналитики будут периодически появляться. почему бы их и не почистить.
__________________
-Ты в гномиков веришь?
-Нет.
-А они в тебя верят, смотри, не подведи их.
Старый 23.12.2011, 13:10   #9  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,201 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от Vadik Посмотреть сообщение
Может кто-то поделиться статистикой - какие аналитики используются и как, количество записей в InventDim до и после, общие впечатления (по возможности - объективные) ? Просто не очень понятно, что там такого можно понавычистить и что от этого улучшится
P.S. что можно поломать, случайно вычистив не то что надо, я в общих чертах представляю
Удалилось >20%.
Строки заказа на покупку создаются, потом удаляются - а записи в InventDim остаются.
Текущий размер таблицы InventDim >11 млн.записей.

Последний раз редактировалось Zabr; 23.12.2011 в 13:12.
Старый 22.12.2011, 19:38   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Удалилось примерно 10% от общего количества записей. Как в InventDim, так и в InventSum. От общего объема базы данных это составило примерно 0,1% (по объему InventSum / InventDim = 3 / 1) Строго говоря, "копейки", которые вряд ли вообще заметно повлияют на что-либо. Так что, удаление скорее "для порядка", чем из практической необходимости.

Из стандартных аналитик у нас используется только Склад и ГТД. Плюс добавлены еще 2 собственные аналитики.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 25.07.2012, 11:57   #11  
Ace of Database is offline
Ace of Database
Участник
Аватар для Ace of Database
 
870 / 637 (23) +++++++
Регистрация: 14.10.2004
Тоже возникла заинтересованность в удалении лишних InventDim.
Написал SQL - запрос, который может быть актуален для Аксапты, в которой ведутся продажи, закупки, складские журналы, журналы прибытия и отгрузки.
По моей базе из 6 млн аналитик неиспользуемых получается 50% - 3 млн.
Аналитика может присутствовать в строке заказа, но осутствовать в складских проводках и в InventSum, так как в результате работы резервирования аналитика в проводках меняется, а строках заказа нет.
Данный запрос я на боевой базе пока не запускал. Еще бы туда по идее надо добавить транспортировки палет и прочие журналы, в которых используется складская аналитика. И еще бы можно было добавить проверку на аналитику "Куда" в строках складского журнала, но я пока решил не проверять это, так как сохранение строк журналов переноса для нас неактуально
Проверка на использование аналитики в строках документов нужна для того, чтобы строки из аксаптовских форм не исчезли после удаления аналитики.
X++:
delete from INVENTDIM where 
not exists
(select RECID from InventSum where InventSum.DATAAREAID = InventDim.DATAAREAID and
InventSum.INVENTDIMID = InventDim.INVENTDIMID)
and not exists
(select RECID from InventTrans where InventTrans.DATAAREAID = InventDim.DATAAREAID and
InventTrans.INVENTDIMID = InventDim.INVENTDIMID)
and not exists
(select RECID from SalesLine where SalesLine.DATAAREAID = InventDim.DATAAREAID and
SalesLine.INVENTDIMID = InventDim.INVENTDIMID)
and not exists
(select RECID from PurchLine where PurchLine.DATAAREAID = InventDim.DATAAREAID and
PurchLine.INVENTDIMID = InventDim.INVENTDIMID)
and not exists
(select RECID from InventJournalTrans where InventJournalTrans.DATAAREAID = InventDim.DATAAREAID and
InventJournalTrans.INVENTDIMID = InventDim.INVENTDIMID
)
and not exists
(select RECID from WMSOrderTrans where WMSOrderTrans.DATAAREAID = InventDim.DATAAREAID and
WMSOrderTrans.INVENTDIMID = InventDim.INVENTDIMID)
and not exists
(select RECID from WMSJournalTrans where WMSJournalTrans.DATAAREAID = InventDim.DATAAREAID and
WMSJournalTrans.INVENTDIMID = InventDim.INVENTDIMID)

Последний раз редактировалось Ace of Database; 25.07.2012 в 12:01.
Старый 23.12.2011, 13:11   #12  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
А сильно помогли эти 20 % ?
Старый 23.12.2011, 13:18   #13  
Zabr is offline
Zabr
Участник
Axapta Retail User
 
1,201 / 345 (14) ++++++
Регистрация: 26.06.2002
Адрес: Москва
Цитата:
Сообщение от Logger Посмотреть сообщение
А сильно помогли эти 20 % ?
Не знаю. Надо было замерять какие-то запросы до и после, я этого не делал. Но по отдельным складам число InventDim сократилось более чем вдвое, так что думаю это сказалось на производительности всех тех запросов, где джойнится InventDim с условием по конкретному складу.
Старый 23.12.2011, 13:42   #14  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от Zabr Посмотреть сообщение
Не знаю. Надо было замерять какие-то запросы до и после, я этого не делал. Но по отдельным складам число InventDim сократилось более чем вдвое, так что думаю это сказалось на производительности всех тех запросов, где джойнится InventDim с условием по конкретному складу.
Склад в InventDim - это вообще подстава. Не надо было им смешивать высокоселективные аналитики (партия, серийник, ГТД) и низкоселективные.

Денормализацию не пробовали ?
Старый 25.07.2012, 12:57   #15  
Wamr is offline
Wamr
----------------
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
 
1,737 / 858 (32) +++++++
Регистрация: 15.01.2002
Адрес: Москва
Записей в блоге: 7
а слабо джобик в аксе написать, который пробежит по всем табличкам, где есть данные и поля с ссылкой на InventDim и сгенерит по ним такой скрипт?
Старый 25.07.2012, 18:30   #16  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от Wamr Посмотреть сообщение
а слабо джобик в аксе написать, который пробежит по всем табличкам, где есть данные и поля с ссылкой на InventDim и сгенерит по ним такой скрипт?
Так написано уже И даже не джобик а полноценный класс. Мой проект на предыдущей закладке. Там для 2.5 вообще-то, но отличия от исходного скрипта незначительные. В основном по правам доступа.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 25.07.2012, 17:37   #17  
KiselevSA is offline
KiselevSA
Злыдни
Аватар для KiselevSA
Злыдни
Лучший по профессии 2015
 
958 / 333 (13) ++++++
Регистрация: 25.01.2002
Адрес: Москва
Я бы поостерегся удалять таким образом: достаточно в справочнике номенклатур внести одну услугу и InventSum уже не будет работать.
__________________
люди...считают, что если техника не ломается, то ее не нужно ремонтировать. Инженеры считают, что если она не ломается, то нуждается в совершенствовании.
Старый 25.07.2012, 18:27   #18  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ace of Database

Таблицы, хранящие интегральные (суммовые) показатели не могут служить критерием "использования" складской аналитики. В данном случае имею в виду InventSum

Другими словами, наличие записи в таблице складских остатков не может являться "оправданием" факта существования складской аналитики. Должна быть ссылка на складскую аналитику где-то еще.

Как следствие, в приведенном SQL-запросе exists(... from InventSum ...) - лишний. Если складской аналитики нет больше нигде, кроме как в складских остатках, то такую аналитику тоже надо удалить!

Соответственно, следующий логичный шаг - второй запрос, который удаляет записи складских остатков, если они ссылаются на не существующую (возможно, удаленную на первом шаге) складскую аналитику.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 24.01.2018, 13:10   #19  
БАХ43 is offline
БАХ43
Участник
 
92 / 54 (2) ++++
Регистрация: 15.02.2013
Адрес: г.Москва, г. Зеленоград
Тоже недавно понадобилось почистить неиспользуемые InventDim. Использовал класс InventUnusedDimCleanUp. Все прекрасно, за час-два осталось 7 млн записей из 16 млн. НО!!! После этого залез в таблицу и невооруженным глазом заметил несколько явно неиспользуемых аналитик. В методе deleteUsedIdsFromCleanUpTable поставил заплаточку:
X++:
while( listEnumerator.moveNext() )
    {
// ->
        select firstonly inventDimCleanUp
            where        inventDimCleanUp.InventDimId    == "УЗАН000434";

        if (!inventDimCleanUp && tableId)
        {
            warning(strfmt("Аналитика = %1 найдена в таблице %2 (%3) (%4)", inventDimCleanUp.InventDimId, tableid2pname(tableId), tableid2name(tableId), fieldId2name(tableId, fieldId)));
        }
// <-
        tableAndField = listEnumerator.current();
        tableId = conpeek(tableAndField, 1);
        fieldId = conpeek(tableAndField, 2);
по которой определил, что искомая аналитика удаляется при анализе таблицы WMSOrder. В этой таблице такой аналитики не оказалось ни в InventDimId, ни в toInventDimId. Задумался о легитимности метода deleteInventDimCleanUp.
Поставил еще одну заплаточку:
X++:
        tableAndField = listEnumerator.current();
        tableId = conpeek(tableAndField, 1);
        fieldId = conpeek(tableAndField, 2);
// ->        
        dictTable = new DictTable(tableId);
        common = dictTable.makeRecord();

        info(strfmt("%1 (%2) Id = %3", tableid2pname(tableId), tableid2name(tableId), tableId));

        select count(RecId) from inventDimCleanUp
            exists join common
                where inventDimCleanUp.InventDimId == common.(fieldId);
        warning(strfmt("Найдено %1 записей", inventDimCleanUp.RecId));
        
        select count(RecId) from inventDimCleanUp;
        recToDel = inventDimCleanUp.RecId;
// <-
        // Update progress bar
        progress.incCount();
        progress.setText( tableid2pname(tableId) );

        // The InventDim is being used, remove it from the list of unused InventDims
        this.deleteInventDimCleanUp(connection, tableId, fieldId);
        deleted ++;
//->        
        select count(RecId) from inventDimCleanUp;
        recToDel -= inventDimCleanUp.RecId;
        warning(strfmt("Удалено %1 записей", recToDel));
// <-
В итоге получил такой инфолог:
Код:
Складской заказ (WMSOrder) Id = 666
Найдено 37141 записей
Удалено 102098 записей
Складской заказ (WMSOrder) Id = 666
Найдено 23159 записей
Удалено 23161 записей
Проводки заказа запасов (WMSOrderTrans) Id = 716
Найдено 9 записей
Удалено 9 записей
Проводки заказа запасов (WMSOrderTrans) Id = 716
Найдено 856640 записей
Удалено 858638 записей
То есть оказалось, что запрос в X++
X++:
select count(RecId) from inventDimCleanUp
            exists join common
                where inventDimCleanUp.InventDimId == common.(fieldId);
и запрос, формируемый для SQL в методе deleteInventDimCleanUp
Код:
DELETE FROM INVENTDIMCLEANUP WHERE EXISTS (SELECT 'x' FROM WMSORDER T WHERE (INVENTDIMCLEANUP.INVENTDIMID = T.INVENTDIMID))
обрабатывают разное количество записей.
Кто подскажет, в чем может быть дело. Или плюнуть на высокую производительность запроса SQL и удалять записи через delete_from из X++ ???

Последний раз редактировалось БАХ43; 24.01.2018 в 13:15.
Старый 24.01.2018, 14:11   #20  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,657 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Вы DataAreaId учитываете?
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
За это сообщение автора поблагодарили: БАХ43 (1).
Теги
inventdim, inventsum, складская аналитика, удаление

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
axforum blogs: Можно ли снизить стоимость внедрения ERP-системы? Blog bot DAX Blogs 0 11.02.2011 15:11
Производительность InventSum, InventDim AlexeyBP DAX: Администрирование 20 13.05.2007 12:58
«Как без последствий удалять ненужную номенклатуру готовой продукции ?» DaniK DAX: Функционал 3 24.12.2004 10:20
Как без последствий удалять ненужную номенклатуру готовой продукции ? DaniK DAX: Администрирование 1 23.12.2004 10:49
Что и как можно резать? George Nordic DAX: Администрирование 1 11.05.2004 18:44

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:59.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.