自定义Microsoft Dynamics 365的项目服务自动化(PSA)

时间:2018-06-13 08:58:41

标签: javascript microsoft-dynamics dynamics-365

我需要在PSA为每个项目实体实施的工作分解结构(WBS)中添加一个自定义列。它显示了具有一些默认列的项目任务,以及Microsoft Project外观(和功能)。

This is an example of the WBS of PSA for Dynamics

此工具的问题是您无法从中打开任何任务。所以,我想插入一个允许用户这样做的列。怎么这么难?

1 个答案:

答案 0 :(得分:2)

嗯,我找到的唯一方法是改变PSA的JS库。 这非常危险,因为将来执行的任何更新都可能使您的解决方案崩溃。 但是,由于我找不到解释如何执行我需要的文档或解决方法,因此我决定同时向您介绍我遇到的问题和解决方案。

1.-使用PSA的JS库创建一个解决方案,我们必须使用Add Existing按钮进行更改。这些是组件

  • msdyn_ /通用/型号/ ProjectTask.js
  • msdyn_ /项目/ WBS /脚本/ ViewModelTask​​Factory.js
  • msdyn_ /项目/ WBS /脚本/ WBSView.js
  • msdyn_ /项目/ WBS /视图/ ViewTaskInitializer.js

2.-由于这些是PSA性能的关键文件,因此将其导出为非托管解决方案。为了获得某种备份文件,以防万一。

3.-对资源的修改 msdyn_ / Common / Models / ProjectTask.js

这是实体与视图模型之间的数据映射的位置。如果要显示的字段是ProjectTask实体的自定义字段,则必须将其值分配给在函数中创建的JS变量
ProjectTask(实体)和原型" initFromFetchXmlResponse",像这样:

this.myVariableField=entity.fieldAttribute; //this in projectTask(entity)
this.myVariableField=fetchXmlEntity.fieldAttribute; //this initFromFetchXmlResponse

我只想创建一个指向该任务的链接,因此对我来说没有必要。

4.-对资源的更改 msdyn_ / Project / WBS / Scripts / ViewModelTask​​Factory.js

此文件包含创建viewModelTask​​的函数,这是一种用任务值填充的行。对于我们想要添加到WBS的每一列,我们必须在" createDefaultViewModelTask​​"中添加一些行。和" createViewModelTask​​FromProjectTask"功能

viewModelTask.myDefaultValueInColumn="";//createDefaultViewModelTask
viewModelTask.myActualValueInColumn=projectTask.Attribute;//createViewModelTaskFromProjectTask

5.-对资源的更改 msdyn_ / Project / WBS / View / ViewTaskInitializer.js : 这是列本身的定义。我们必须在ViewTaskInitializer函数和" defineTask"中添加一些代码。字段声明:

ViewTaskInitializer.taskNameColumn = 'taskAttributeName';//ViewTaskInitializer
{ name: ViewTaskInitializer.taskNameColumn, type: 'string' }//defineTask

6.-资源的变化 msdyn_ / Project / WBS / Scripts / WBSView.js : 在这个JS上找到了执行实际" row-painting"的文件。特征。我们需要更改函数" gridConfiguration",并将我们的列添加到" this.Ext.create"方法。 对于gridConfiguration,我们将在该系列中添加此数组:

            {
              id: ViewTaskInitializer_1.default.OurColumnName,
              label: ''
            }

关于第二个函数的列添加,可能是这样的:

             {
                header: 'OurColumnHeader',
                align: 'center',
                dataIndex: ViewTaskInitializer_1.default.OurColumnName,
                width: 800,
                sortable: true,
                resizable: true,
                readOnly: false,
                renderer: function (value, record) {
                    //here is the code which returns the value
                   // you can access the current task is trying to paint like this:
                   var task=record.record.data;
                          }

            }