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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 21.08.2009, 17:17   #1  
JeS is offline
JeS
Участник
 
61 / 22 (1) +++
Регистрация: 30.10.2007
Адрес: СПб
Ну тогда, позвольте я еще про одну ошибку изложу. Скажу сразу, что толком не помню как ее воспроизвести (давненько это было). Кроется она в классе IntercompanyTransferInventDim метод transfer:
X++:
...
while (qr.next())
{
     fromInventTrans = qr.get(tablenum(InventTrans));
     fromInventDim   = qr.get(tablenum(InventDim));
     ...
     fromQty = -fromInventTrans.Qty;
     if (inventDimParm.InventLocationIdFlag && fromInventDim.InventLocationId)
     {
        convInventLocation = new TradeInterCompanyConv();
        salesInventLocationId = fromInventDim.InventLocationId;
        convInventLocation.axInventLocationId(fromValueMap, fromInventDim.InventLocationId);
     }
     ...
     changecompany(_toDataAreaId)
     {
          toInventTrans = null;
          
          select forceplaceholders sum(Qty) from toInventTrans
                           where toInventTrans.InventTransId == _toInventTransId
                           &&   (toInventTrans.StatusReceipt <= StatusReceipt::Registered
                              || toInventTrans.InterCompanyInventDimTransferred == true)
                           &&    toInventTrans.StatusIssue   == StatusIssue::None
         #inventDimJoin(toInventTrans.InventDimId,toInventDim,fromInventDim,inventDimParm);

         fromQty -= toInventTrans.Qty;
        ....
Обратите внимание на третий параметр в макросе #inventDimJoin, и что этот запрос исполняется уже в другой компании. В случае, если стоит настройка, при которой происходит синхронизация складов между компаниями через внешние коды, то последний запрос будет всегда возвращать ноль. То есть лечить надо примерно так: сначала сконвертировать значение fromInventDim.InventLocationId, и только потом использовать его в запросе.

P.S.: надеюсь понятно пояснил, как-то сумбурно получилось, млин
Старый 21.08.2009, 17:20   #2  
JeS is offline
JeS
Участник
 
61 / 22 (1) +++
Регистрация: 30.10.2007
Адрес: СПб
Забыл добавить: DAX 4.0 SP2
Старый 21.08.2009, 20:53   #3  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Ошибка проявляется в именно так, как описал JeS.
Ой, насчет:
Цитата:
Кроется она в классе IntercompanyTransferInventDim метод transfer
К сожалению это не одна ошибка в этом методе (даже если отбросить тот факт, что про ГТД в этом методе ничего нет).
Он неправильно отрабатывает в случаях, когда были кредит-ноты по строке, лечилось добавлением в выборки (те, которые зависят от того, какие аналитики включены) условий (то, что выделено комментариями):
Код:
select forceplaceholders sum(Qty) from fromInventTrans
     where fromInventTrans.InventTransId == _fromInventTransId
          &&    fromInventTrans.StatusIssue   <= _statusIssue
          &&    fromInventTrans.StatusReceipt == StatusReceipt::None
// ААК: МФД40_09_01_0013_001 11.07.2009 [Сторнирование и копирование документов] -->
          &&    fromInventTrans.InvoiceReturned        == NoYes::No
          &&    fromInventTrans.PackingSlipReturned    == NoYes::No
// ААК: МФД40_09_01_0013_001 11.07.2009 [Сторнирование и копирование документов] <--
          join InventLocationId, InventBatchId, InventSerialId, InventGtdId_RU  from fromInventDim
               group by InventLocationId, InventBatchId, InventSerialId, InventGtdId_RU
               where fromInventDim.InventDimId == fromInventTrans.InventDimId;
Одна трудно уловимая ошибка связана со вторым проходом метода, то есть тогда, когда вызван с параметром _registerReceipt равном true. При определении того, какие проводки связанной закупки уже отработаны, метод ориентируется на поле InterCompanyInventDimTransferred. В отработанных проводках он проставляет в это поле true и больше к ним не обращается. Но, когда вызывается регистрация InventTransWMS_Register, то естественно, процедура регистрации ничего не знает про это поле и регистрирует любую запись в InventTrans (естественно, с учетом аналитик), если их по лоту несколько. В результате получаем ситуацию, что признак обработки поставили в одной записи, а зарегистрированы другие. Соответственно на следующем проходе выборка:
X++:
select forupdate toInventTrans
     index hint TransIdIdx
     where toInventTrans.InventTransId                    == _toInventTransId
          &&    toInventTrans.StatusReceipt                    == StatusReceipt::Ordered
          &&    toInventTrans.StatusIssue                      == StatusIssue::None
          &&    toInventTrans.InterCompanyInventDimTransferred == false;
может ничего не найти.
Для воспроизведения этой ошибки нужно чтобы проводки по лоту были расщеплены как со стороны заказа на продажу, так и со стороны заказа на покупку. Причем, иногда везет и комплектуются те записи, по которым установили флаг, но везение не всегда случается. Эту проблему решили, но грубо (стояли отгрузки, поэтому было не до изящности):
вместо
X++:
inventTransUpd.InterCompanyInventDimTransferred = true;
поставили:
X++:
//lex 24.04.2009 при регистрации могла выбраться еще необработанная проводка и на пересечении...-->
if (!_registerReceipt)
{
      inventTransUpd.InterCompanyInventDimTransferred = true;
}
//lex 24.04.2009 при регистрации могла выбраться еще необработанная проводка и на пересечении...<--
А саму установку флага делаем после регистрации:
X++:
//lex 24.04.2009 при регистрации могла выбраться еще необработанная проводка и на пересечении...-->
update_recordset refInventTrans
     setting InterCompanyInventDimTransferred = true
     where refInventTrans.InventTransId      == inventTransUpd.InventTransId
          && refInventTrans.StatusReceipt == StatusReceipt::Registered
          && !refInventTrans.InterCompanyInventDimTransferred;
//lex 24.04.2009 при регистрации могла выбраться еще необработанная проводка и на пересечении...<--
За это сообщение автора поблагодарили: JeS (1).
Старый 21.08.2009, 21:18   #4  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,164 / 1296 (48) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Еще один недостаток этого метода. Бывает, что в компании, в которой производится продажа конечному клиенту, требуются данные не только номера партии, а и то, что есть в таблице партий (например, дата производства, если существует контроль и предоставление клиенту информации о сроках годности), тоже может требоваться по серийным номерам и, естественно, нужна страна по ГТД. Однако, в методе создаются записи только с номером:
X++:
if (!InventBatch::exist(toInventTrans.ItemId,inventDimUpd.InventBatchId))
{
     inventBatch.clear();
     inventBatch.ItemId          = toInventTrans.ItemId;
     inventBatch.InventBatchId   = inventDimUpd.InventBatchId;
     inventBatch.insert();
}
Пришлось допиливать: в исходной компании запоминать данные из соотвествующих таблиц:
X++:
while (fromInventTrans)
{
     // ААК: МФД40_08_01_0003 19.03.2009 [Планирование сделок] -->
     inventBatchFrom     = null;
     if (fromInventDim.inventBatchId)
     {
          inventBatchFrom     = InventBatch::find(fromInventDim.inventBatchId, itemIdFrom);
     }
     ...
А создание в компании-продавце добавлять:
X++:
if (!InventBatch::exist(toInventTrans.ItemId,inventDimUpd.InventBatchId))
{
     inventBatch.clear();
     inventBatch.ItemId          = toInventTrans.ItemId;
     inventBatch.InventBatchId   = inventDimUpd.InventBatchId;
     // ААК: МФД40_08_01_0003 19.03.2009 [Планирование сделок] -->
     inventBatch.initFromInventBatch_OVK(inventBatchFrom);
     // ААК: МФД40_08_01_0003 19.03.2009 [Планирование сделок] <--
     inventBatch.insert();
}
В общем, вещи достаточно нужные, но почему-то нереализованные. А рука локализаторов вообще не касалась этого механизма. Помимо того, что в описываемом методе пришлось добавлять синхронизацию по ГТД, еще самостоятельно реализовывали настройки синхронизации росийских форматов адресов и использование этих настроек в методах InterCompanyMirror классов SalesTableType, SalesLineType и их же по закупкам, включая классы Ax*
Теги
ax4.0, intercompany, ошибка, интеркомпани

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Отмена разноски отборочной накладной Iskorka DAX: Функционал 7 03.07.2008 18:23
ошибка при обработке накладной по заказу kashperuk DAX: Функционал 9 18.09.2006 10:40
Настройка разноски Накладной в Заказах vesna DAX: Функционал 19 18.11.2005 16:11
разноска счета на оплату после разноски накладной OlegKocherga DAX: Функционал 14 12.03.2004 17:48
Русская локализация Axapta 3 ? SlavaK DAX: Администрирование 59 01.07.2003 22:38

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

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

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