AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 12.09.2008, 11:51   #1  
evv ist offline
evv
Участник
 
18 / 10 (1) +
Registriert seit: 01.08.2003
Ort: Санкт-Петербург
Подмена аналитик при разноске отборочной накладной
Dynamics Ax 4.0 kernel 4.0.2501.116 Application version 4.0.2200.0
Уважаемые коллеги!
Происходит странная вещь - при разноске отборочной накладной иногда (не всегда!) InventDimId из строки отборочной накладной подменяется неким другим, взятым из строки с тем же ItemId из другой отборочной накладной, привязанной к данному производственному заказу. То есть мы имеем в строке prodJournalBOM InvenDimId_1, а в соответствующей ей строке InventTrans - совершенно другой InventDimId_2. Это приводит к путанице серийных номеров и другим неприятным последствиям. В чем может быть причина? Разноска накладной осуществляется стандартными средствами Аксапты, отборочная накладная генерится тоже стандартными средствами аксапты в автоматическом режиме.
X++:
    InventDim                       serialNumber, inventDim, inventDimNew;
    InventTrans                     inventTrans;
    ProdJournalProd                 prepack, journalBOM;
    ProdJournalBom                  content, newPickingListLines;
    ProdJournalTable                prodJournalTable, pickingList;
    ProdJournalCheckPost            journalCheckPost, pickingListPost;
    JournalTableData                journalTableData;
    ProdJournalCreateBOM            prodJournalCreateBOM;
    ;

 journalTableData = JournalTableData::newTable(prodJournalTable);
                journalTableData.initFromJournalName(ProdJournalName::find(ProdJournalName::standardJournalName(ProdJournalType::ReportFinished)));

                ttsbegin;
                prodJournalTable.JournalId         = journalTableData.nextJournalId();
                prodJournalTable.Description       = journalTableData.journalTable().Description;
                prodJournalTable.JournalNameId     = journalTableData.journalTable().JournalNameId;
                prodJournalTable.ProdId            = prepack.ProdId;
                prodJournalTable.Posted            = NoYes::No;
                prodJournalTable.PostedDate        = SystemDateGet();
                prodJournalTable.PostedUserId      = '';
                prodJournalTable.NumOfLines        = 1;
                prodJournalTable.ProdAutoPickList  = NoYes::No;
                prodJournalTable.JournalNameIdPickList = ProdJournalName::find(ProdJournalName::standardJournalName(ProdJournalType::Picklist)).JournalNameId;
                prodJournalTable.insert();

                journalBOM.initFromProdJournalTable(prodJournalTable);
                journalBOM.TransDate               = SystemDateGet();
                journalBOM.InventDimId             = inventTrans.InventDimId;
                journalBOM.QtyGood = -1;
                journalBOM.ProdFinished            = NoYes::No;
                journalBOM.ProdPickListJournalId   = '';
                journalBOM.insert();

                prodJournalCreateBOM = ProdJournalCreateBOM::newProdJournalProd(journalBOM);
                prodJournalCreateBOM.run();
                pickingList = ProdJournalTable::find(prodJournalCreateBOM.usedProdJournalTable().JournalId);

                if (pickingList)
                {
                    journalBOM.ProdPickList           = NoYes::Yes;
                    journalBOM.ProdPickListJournalId  = pickingList.JournalId;
                    journalId                         = pickingList.JournalId;
                    journalBOM.doupdate();

                }
                else
                    throw error("@SYS71699");
                    while  select content
                            where content.JournalId == prepack.ProdPickListJournalId
                            join inventDim
                                where content.InventDimId == inventDim.inventDimId
                                   && inventDim.inventSerialId
                    {
                    select forupdate newPickingListLines
                        where newPickingListLines.JournalId == pickingList.JournalId
                           && newPickingListLines.ItemId    == content.ItemId
                            join inventDimNew
                                where newPickingListLines.InventDimId == inventDimNew.inventDimId
                                   && ! inventDimNew.inventSerialId;

                        if (newPickingListLines)
                        {
                            newPickingListLines.InventDimId = content.InventDimId;
                            newPickingListLines.update();
                        }
                    }

                ttscommit;
ТО есть при попытке вернуть некий компонент изделия на склад создается отборочная накладная с отрицательным количеством и в ее строках проставляется та же аналитика, что и в обычной отборочной накладной, созданной и разнесенной при сборке изделия. Но при разноске этой возвратной накладной иногда в InventTrans попадает совершенно другой серийный номер, чем тот, что указан в возвратной накладной. Подскажите, где может происходить такая подмена?
Alt 12.09.2008, 20:45   #2  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.985 / 3273 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Сразу оговорюсь что у меня Ax3.0 SP5
Поэтому у вас возможны отличия. Но если в 4-ке код несильно поменялся, то

скорее всего работают методы
\Classes\InventUpd_Physical\updatePhysicalReturnedReceipt
или
\Classes\InventUpd_Physical\updatePhysicalReturnedIssue


На примере
\Classes\InventUpd_Physical\updatePhysicalReturnedReceipt
Там вначале ищется расход (физическое или финансовое движение) по аналитике из строки. Если найден, то на основе него делается возврат, подхватывается аналитика и все такое.

X++:
            while select forupdate inventTrans
                Index hint TransIdIdx
                order by inventDimId Desc
                where inventTrans.inventTransId         == movement.transId()       &&
                      inventTrans.statusIssue           == statusIssue              &&
                      inventTrans.statusReceipt         == StatusReceipt::None      &&
                      inventTrans.packingSlipReturned   == 0
                #InventDimJoin(InventTrans.inventDimId,InventDim,inventDimCriteria,inventDimFlags)
            {
                if (inventTrans.InventTransIdReturn)
                    continue;

                addQty = this.updateTransPhysicalReturnedReceipt(_ledgerVoucher, inventTrans, addQty);


Если что-то не получилось. (Скорее всего это и есть ваш случай) В силу каких то причин не нашлась проводка. (Например, проставлен Номер возвращенного лота inventTrans.InventTransIdReturn - т.е. этот лот кто то уже использовал) то тогда она продолжает поиск без учета аналитик, работает такой код :
X++:
        while select forupdate inventTrans
            Index hint TransIdIdx
            order by inventDimId desc
            where inventTrans.inventTransId         == movement.transId()       &&
                  inventTrans.statusIssue           == statusIssue              &&
                  inventTrans.statusReceipt         == StatusReceipt::None      &&
                  inventTrans.packingSlipReturned   == 0
        {
            if (inventTrans.InventTransIdReturn)
                continue;

            addQty = this.updateTransPhysicalReturnedReceipt(_ledgerVoucher, inventTrans, addQty);
            if (!addQty)
                break;
и тут может произойти "перескок" аналитик.

Ставьте точки останова и смотрите что реально там у вас происходит.

Geändert von Logger (12.09.2008 um 21:09 Uhr)
This post has been rated by: evv (1).
Alt 15.09.2008, 23:22   #3  
evv ist offline
evv
Участник
 
18 / 10 (1) +
Registriert seit: 01.08.2003
Ort: Санкт-Петербург
Zitat:
Zitat von Logger Beitrag anzeigen
Сразу оговорюсь что у меня Ax3.0 SP5
Поэтому у вас возможны отличия. Но если в 4-ке код несильно поменялся, то

скорее всего работают методы
\Classes\InventUpd_Physical\updatePhysicalReturnedReceipt
или
\Classes\InventUpd_Physical\updatePhysicalReturnedIssue

тут может произойти "перескок" аналитик.
Спасибо за дельный совет, в четверке действительно все несильно поменялось. Я самостоятельно вышел на эти методы по точкам останова, как Вы и предположили. А поняв эту логику, я понял и то, что информация о строке отборочной накладной, вернее, об использованной в ней аналитике, формируется методом самой таблицы InventJournalBOM. там есть такой метод
X++:
InventMovement inventMovementChild(Common _buffer)
{
//    if (!this.InventReturnFlag && _buffer.TableId == tablenum(ProdBOM))
    if (_buffer.TableId == tablenum(ProdBOM))
    {
        return new InventMov_ProdLine_JournalBOM(_buffer,this);
    }

    return null;
}
который собственно выдает курсор с текущей аналитикой. В случае, если речь идет о возврате (количество < 0), метод возвращает null, и указанные Вами методы выбирают последнюю отгруженную номенклатуру для возврата. После того, как я закомментировал анализ InventReturnFlag, стала возвращаться на склад именно та номенклатура, которая указана в строках отгрузочной накладной на возврат.
Alt 16.09.2008, 09:53   #4  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.985 / 3273 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Zitat:
Zitat von evv Beitrag anzeigen
После того, как я закомментировал анализ InventReturnFlag, стала возвращаться на склад именно та номенклатура, которая указана в строках отгрузочной накладной на возврат.
Вообще-то я бы не комментировал это место безусловно для всех случаев. Оно дергается из кучи мест. Мне кажется лучше сделать какой-нить управляющий параметр, который меняет поведение только для этого конкретного случая.
Alt 16.09.2008, 22:49   #5  
evv ist offline
evv
Участник
 
18 / 10 (1) +
Registriert seit: 01.08.2003
Ort: Санкт-Петербург
Zitat:
Zitat von Logger Beitrag anzeigen
Вообще-то я бы не комментировал это место безусловно для всех случаев. Оно дергается из кучи мест. Мне кажется лучше сделать какой-нить управляющий параметр, который меняет поведение только для этого конкретного случая.
Насколько я понимаю, этот метод вызывается только для отборочных накладных в модуле "Производство", а заказчик предпочитает точно указывать аналитику (в частности, серийный номер) при возврате на склад, поэтому в данной ситуации это не должно привести к криминальным последствиям. Но можно и параметр сделать, если кастомер не будет возражать...
Alt 16.09.2008, 22:56   #6  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.985 / 3273 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
X++:
\Classes\InventUpd_Physical\updatePhysicalReturnedReceipt
или
X++:
\Classes\InventUpd_Physical\updatePhysicalReturnedIssue
Эти методы вызываются везде где идет возврат.

Например, при обработке накладной по заказу или закупке через немедленное получение на отрицательное количество. Т.е. когда оформили накладную, а потом возвращаем через немедленное получение.

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

Geändert von Logger (16.09.2008 um 22:58 Uhr)
Alt 17.09.2008, 09:50   #7  
Vals ist offline
Vals
Аманд
Benutzerbild von Vals
Компания АМАНД
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2009
 
1.766 / 507 (20) +++++++
Registriert seit: 27.02.2002
Ort: Pass partout, Москва
Zitat:
Но при разноске этой возвратной накладной иногда в InventTrans попадает совершенно другой серийный номер, чем тот, что указан в возвратной накладной. Подскажите, где может происходить такая подмена?
Думал я тут над этим вопросом: код может быть ни при чём. Такая штука может происходить, когда аналитика, например, вторичная и при определённых комбинациях настроек разных аналитик. Также для исключения таких ситуаций можно рекомендовать включить регистрацию/комплектацию.
Итого - нужно проверить настройки номенклатуры в части складской аналитики, групп складских моделей а также бизнес-процесса.
То есть я думаю, что в вашей ситуации нужно изменить или добавить настройки.
Alt 17.09.2008, 10:41   #8  
Logger ist offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3.985 / 3273 (117) ++++++++++
Registriert seit: 12.10.2004
Ort: Москва
Blog-Einträge: 2
Регистрация/комплектация не помогает в данном случае.
Если вы посмотрите тот код который приводился - то увидите что система вообще не учитывает проводки в этом статусе. Она ищет проводки со StatusIssue::Sold или StatusIssue:: Deducted и на основе их создает новые проводки с другим знаком. Т.е. в отличие от остальных режимов обработки, система не меняет статусы уже существующих проводок, а создает их с нуля.

Geändert von Logger (17.09.2008 um 10:57 Uhr)
Alt 01.12.2010, 13:38   #9  
b_nosoff ist offline
b_nosoff
Читатель
Benutzerbild von b_nosoff
MCP
MCBMSS
 
197 / 143 (5) +++++
Registriert seit: 01.12.2004
Ort: Msk
Blog-Einträge: 13
Приподниму старую тему... На всякий случай, уточню - при наличии флага InventReturnFlag, movement конструируется не на основе ProdJournalBOM, а на основе ProdBOM, в котором бывает не указывается ни партия ни номер, ну и соответственно, при выборке проводок система не глядит на эти аналитики. Так вот, интересный факт - в пятерке проверку флага на sys слое выключили, но потом обратно включили на gls. Кто знает, к чему это?
__________________
Axapta non erubescit
This post has been rated by: EVGL (5).
Alt 01.12.2010, 13:52   #10  
EVGL ist offline
EVGL
Banned
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
4.445 / 3001 (0) ++++++++++
Registriert seit: 09.07.2002
Ort: Parndorf, AT
Zitat:
Zitat von b_nosoff Beitrag anzeigen
Так вот, интересный факт - в пятерке проверку флага на sys слое выключили, но потом обратно включили на gls. Кто знает, к чему это?
Спасибо за информацию! Это - определенно не к добру. Не верим русским и убираем проверку флага обратно, иначе будет невозможно отсторнировать, скажем, определенную палету или серийный номер!
Stichworte
ax3.0, ax4.0

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Бухгалтерские проводки по отборочной накладной PMS DAX: Функционал 12 24.04.2012 13:45
Проблемы при разноске отборочной накладной Ek@terin@ DAX: Функционал 7 11.12.2008 16:06
Повисание при разноски отборочной накладной Poleax DAX: Функционал 8 14.12.2007 12:46
Отчет по отборочной накладной Uma Turman DAX: Функционал 0 01.08.2006 12:57
Должностные лица в отборочной накладной Zveriok DAX: Функционал 4 27.01.2005 15:28

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 09:08 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.