首页 > 其他分享 >【Dynamics365-Finance&Operations学习】Chain of Command Feature使用方法与使用场景

【Dynamics365-Finance&Operations学习】Chain of Command Feature使用方法与使用场景

时间:2024-01-21 13:56:35浏览次数:36  
标签:Operations Finance Chain custGroup CustGroup next CoC class Name

前提

微软在Platform Update 9之后引入了Chain of Command(CoC),通过支持像Public和Protected类型的拓展,来为技术顾问和编程人员减少过度分层(over layering)。
在PU15(Dynamic365的某一版本)中,在Form、Table和Class的CoC已经被实现,但在表单数据源(Form Data Source)和表单数据字段(Form data field)的部分还有所限制。
如不能对上述两种数据类型进行拓展。这些将在2018年10月的更新中得到实现(现已实装)。

代码

[Form]
public class ARBTestForm extend FormRun {
  [DataSource]
  class CustGroup {
    public void initValue() {
	  super();

	  custGroup.PaymTermId = "Net10";
	  info(strFmt("Pre CoC: %1 set to %2", fieldId2PName(tableNum(CustGroup), fieldNum(CustGroup, PaymTermId)), custGroup.PaymTermId));
    }

    [DataField]
    class CustGroup {
      public void modified() {
        super();
        
        CustGroup.Name = "TEST";
        warning(strFmt("Pre CoC: %1 set to %2", fieldId2PName(tableNum(CustGroup), fieldNum(CustGroup, Name)), CustGroup.Name));
      }
    }
  }
  
  [Control("Button")]
  class ExecuteButton {
    public void clicked() {
      super();
    }
	
    public void execute() {
      error("Post CoC: Operation executed by CoC.");
    }
  }
}

上述代码显示了一组简单的对于Form Control、Data Source和Data Field的实现。但也可发现他们是不可继承的,如果有更改的需求,没有CoC的话就只能进行复制一份然后编写重复代码这样的行为。
对此,Dynamics365 FO提供了一套解决方案

解决

CoC在Form和Data Foeld的语法层面上会与Table和Class的CoC有所不同。我们需要对每一个需要继承的对象进行继承(extend)。可能在最开始会有些不习惯和觉得冗长复杂,但习惯后会发现这是个不错的解决方案。

通过CoC,上述的代码将如此动作:

  1. 在ARMTestForm上创建一个新的CustGroup记录会调用(invoke)initValue方法,并将Payment Term Id设置为Net10,画面显示为Terms of Payment。并在画面以info级别打印信息:“Pre CoC:Terms of payment set to Net10”。
    image
  2. 更改CustGroup记录将会触发CustGroup的modified方法,将CustGroup的Name属性设置为TEST,画面显示为Description。并在画面以Warning级别打印情报:“Pre CoC:Description set to TEST”。
    image
  3. 当Execute按钮被点击时,由于在Clicked方法中只执行了super方法,所以没有任何动作。
    在我们实际开始编写CoC代码前有几点需要注意:
  4. class要被声明为final
  5. 在方法中必须要有next关键字

关于next关键字

next关键字类似一个super,它定义了你业务代码的执行逻辑,熟悉Java切片式编程的人可以把他类比于Spring中的joincut,在next之前定义的增强代码相当于@before的代码——父类对应代码的前置事件处理逻辑在此处执行,在next之后定义的可以理解为@after的代码——父类对应代码的后置事件处理逻辑在此处执行。

实现

让我们看以下三个类的实现来说明下CoC对Data Source、Data Field和Form Control的实现。

  1. DataSource Extension Class
[ExtensionOf(FormDataSourceStr(ARBTestForm, CustGroup))]
final class ARBFormCustGroup_Extension {
  public void initValue() {
    FormDataSource formDS = this;
    
    CustGroup cust = formDS.cursor();
    next initValue();
    
    cust.PaymTermId = "Net30";
    info(strFmt("Pre CoC: %1 set to %2", fieldId2PName(tableNum(CustGroup), fieldNum(CustGroup, PaymTermId)), custGroup.PaymTermId));
  }
}
  1. Data source Field extension class
[ExtensionOf(FormDataFieldStr(ARBTestForm, CustGroup, CustGroup))]
final class ARBFormCustField_Extension {
  public void modified() {
    CustGroup custGroup;
    FormDataSource ds;
    FormDataObject df = any2Object(this) as FormDataObject;
	
    next modified();
    ds = df.datasource();
    custGroup = ds.cursor();
    custGroup.Name = strFmt("%1 with added description", CustGroup.Name);
	
    warning(strFmt("Pre CoC: %1 set to %2", fieldId2PName(tableNum(CustGroup), fieldNum(CustGroup, Name)), CustGroup.Name));
  }
}
  1. Button Control extension class
[ExtensionOf(FormControlStr(ARBTestForm, ExecuteButton))]
final class ARBFormExecuteButton_Extension {
  public void clicked() {
    CustGroup custGroup;
    FormButtonControl fbc = any2Object(this) as FormButtonControl;
    FormDataSource fds = fbc.formRun().dataSource(tableStr(CustGroup));
	
    next clicked();
	
    custGroup = fds.cursor();
    if(custGroup.CustGroup == '10' || custGroup.CustGroup == '20') {
      this.execute();
    }
  }
}

其行为如下:

  1. 在父类代码(称为父类并不准确,因为并没有通过extend关键字直接extend)中,在initValue方法中将PaymTermId字段设置为了Net10,通过CoC,将该字段设置为Net30,画面显示为Terms of Payment,并通过info方式显示信息。
    image
  2. 在父类代码中,通过modified方法监听记录的更改操作。在CoC下,将Name字段的值设置为TEST
    with added description,在画面显示为字段Description,并通过Warning显示信息。
    image
  3. 在父类代码中,通过clicked方法来监听Execute按钮的点击操作,在CoC中,添加逻辑:如果该记录的CustGroup为10或20时才执行execute方法。并调用父类的execute方法,以error显示信息:After CoC: Operation executed through CoC。

由于execute方法在嵌套控件类型(nested control type, 此处为FormControl)的原始基本行为(original base behavior)中未被定义,不能直接通过execute来自定义行为。

上述FormControl的执行结果如下:
image

总结

  1. 像其他所有的CoC实现一样,next必须要被调用来保证父类方法的执行。
  2. 在现在的Visual Studion X++ Editor中,无法通过补全或者其他支持来获取可被包装方法的信息(如上文中clicked和execute的区别),需要查阅系统文档或查看方法签名方式来确定。
  3. 对于需要被包装的无法被包装的方法(如上文的execute),可以通过对control型方法的CoC定义。
  4. 无需通过再次编译来获取对要继承Form的CoC支持,新增extension->定义各个方法后就可在画面上直接确认。

原文

https://www.arbelatech.com/insights-resources/blog/dynamics-365-finance-operations-chain-of-command-new-features.html

标签:Operations,Finance,Chain,custGroup,CustGroup,next,CoC,class,Name
From: https://www.cnblogs.com/smithlaod/p/17953486

相关文章

  • P9012 [USACO23JAN] Moo Operations B题解
    第1道赛场AC的题,必须发篇题解记录一下。Tips:\(1\le|S|\le100\)——题目才100,这就可以随便整活了。如果你稍微懂点英语,就会知道第\(2\sim4\)个点的\(S\)都最多只有\(3\)个字符,而目标“MOO”也是\(3\)个字符,所以只需要模拟就可以了。intcheck(string......
  • 【langchain】在单个文档知识源的上下文中使用langchain对GPT4All运行查询
    Inthepreviouspost, RunningGPT4AllOnaMacUsingPythonlangchaininaJupyter Notebook,我发布了一个简单的演练,让GPT4All使用langchain在2015年年中的16GBMacbookPro上本地运行。在这篇文章中,我将提供一个简单的食谱,展示我们如何运行一个查询,该查询通过从单个基于......
  • 机器学习周刊第六期:哈佛大学机器学习课、Chatbot Ul 2.0 、LangChain v0.1.0、Mixtral
    ---date:2024/01/08---吴恩达和Langchain合作开发了JavaScript生成式AI短期课程:《使用LangChain.js构建LLM应用程序》大家好,欢迎收看第六期机器学习周刊本期介绍10个内容,涉及Python、机器学习、大模型等,目录如下:1、哈佛大学机器学习课2、第一个JavaScript生成......
  • 基于langchain和文心一言的检索增强生成(RAG)初级实验
    一、什么是RAG?RAG的架构如图中所示,简单来讲,RAG就是通过检索获取相关的知识并将其融入Prompt,让大模型能够参考相应的知识从而给出合理回答。因此,可以将RAG的核心理解为“检索+生成”,前者主要是利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回......
  • Cyber Kill Chain
    CyberKillChain分为3个阶段 1.侦查和武器化2.投递利用和安装3.C2和影响 Mitre官方由抽象层次高低举例了三种网络攻击模型:高抽象模型:LockheedMartin的CyberKillChain模型、Microsft的STRIDE模型等中抽象模型:Mitre的ATT&CK模型低抽象模型:漏洞数据集、......
  • 开发篇1:使用原生api和Langchain调用大模型
    对大模型的调用通常有以下几种方式:方式一、大模型厂商都会定义http风格的请求接口,在代码中可以直接发起http请求调用;方式二、在开发环境中使用大模型厂商提供的api;方式三、使用开发框架Langchain调用,这个就像java对数据库的调用一样,可以直接用jdbc也可以使用第三方框架,第三方框架......
  • 【虹科分享】用Redis为LangChain定制AI代理——OpenGPTs
    penAI最近推出了OpenAIGPTs——一个构建定制化AI代理的无代码“应用商店”,随后LangChain开发了类似的开源工具OpenGPTs。OpenGPTs是一款低代码的开源框架,专用于构建定制化的人工智能代理。因为Redis具有高速和稳定性的优点,所以LangChain选择了Redis来作为OpenGPTs的默认向量数据......
  • LangChain第一个稳定版本重磅发布
    LangChain的第一个稳定版本,即LangChain0.1.0,于2024年1月8日正式发布,这是一个值得庆祝的里程碑,也是LangChain项目的一个新的起点。在这个版本中,LangChain引入了许多重要的特性、架构变化、版本规范和发展方向,为LLM应用的开发者和用户带来了更好的体验和性能。在本文......
  • Finance_金蝶KIS专业版全模块精讲
    金蝶KIS专业版全模块精讲https://www.bilibili.com/video/BV19Y4y1X7DD?p=5&vd_source=8b9de621639420a0ceb703aceed712f7  第2节、公共基础设置新增部门 新增用户      第5节、固定资产  ......
  • TUniGUIMainModule.EnableSynchronousOperations 属性
    TUniGUIMainModule.EnableSynchronousOperations属性与所有其他Web应用服务器类似,uniGUI框架采用异步操作模式。在此模式下,请求由服务器处理,响应处理完毕后立即发送回客户端。例如,当用户按下客户端屏幕上的按钮时,就会生成Ajax请求,服务器将处理关联的OnButtonClick()事件。一旦......