在自定义项目中包含自动化计划定义

时间:2018-02-16 21:50:38

标签: automation customization acumatica

我有一个通常会安排的处理屏幕。我想在自定义项目中包含一个非活动的计划定义,以使客户更容易。我无法在自定义屏幕中找到该选项以添加自动化。有什么办法吗?

1 个答案:

答案 0 :(得分:1)

如果没有开箱即用的选项将特定实体包含到自定义项目中,您可以创建一个自定义插件,该插件将在发布过程结束时执行。该插件可用于与DAC和Graph一起使用,以根据需要插入,更新,删除数据。这是首选使用SQL脚本作为其DBMS中立(适用于SQL Server或MySQL)。

这是一篇将插件添加到自定义项目的帮助文章: To Add a Customization Plug-In to a Project

对于添加自动日程安排的具体问题,您可以使用与该页面相关的图表AUScheduleMaint。下面是一个工作示例,如果计划尚不存在,则将 Release IN Documents(IN501000)添加为非活动计划。替换屏幕ID和描述以满足您的需求。如果您需要默认的其他计划设置,请根据需要修改AUSchedule的插入。

public class MyCustomPlugin : CustomizationPlugin
{

    //This method executed after customization was published and website was restarted.  
    public override void UpdateDatabase()
    {
        CreateSchedule("IN501000", "My New IN501000 Schedule");
    }

    /// <summary>
    /// Create a schedule for a given screen if the screen doesn't have a schedule
    /// </summary>
    /// <param name="screenID">Sitemap screen ID</param>
    /// <param name="scheduleDesc">Schedule description when creating a new schedule</param>
    protected virtual void CreateSchedule(string screenID, string scheduleDesc)
    {
        if (string.IsNullOrWhiteSpace(screenID))
        {
            throw new ArgumentNullException("screenID");
        }

        if (string.IsNullOrWhiteSpace(scheduleDesc))
        {
            throw new ArgumentNullException("scheduleDesc");
        }

        var auScheduleGraph = PXGraph.CreateInstance<PX.SM.AUScheduleMaint>();

        var schedule = FindScheduleByScreen(auScheduleGraph, screenID);

        if (schedule != null)
        {
            //schedule exists, no need to create...
            return;
        }

        auScheduleGraph.Schedule.Insert(new PX.SM.AUSchedule
        {
            ScreenID = screenID,
            Description = scheduleDesc,
            IsActive = false,
            StartTime = PX.Common.PXTimeZoneInfo.UtcNow
        });

        auScheduleGraph.Actions.PressSave();

        this.WriteLog(string.Format("Created automation schedule '{0}' for screen '{1}'", scheduleDesc, screenID));
    }

    /// <summary>
    /// Find an automation schedule by screen ID
    /// </summary>
    /// <param name="graph"></param>
    /// <param name="screenID"></param>
    /// <returns></returns>
    protected virtual PX.SM.AUSchedule FindScheduleByScreen(PXGraph graph, string screenID)
    {
        PX.SM.AUSchedule auSchedule = null;

        foreach (PX.SM.AUSchedule result in PXSelect<PX.SM.AUSchedule, Where<PX.SM.AUSchedule.screenID, Equal<Required<PX.SM.AUSchedule.screenID>>>>.Select(graph, screenID))
        {
            if (auSchedule == null)
            {
                auSchedule = result;
                continue;
            }

            if (result.IsActive.GetValueOrDefault() && !auSchedule.IsActive.GetValueOrDefault())
            {
                //Find an active if possible
                auSchedule = result;
            }
        }

        return auSchedule;
    }
}