Как вызвать метод при нажатии кнопки - PullRequest
0 голосов
/ 21 декабря 2018

Очень незнаком с Acumatica, я пытаюсь сделать кнопку нажатой, которую я настроил на экране Time Card сотрудника.Я хочу, чтобы он вызывал метод при нажатии, но у меня не получилось.

Вот мой экран.Кнопка помечена перфокартой.

enter image description here

Внесены некоторые изменения:

Когда я нажимаю кнопку PUNCH CARD, я вижу сообщение POST на сервере: https://dev.domain.tld/db/(W(20))/pages/ep/ep305000.aspx?PopupPanel=Inline&HideScript=On&TimeCardCD=TC00000001 Я думаю, что должен видеть какой-то ответ об исключении на экране, но я ничего не вижу.

Вот код aspx.Я не знаю, что добавить в атрибут DependOnGrid.Я просто скопировал то, что было в блоге Юрия Залецкого.Это всегда установлено или есть что-то конкретное для сайта / страницы, с которой я работаю?Если да, то как мне определить, что здесь поставить?

<px:PXToolBarButton Text="Punch Card" Visible="True" DependOnGrid="grdJiraProjects">
    <AutoCallBack Target="" Enabled="True" Command="punchCard">
      <Behavior CommitChanges="True" /></AutoCallBack>
    <PopupCommand>
      <Behavior CommitChanges="True" />
</PopupCommand></px:PXToolBarButton>

C # Код:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Common;
using PX.Data;
using PX.Objects.CR;
using PX.Objects.CS;
using PX.Objects.IN;
using PX.Objects.CT;
using PX.Objects.PM;
using PX.Objects.GL;
using System.Diagnostics;
using System.Globalization;
using PX.SM;
using PX.TM;
using PX.Web.UI;
using Branch = PX.Objects.GL.Branch;
using System.Text;
using PX.Objects.GL.FinPeriods.TableDefinition;
using PX.Objects.GL.FinPeriods;
using PX.Objects;
using PX.Objects.EP;

namespace TimeTracking
{
  public class TimeCardMaint_Extension : PXGraphExtension<PX.Objects.EP.TimeCardMaint>
  {   
    public PXSelect<PMTimeActivity> PMTimeActivity;
    public PXAction<EPTimeCard> PunchCard;

    #region Event Handlers
    protected void EPTimecardDetail_UsrPIXIClockIn_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {
      if(InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
      var row = (PMTimeActivity)e.Row;
      var rows = row.GetExtension<PMTimeActivityExt>();
      updateTotalHours(cache, rows, row);
    }

    protected void EPTimecardDetail_UsrPIXIClockOut_FieldUpdated(PXCache cache, PXFieldUpdatedEventArgs e, PXFieldUpdated InvokeBaseHandler)
    {      
      if(InvokeBaseHandler != null)
        InvokeBaseHandler(cache, e);
      var row = (PMTimeActivity)e.Row;
      var rows = row.GetExtension<PMTimeActivityExt>();
      updateTotalHours(cache, rows, row);
    }   
    #endregion

    public void punchCard()
    {
      throw new PXException("You Clicked Punch Time Card on Action Bar");     
    }

    public void updateTotalHours(PXCache cache, PMTimeActivityExt rows, PMTimeActivity row)
    {
       if (rows.UsrPIXIClockIn != null && rows.UsrPIXIClockOut != null)
        {
        DateTime dtClockIn = DateTime.Parse(rows.UsrPIXIClockIn.ToString());
        DateTime dtClockOut = DateTime.Parse(rows.UsrPIXIClockOut.ToString());
        double total = (dtClockOut - dtClockIn).TotalHours;
        rows.UsrPIXITotalHours = (decimal) total;
        }

    }        
  }
}

1 Ответ

0 голосов
/ 21 декабря 2018

Один общий перехват, который приводит к тому, что обработчик события действия кнопки не вызывается, использует неправильный ЦАП для параметра универсального типа действия.

Убедитесь, что универсальный тип действия соответствует первичному ЦАП графа.В вашем случае это будет EPTimeCard:

public PXAction<EPTimeCard> PunchCard;

У вас есть расширение графика?Вот где вы должны поместить обработчик события действия для кнопки.

В вашем случае TimeCardMaint - это график экрана тайм-карты сотрудника:

using PX.Data;
using PX.Web.UI;
using System.Collections;

namespace PX.Objects.EP
{
    public class TimeCardMaint_Extension : PXGraphExtension<TimeCardMaint>
    {
        public PXAction<EPTimeCard> PunchCard;

        [PXButton]
        [PXUIField(DisplayName = "Punch Card")]
        public virtual IEnumerable punchCard(PXAdapter adapter)
        {
            // This is where you handle button click event
            return adapter.Get();
        }
    }
}

В этом есть что-то особенноеКнопка, которую вы добавили.Он расположен на панели инструментов сетки.Часто бывает так, что вы хотите, чтобы действия панели инструментов сетки работали на выбранной в данный момент строке.Чтобы это работало, вам нужно объявить действие в ASP-файле и установить его DependOnGrid свойство:

Более подробно это объясняется здесь: http://blog.zaletskyy.com/dependongrid-in-acumatica-or-how-to-get-currently-selected-record-in-grid

Эта ссылка может вам тоже помочь: http://blog.zaletskyy.com/add-button-to-grid-in-acumatica

После того, как все настроено, вы можете получить доступ к текущей выбранной записи в сетке из вашего обработчика событий, например:

[PXButton]
[PXUIField(DisplayName = "Punch Card")]
public virtual IEnumerable punchCard(PXAdapter adapter)
{
    EPTimeCardDetail row = Base.Activities.Current as EPTimeCardDetail;

    if (row != null)
    {
        // Presumably do some Punch Card action on selected row from Details tab Activities grid
    }

    return adapter.Get();
}
...