从“结算和调整”屏幕上的按钮打开自定义Acumatica屏幕作为弹出窗口

时间:2017-01-13 16:46:27

标签: acumatica

我有一个完全自定义的屏幕,有自己的BLC和DAC,我想从“Bills and Adjustments”屏幕上的按钮打开它作为弹出窗口。我把它编码如下:

public class APInvoiceEntryExt : PXGraphExtension<APInvoiceEntry>
{

    public PXAction<APInvoice> LaunchOpenSource;
    [PXButton(CommitChanges = true)]
    [PXUIField(DisplayName = "Open Source")]

    protected void launchOpenSource()
    {
        APInvoice apinvoice = (APInvoice)Base.Document.Current;

        if (apinvoice != null)
        {

            //var url = "http://localhost/AcumaticaDB2562/?ScreenId=AC302000&OpenSourceName=Bills+and+Adjustments&DataID=" + apinvoice.RefNbr;
            OpenSourceDataMaint graph = PXGraph.CreateInstance<OpenSourceDataMaint>();
            graph.OpenSourceDataHeader.Current = graph.OpenSourceDataHeader.Search<xTACOpenSourceHeader.openSourceName, xTACOpenSourceHeader.dataID>("Bills and Adjustments", apinvoice.RefNbr);

            if (graph.OpenSourceDataHeader.Current != null)
            {
                throw new PXRedirectRequiredException(graph, "Open Source")
                {
                    Mode = PXBaseRedirectException.WindowMode.NewWindow
                };
            }
        }
    }
}               

我已经在我用于自定义&#39; Bills and Adjustments&#39;的班级图书馆项目中为我的自定义屏幕添加了所有相关的DAC和BLC。屏幕我添加按钮。

我遇到的问题是,启动按钮时出现以下错误消息:

enter image description here

我已为使用OpenSourceDataMaint BLC的屏幕设置了所有相关权限,以便删除&#39; “按角色访问权限”,“按用户访问权限”和“按屏幕访问权限”#39;访问权限按用户&#39;没有任何区别。

2 个答案:

答案 0 :(得分:0)

看起来DataSource正在尝试在SiteMap中找到一个节点,其GraphType等于您的OpenSourceDataMaint类的全名并且失败:

public class PXBaseDataSource : DataSourceControl, IAttributeAccessor, INamingContainer, ICompositeControlDesignerAccessor, ICommandSource, IPXCallbackHandler, IPXScriptControl, IPXCallbackUpdatable, IPostBackDataHandler
{
    ...

    private static string getFormUrl(Type graphType)
    {
        PXSiteMapNode node = getSiteMapNode(graphType);
        if (node == null)
        {
            throw new PXException(string.Format(ErrorMessages.GetLocal(ErrorMessages.NotEnoughRightsToAccessObject), graphType.Name));
        }
        String url = node.Url;
        //if (url.Contains("unum=")) url = PXUrl.IgnoreQueryParameter(url, "unum");
        return PXUrl.TrimUrl(url);
    }

    ...
}

是否可以检查自定义Aspx页面中TypeName是否已正确定义PXDataSource?您也可以检查一下您的自定义Aspx页面是否也存在于Cst_Published文件夹中,并且如果在{和1}}属性中设置的值在Pages和Cst_Published文件夹中是否相同?

还有一件事要检查,“站点地图”屏幕是否为您的自定义屏幕显示正确的GraphName? - 如果您可以提供屏幕截图进行验证,将会很有用。

如果可能,请提供可在本地发布的自定义包(即使是已编译的程序集) - 这将大大加快调查过程。

答案 1 :(得分:0)

对我来说,解决方案是将代码(如下所示)放在自定义窗口中,而不是Visual Studio中的类库项目中。由于代码需要引用另一个已发布的自定义,因此将其置于Acumatica代码窗口中可以解决此问题。在我的类库项目中没有引用已发布的自定义屏幕自定义,这显然会导致问题 - 我不知道如何处理它。

<div id="container"></div>

<script type="text/javascript">
    $.ajax({
        url: 'https://YourBlog/feeds/posts/default',
        type: 'get',
        dataType: 'xml',
        success: function (xml) {
            $(xml).find('entry').each(function(t) {
                $('#container').append('<div>' + $(this).find('title').text() + '</div>');
            });
        }
    });
</script>