Adding custom button in acumatica

2019-08-29 02:33发布

问题:

I am new to Acumatica and trying to explore some customization features.

I have created 2 labels on Sales Order screen - CstLabeltotal and CstLabelqty

I am trying to figure out a way where besides the total label will show total number transactions(1st column) from the Document Details tab and Quantity label shows total quantity from the Document Details tab(9th Column)

Can anybody help me with this?

回答1:

Use custom unbound fields (NonPersistedField) as placeholders to display the totals.

First add those custom fields to SOOrder DAC extension:

Total quantity custom field:

Total transactions custom field:

Create a SOOrderEntry graph extension to compute/update totals:

Add custom fields to Sales Order screen, no need to use label controls, DAC DisplayName property will act as the field label:

Locate the Base graph Transactions DataView which contains the detail data needed for computing the totals (for information only):

In your SOOrderEntry extension use the Transactions DataView from Base Graph to compute totals:

namespace PX.Objects.SO
{
  public class SOOrderEntry_Extension:PXGraphExtension<SOOrderEntry>
  {
      // Initialize unbound values in FieldSelecting events
      public void SOOrder_UsrTotalQty_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
      {
          e.ReturnValue = GetTotalQty(sender);
      }

      public void SOOrder_UsrTotalTransactions_FieldSelecting(PXCache sender, PXFieldSelectingEventArgs e)
      {
          e.ReturnValue = GetTotalTransactions(sender);
      }

      // Update values
      public void SOLine_RowDeleted(PXCache sender, PXRowDeletedEventArgs e)
      {
          UpdateTotals(sender, e.Row as SOOrder, true, true);
      }

      public void SOLine_RowInserted(PXCache sender, PXRowInsertedEventArgs e)
      {
          UpdateTotals(sender, e.Row as SOOrder, true, true);
      }

      public void SOLine_OrderQty_FieldUpdated(PXCache sender, PXFieldUpdatedEventArgs e)
      {
          UpdateTotals(sender, e.Row as SOOrder, true, false);
      }

      public void UpdateTotals(PXCache sender, SOOrder soOrder, bool isUpdateQty, bool isUpdateTranCount)
      {
          // Get SOOrder DAC extension
          if (soOrder != null)
          {
              SOOrderExt soOrderExt = sender.GetExtension<SOOrderExt>(soOrder);
              
              if (soOrderExt != null)
              {
                   // Update values
                   if (isUpdateQty)
                   {
                       soOrderExt.UsrTotalQty = GetTotalQty(sender);
                   }
               
                   if (isUpdateTranCount)
                   {
                       soOrderExt.UsrTotalTransactions= GetTotalTransactions(sender);
                   } 
              }
          }
      }
            
      // Compute totals
      public decimal? GetTotalQty(PXCache sender)
      {
          decimal? totalQty = 0M;

          // Compute quantity from SOOrderEntry base graph Transactions DataView
          foreach (SOLine soLine in Base.Transactions.Select())
          {
              totalQty += soLine.OrderQty;
          }

          return totalQty;
      }

      public int? GetTotalTransactions(PXCache sender)
      {
          return Base.Transactions.Select().Count();
      }
  }
}

Totals are displayed in Sales Order screen, they will update when inserting/removing Transaction rows and modifying order quantities: