สร้างกฎสำหรับโปรแกรมที่ปรึกษาด้านการเพิ่มประสิทธิภาพ
บทความนี้อธิบายวิธีการสร้างกฎใหม่สำหรับ โปรแกรมช่วยแนะนำการปรับให้เหมาะสม ตัวอย่างเช่น คุณสามารถสร้างกฎใหม่ที่ระบุกรณีของคำขอใบเสนอราคา (RFQ) ที่มีชื่อเรื่องแบบว่างเปล่า การใช้ชื่อในกรณีทำให้สามารถระบุและสามารถค้นหาได้ง่าย ขณะที่ค่อนข้างอย่างง่าย ตัวอย่างนี้แสดงสิ่งที่สามารถทำได้ด้วยกฎการปรับให้เหมาะสม
กฎ เป็นการตรวจสอบข้อมูลแอพลิเคชัน ถ้าเป็นไปตามเงื่อนไขที่กฎประเมิน จะมีการสร้างโอกาสในการเพิ่มประสิทธิภาพกระบวนการ หรือปรับปรุงข้อมูล โอกาสที่สามารถดำเนินการ และอีกทางหนึ่งคือ สามารถวัดผลกระทบของการดำเนินการได้
ในการสร้างกฎใหม่สำหรับ โปรแกรมช่วยแนะนำการปรับให้เหมาะสม เพิ่มคลาสใหม่ที่ขยายคลาสนามธรรม SelfHealingRule ใช้อินเทอร์เฟส IDiagnosticsRule และถูกตกแต่งโดยแอตทริบิวต์ DiagnosticRule คลาสต้องมีวิธีที่ถูกตกแต่งด้วยแอตทริบิวต์ DiagnosticsRuleSubscription ตามแบบแผน ซึ่งเสร็จสิ้นในวิธี opportunityTitle ซึ่งจะกล่าวถึงในภายหลัง คลาสใหม่นี้สามารถถูกเพิ่มไปยังแบบจำลองที่กำหนดเองที่มีการขึ้นต่อกันในแบบจำลอง SelfHealingRules ได้ ในตัวอย่างต่อไปนี้ กฎที่กำลังถูกใช้ เรียกว่า RFQTitleSelfHealingRule
[DiagnosticsRule]
public final class RFQTitleSelfHealingRule extends SelfHealingRule implements IDiagnosticsRule
{
…
}
คลาสนามธรรม SelfHealingRule มีวิธีการนามธรรมที่ต้องดำเนินการในคลาสที่สืบทอด หลักคือ วิธี ประเมิน ซึ่งส่งกลับรายการของโอกาสที่ระบุโดยกฎ โอกาสสามารถเป็นต่อนิติบุคคล หรือสามารถนำไปใช้กับทั้งระบบได้
protected List evaluate()
{
List results = new List(Types::Record);
DataArea dataArea;
while select id from dataArea
where !dataArea.isVirtual
{
changecompany(dataArea.id)
{
container result = this.findRFQCasesWithEmptyTitle();
if (conLen(result) > 0)
{
SelfHealingOpportunity opportunity = this.getOpportunityForCompany(dataArea.Id);
opportunity.EvaluationState = SelfHealingEvaluationState::Evaluated;
opportunity.Data = result;
opportunity.OpportunityDate = DateTimeUtil::utcNow();
results.addEnd(opportunity);
}
}
}
return results;
}
วิธีการที่แสดงไว้ข้างบนวนผ่านบริษัทและเลือกกรณี RFQ ที่มีชื่อเรื่องแบบว่างเปล่าในวิธี findRFQCasesWithEmptyTitle ถ้ามีการพบกรณีดังกล่าวอย่างน้อยหนึ่งกรณี โอกาสทางการขายเฉพาะบริษัทจะถูกสร้างขึ้นด้วยวิธี getOpportunityForCompany สังเกตว่า ฟิลด์ ข้อมูล ในตาราง SelfHealingOpportunity เป็นชนิด คอนเทนเนอร์ และดังนั้นจึงสามารถประกอบด้วยข้อมูลที่เกี่ยวข้องกับตรรกะเฉพาะสำหรับกฎนี้ การตั้งค่า OpportunityDate ด้วยการประทับเวลาปัจจุบันจะลงทะเบียนเวลาของการประเมินล่าสุดของโอกาส
โอกาสทางการขายอาจเป็นระหว่างบริษัทได้ด้วย ในกรณีนี้ ลูปที่ผ่านบริษัทไม่จำเป็น และต้องมีการสร้างโอกาสด้วยวิธี getOpportunityAcrossCompanies
โค้ดต่อไปนี้แสดงวิธี findRFQCasesWithEmptyTitle ซึ่งส่งกลับรหัสของกรณี RFQ ที่มีชื่อที่ว่างเปล่า
private container findRFQCasesWithEmptyTitle()
{
container result;
PurchRFQCaseTable rfqCase;
while select RFQCaseId from rfqCase
where rfqCase.Name == ''
{
result += rfqCase.RFQCaseId;
}
return result;
}
วิธีเพิ่มเติมที่ต้องถูกนำมาใช้คือ opportunityTitle และ opportunityDetails ค่าเดิมคืนค่าชื่อเรื่องแบบสั้นสำหรับโอกาส ค่าหลังส่งคืนคำอธิบายโดยละเอียดของโอกาสทางการขาย ซึ่งยังสามารถมีข้อมูลอยู่ได้ด้วย
ชื่อเรื่องที่ส่งคืนโดย opportunityTitle ปรากฏอยู่ภายใต้คอลัมน์ โอกาสในการปรับให้เหมาะสม ในพื้นที่ทำงาน โปรแกรมช่วยแนะนำการปรับให้เหมาะสม นอกจากนี้ยังปรากฏเป็นส่วนหัวของบานหน้าต่างด้านข้างที่แสดงข้อมูลเพิ่มเติมเกี่ยวกับโอกาสด้วย ตามแบบแผน วิธีการนี้ถูกปรับปรุงด้วยแอตทริบิวต์ DiagnosticRuleSubscription ซึ่งใช้อาร์กิวเมนต์ดังต่อไปนี้:
พื้นที่วิเคราะห์ – enum ของชนิด DiagnosticArea ซึ่งอธิบายถึงพื้นที่ของแอพลิเคชันที่มีกฎนี้อยู่ เช่น DiagnosticArea::SCM
ชื่อ กฎ– สตริงที่มีชื่อกฎ นี่จะปรากฏขึ้นภายใต้คอลัมน์ ชื่อกฎ ในแบบฟอร์ม กฎการตรวจสอบความถูกต้องของการวิเคราะห์ (DiagnosticsValidationRuleMaintain)
ความถี่ของการ รัน– enum การวินิจฉัย ชนิด DiagnosticRunFrequency ที่อธิบายความถี่ในการรันกฎ เช่น DiagnosticRunFrequency::ทุกวัน
อธิบายกฎ – สตริงที่มีข้อความอธิบายที่ละเอียดมากขึ้นของกฎ นี่จะปรากฏขึ้นภายใต้คอลัมน์ คำอธิบายกฎ ในแบบฟอร์ม กฎการตรวจสอบความถูกต้องของการวิเคราะห์ (DiagnosticsValidationRuleMaintain)
หมายเหตุ
แอตทริบิวต์ DiagnosticRuleSubscription จำเป็นสำหรับกฎในการทำงาน โดยทั่วไป จะมีการใช้ใน opportunityTitle แต่จะสามารถตกแต่งวิธีใดๆ ของคลาสได้
รายการต่อไปนี้เป็นการนำไปใช้แบบตัวอย่าง มีการใช้สตริงการดิบสำหรับความเรียบง่าย แต่การใช้งานที่ถูกต้องต้องมีป้ายชื่อ
[DiagnosticsRuleSubscription(DiagnosticsArea::SCM,
'Assign titles to Request for Quotation cases',
DiagnosticsRunFrequency::Daily,
'This rule detects Requests for Quotation with empty titles.')]
public str opportunityTitle()
{
return 'Assign titles to Request for Quotation cases';
}
คำอธิบายที่ส่งคืนโดย opportunityDetails ปรากฏในบานหน้าต่างด้านข้างที่แสดงข้อมูลเพิ่มเติมเกี่ยวกับโอกาส นี่จะใช้อาร์กิวเมนต์ SelfHealingOpportunity ซึ่งก็คือฟิลด์ ข้อมูล ที่สามารถใช้เพื่อระบุรายละเอียดเพิ่มเติมเกี่ยวกับโอกาสได้ ในตัวอย่าง วิธีส่งคืนรหัสของกรณี RFQ ที่มีชื่อเรื่องแบบว่างเปล่า
public str opportunityDetails(SelfHealingOpportunity _opportunity)
{
str details = '';
container opportunityData = _opportunity.Data;
int affectedRFQCasesCount = conLen(opportunityData);
if (affectedRFQCasesCount != 0)
{
details = 'The following Request for Quotation cases have an empty title:\n';
for (int i = 1; i <= affectedRFQCasesCount ; i++)
{
PurchRFQCaseId rfqCaseId = conPeek(opportunityData, i);
details += rfqCaseId + '\n';
}
}
return details;
}
วิธีการนามธรรมที่คงเหลือสองวิธีในการนำไปใช้คือ provideHealingAction และ securityMenuItem
provideHealingAction จะส่งคืนจริงถ้ามีการจัดเตรียมการส่งเสริมการขาย มิฉะนั้น การส่งคืนค่าเท็จ ถ้ามีการส่งคืนค่าจริง วิธีการ performAction ต้องถูกนำมาใช้ได้ หรือจะมีข้อผิดพลาดแสดงขึ้น วิธีการ performAction ใช้อาร์กิวเมนต์ SelfHealingOpportunity ที่ซึ่งสามารถใช้ข้อมูลสำหรับการดำเนินการได้ ในตัวอย่าง การดำเนินการเปิด PurchRFQCaseTableListPage สำหรับการแก้ไขด้วยตนเอง
public boolean providesHealingAction()
{
return true;
}
protected void performAction(SelfHealingOpportunity _opportunity)
{
new MenuFunction(menuItemDisplayStr(PurchRFQCaseTableListPage), MenuItemType::Display).run();
}
โดยขึ้นอยู่กับข้อกำหนดของกฎ อาจสามารถที่จะดำเนินการโดยอัตโนมัติโดยใช้ข้อมูลโอกาสได้ ในตัวอย่างนี้ ระบบสามารถสร้างชื่อเรื่องสำหรับกรณี RFQ ได้โดยอัตโนมัติ
securityMenuItem จะส่งคืนชื่อของรายการเมนูการปฏิบัติการ เช่น กฎสามารถมองเห็นได้เฉพาะผู้ใช้ที่สามารถเข้าถึงรายการเมนูการปฏิบัติการเท่านั้น ความปลอดภัยอาจต้องการให้กฎเฉพาะและโอกาสจะสามารถเข้าถึงผู้ใช้ที่ได้รับอนุญาตเท่านั้น ในตัวอย่าง เฉพาะผู้ใช้ที่มีการเข้าถึง PurchRFQCaseTitleAction สามารถดูโอกาสได้ สังเกตว่า รายการเมนูการดำเนินการนี้ถูกสร้างขึ้นสำหรับตัวอย่างนี้ และถูกเพิ่มเป็นจุดเข้าใช้งานสำหรับสิทธิ์ความปลอดภัย PurchRFQCaseTableMaintain
หมายเหตุ
รายการเมนูต้องเป็นรายการเมนูการดำเนินการเพื่อให้ความปลอดภัยทำงานอย่างถูกต้อง ชนิดรายการเมนูอื่นๆ เช่น แสดงรายการเมนู จะไม่ทำงานอย่างถูกต้อง
public MenuName securityMenuItem()
{
return menuItemActionStr(PurchRFQCaseTitleAction);
}
หลังจากที่มีการคอมไพล์กฎ ดำเนินการงานต่อไปนี้เพื่อให้แสดงในอินเทอร์เฟสผู้ใช้ (UI)
class ScanNewRulesJob
{
public static void main(Args _args)
{
SysExtensionCache::clearAllScopes();
var controller = new DiagnosticsRuleController();
controller.runOperation();
}
}
กฎจะแสดงในแบบฟอร์ม กฎการตรวจสอบความถูกต้องของการวิเคราะห์ ที่พร้อมใช้งานจาก การดูแลระบบ>งานประจำงวด>รักษากฎการตรวจสอบความถูกต้องของการวิเคราะห์ เพื่อการให้มีการประเมิน ไปที่ การดูแลระบบ>งานประจำงวด>กฎการตรวจสอบความถูกต้องของการวิเคราะห์ของกำหนดการ เลือกความถี่ของกฎ เช่น รายวัน คลิก ตกลง ไปยัง การดูแลระบบ>โปรแกรมช่วยแนะนำการปรับให้เหมาะสม เพื่อดูโอกาสใหม่
ตัวอย่างต่อไปนี้คือ ส่วนเล็กๆ ของโค้ดที่มีโครงสร้างของกฎซึ่งรวมถึงวิธีและแอตทริบิวต์ที่จำเป็นทั้งหมด จะช่วยคุณในการเริ่มต้นใช้งานด้วยการเขียนกฎใหม่ ฉลากและรายการเมนูการดำเนินการที่ถูกใช้ในตัวอย่าง ถูกใช้เพื่อวัตถุประสงค์การสาธิตเท่านั้น
[DiagnosticsRuleAttribute]
public final class SkeletonSelfHealingRule extends SelfHealingRule implements IDiagnosticsRule
{
[DiagnosticsRuleSubscription(DiagnosticsArea::SCM,
"@SkeletonRuleLabels:SkeletonRuleTitle", // Label with the title of the rule
DiagnosticsRunFrequency::Monthly,
"@SkeletonRuleLabels:SkeletonRuleDescription")] // Label with a description of the rule
public str opportunityTitle()
{
// Return a label with the title of the opportunity
return "@SkeletonRuleLabels:SkeletonOpportunityTitle";
}
public str opportunityDetails(SelfHealingOpportunity _opportunity)
{
str details = "";
// Use _opportunity.data to provide details on the opportunity
return details;
}
protected List evaluate()
{
List results = new List(Types::Record);
// Write here the core logic of the rule
// When creating an opportunity, use:
// * this.getOpportunityForCompany() for company specific opportunities
// * this.getOpportunityAcrossCompanies() for cross-company opportunities
return results;
}
public boolean providesHealingAction()
{
return true;
}
protected void performAction(SelfHealingOpportunity _opportunity)
{
// Place here the code that performs the healing action
// To open a form, use the following:
// new MenuFunction(menuItemDisplayStr(SkeletonRuleDisplayMenuItem), MenuItemType::Display).run();
}
public MenuName securityMenuItem()
{
return menuItemActionStr(SkeletonRuleActionMenuItem);
}
}
สำหรับข้อมูลเพิ่มเติม ดูวิดีโอ YouTube แบบสั้น: ผู้แนะนำการเพิ่มประสิทธิภาพใน Dynamics 365 Finance