Reputation: 5151
I try to create Acumatica processing page. I have following aspx code:
<%@ 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="StackOverflowProcess" TypeName="StackOverflowSync.UsrStackOverflowProcess">
</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="StackOverflowProcess">
<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>
Following DAC class:
using PX.Data;
using System;
namespace StackOverflowSync.DAC
{
[Serializable()]
public class UsrStackOverflowSettingItem: 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
}
}
And following graph:
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using PX.Data;
using PX.SM;
using StackOverflowSync.DAC;
namespace StackOverflowSync
{
public class UsrStackOverflowProcess:PXGraph<UsrStackOverflowProcess>
{
[PXFilterable]
public PXProcessing<UsrStackOverflowSettingItem> StackOverflowProcess;
public PXCancel<UsrStackOverflowSettingItem> Cancel;
public UsrStackOverflowProcess()
{
StackOverflowProcess.SetProcessDelegate(Process);
}
public static void Process(List<UsrStackOverflowSettingItem> syncItems)
{
foreach (UsrStackOverflowSettingItem usrStackOverflowPrcSt in syncItems)
{
//
}
}
public override bool IsDirty => false;
}
}
If I compile and open all of it in my Acumatica instance I see three buttons: Process, and Process All and Cancel, which is expected behavior. When I check "Process All" then method Process receives all items. But if I select few items, and press at Process, method Process doesn't receive any ( I've checked in debugger ). What else should I add/remove to my code in order make button Process work properly?
Upvotes: 0
Views: 798
Reputation: 6778
Reported issue is caused by the non-nullable SettingID field. All DAC fields must be of a nullable type. Your custom screen should operate as expected after you change type of the SettingID property and the _SettingID field to 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
...
}
Upvotes: 2
Reputation: 586
The problem is that in aspx you have the first column defined as:
<px:PXGridColumn DataField="Seleted" ...
While the name of the column you want is Selected. Looks like it is as easy as that.
Upvotes: 1
Reputation: 1066
I've been where you are and I think to solve it I had to build the list. Try something like the following.
//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);
});
Upvotes: 0