我在 Acumatica 处理页面实现中错过了什么

What I missed in Acumatica processing page implementation

我尝试创建 Acumatica 处理页面。 我有以下 aspx 代码:

<%@ Page Language="C#" MasterPageFile="~/MasterPages/TabView.master" AutoEventWireup="true" 
    ValidateRequest="false" CodeFile="SM102000.aspx.cs"
    Inherits="Page_SM102000" Title="Untitled Page" %>

<%@ MasterType VirtualPath="~/MasterPages/TabView.master" %>
<asp:Content ID="cont1" ContentPlaceHolderID="phDS" runat="Server">
    <px:PXDataSource ID="ds" runat="server" Visible="True" Width="100%" 
        PrimaryView="WhosebugProcess" TypeName="WhosebugSync.UsrWhosebugProcess">
    </px:PXDataSource>
    </asp:Content>
<asp:Content ID="cont2" ContentPlaceHolderID="phF" runat="server">
    <px:PXGrid ID="grid" runat="server" 
        Height="400px" 
        Width="100%" 
        AllowPaging="True" 
        AdjustPageSize="Auto" 
        AutoAdjustColumns="True" 
        AllowSearch="True"
        SkinID="Inquire" 
        DataSourceID="ds" 
        NoteIndicator="true"
        TabIndex="3300" 
        TemporaryFilterCaption="Filter Applied">
        <Levels>
            <px:PXGridLevel DataMember="WhosebugProcess">
                <Columns>
                    <px:PXGridColumn DataField="Selected" TextAlign="Center" Width="20px" Type="CheckBox" AllowCheckAll="True">
                    </px:PXGridColumn>
                    <px:PXGridColumn DataField="FailInfo" Width="20px">
                    </px:PXGridColumn>
                    <px:PXGridColumn DataField="SynchronizationType" Width="80px">
                    </px:PXGridColumn>
                    <px:PXGridColumn DataField="LastFullSync" TextAlign="Right" Width="100px">
                    </px:PXGridColumn>
                    <px:PXGridColumn DataField="LastRunCmt" Width="80px">
                    </px:PXGridColumn>
                    <px:PXGridColumn DataField="LastRunFld" TextAlign="Right" Width="100px">
                    </px:PXGridColumn>
                </Columns>
            </px:PXGridLevel>
        </Levels>
        <AutoSize Container="Window" Enabled="True" MinHeight="400" />
    </px:PXGrid>
</asp:Content>

以下 DAC class:

using PX.Data;
using System;

namespace WhosebugSync.DAC
{
    [Serializable()]
    public class UsrWhosebugSettingItem: IBqlTable
    {
        #region SettingID
        public abstract class settingID : PX.Data.IBqlField
        {
        }

        protected int _SettingID;
        [PXDBIdentity(IsKey = true)]
        public virtual int SettingID
        {
            get
            {
                return this._SettingID;
            }
            set
            {
                this._SettingID = value;
            }
        }
        #endregion

        #region FailInfo 
        public abstract class failInfo : PX.Data.IBqlField
        {
        }
        protected string _FailInfo;

        [PXDBString(255, IsUnicode = true)]
        [PXDefault()]
        [PXUIField(DisplayName = "")]

        public virtual string FailInfo
        {
            get
            {
                return this._FailInfo;
            }
            set
            {
                this._FailInfo = value;
            }
        }
        #endregion
        #region Selected
        public abstract class selected : IBqlField
        {
        }
        protected bool? _Selected = false;

        /// <summary>
        /// Indicates whether the record is selected for mass processing.
        /// </summary>
        [PXBool]
        [PXDefault(false)]
        [PXUIField(DisplayName = "Selected")]
        public bool? Selected
        {
            get
            {
                return _Selected;
            }
            set
            {
                _Selected = value;
            }
        }
        #endregion
        #region SynchronizationType 
        public abstract class synchronizationType : PX.Data.IBqlField
        {
        }
        protected string _SynchronizationType;

        [PXDBString(255, IsUnicode = true)]
        [PXDefault()]
        [PXUIField(DisplayName = "Synchronization Type")]

        public virtual string SynchronizationType
        {
            get
            {
                return this._SynchronizationType;
            }
            set
            {
                this._SynchronizationType = value;
            }
        }
        #endregion
        #region LastFullSync 
        public abstract class lastFullSync : PX.Data.IBqlField
        {
        }
        protected DateTime? _LastFullSync;

        [PXDBDate()]
        [PXDefault()]
        [PXUIField(DisplayName = "Last Full Sync")]

        public virtual DateTime? LastFullSync
        {
            get
            {
                return this._LastFullSync;
            }
            set
            {
                this._LastFullSync = value;
            }
        }
        #endregion
        #region LastRunCmt 
        public abstract class lastRunCmt : PX.Data.IBqlField
        {
        }
        protected decimal? _LastRunCmt;
        [PXDBDecimal(2)]
        [PXDefault(TypeCode.Decimal, "0.0")]
        [PXUIField(DisplayName = "Last Run: Records Commited")]
        public virtual decimal? LastRunCmt
        {
            get
            {
                return this._LastRunCmt;
            }
            set
            {
                this._LastRunCmt = value;
            }
        }
        #endregion
        #region LastRunFld 
        public abstract class lastRunFld : PX.Data.IBqlField
        {
        }
        protected decimal? _LastRunFld;
        [PXDBDecimal(2)]
        [PXDefault(TypeCode.Decimal, "0.0")]
        [PXUIField(DisplayName = "Last Run: Records Failed")]
        public virtual decimal? LastRunFld
        {
            get
            {
                return this._LastRunFld;
            }
            set
            {
                this._LastRunFld = value;
            }
        }
        #endregion

        #region CreatedByID
        public abstract class createdByID : PX.Data.IBqlField
        {
        }
        protected Guid? _CreatedByID;
        [PXDBCreatedByID()]
        public virtual Guid? CreatedByID
        {
            get
            {
                return this._CreatedByID;
            }
            set
            {
                this._CreatedByID = value;
            }
        }
        #endregion
        #region Tstamp
        public abstract class tstamp : PX.Data.IBqlField
        {
        }
        protected byte[] _Tstamp;
        [PXDBTimestamp()]
        public virtual byte[] Tstamp
        {
            get
            {
                return this._Tstamp;
            }
            set
            {
                this._Tstamp = value;
            }
        }
        #endregion
        #region CreatedByScreenID
        public abstract class createdByScreenID : PX.Data.IBqlField
        {
        }
        protected string _CreatedByScreenID;
        [PXDBCreatedByScreenID()]
        public virtual string CreatedByScreenID
        {
            get
            {
                return this._CreatedByScreenID;
            }
            set
            {
                this._CreatedByScreenID = value;
            }
        }
        #endregion
        #region CreatedDateTime
        public abstract class createdDateTime : PX.Data.IBqlField
        {
        }
        protected DateTime? _CreatedDateTime;
        [PXDBCreatedDateTime()]
        public virtual DateTime? CreatedDateTime
        {
            get
            {
                return this._CreatedDateTime;
            }
            set
            {
                this._CreatedDateTime = value;
            }
        }
        #endregion
        #region LastModifiedByID
        public abstract class lastModifiedByID : PX.Data.IBqlField
        {
        }
        protected Guid? _LastModifiedByID;
        [PXDBLastModifiedByID()]
        [PXUIField(DisplayName = "Last Modified By")]
        public virtual Guid? LastModifiedByID
        {
            get
            {
                return this._LastModifiedByID;
            }
            set
            {
                this._LastModifiedByID = value;
            }
        }
        #endregion
        #region LastModifiedDateTime
        public abstract class lastModifiedDateTime : PX.Data.IBqlField
        {
        }
        protected DateTime? _LastModifiedDateTime;
        [PXDBLastModifiedDateTime()]
        [PXUIField(DisplayName = "Modified At")]
        public virtual DateTime? LastModifiedDateTime
        {
            get
            {
                return this._LastModifiedDateTime;
            }
            set
            {
                this._LastModifiedDateTime = value;
            }
        }
        #endregion
        #region LastModifiedByScreenID
        public abstract class lastModifiedByScreenID : PX.Data.IBqlField
        {
        }
        protected string _LastModifiedByScreenID;

        [PXDBLastModifiedByScreenID()]
        public virtual string LastModifiedByScreenID
        {
            get
            {
                return this._LastModifiedByScreenID;
            }
            set
            {
                this._LastModifiedByScreenID = value;
            }
        }
        #endregion
    }
}

下图:

    using System.Collections;
    using System.Collections.Generic;
    using System.Linq;
    using PX.Data;
    using PX.SM;
    using WhosebugSync.DAC;

    namespace WhosebugSync
    {
        public class UsrWhosebugProcess:PXGraph<UsrWhosebugProcess>
        {
            [PXFilterable]
            public PXProcessing<UsrWhosebugSettingItem> WhosebugProcess;
            public PXCancel<UsrWhosebugSettingItem> Cancel;


            public UsrWhosebugProcess()
            {
                WhosebugProcess.SetProcessDelegate(Process);
            }

            public static void Process(List<UsrWhosebugSettingItem> syncItems)
            {
                foreach (UsrWhosebugSettingItem usrWhosebugPrcSt in syncItems)
                {
                    //
                }
            }

            public override bool IsDirty => false;
        }
    }

如果我在我的 Acumatica 实例中编译并打开所有这些,我会看到三个按钮:Process、Process All 和 Cancel,这是预期的行为。当我检查 "Process All" 时,方法 Process 会收到所有项目。但是,如果我 select 几个项目,并在 Process 上按,方法 Process 不会收到任何(我已经在调试器中检查过)。为了让按钮进程正常工作,我还应该 add/remove 我的代码吗?

我去过你所在的地方,我认为要解决这个问题我必须建立清单。尝试如下所示。

//Invoices.SetProcessDelegate(SendData);
        Invoices.SetProcessDelegate(delegate(List<ARInvoice> list)
        {
            List<ARInvoice> newlist = new List<ARInvoice>(list.Count);
            foreach (ARInvoice doc in list)
            {
                newlist.Add(doc);
            }
            SendData(newlist);
        });

问题是在 aspx 中您将第一列定义为:

<px:PXGridColumn DataField="Seleted" ...

虽然您想要的列名称是 Selected。看起来就是这么简单。

报告的问题是由不可为空的 SettingID 字段引起的。所有 DAC 字段都必须是可空类型。在将 SettingID 属性 和 _SettingID 字段的类型更改为 Nullable<int> ( int?):

[Serializable()]
public class UsrScanCoSettingItem : IBqlTable
{
    #region SettingID
    public abstract class settingID : PX.Data.IBqlField
    {
    }

    protected int? _SettingID;
    [PXDBIdentity(IsKey = true)]
    public virtual int? SettingID
    {
        get
        {
            return this._SettingID;
        }
        set
        {
            this._SettingID = value;
        }
    }
    #endregion
    ...
}