понедельник, 14 августа 2017 г.

Добавление складской аналитики в Microsoft Dynamics AX 4.0.

Проверенный алгоритм добавления складской аналитики в Microsoft Dynamics AX 4.0.
________________________________________
1. Создать расширенный тип данных для новой аналитики –DUN_PurchMachineId
2. Создать функциональный ключ для настройки использования аналитики в приложении – DUN_PurchMachineId. В качестве ParentFeatureKey для него задать функциональные ключи LogisticsDefault и Invent.

3. В расширенном типе данных DUN_PurchMachineId задать функциональный ключ DUN_PurchMachineId.
4. Создать таблицу DUN_PurchNumberMachine с String - полями:
NumberMachineId (DUN_PurchMachineId)
ItemId (ItemId)
ConfigId (ConfigId)
5. В расширенном типе данных добавить Relation: NumberMachineId == DUN_PurchNumberMachine. NumberMachineId.
6. Создать форму DUN_PurchNumberMachine с источником DUN_PurchNumberMachine
7. В таблице InventDim:
7.1. Создать поле DUN _PurchMachineId. В качестве расширенного типа данных для него задать DUN_PurchMachineId
7.2. Добавить поле DUN _PurchMachineId в группы полей Autoreport и InventoryDimensions
7.3. Создать индекс DUN__Mach_Idx по полю DUN_PurchMachineId
7.4. Добавляем поле DUN_PurchMachineId в индекс DimIdx
7.5. Изменяем методы, в которых встречается макрос InventDimDevelop, добавляя строки аналогичные уже присутствующим в них.
dim2dimParm() + case (fieldnum(InventDim,DUN_PurchMachineId)) : return fieldnum(InventDimParm, DUN _PurchMachineIdFlag);
dimParm2dim() + case (fieldnum(InventDimParm, DUN_PurchMachineIdFlag)) : return fieldnum(InventDim, DUN_PurchMachineId);
findDim() + inventDim. DUN_PurchMachineId == _inventDim. DUN_PurchMachineId
findOrCreate() + inventDim. DUN_PurchMachineId = _inventDim. DUN_PurchMachineId;
formQueryAddDynalink() +
case tablenum(DUN_PurchNumberMachine):
inventDim_DS.query().dataSourceTable(tablenum(InventDim)).addDynalink(
fieldnum(InventDim, DUN_PurchMachineId),
args.record(),
fieldname2id(args.dataset(), fieldstr(DUN_PurchNumberMachine, NumberMachineId)));

inventDim_DS.query().dataSourceTable(tablenum(InventDim)).addSortField(fieldnum(InventDim, DUN_PurchMachineId));
isFieldIdItemDim() + case (fieldnum(InventDim, DUN_PurchMachineId)) :
8. Изменяем таблицу InventDimParm
Создаем поле DUN_PurchMachineIdFlag. В качестве расширенного типа данных для него задаем NoYesId
Добавляем поле DUN_PurchMachineIdFlag в группы полей Autoreport, View и FixedView
9. Изменяем метод в таблице WMSOrderTrans:
initInventDimPick() +
if (!_inventDimParmShow. DUN_PurchMachineIdFlag && !_inventDimParmFixed. DUN_PurchMachineIdFlag)
_inventDim. DUN_PurchMachineId = '';
10. В таблице InventSumDeltaDim (Проверки запасов в наличии) добавить поля:
String DUN_PurchMachineId DUN_PurchMachineId;
Enum DUN_MachineIdFlag_RU NoYesId.
11. В таблице InventSumDeltaDim изменяем методы:
initFromInventDim() + this. DUN_PurchMachineId = _inventDim. DUN_PurchMachineId;
initFromInventDimParm() + this. DUN_MachineIdFlag_RU = _inventDimParm. DUN_PurchMachineIdFlag;
initInventDim() + _inventDim. DUN_PurchMachineId = this. DUN_PurchMachineId;
initInventDimParm() + _inventDimParm. DUN_PurchMachineIdFlag = this. DUN_MachineIdFlag_RU;
12. Изменяем методы класса InventDimFixedClass, в которых встречается макрос InventDimDevelop, добавляя строки аналогичные уже присутствующим в них:
classDeclaration + #DEFINE. DUN_Mach_IDX(17)
initFromInventDimFixed() + inventDimParm. DUN_PurchMachineIdFlag = InventDimFixedClass::dimFixed(inventDimFixed, # DUN_Mach_IDX);
inventDimFixed() + if (inventDimParm. DUN_PurchMachineIdFlag) inventDimFixed = InventDimFixedClass::setField(inventDimFixed, # DUN_Mach_IDX);
fieldId2Idx() + case fieldnum(InventDim, DUN_PurchMachineId) : return # DUN_Mach_IDX;
13. Изменяем метод класса InventDimCtrl_Frm_QuickQuote:
buildQuery() +
if (dimParmVisibleGrid. DUN_PurchMachineIdFlag)
{
queryBuildDsDim.addSortField(fieldnum(InventDim, DUN_PurchMachineId));
sortfield = true;
}
14. Изменяем метод класса InventDimTracking:
initFromArgs() +
case tablenum(DUN_PurchNumberMachine):
numberMachine = args.record();
queryBuildRangeItemId.value(queryValue(numberMachine.ItemId));
queryBuildDataSourceDim.addRange(fieldnum(InventDim, DUN_PurchMachineId)).value(queryValue(numberMachine.NumberMachineId));
break;
15. Добавляем методы класса AxInternalBase:
public DUN_PurchMachineId parmPurchMachineId(DUN_PurchMachineId _purchMachineId = "")
{
if (! prmisdefault(_purchMachineId))
{
this.setField(fieldnum(InventDim, DUN_PurchMachineId), _purchMachineId);
}
}

public void setInventPurchMachineId()
{
if (this.isFieldSet(fieldnum(InventDim, DUN_PurchMachineId)))
{
return;
}
}
return inventDim. DUN__PurchMachineId;
16. Изменяем метод класса InventUpdateOnhand:
checkOnhand() + (inventSumDeltaDim. DUN_PurchMachineId == inventDim. DUN_PurchMachineId || inventSumDeltaDim. DUN_MachineIdFlag_RU == NoYes::No)
17. Изменяем макросы:
InventDimJoin + (%2. DUN_PurchMachineId == %3. DUN_PurchMachineId || ! %4. DUN_PurchMachineIdFlag)
InventDimSelect + (%1. DUN_PurchMachineId == %2. DUN_PurchMachineId || ! %3. DUN_PurchMachineIdFlag)
InventDimExistsJoin + (%2. DUN_PurchMachineId == %3. DUN_PurchMachineId || ! %4. DUN_PurchMachineIdFlag)
18. На Grid в формах, где отображаются стандартные складские аналитики требуется добавить поле, связанное с новой аналитикой.
19. Выполнить глобальную компиляцию приложения
20. В случае использования Oracle, выполнить процедуру SQLOracleInitStoredProc::initOracleSPIMTS. Теоретически она же должна вызываться при глобальной синхронизации (когда не одна таблица, а весь словарь синхронизируется), но я бы не стал рисковать и вызвал бы ручками.



Удачи!

Комментариев нет: