BP只是给出一些建议,这些建议在通常情况下是成立的,但是在某些特殊的场景下,这些BP可能并不适合。
同样一条BP,可能在其他场景下需要检查,这个时候就需要根据具体的代码去决定是否忽略BP,而不是整条BP规则全部忽略。
在AX2012及以前版本是通过在代码里添加注释 //BP deviation documented来告诉BP这段代码是有充足理由忽略BP的。
D365 FO显然 更完善了, 它提供了两种特定场景下忽略BP的方法。
对于某个方法想要忽略特定的BP规则,可以在方法体上通过SuppressBPWarning这个Atrribute来忽略BP。
1 [SuppressBPWarning("BPCheckInsertMethodInLoop", "因为覆盖了表的insert方法,导致RecordInsertList降级,所以不采用此方法。")] 2 public static void main(Args _args) 3 { 4 BulkInsertTest bulkInsertTest; 5 6 ttsbegin; 7 for (int i = 0 ; i < 100; i++) 8 { 9 bulkInsertTest.ItemName = "品名" + int2Str(i); 10 bulkInsertTest.insert(); 11 } 12 ttscommit; 13 }
SuppressBPWarning这个属性有两个变量,一个是要忽略的BP检查的名字,代码里如果有BP警告,会提示BP检查的名字,另一个是忽略的理由。
如果一个方法要忽略多个BP检查规则,多写几个。
1 [SuppressBPWarning("BPCheckInsertMethodInLoop", 2 "因为覆盖了表的insert方法,导致RecordInsertList降级,所以不采用此方法。"), 3 SuppressBPWarning("BPUpgradeCodeSystemDate", "Just For Test")] 4 public static void main(Args _args) 5 { 6 BulkInsertTest bulkInsertTest; 7 8 TransDate transDate = systemDateGet(); 9 10 ttsbegin; 11 for (int i = 0 ; i < 100; i++) 12 { 13 14 bulkInsertTest.ItemName = "品名" + int2Str(i); 15 bulkInsertTest.insert(); 16 } 17 ttscommit; 18 }
想在方法中忽略所有的BP检查,就直接属性SupressBPWarning,不带入参就可以了。
对于表的属性和窗体的属性的BP就没办法通过代码属性的办法忽略BP检查,D365 FO提供了通过XML设置的方式忽略BP检查。
对于新建的model,需要在model对应的文件夹中的子文件夹AxIgnoreDiagnosticList中创建一个[Model名字]_BPSuppressions.xml的文件,如下图所示:
然后就可以在VS中的项目中点右键编辑了。
针对不同的BPRule增加Diagnotic节点就可以了。
1 <?xml version="1.0" encoding="utf-8"?> 2 <IgnoreDiagnostics> 3 <Name>ModelName_BPSuppressions</Name> 4 <Items> 5 <Diagnostic>e 6 <DiagnosticType>BestPractices</DiagnosticType> 7 <Severity>Warning</Severity> 8 <Path>dynamics://Form/SomeForm/FormDesign/FormDesign/FormTabControl/FormTabControl/FormTabPageControl/FormTabPageControlTable111</Path> 9 <Moniker>SomeBPRule</Moniker> 10 <Message>BPRule Info</Message> 11 <Justification></Justification> 12 </Diagnostic> 13 </Items> 14 </IgnoreDiagnostics>
其中Path,Moniker和Message在BP警告里都可以找到,Justification写出自己忽略BP规则的理由。
其实这个Message没什么必要,只要知道Moniker就知道具体是哪个BP规则了,没必要再把Message拷贝过来了,AX自带的Supression.xml文件里有一些是不包含Message节点的。
我自己用的时候(版本10.0.0.10)发现添加了这个Message节点后,就没办法忽略BP规则了,去掉Message节点以后一切正常,所以还是不要再拷贝一次Message的信息了。