0
votes

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?

3

3 Answers

2
votes

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
    ...
}
1
votes

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.

0
votes

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);
        });