13.03.2008, 11:01 | #1 |
Участник
|
Проблема с поиском в InventTrans после changeCompany (DAX4)
Так получилось, что заказ на покупку и связанный заказ на продажу, созданный функционалом InterCompany в строке имеет одинаковый InventTransId.
В результате код в методе transfer класса InterCompanyTransferInventDim находит строку InventTrans из компании, в которой вызывается разноска заказа на продажу, а не в компании, содержащей закупку. Сам код (стандартный, мое только добавление с попыткой сбросить переменную): X++: changecompany(_toDataAreaId) { setprefix(strfmt("@SYS93821",TradeInterCompany::curCompanyName())); // Попробуем сбросить переменную --> toInventTrans = null; // Попробуем сбросить переменную <-- toInventTrans = InventTrans::findTransId(_toInventTransId); toEndpoint = AifEndpoint::findInterCompany(fromValueMap.DataAreaId); if (toInventTrans.TransType == InventTransType::Sales) toValueMap = AifEndpointActionValueMap::find(toEndpoint.EndpointId, defaultSalesOrderAction); else toValueMap = AifEndpointActionValueMap::find(toEndpoint.EndpointId, defaultPurchaseRequisitionAction); toInventTrans = InventTrans::findTransId(_toInventTransId); Причем, для toValueMap находит нужную строку, хотя значение EndpointId есть и в исходной компании. Сама смена точно происходит (TradeInterCompany::curCompanyName() возвращает нужное значение). Если в 3.0 были такие проблемы при работе прогресс-бара, то в чем проблема в моем случае? Может кто решал? |
|
13.03.2008, 11:12 | #2 |
Злыдни
|
Попробуйте сбросить табличную переменную до смены компании - так, во всяком случае, советуют делать в design pattern
|
|
13.03.2008, 11:35 | #3 |
Участник
|
В данном случае не имеет значение инициализирована табличная переменная toInventTrans в какой-либо компании или нет.
Смотрите в какой компании находитесь внути метода findTransId()
__________________
Axapta v.3.0 sp5 kr2 |
|
13.03.2008, 12:22 | #4 |
Участник
|
Цитата:
Что интересно, профайлер MS SQL показывает, что не создается новый курсор, а используется созданный на предыдущем поиске в текущей компании, а в нем компания как раз TS1. Может какие проблемы с настройками конкурентной модели? Включен режим оптимистичной конкуренции для таблиц. |
|
13.03.2008, 12:28 | #5 |
Участник
|
И еще что характерно: проблема проявляется если _fromInventTransId и _toInventTransId имеют одинаковые значения. Если они разные, то все отрабатывает как положено (включая то, что в MS SQL создаётся отдельный курсор).
|
|
13.03.2008, 12:36 | #6 |
Участник
|
А у вас с кэшем на InventTrans никто не игрался?
Попробуйте его сбросить: toInventTrans.disableCache(true)
__________________
Axapta v.3.0 sp5 kr2 |
|
13.03.2008, 12:38 | #7 |
Злыдни
|
А если ради эксперимента попробовать написать
X++: toInventTrans.disableCache(true); |
|
13.03.2008, 13:10 | #8 |
Участник
|
Никто не успел бы поиграться. DAX4 недавно поставлена и никаких ползновений по изменению приложения пока не было. Сброс кэша не помог (попробовал и в InventTrans::findTransId и прямо в методе, заменяя findTransId на select)
Хорошо, что обнаружил в процессе придумывания схемы учета при переходе к четверке. Если не решится проблема, буду знать, что настраивать номерные серии для лотов нужно будет в разных компаниях с разными префиксами. |
|
13.03.2008, 13:22 | #9 |
Злыдни
|
А если этот кусок в джобик запихать - то что найдет?
|
|
13.03.2008, 13:35 | #10 |
Участник
|
Фантастика!
X++: static void testChangeCompany(Args _args) { InventTrans inventTransTS1, inventTransTS2; ; changeCompany('ts1') { inventTransTS1 = InventTrans::findTransId('14265_059'); } changeCompany('ts2') { setprefix(strfmt("@SYS93821",TradeInterCompany::curCompanyName())); inventTransTS2 = InventTrans::findTransId('14265_059'); } } |
|
13.03.2008, 13:59 | #11 |
Участник
|
Цитата:
А что в этом случае выдает метод InventTrans.wasCached() ? Если он скажет что запись взята из кеша, то по идее вообще никакого запроса не должно уходить на SQL server. |
|
13.03.2008, 14:02 | #12 |
Участник
|
Цитата:
Находит то, что должен. А в коде класса InterCompanyTransferInventDim продолжает надо мной издеваться.
Есть подозрение что там RecordViewCache влез. В любом случае DisableCache(true); спасет смотите еще Глюки RecordViewCache |
|
Теги |
ax3.0, ax4.0, cache, кэширование |
|
|