我在 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
...
}
我尝试创建 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
...
}