如何在网格视图委托中覆盖“帐单和调整项”屏幕的AddPOReceipt按钮

时间:2020-02-04 17:34:50

标签: acumatica

我们有一个要求,在“帐单类型”的“ AddPoReceipt”按钮的网格中仅显示“收据类型”,因为我试图覆盖如下所示的网格视图委托,但未能加载屏幕,也无法为此创建扩展图,请看看下面的代码也可以帮助我解决这个问题

预先感谢

public class AddPOReceiptExtensionExt : AddPOReceiptExtension
   {
       [PXOverride]
       public  IEnumerable pOreceiptslist()
       {
           APInvoice doc = Base.Document.Current;
           if (doc?.VendorID == null
               || doc.VendorLocationID == null
               || doc.DocType != APDocType.Invoice
               && doc.DocType != APDocType.DebitAdj)
           {
               yield break;
           }

           string poReceiptType = doc.DocType == APDocType.Invoice
               ? POReceiptType.POReceipt
               : POReceiptType.POReturn;

           Dictionary<APTran, int> usedReceipt = new Dictionary<APTran, int>(new POReceiptComparer());

           int count;
           foreach (APTran aPTran in Base.Transactions.Cache.Inserted)
           {
               if (aPTran.ReceiptNbr != null)
               {
                   usedReceipt.TryGetValue(aPTran, out count);
                   usedReceipt[aPTran] = count + 1;
               }
           }

           foreach (APTran aPTran in Base.Transactions.Cache.Deleted)
           {
               if (aPTran.ReceiptNbr != null && Base.Transactions.Cache.GetStatus(aPTran) != PXEntryStatus.InsertedDeleted)
               {
                   usedReceipt.TryGetValue(aPTran, out count);
                   usedReceipt[aPTran] = count - 1;
               }
           }

           foreach (APTran aPTran in Base.Transactions.Cache.Updated)
           {
               string originalValue = (string)Base.Transactions.Cache.GetValueOriginal<APTran.receiptNbr>(aPTran);
               if (aPTran.ReceiptNbr != originalValue)
               {
                   if (originalValue != null)
                   {
                       APTran originTran = new APTran { ReceiptNbr = originalValue };
                       usedReceipt.TryGetValue(originTran, out count);
                       usedReceipt[originTran] = count - 1;
                   }
                   if (aPTran.ReceiptNbr != null)
                   {
                       usedReceipt.TryGetValue(aPTran, out count);
                       usedReceipt[aPTran] = count + 1;
                   }
               }
           }

           PXSelectBase<POReceipt> cmd = new PXSelectJoinGroupBy<
               POReceipt,
               InnerJoin<POReceiptLineS, On<POReceiptLineS.receiptNbr, Equal<POReceipt.receiptNbr>>,
               LeftJoin<APTran, On<APTran.released, Equal<False>,
                   And<Where<POReceiptLineS.pOAccrualType, Equal<POAccrualType.receipt>,
                       And<APTran.receiptNbr, Equal<POReceiptLineS.receiptNbr>,
                       And<APTran.receiptType, Equal<POReceiptLineS.receiptType>,
                       And<APTran.receiptLineNbr, Equal<POReceiptLineS.lineNbr>,
                   Or<POReceiptLineS.pOAccrualType, Equal<POAccrualType.order>,
                       And<APTran.pOOrderType, Equal<POReceiptLineS.pOType>,
                       And<APTran.pONbr, Equal<POReceiptLineS.pONbr>,
                       And<APTran.pOLineNbr, Equal<POReceiptLineS.pOLineNbr>>>>>>>>>>>>>,
               Where<POReceipt.hold, Equal<False>,
                    And<POReceipt.released, Equal<True>,
                    And<POReceipt.receiptType, Equal<Required<POReceipt.receiptType>>,
                    And<APTran.refNbr, IsNull,
                    And<POReceiptLineS.unbilledQty, Greater<decimal0>,
                    And<Where<POReceiptLineS.pONbr, Equal<Current<POReceiptFilter.orderNbr>>,
                       Or<Current<POReceiptFilter.orderNbr>, IsNull>>>>>>>>,
               Aggregate<
                   GroupBy<POReceipt.receiptType,
                   GroupBy<POReceipt.receiptNbr,
                   Sum<POReceiptLineS.receiptQty,
                   Sum<POReceiptLineS.unbilledQty,
                   Count<POReceiptLineS.lineNbr>>>>>>>(Base);

           if (Base.APSetup.Current.RequireSingleProjectPerDocument == true)
           {
               cmd.WhereAnd<Where<POReceipt.projectID, Equal<Current<APInvoice.projectID>>>>();
           }

           if (PXAccess.FeatureInstalled<FeaturesSet.vendorRelations>())
           {
               cmd.Join<LeftJoin<POOrder, On<POOrder.orderType, Equal<POReceiptLineS.pOType>, And<POOrder.orderNbr, Equal<POReceiptLineS.pONbr>>>>>();

               cmd.WhereAnd<Where<POReceipt.vendorID, Equal<Current<APInvoice.suppliedByVendorID>>,
                   And<POReceipt.vendorLocationID, Equal<Current<APInvoice.suppliedByVendorLocationID>>,
                   And<Where<POOrder.payToVendorID, IsNull, Or<POOrder.payToVendorID, Equal<Current<APInvoice.vendorID>>>>>>>>();
           }
           else
           {
               cmd.WhereAnd<Where<POReceipt.vendorID, Equal<Current<APInvoice.vendorID>>,
                   And<POReceipt.vendorLocationID, Equal<Current<APInvoice.vendorLocationID>>>>>();
           }
           if (doc.DocType == "INV")
           {
               cmd.WhereAnd<Where<POReceiptExt.usrKWIsVirtualReceipt, IsNull, Or<POReceiptExt.usrKWIsVirtualReceipt, Equal<False>>>>();

               foreach (PXResult<POReceipt, POReceiptLineS, APTran> result in cmd.View.SelectMultiBound(new object[] { doc }, POReceiptType.POReceipt))
               {
                   POReceipt receipt = result;
                   APTran aPTran = new APTran { ReceiptNbr = receipt.ReceiptNbr };

                   if (usedReceipt.TryGetValue(aPTran, out count))
                   {
                       usedReceipt.Remove(aPTran);

                       if (count < result.RowCount)
                       {
                           yield return receipt;
                       }
                   }
                   else
                   {
                       yield return receipt;
                   }
               }
           }
           else
           {
               foreach (PXResult<POReceipt, POReceiptLineS, APTran> result in cmd.View.SelectMultiBound(new object[] { doc }, poReceiptType))
               {
                   POReceipt receipt = result;
                   APTran aPTran = new APTran { ReceiptNbr = receipt.ReceiptNbr };

                   if (usedReceipt.TryGetValue(aPTran, out count))
                   {
                       usedReceipt.Remove(aPTran);

                       if (count < result.RowCount)
                       {
                           yield return receipt;
                       }
                   }
                   else
                   {
                       yield return receipt;
                   }
               }
           }

           foreach (APTran deletedTran in usedReceipt.Where(_ => _.Value < 0).Select(_ => _.Key))
           {
               yield return PXSelect<POReceipt, Where<POReceipt.receiptNbr, Equal<Required<APTran.receiptNbr>>>>
                   .SelectSingleBound(Base, new object[] { }, deletedTran.ReceiptNbr)
                   .RowCast<POReceipt>()
                   .First();
           }
       }
   }

When tried to add extension for this graph (AddPOReceiptExtension) got movenext error

When i wrote inheritance for this got method is not found error

1 个答案:

答案 0 :(得分:3)

您需要扩展AddPOReceiptExtension图扩展名:

class MyExtension : PXGraphExtension<AddPOReceiptExtension, APInvoiceEntry>

该功能命名为Second-Level BLC Extension,并在此处记录: https://help-2019r2.acumatica.com/Help?ScreenId=ShowWiki&pageid=c86fdae8-fef9-4490-aa57-3528d0fa172e

我精心制作了这个示例,以确保可以使用该方法扩展覆盖的AddPOReceipt:

using PX.Data;
using PX.Objects.AP;
using PX.Objects.CS;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Objects.PO.GraphExtensions.APInvoiceSmartPanel;

namespace PX.Objects.AP
{
  public class AddPOReceiptExtension_Extension : PXGraphExtension<AddPOReceiptExtension, APInvoiceEntry>
  {
    public PXAction<APInvoice> addPOReceipt;
    public PXAction<APInvoice> addPOReceipt2;

    [PXUIField(DisplayName = PX.Objects.PO.Messages.AddPOReceipt, MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Visible = true, FieldClass = "DISTR")]
    [PXLookupButton]
    [APMigrationModeDependentActionRestriction(
      restrictInMigrationMode: true,
      restrictForRegularDocumentInMigrationMode: true,
      restrictForUnreleasedMigratedDocumentInNormalMode: true)]
    public virtual IEnumerable AddPOReceipt(PXAdapter adapter)
    {
       throw new PXException("Test Override");
    }


    [PXUIField(DisplayName = PX.Objects.PO.Messages.AddPOReceipt, MapEnableRights = PXCacheRights.Select, MapViewRights = PXCacheRights.Select, Visible = false)]
    [PXLookupButton]
    [APMigrationModeDependentActionRestriction(
      restrictInMigrationMode: true,
      restrictForRegularDocumentInMigrationMode: true,
      restrictForUnreleasedMigratedDocumentInNormalMode: true)]
    public virtual IEnumerable AddPOReceipt2(PXAdapter adapter)
    {
       throw new PXException("Test Override 2");
    }
  }
}