27.01.2014, 16:28 | #1 |
Banned
|
Effective "Date effectivness"
Дамы и господа, как вы считаете, можно ли запрограммировать следующий код в AX2012 лаконичнее:
X++: public static void setStopped( InventItemOrderSetupMap _inventItemOrderSetupMap, ItemStopped _stopped, date _effectiveDate = systemDateGet()) { InventItemSetupStopped record; ttsBegin; record = InventItemSetupStopped::find(_inventItemOrderSetupMap.TableId, _inventItemOrderSetupMap.RecId, _effectiveDate); record.validTimeStateUpdateMode(ValidTimeStateUpdate::Correction); if (record && record.Stopped != _stopped) { while select forUpdate validTimeState(_effectiveDate) record where record.InventItemSetupRecId == _inventItemOrderSetupMap.RecId && record.InventItemSetupTableId == _inventItemOrderSetupMap.TableId && record.ValidTo != _effectiveDate { record.ValidTo = max(_effectiveDate-1, record.ValidFrom); if (record.validateWrite()) record.update(); } } select forUpdate validTimeState(_effectiveDate) record where record.InventItemSetupRecId == _inventItemOrderSetupMap.RecId && record.InventItemSetupTableId == _inventItemOrderSetupMap.TableId && record.ValidTo == _effectiveDate; record.initFromInventItemOrderSetupMap(_inventItemOrderSetupMap); record.ValidFrom = _effectiveDate; record.ValidTo = dateMax(); record.Stopped = _stopped; if (record.validateWrite()) record.write(); ttsCommit; } |
|
27.01.2014, 16:39 | #2 |
Участник
|
а что за версия?
судя по функции validTimeState - акс2012. но не вижу таблицы InventItemSetupStopped в стандартном функционале. |
|
27.01.2014, 16:42 | #3 |
Участник
|
Цитата:
Сообщение от EVGL
X++: if (record && record.Stopped != _stopped) { while select forUpdate validTimeState(_effectiveDate) record where record.InventItemSetupRecId == _inventItemOrderSetupMap.RecId && record.InventItemSetupTableId == _inventItemOrderSetupMap.TableId && record.ValidTo != _effectiveDate { record.ValidTo = max(_effectiveDate-1, record.ValidFrom); if (record.validateWrite()) record.update(); } } но точно - не помню. надо перечитать про механизм периодических значений в книге. |
|
27.01.2014, 16:55 | #4 |
Участник
|
По-моему, в приведенном выше куске кода выполняется "закат солнца вручную". Схожий по смыслу, но более лаконичный код можно найти в ГАКе, например, \Data Dictionary\Tables\DirPersonUser\Methods\createDirPersonUser.
|
|
|
За это сообщение автора поблагодарили: EVGL (5). |
27.01.2014, 18:40 | #5 |
Banned
|
Благодарю! Удалось выбросить пару строчек:
X++: public static void setStopped( InventItemOrderSetupMap _inventItemOrderSetupMap, ItemStopped _stopped, date _effectiveDate = systemDateGet()) { InventItemSetupStopped record; ttsBegin; record = InventItemSetupStopped::find(_inventItemOrderSetupMap.TableId, _inventItemOrderSetupMap.RecId, _effectiveDate); record.validTimeStateUpdateMode(ValidTimeStateUpdate::Correction); if (record && record.Stopped != _stopped) { while select forUpdate validTimeState(_effectiveDate) record where record.InventItemSetupRecId == _inventItemOrderSetupMap.RecId && record.InventItemSetupTableId == _inventItemOrderSetupMap.TableId { record.ValidTo = max(_effectiveDate-1, record.ValidFrom); if (record.validateWrite()) record.update(); } } select forUpdate validTimeState(_effectiveDate) record where record.InventItemSetupRecId == _inventItemOrderSetupMap.RecId && record.InventItemSetupTableId == _inventItemOrderSetupMap.TableId; record.initFromInventItemOrderSetupMap(_inventItemOrderSetupMap); record.ValidFrom = _effectiveDate; record.ValidTo = dateMax(); record.Stopped = _stopped; if (record.validateWrite()) record.write(); ttsCommit; } Без строки record.ValidTo = max(_effectiveDate-1, record.ValidFrom); работает, но ожидаемо перестает формироваться строчка с историей, а хочется. |
|
27.01.2014, 19:47 | #6 |
Участник
|
Может, если нужна строка с историей, вместо ValidTimeStateUpdate::Correction следует использовать ValidTimeStateUpdate::CreateNewTimePeriod?
|
|
27.01.2014, 20:00 | #7 |
Banned
|
Проверял, не стыкуется с попыткой перезаписать настроки текущего дня, выдает ошибку.
|
|
Теги |
ax2012 |
|
|