05.02.2009, 19:26 | #121 |
MCITP
|
Поехали дальше....
2 на мой взгляд бага на 4-ке сп2 с нашей локализацией (восточная европа), слои GLS & GLP. (На 2009 локализации пока не видел, так что не знаю как там... Может ещё не поздно предупредить ) Таблицы PurchLine & SalesLine. Для начала метод PurchLine.delete() (та же картина, только вид сбоку, наблюдается и в SalesLine.insert() и в SalesLine.update() - но там касается только братьев-поляков ) X++: public void delete(boolean _showInfoDelReserv = true, boolean deletePBA = true) { PurchLineType purchLineType; ; purchLineType = this.type(); purchLineType.delete(_showInfoDelReserv, deletePBA); TaxWorkRegulation::deleteRegulation_W(this); } Теперь перейдём к методу SalesLine.delete(): X++: void delete(Common childBuffer = null, boolean deletePBA = true) { SalesLineType salesLineType; ; ttsbegin; if (this.AssetId_RU && this.SalesStatus != SalesStatus::Invoiced && ! this.creditNoteLine()) { RAssetTable::updateStatus(this.AssetId_RU, RAssetStatus::Open); RAssetTable::updateCustInfo(this.AssetId_RU, '', ''); } salesLineType = this.type(); salesLineType.delete(childBuffer, deletePBA); TaxWorkRegulation::deleteRegulation_W(this); ttscommit; } Видим внутреннюю транзакцию и перехват ошибок типа Deadlock, UpdateConflict и т.п. И что происходит из-за появления "внешней" транзакции на SalesLine.delete()? Правильно, весь эти тщательно пИсаный старшими товарищами код по перехвату ошибок дружно встаёт и уходит сами знаете куда... Нехорошо, как-то... Я всё-таки в подобных случаях предпочитаю вносить все свои доработки в единую транзакцию в класс Sales/PurchSalesLine. И, на мой взгляд, так должны были поступить и "локализаторы"... Или я пропустил какую-то глубокую мысль, которую всё это преследовало?
__________________
Zhirenkov Vitaly |
|
05.02.2009, 22:02 | #122 |
Microsoft Dynamics
|
Уважаемый ZVV, Вы правы лишь отчасти, и то - с точностью до наоборот. Попробуйте в методе PurchLine.delete() заменить
X++: TaxWorkRegulation::deleteRegulation_W(this); X++: ttsbegin; throw error(''); ttscommit; Отсюда Ваш вывод относительно кода в SalesLine.delete(); также неверен, - здесь как раз транзакционные скобки являются лишними, но их присутствие не так уж критично.
__________________
You should use Bing before asking dumb questions. Последний раз редактировалось Jabberwocky; 05.02.2009 в 22:10. |
|
|
За это сообщение автора поблагодарили: ZVV (1). |
05.02.2009, 23:58 | #123 |
MCITP
|
Вы чертовски правы, Jabberwocky. Действительно, всё наоборот. Слона то я (неявного) и не приметил. Спасибо!
Даже если вызовы идут и не из формы, а в коде, то там всё равно практически всегда будет присутствовать явная транзакция извне... Разве что вставку можно без транзакции сделать, и тогда всё-таки SalesLine.insert() пройдёт в двух транзакциях. Но это не сильно типичная ситуация, имхо. Тогда сформулирую обратный вопрос: а зачем в методах Sales/PurchSalesLine.insert/update/delete() организованы эти масштабные try-catch блоки? Ведь получается они никогда не работают, или всё таки работают, но тогда что-то не понимаю когда?
__________________
Zhirenkov Vitaly |
|
06.02.2009, 07:01 | #124 |
Moderator
|
Не уверен что эта тема подходит для данной ссылки. Более того - подозреваю что это известный боян, но все таки:
http://www.youtube.com/watch?v=M-c0YSsF_O0 |
|
10.02.2009, 19:36 | #125 |
Member
|
А зачем так сделано, что в строках закупок на закладке Разное правами доступа табличка с номерами ОС никак не отключается?
__________________
С уважением, glibs® |
|
12.02.2009, 17:35 | #126 |
MCITP
|
Небольшой "бажок" на 4.0сп2 (в 2009 этот функционал регистрации отгрузочных накладных переделали, и там этой таблицы уже нет). Но может кому пригодится...
Таблица InventPickingListJournalLine, метод splitByInventTrans В последнем delete_from явно забыли поле поменять после "копи-пасте" Вместо X++: inventPickingListJournalLine.InventTransChildType == this.InventTransChildType && inventPickingListJournalLine.InventTransChildType == this.InventTransChildType && X++: inventPickingListJournalLine.InventTransChildType == this.InventTransChildType &&
inventPickingListJournalLine.InventTransChildRefId == this.InventTransChildRefId && // ZVV, Bug fix
__________________
Zhirenkov Vitaly |
|
12.02.2009, 17:53 | #127 |
Member
|
Если создать журнал платежей поставщикам, строчку создать и пометить ее на сопоставление с накладной (как вариант можно воспользоваться функционалом предложений по оплатам), а потом удалить заголовок журнала, то в SpecTrans остается привязка инвойса к несуществующей строчке журнала ГК. Такой инвойс уже ни с чем не хочет сопоставляться.
В 5.0 отремонтировано. Так что это просто к сведению для тех, кто пока только мечтает о локализованной 5.0.
__________________
С уважением, glibs® |
|
16.02.2009, 17:53 | #128 |
Member
|
В 4.0 в деловых отношениях в CRM в адресе при смене страны не чистятся регионы, районы, города... В клиентах чистятся. В альтернативных адресах тоже чистятся. IMHO, это стандартное поведение для каскада связанных полей.
Заглянул в 5.0. Там адреса пережили серьезные метаморфозы. Но поля каскадом не чистятся. Даже не знаю чего бы и сказать такого... IMHO, бага.
__________________
С уважением, glibs® |
|
|
За это сообщение автора поблагодарили: kashperuk (3). |
16.02.2009, 18:23 | #129 |
Участник
|
Цитата:
Сообщение от glibs
В 4.0 в деловых отношениях в CRM в адресе при смене страны не чистятся регионы, районы, города... В клиентах чистятся. В альтернативных адресах тоже чистятся. IMHO, это стандартное поведение для каскада связанных полей.
Заглянул в 5.0. Там адреса пережили серьезные метаморфозы. Но поля каскадом не чистятся. Даже не знаю чего бы и сказать такого... IMHO, бага. Я вроде помню, что на 3.0 SP5 работало, но возможности проверить нету |
|
16.02.2009, 19:09 | #130 |
Member
|
В клиентах и в альтернативных адресах работает в 4.0. Я ж написал.
Думаю, что и в 3.0 работает .
__________________
С уважением, glibs® |
|
16.02.2009, 19:35 | #131 |
MCTS
|
|
|
17.02.2009, 11:06 | #132 |
MCITP
|
Цитата:
Сообщение от alex55
Работают в случае Exception::UpdateConflict, как минимум:
TTS и try..catch И отправит дальше! Потому что appl.ttsLevel() <> 0...
__________________
Zhirenkov Vitaly |
|
17.02.2009, 16:05 | #133 |
MCITP
|
Разноска отборочной из отгрузок
dax 2009 sp 1
Создание отборочной из отгрузки... Имеет место 2 следующих (на мой сугубо личный взгляд - слабо предсказуемых) эффекта (или бага, как кому нравится), оба связаны с ситуацией, когда строка заказа на продажу коплектуется несколькими отгрузками. Т.е., например, в строке заказа количество 5, из них 2 и 3 обработаны разными отгрузочными и соответсвенно пошли в строки разных отгрузок. 1. При попытке обработать отборочную по двум данным отгрузкам сразу (выделить 2-е на форме отгрузок) обработается только одна из строк отгрузки. Причина: класс SalesTotals_ParmTrans X++: protected void initRecordSortedListLine() { ; recordSortedListLine = new RecordSortedList(tablenum(SalesParmLine)); recordSortedListLine.sortOrder(fieldnum(SalesParmLine, TableRefId), fieldnum(SalesParmLine, OrigSalesId), fieldnum(SalesParmLine, LineNum), fieldnum(SalesParmLine, SalesLineRecId)); } в следствие чего при заполнении в этот лист списка строчек, последняя (с кол-вом 3) перезатрёт предыдущую (с кол-вом 2). Это в классе TradeTotals, метод calc() X++: recordSortedListLine.ins(orderLine); Возможные варианты - либо в этом же методе проверять наличие подобной строки в recordSortedListLine и, если есть - суммировать кол-ва (правда в этом случае придётся отдельно проработать вопрос оставшегося кол-ва по строке). Пробовал на 2009 реализовывать - работает. Как альтернатива (такое у нас реализовывалось на 3-ке) - переделывать запрос на более ранннем этапе - в SalesFormLetter_PackingSlip.chooseLinesFromWMSShipmentSet(). По сравнению с той же 3-кой тут кой-чего уже переделали, некоторые баги поправили, но как-то не до конца. Тут можно переписать, вместо последнего цикла сделать Query по всем имеющимся отгрузкам и изначально просуммировать все нужные кол-ва в одну строку ещё на форме разноска. Как третий вариант (сам не пробовал, может он и нереализуем) - как-то изменить recordSortedListLine.sortOrder для данного случая. 2. Второй баг более тяжело объяснить... Счас будет много местами бессвязных слов, но кто с этим кодом\функционалом разбирался - надеюсь поймёт. Теперь разносим только одну отгрузу из двух описанных выше. Есть метод SalesFormLetter_PackingSlip.resetProformaUponPhysicalUpdatable(), который определяет будет ли реально производится разноска - он работает на основе полей маршрута из WMSOrderTrans и InventTrans. Т.е. можно разносить, только если ещё остались проводки неразнесённые с таким маршрутом. (иначе будет proforma) Появляются следующие проблемы: а) при реальной разноске отборочной эти маршруты никак не учитываются и разнося отборочную по одной отгрузке мы можем разнести проводки по маршруту другой отгрузки. В итоге чтобы разнести отборочную по второй придётся ещё раз разносить её по первой отгрузке. (извините за каламбур, я предупреждал ) А разнося первую мы как бы разнесли вторую. И вообще когда таких отгрузок много, можно получить много всяких непредсказуемых эффектов с доступностю птички "разноска" при разноске отборочной по различным отгрузкам. б) даже если передположить, что проводки будут разноситься по нужным маршрутам, есть ещё проблема, с количеством. Возвращаемся к примеру с разбитой на 2 отгрузки строкой. 2 и 3. Предположим мы разносим отгрузку с кол-вом 3, уменьшаем там кол-во до 2-х и разносим. Остаётся в одной отгрузке 2, в другой - 1. Теперь пытаемся опять разнести ту же отгрузку. Благодаря методу SalesFormLetter_PackingSlip.createParmLineFromWMSOrderTrans() который проверяет только общее кол-во скомплектованных по строке заказа (без учёта отгрузок и маршрутов), нам опять предложат разнести кол-во 3, и разноска эта пройдёт без проблем, в результате чего разнесётся сразу всё оставшееся кол-во (3). Т.е. разнося одну отгрузку - мы разнесли обе. Не знаю, может так, конечно, и задумывалось, но со стороны выглядит как-то уж очень кривенько... б) решается, вероятно, довольно просто, если SalesFormLetter_PackingSlip.createParmLineFromWMSOrderTrans() проверять не общее кол-во скомплектованных проводок по строке заказа, X++: InventQty qtyPicked = _salesLine.pickedInTotalInventUnit(); с а) - кажется сложнее, тут надо параметр какой-то в разноску добавлять, что-ли. Возможно из-за лишнего геморроя на этот момент и решили забить. Не такой уж и частый случай, типа... PS sorry за многабукаф, короче не получилось...
__________________
Zhirenkov Vitaly |
|
17.02.2009, 17:15 | #134 |
Участник
|
При удалении объекта из проекта дается выбор: Remove from project или Permanently delete.
Если же для удаления выбираешь группу+объект, просто спрашивает: Remove these n application objects? Только что таким образом случайно удалил класс, хотя намеревался просто исключить его из проекта. Думаю, это все-таки баг. AX 4.0 Последний раз редактировалось Hyper; 17.02.2009 в 17:18. |
|
17.02.2009, 17:27 | #135 |
Участник
|
Цитата:
Цитата:
|
|
|
За это сообщение автора поблагодарили: alex55 (1). |
17.02.2009, 17:34 | #136 |
MCITP
|
Цитата:
Сообщение от Hyper
При удалении объекта из проекта дается выбор: Remove from project или Permanently delete.
Если же для удаления выбираешь группу+объект, просто спрашивает: Remove these n application objects? Только что таким образом случайно удалил класс, хотя намеревался просто исключить его из проекта. Думаю, это все-таки баг. AX 4.0
__________________
Zhirenkov Vitaly |
|
17.02.2009, 20:50 | #137 |
Участник
|
Цитата:
Сообщение от Hyper
При удалении объекта из проекта дается выбор: Remove from project или Permanently delete.
Если же для удаления выбираешь группу+объект, просто спрашивает: Remove these n application objects? Только что таким образом случайно удалил класс, хотя намеревался просто исключить его из проекта. Думаю, это все-таки баг. AX 4.0 |
|
18.02.2009, 10:57 | #138 |
MCITP
|
Цитата:
создаём проект, в нём создаём 2 таблицы, table1 & table2, создаём группу, в группу включаем переносим таблицу table2. Выделяем table1+группа, добиваемся сообщения "удалить эти 2 объекта?". соглашаемся: На выходе в АОТ осталось только таблица из группы, table2. Первая таблица удалилась.
__________________
Zhirenkov Vitaly |
|
18.02.2009, 11:29 | #139 |
Участник
|
Цитата:
Сообщение от ZVV
2009sp1
создаём проект, в нём создаём 2 таблицы, table1 & table2, создаём группу, в группу включаем переносим таблицу table2. Выделяем table1+группа, добиваемся сообщения "удалить эти 2 объекта?". соглашаемся: На выходе в АОТ осталось только таблица из группы, table2. Первая таблица удалилась. |
|
18.02.2009, 12:08 | #140 |
MCITP
|
Цитата:
Но у меня где-то 60 на 40 не так уж и редко.
__________________
Zhirenkov Vitaly |
|
Теги |
bug report, баг, ошибка, dynamics |
|
|