按钮未显示在用户界面中

时间:2018-10-02 17:23:08

标签: acumatica

我正在扩展AccountByPeriodEnq逻辑,我只想在屏幕上方添加一个按钮来修改所选的GL记录,但它只是不想显示,所以我不知道为什么。

这是我的代码:

namespace PX.Objects.GL
{
    class AccountByPeriodEnqExtensions : PXGraphExtension<AccountByPeriodEnq>
    {
        #region Actions
        public PXAction<AccountByPeriodFilter> Letter;
        [PXUIField(Visible = true, DisplayName = "Lettrer")]
        [PXButton(CommitChanges = true)]
        protected virtual IEnumerable letter(PXAdapter adapter)
        {
            IReadOnlyCollection<GLTranR> selectedTrans = GetSelectedTrans();

            if (selectedTrans.Any())
            {
                PXLongOperation.StartOperation(this, delegate ()
                {
                    foreach(GLTranR line in selectedTrans)
                    {
                        // UpdateSomeFieldsAndPersists
                    }
                });
            }
            else
            {
                throw new PXException("Error");
            }

            return Base.Filter.Select();
        }
        #endregion

        #region Utility
        private IReadOnlyCollection<GLTranR> GetSelectedTrans()
        {
            return Base.GLTranEnq.Cache.Updated
                .Cast<GLTranR>()
                .Where(tran => tran.Selected == true)
                .ToArray();
        }
        #endregion
    }
}

在这里我想念什么吗?

关于

编辑:

为澄清起见,我正在尝试自定义GL404000,帐户详细信息。并且使用检查器,我看到了业务逻辑在AccountByPeriodEnq图

2 个答案:

答案 0 :(得分:2)

使用Acumatica Inspect Element功能时,请注意“按期间计帐”屏幕(GL402000)未使用“ AccountByPeriodEnq”图。

它使用的是“ AccountHistoryByYearEnq”图,因此这就是您要定位的图:

enter image description here

您还需要在该图的主DAC上声明操作。

“ AccountHistoryByYearEnq”的名称比平常更难找到。

您可以使用Acumatica源代码页面并搜索'PXPrimaryGraph(typeof(AccountHistoryByYearEnq)':

enter image description here

在这种情况下,应使用AccountByYearFilter DAC:

[System.SerializableAttribute()]
[PXCacheName(Messages.Account)]
[PXPrimaryGraph(typeof(AccountHistoryByYearEnq), Filter = typeof(AccountByYearFilter))]
public partial class Account : PX.Data.IBqlTable, PX.SM.IIncludable
{
  […]
}

我认为这是过滤器的一种特殊情况,因为如果没有过滤器,则帐户将是用于操作的DAC。


现在您已经确定了屏幕的主图(AccountHistoryByYearEnq)和图的主DAC(AccountByYearFilter),它应该可以按预期工作:

public class AccountByPeriodEnq_Extension : PXGraphExtension<AccountHistoryByYearEnq>
{
  public PXAction<AccountByYearFilter> letter;

  [PXUIField(DisplayName = "Letter")]
  [PXButton]
  protected virtual IEnumerable Letter(PXAdapter adapter)
  {
      return adapter.Get();
  }
}

UI: enter image description here


编辑:

对于“帐户详细信息”页面(GL404000),请对不同的DAC和图形使用相同的代码:

using PX.Data;
using System.Collections;

namespace PX.Objects.GL
{
  public class AccountByPeriodEnq_Extension : PXGraphExtension<AccountByPeriodEnq>
  {
      #region Actions
      public PXAction<AccountByPeriodFilter> letter;

      [PXUIField(DisplayName = "Letter")]
      [PXButton]
      protected virtual IEnumerable Letter(PXAdapter adapter)
      {
          return adapter.Get();
      }
      #endregion
  }
}

通过基本的Acumatica安装,即可显示操作: enter image description here

请注意,您可以为按钮控件指定显式状态和查看权限,尽管如果您在开发人员实例中工作,我认为您的问题与访问权限无关:

[PXUIField(DisplayName = "Letter", 
           MapEnableRights = PXCacheRights.Select, 
           MapViewRights = PXCacheRights.Select)]

答案 1 :(得分:0)

我终于找到了问题,我错过了上课的公开成员。

namespace PX.Objects.GL
{
    public class AccountByPeriodEnqExtensions : PXGraphExtension<AccountByPeriodEnq>
    {
        #region Actions
        public PXAction<AccountByPeriodFilter> Letter;

感谢您回答HB,我会重用它。