08.05.2007, 19:56 | #1 |
Участник
|
Скорее всего блокировка таблиц.
Привет !
Задача: 1) Создаем в purchFormLetter_PackingSlip новый метод с таким кодом: static void method1( PurchLine _purchLine) { InventTrans inventTrans; Voucher voucher; ; while select inventTrans where inventTrans.InventTransId == _purchLine.InventTransId && ( inventTrans.StatusReceipt == StatusReceipt::Registered || inventTrans.Voucher == voucher ) { info("1"); } } 2) Вствляем вызов этого метода в purchFormLetter_PackingSlip.updateNow() на 35 линию: PurchFormLetter_PackingSlip::method1( PurchLine ); 3) Создаем purchesOrder ( AccountsPayable -> Purches order ). В нем создаем две линии с товаром DPI-02 в количесвте 2 и 3 штук. (Товар можно и OL-2500-T, главное чтобы был SerialNumber в InventoryDimension) 4) Резервируем (на форме Inventory->Reservation) Результат: Выводится только 3 раза инфо. Вопрос: Почему выводится 3 раза, если должно выводится 5 раз? Предположение: Возможно таблица блокируется при выполении селекта и селект не проходит. Такая вот проблема, может кто-то что-то посоветует, может линки есть почитать. Самое интересное (непонятное) : Если закоментировать в селекте строку с inventTrans.Voucher == voucher, то все будет работать хорошо! Если кто дочитал , объясните в чем проблема! |
|
|
За это сообщение автора поблагодарили: AndyD (5). |
10.05.2007, 10:26 | #2 |
Участник
|
Жаль, что никому не интересно.
Потомучто это ошибка Аксапты, хотелось бы услышать мнение людей о причинах. ЗЫ: использовалась AX40 |
|
10.05.2007, 11:06 | #3 |
Программатор
|
переменная Voucher у Вас где инициализируется?? Она же всегда тут пустая....Зачем она? Может в этом соль
|
|
10.05.2007, 11:26 | #4 |
Участник
|
может быть у вас не || а && - иначе это условие не должно влиять
|
|
10.05.2007, 11:28 | #5 |
Программатор
|
|
|
10.05.2007, 12:38 | #6 |
Участник
|
Кстати в 3-ке тоже не работает, так что у кого нет 4-ки может попробовать.(Только вставлять нужно в 32 линию)
В том то и дело , что условие стоит по "ИЛИ" и ваучер не должен влиять на выборку (потомучто StatusReceipt всегда Registered). Но это если рассуждать логично. А тут ошибка Аксапты или какие-то неизвестные мне глубины. Повторюсь, ошибок в коде нет. |
|
10.05.2007, 12:43 | #7 |
Участник
|
То SADA: переменная ваучер должна быть пустой (вообще это не важно, потомучто оно идет по ИЛИ)
Я тут уже все умы подключил на работе... не решили Скажу сразу, пробовали куча вариантов (гипотез), кажется просто все .... а работать не хочет |
|
10.05.2007, 12:43 | #8 |
Участник
|
SQL на сервер правильный уходит?
|
|
10.05.2007, 12:49 | #9 |
Программатор
|
А что за задачка то? Что сделать нужно? Может как то по другому можно решить.
|
|
10.05.2007, 14:10 | #10 |
Участник
|
To belugin: SQL-запрос не формируется. Не знаю почему. Т.е. в дебагере доходит до селекта. Смотрю трейс - SQL-запроса нет.
(Прога отлавливает запросы к конкретной таблице, поэтому ошибки нет. ) Получается так - для первой линии(Заказ-а\PurchesOrder-а) селект выполняется, для второй нет. To SADA: самый простой способ решения это сделать два цикла и все будет работать. Еще раз повторюсь если закоментировать inventTrans.Voucher == voucher , то все работает. Мистика |
|
10.05.2007, 16:17 | #11 |
Участник
|
Что-то у нее (Ax) с кэшем крышу сносит.
Если перед селектом поставить inventTrans.DisableCache(True), то все будет выполняться на ура. Причем, на таблице кэширование выключено и WasCache() возвращает CachedHow::NotCached
__________________
Axapta v.3.0 sp5 kr2 |
|
10.05.2007, 16:39 | #12 |
Участник
|
классно, действительно помогло.
Только это к сожалению не помогло в проэкте - есть селекты, которым не помогает ни: 1) flush inventTrans; 2) inventTrans.DisableCache(true) 3) ttsbegin select ttscommit - на всякий случай 4) inex.... index hint Вобщем будте осторожны с таблице inventTrans! Если еще есть гипотезы прошу.... интересно найти правду ... если нужно могу подумать и выложит код которому не помогает inventTrans.DisableCache(true) |
|
10.05.2007, 16:47 | #13 |
Участник
|
Выкладывайте
__________________
Axapta v.3.0 sp5 kr2 |
|
10.05.2007, 17:30 | #14 |
Участник
|
А вообще-то, никакой загадки нет.
Если посмотреть дальше по коду, то увидим вызов \Data Dictionary\Tables\InventTrans\Methods\viewCacheInventTransId в котором выборка по inventTransId засовывается в кэш (return new RecordViewCache(inventTrans); ). Так что, второй запрос просто делает выборку не в таблице, а в кэше (почему это происходит с включенным в запрос Voucher могу только гадать). Для обхода такого негативного влияния кэширования просто вставьте такой код X++: while (purchParmLine) { inventMovement = null; PS Или вызывайте код по работе с InventTrans после X++: inventMovement = InventMovement::construct(purchLine);
__________________
Axapta v.3.0 sp5 kr2 Последний раз редактировалось AndyD; 10.05.2007 в 17:33. |
|
|
За это сообщение автора поблагодарили: belugin (6), kashperuk (3). |
10.05.2007, 17:36 | #15 |
Участник
|
Погорячился !
Срабатывает везде. Дейсвтительно, получается значения берутся из кеша. Этим и объясняется отсутствие запроса к базе данных в профайле. Спасибо еще раз! Вывод: использовать совет AndyD - inventTrans.disableCache(true), если возникнут такие проблемы. Причины возниконвения: фичя аксапты (или ) |
|
10.05.2007, 18:05 | #16 |
Участник
|
Спасибо огромное !
ЗЫ: Когда писал последний пост, не знал, что ответ уже дан. |
|