Показать сообщение отдельно
Старый 12.09.2008, 11:51   #1  
evv is offline
evv
Участник
 
18 / 10 (1) +
Регистрация: 01.08.2003
Адрес: Санкт-Петербург
Подмена аналитик при разноске отборочной накладной
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 попадает совершенно другой серийный номер, чем тот, что указан в возвратной накладной. Подскажите, где может происходить такая подмена?