从账单和调整屏幕上的按钮弹出自定义Acumatica屏幕

从账单和调整屏幕上的按钮弹出自定义Acumatica屏幕,acumatica,Acumatica,我有一个完全定制的屏幕,有自己的BLC和DAC,我想从“账单和调整”屏幕上的按钮将其作为弹出窗口打开。我将其编码如下: public class APInvoiceEntryExt : PXGraphExtension<APInvoiceEntry> { public PXAction<APInvoice> LaunchOpenSource; [PXButton(CommitChanges = true)] [PXUIField(DisplayN

我有一个完全定制的屏幕,有自己的BLC和DAC,我想从“账单和调整”屏幕上的按钮将其作为弹出窗口打开。我将其编码如下:

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
                };
            }
        }
    }
}               
公共类APInvoiceEntryExt:PXGraphExtension


我已将使用OpenSourceDataMaint BLC的屏幕的所有相关权限设置为“按角色访问权限”、“按用户访问权限”和“按屏幕访问权限”中的“删除”。没有任何区别。

看起来DataSource正在尝试从OpenSourceDataMaint类中查找GraphType等于全名的站点地图中的节点,但失败:

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页面中的
PXDataSource
是否正确定义了
TypeName
?另外,请检查Cst_发布的文件夹中是否也存在自定义Aspx页面,以及为
PXDataSource.TypeName
属性设置的值在页面和Cst_发布的文件夹中是否相同

还有一件事需要检查,站点地图屏幕是否为您的自定义屏幕显示了正确的图形名称如果你能提供一个屏幕截图进行验证,这将是有益的


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

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

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)
        {
            AssistantController.OpenSourceDataMaint graph = PXGraph.CreateInstance<AssistantController.OpenSourceDataMaint>();
            graph.OpenSourceDataHeader.Current = graph.OpenSourceDataHeader.Search<AssistantController.xTACOpenSourceHeader.openSourceName
                                                                                  ,AssistantController.xTACOpenSourceHeader.dataID>("Bills and Adjustments", apinvoice.RefNbr);

            throw new PXRedirectRequiredException(graph, "Open Source")
            {
                Mode = PXBaseRedirectException.WindowMode.NewWindow
            };
        }
    }
}
公共类APInvoiceEntryExt:PXGraphExtension
{
公共行动启动开源;
[PXButton(CommitChanges=true)]
[PXUIField(DisplayName=“开源”)]
受保护的void launchOpenSource()
{
APInvoice APInvoice=(APInvoice)Base.Document.Current;
如果(apinvoice!=null)
{
AssistantController.OpenSourceDataMaint graph=PXGraph.CreateInstance();
graph.OpenSourceDataHeader.Current=graph.OpenSourceDataHeader.Search(“账单和调整”,apinvoice.RefNbr);
抛出新的PXRedirectRequiredException(图“开源”)
{
模式=PXBaseRedirectException.WindowMode.NewWindow
};
}
}
}

Ruslan-我找到了一个解决方案,就是将代码放在customization manager的代码窗口中,而不是放在网站引用的类库项目中。我不确定如何将其作为类库项目来执行,因为它需要对已发布的自定义项(我们的自定义屏幕、BLC和DAC)进行引用。当您将其放入Acumatica的代码窗口中时,我们发布的自定义/新屏幕自定义已经存在,因此引用是有效的。