|
14.10.2008, 10:27 | #1 |
Axapta
|
А ЧЮ где?
__________________
С уважением, Олег. |
|
14.10.2008, 10:35 | #2 |
Участник
|
Ну, я в конце смайл, вроде бы, вставил
__________________
Axapta v.3.0 sp5 kr2 |
|
09.02.2009, 15:05 | #3 |
Участник
|
Интересный код обнаружился в Ax*-классах при доступе к полям-массивам: к примеру, в AxSalesTable, в методе dimensionElement() (для 3-ки) или же setDimensionElement() (для 4-ки и выше) вместо вроде бы очевидной конструкции
X++: fieldId2Ext(fieldnum(SalesTable, Dimension), _array) X++: new SysDictField(tablenum(SalesTable), fieldnum(SalesTable, Dimension), _array).id() |
|
08.01.2010, 13:59 | #4 |
Мрачный тип
|
Атавизьмы
Класс RAssetDisposalValue.
Безобразная передача параметров при инициализации экземпляров RAssetSumCalc дожила c 3-ки до DAX2009 X++: public server static RAssetAmount postValue(RAssetId _assetId, RAssetPostValue _postValue, RAssetAmount _assetAmount = 0, RAssetStandardId _assetStandardId, RAssetTransDate _assetTransDate = systemdateget()) { RAssetSumCalc rAssetSumTransThisYear, rAssetSumTransPriorYear, rAssetSumTransDate; RAssetTransDate prior_Years, this_Year; RAssetAmount assetAmount; ; this_Year = dateEndYr(systemdateget()); prior_Years = dateEndYr(prevyr(systemdateget())); rAssetSumTransThisYear = RAssetSumCalc_Trans::newAssetPeriod(RAssetTable::find(_assetId).AccountNum, _assetStandardId, this_Year, prior_Years);
__________________
Мы летаем, кружимся, нагоняем ужасы ... |
|
08.01.2010, 14:19 | #5 |
Участник
|
В 6ке им это придется пофиксить, так как компилироваться такое уже не будет
|
|
11.11.2010, 17:29 | #6 |
Banned
|
CustClassificationGroup
Если хочется от души посмеяться, рекомендую простенькую таблицу CustClassificationGroup из AX2009, особенно ее [нигде не используемые] методы find(), exist(). Из серии "как сделать в слове еще четыре ошибки"; так и представляется индус из Мумбая, которому дали тестовое задание - создать таблицу.
|
|
11.11.2010, 18:32 | #7 |
Участник
|
Нуу, работать то будет. Чуть странно с concurrencyModel, первый раз такое видел в коде. А так - ну, подумаешь, indentation плохой.
|
|
11.11.2010, 19:05 | #8 |
Модератор
|
Там все чуть более запущено чем просто проблемы с отступами - обрати внимание на первичный ключ на табличке
__________________
-ТСЯ или -ТЬСЯ ? |
|
12.11.2010, 01:53 | #9 |
Участник
|
Цитата:
Другое дело, что в этой табличке надо бы еще другой уникальный индекс создать. Но видимо табличка так часто используется, что пока не понадобилось |
|
12.11.2010, 02:15 | #10 |
Модератор
|
Цитата:
Цитата:
Другое дело, что в этой табличке надо бы еще другой уникальный индекс создать. Но видимо табличка так часто используется, что пока не понадобилось
Я в принципе догадываюсь, зачем эти неиспользуемые find() и exist() методы создавались - чтобы тупо пройти формальную проверку на их наличие. Вопрос в том, как такое сумели в SYS слой закоммитить и на кой ляд вводили разрекламированные юнит-тесты
__________________
-ТСЯ или -ТЬСЯ ? |
|
23.11.2010, 20:28 | #11 |
Участник
|
AX 2009 SP1 RU5, \Macros\SQLFormatting - вот и пользуйся после этого стандартными макросами
X++: #define.SQLfrom('FROM') #define.SQLOr('FROM') #define.SQLAnd('AND') #define.SQLNot('NOT') #define.SQLOrder('ORDER') #define.SQLBY('GROUP') |
|
|
За это сообщение автора поблагодарили: EVGL (1), Maximin (1), lev (1). |
23.11.2010, 23:03 | #12 |
Участник
|
Предположил, что расписывать на 13 и больше страниц коллега (или не коллега) EVGL уже не осилил
Но вы правы. Для полноты соответствия, надо еще проверку на больше 12 вставить. Можно и одной строкой PS Хотя, как выяснилось, речь шла вообще о другом
__________________
Axapta v.3.0 sp5 kr2 |
|
14.01.2011, 10:01 | #13 |
Мрачный тип
|
DAX2009, формы строк журналов ГК, переопределенные validate'ы и modified'ы - часто используются в анализе содержимого полей подобные конструкции :
X++: if (ledgerJournalTrans_ds.object(fieldnum(LedgerJournalTrans, AccountNum)).getValue()!="") X++: if (ledgerJournalTrans.AccountNum)
__________________
Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 14.01.2011 в 10:04. |
|
14.01.2011, 11:45 | #14 |
Участник
|
Однозначно индусский стиль
|
|
14.01.2011, 13:26 | #15 |
Модератор
|
И кто ж, как и на что их (вне привязки к национальности - скажем, "этих людей") в таком случае тестирует при найме (помню ты рассказывал как валят кандидатов не умеющих генерировать качественный (с) код). И через скольких (в среднем) людей проходит код перед тем как попадет в релиз? Если конечно это не секрет
P.S. Я не ерничаю, просто наблюдаю какой-то непонятный процесс (вернее, два - набор персонала и процесс проверки кода при переносе в релиз) и хочется разобраться
__________________
-ТСЯ или -ТЬСЯ ? |
|
14.01.2011, 13:11 | #16 |
Мрачный тип
|
Там же, в LedgerJournalTransDaily на источнике данных LedgerJournalTrans ...
Метод active() постоянно вызывает метод setFurtherPostingProtection(), который меняет возможность редактирования 7 полей (тип счета и счет, тип корр.счета и коррсчет, суммы дебет/кредит и валюту) по факту заполненности полей FurtherPostingType и FurtherPostingRecId. Вот как это делает наш неизвестный герой: X++: void setFurtherPostingProtection() { int i; DictTable dictTable = new DictTable(ledgerJournalTrans.TableId); FormDataObject objectLedgerJournalTrans; boolean preventEdit; ; preventEdit = ledgerJournalTrans.FurtherPostingType && ledgerJournalTrans.FurtherPostingRecId; for (i = 1; i <= dictTable.fieldCnt(); i++) { objectLedgerJournalTrans = ledgerJournalTrans_ds.object(dictTable.fieldCnt2Id(i)); if (objectLedgerJournalTrans) { if (preventEdit) { switch (dictTable.fieldCnt2Id(i)) { case fieldnum(LedgerJournalTrans, AccountType), fieldnum(LedgerJournalTrans, AccountNum), fieldnum(LedgerJournalTrans, OffsetAccountType), fieldnum(LedgerJournalTrans, OffsetAccount), fieldnum(LedgerJournalTrans, AmountCurDebit), fieldnum(LedgerJournalTrans, AmountCurCredit), fieldnum(LedgerJournalTrans, CurrencyCode) : objectLedgerJournalTrans.allowEdit(false); break; default : objectLedgerJournalTrans.allowEdit(true); } } else { objectLedgerJournalTrans.allowEdit(true); } } } } Есть мнение, что за такое в таком месте - надо бить ... Наверное даже ногами и наверное даже по голове ...
__________________
Мы летаем, кружимся, нагоняем ужасы ... Последний раз редактировалось TasmanianDevil; 14.01.2011 в 13:17. |
|
|
За это сообщение автора поблагодарили: fed (3), Vadik (5). |
14.01.2011, 13:47 | #17 |
Участник
|
Цитата:
Необходимо это или нет - это уже другой вопрос. А если это таким было ТЗ, тогда чего на кодера пенять? Это может быть баг, но это не wtf |
|
14.01.2011, 13:58 | #18 |
Модератор
|
Цитата:
P.S. а может у автора этот код никакого дискомфорта не вызывает - у них вообще похоже свое, особенное чувство прекрасного
__________________
-ТСЯ или -ТЬСЯ ? |
|
|
За это сообщение автора поблагодарили: S.Kuskov (1). |
14.01.2011, 13:44 | #19 |
Участник
|
К сожалению, код пишется разными командами, в разных странах и условиях.
К примеру, команды в Редмонде все больше и больше полагаются на вендоров, теперь уже и при написании кода приложения. При этом уровень code review в таких командах обычно тоже намного ниже, чем хотелось бы. То есть даже если в FTE там наняты хорошие сотрудники (хотя я уже высказывался по этому поводу в какой-то другой теме - мы не нанимаем людей со знанием АХ), то качество вендоров Вы врядли сможете себе даже представить. Раз уж дискуссия идет в этой теме, приведу еще пример кода, тоже от вендоров. Код взят с одной из форм в АХ6. Приведу весь код метода, просто чтобы можно было оценить всю мощь гения: X++: public void setUnitOfMeasureState() { UnitOfMeasure tblUnitOfMeasure; if (ecoResDomain.DataType == AttributeDataType::Integer || ecoResDomain.DataType == AttributeDataType::Decimal) { // Enable unit of measure group if (!unitOfMeasureGroup.enabled()) { unitOfMeasureGroup.enabled(true); } if (ecoResDomainUnitOfMeasure.RecId && ecoResBoundedDomainValue.RecId) { // Enable bounded unit of measure combo boxes if (!intUnitOfMeasureComboBox.visible()) { intUnitOfMeasureComboBox.visible(true); } // Populate the integer bounded unit of measure combo box intUnitOfMeasureComboBox.clear(); while select Symbol from tblUnitOfMeasure where tblUnitOfMeasure.UnitOfMeasureClass == ecoResDomainUnitOfMeasure.UnitOfMeasureClass { intUnitOfMeasureComboBox.add(tblUnitOfMeasure.Symbol); } if (intUnitOfMeasureComboBox.count() > 0) { intUnitOfMeasureComboBox.selection(0); } if (ecoResValueLower_EcoResIntValue.RecId && ecoResValueLower_EcoResIntValue.IntUnitOfMeasure) { // Set the unit of measure selection tblUnitOfMeasure = UnitOfMeasure::find(ecoResValueLower_EcoResIntValue.IntUnitOfMeasure); intUnitOfMeasureComboBox.selectText(tblUnitOfMeasure.Symbol); } else if (ecoResDomainUnitOfMeasure.DefaultUnitOfMeasure) { // Set the unit of measure selection tblUnitOfMeasure = UnitOfMeasure::find(ecoResDomainUnitOfMeasure.DefaultUnitOfMeasure); intUnitOfMeasureComboBox.selectText(tblUnitOfMeasure.Symbol); // Set the unit of measure foreign keys if (ecoResValueLower_EcoResIntValue.RecId) { ecoResValueLower_EcoResIntValue.IntUnitOfMeasure = tblUnitOfMeasure.RecId; } if (ecoResValueUpper_EcoResIntValue.RecId) { ecoResValueUpper_EcoResIntValue.IntUnitOfMeasure = tblUnitOfMeasure.RecId; } } else if (intUnitOfMeasureComboBox.count() > 0) { // Set the unit of measure foreign keys if (ecoResValueLower_EcoResIntValue.RecId) { ecoResValueLower_EcoResIntValue.IntUnitOfMeasure = UnitOfMeasure::findBySymbol(intUnitOfMeasureComboBox.getText(intUnitOfMeasureComboBox.selection())).RecId; } if (ecoResValueUpper_EcoResIntValue.RecId) { ecoResValueUpper_EcoResIntValue.IntUnitOfMeasure = UnitOfMeasure::findBySymbol(intUnitOfMeasureComboBox.getText(intUnitOfMeasureComboBox.selection())).RecId; } } if (!floatUnitOfMeasureComboBox.visible()) { floatUnitOfMeasureComboBox.visible(true); } // Populate the float unit of measure combo box floatUnitOfMeasureComboBox.clear(); while select Symbol from tblUnitOfMeasure where tblUnitOfMeasure.UnitOfMeasureClass == ecoResDomainUnitOfMeasure.UnitOfMeasureClass { floatUnitOfMeasureComboBox.add(tblUnitOfMeasure.Symbol); } if (floatUnitOfMeasureComboBox.count() > 0) { floatUnitOfMeasureComboBox.selection(0); } if (ecoResValueLower_EcoResFloatValue.RecId && ecoResValueLower_EcoResFloatValue.FloatUnitOfMeasure) { // Set the unit of measure selection tblUnitOfMeasure = UnitOfMeasure::find(ecoResValueLower_EcoResFloatValue.FloatUnitOfMeasure); floatUnitOfMeasureComboBox.selectText(tblUnitOfMeasure.Symbol); } else if (ecoResDomainUnitOfMeasure.DefaultUnitOfMeasure) { // Set the unit of measure selection tblUnitOfMeasure = UnitOfMeasure::find(ecoResDomainUnitOfMeasure.DefaultUnitOfMeasure); floatUnitOfMeasureComboBox.selectText(tblUnitOfMeasure.Symbol); // Set the unit of measure foreign keys if (ecoResValueLower_EcoResFloatValue.RecId) { ecoResValueLower_EcoResFloatValue.FloatUnitOfMeasure = tblUnitOfMeasure.RecId; } if (ecoResValueUpper_EcoResFloatValue.RecId) { ecoResValueUpper_EcoResFloatValue.FloatUnitOfMeasure = tblUnitOfMeasure.RecId; } } else if (floatUnitOfMeasureComboBox.count() > 0) { // Set the unit of measure foreign keys if (ecoResValueLower_EcoResFloatValue.RecId) { ecoResValueLower_EcoResFloatValue.FloatUnitOfMeasure = UnitOfMeasure::findBySymbol(floatUnitOfMeasureComboBox.getText(floatUnitOfMeasureComboBox.selection())).RecId; } if (ecoResValueUpper_EcoResIntValue.RecId) { ecoResValueUpper_EcoResFloatValue.FloatUnitOfMeasure = UnitOfMeasure::findBySymbol(floatUnitOfMeasureComboBox.getText(floatUnitOfMeasureComboBox.selection())).RecId; } } } else { // Disable unit of measure combo boxes if (intUnitOfMeasureComboBox.visible()) { intUnitOfMeasureComboBox.visible(false); } if (floatUnitOfMeasureComboBox.visible()) { floatUnitOfMeasureComboBox.visible(false); } } } else { // Disable unit of measure group if (unitOfMeasureGroup.enabled()) { unitOfMeasureGroup.enabled(false); } // Disable unit of measure combo boxes if (intUnitOfMeasureComboBox.visible()) { intUnitOfMeasureComboBox.visible(false); } if (floatUnitOfMeasureComboBox.visible()) { floatUnitOfMeasureComboBox.visible(false); } } } |
|
14.01.2011, 14:32 | #20 |
----------------
|
как правильно заметил TasmanianDevil основная идея - "закрыть на редактирование 7 полей независимо от других", а вот открытие всех остальных полей - явная "фича" метода, с которой придется бороться, если вам понадобится закрыть "свои" поля при других условиях.
|
|