0

I have created maintenance tables and I am applying a "PXForeignReference" at drop time. what I want is that if I delete a record from the table that is being used in another, it should show a message which indicates that it is being used in another table.

But in my example it is not being fulfilled, for varo I will indicate where my error is.

here I attach some images.

1.first maintenance table

namespace SKPriceIndex
{
    [Serializable]
    [PXCacheName("PESKPriceIndexCat")]
    public class PESKPriceIndexCat : IBqlTable
    {
        #region CategoryID
        [PXDBIdentity] 
        [PXUIField(DisplayName = "Category ID")]
        public virtual int? CategoryID { get; set; }
        public abstract class categoryID : PX.Data.BQL.BqlInt.Field<categoryID> { }
        #endregion

        #region CategoryCD
        [PXDBString(10, IsUnicode = true, InputMask = "", IsKey = true)]
        [PXUIField(DisplayName = "Category ID")]
        public virtual string CategoryCD { get; set; }
        public abstract class categoryCD : PX.Data.BQL.BqlString.Field<categoryCD> { }
        #endregion

        #region Descripcion
        [PXDBString(30, IsUnicode = true, InputMask = "")]
        [PXUIField(DisplayName = "Category Description")]
        public virtual string Descripcion { get; set; }
        public abstract class descripcion : PX.Data.BQL.BqlString.Field<descripcion> { }
        #endregion

        #region State
        [PXDBString(100, IsUnicode = true, InputMask = "")]
        [PXUIField(DisplayName = "State")]
        [PXSelector(typeof(State.stateID),
                     typeof(State.stateID), typeof(State.name), typeof(State.countryID),
                    DescriptionField = typeof(State.name))]
        [PXMassMergableField]
        public virtual string State { get; set; }
        public abstract class state : PX.Data.BQL.BqlString.Field<state> { }
        #endregion

        #region Active
        [PXDBBool()]
        [PXDefault(false)]
        [PXUIField(DisplayName = "Active")]
        public virtual bool? Active { get; set; }
        public abstract class active : PX.Data.BQL.BqlInt.Field<active> { }
        #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 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 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()]
        public virtual Guid? LastModifiedByID
        {
            get
            {
                return this._LastModifiedByID;
            }
            set
            {
                this._LastModifiedByID = 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
        #region LastModifiedDateTime
        public abstract class lastModifiedDateTime : PX.Data.IBqlField
        {
        }
        protected DateTime? _LastModifiedDateTime;
        [PXDBLastModifiedDateTime]
        public virtual DateTime? LastModifiedDateTime
        {
            get
            {
                return this._LastModifiedDateTime;
            }
            set
            {
                this._LastModifiedDateTime = value;
            }
        }
        #endregion
    }
}

enter image description here

2.second maintenance table

namespace SKPriceIndexCST
{
    [Serializable]
    [PXCacheName("PESKPriceIndex")]
    public class PESKPriceIndex : IBqlTable
    {
        #region CategoryID
        [PXDBInt(IsKey = true)]
        [PXUIField(DisplayName = "Category ID")]

        [PXSelector(typeof(PESKPriceIndexCat.categoryID),
                    typeof(PESKPriceIndexCat.categoryCD), 
                    typeof(PESKPriceIndexCat.descripcion),
                    DescriptionField = typeof(PESKPriceIndexCat.descripcion),
                    SubstituteKey = typeof(PESKPriceIndexCat.categoryCD))]
        [PXMassMergableField]
        [PXRestrictor(typeof(Where<PESKPriceIndexCat.active, Equal<True>>), "", typeof(PESKPriceIndexCat.active))]      
        public virtual int? CategoryID { get; set; }
        public abstract class categoryID : PX.Data.BQL.BqlInt.Field<categoryID> { }
        #endregion

        #region CreatedDateTime
        [PXDBCreatedDateTime()]
        public virtual DateTime? CreatedDateTime { get; set; }
        public abstract class createdDateTime : PX.Data.BQL.BqlDateTime.Field<createdDateTime> { }
        #endregion

        #region CreatedByID
        [PXDBCreatedByID()]
        public virtual Guid? CreatedByID { get; set; }
        public abstract class createdByID : PX.Data.BQL.BqlGuid.Field<createdByID> { }
        #endregion

        #region CreatedByScreenID
        [PXDBCreatedByScreenID()]
        public virtual string CreatedByScreenID { get; set; }
        public abstract class createdByScreenID : PX.Data.BQL.BqlString.Field<createdByScreenID> { }
        #endregion

        #region LastModifiedDateTime
        [PXDBLastModifiedDateTime()]
        public virtual DateTime? LastModifiedDateTime { get; set; }
        public abstract class lastModifiedDateTime : PX.Data.BQL.BqlDateTime.Field<lastModifiedDateTime> { }
        #endregion

        #region LastModifiedByID
        [PXDBLastModifiedByID()]
        public virtual Guid? LastModifiedByID { get; set; }
        public abstract class lastModifiedByID : PX.Data.BQL.BqlGuid.Field<lastModifiedByID> { }
        #endregion

        #region LastModifiedByScreenID
        [PXDBLastModifiedByScreenID()]
        public virtual string LastModifiedByScreenID { get; set; }
        public abstract class lastModifiedByScreenID : PX.Data.BQL.BqlString.Field<lastModifiedByScreenID> { }
        #endregion

        #region Tstamp
        [PXDBTimestamp()]
        [PXUIField(DisplayName = "Tstamp")]
        public virtual byte[] Tstamp { get; set; }
        public abstract class tstamp : PX.Data.BQL.BqlByteArray.Field<tstamp> { }
        #endregion
    }
}

namespace SKPriceIndexCST
{
    [Serializable]
    [PXCacheName("PESKPriceIndexDetail")]
    public class PESKPriceIndexDetail : IBqlTable
    {
        #region PriceIndexID
        [PXDBIdentity]
        public virtual int? PriceIndexID { get; set; }
        public abstract class priceIndexID : PX.Data.BQL.BqlInt.Field<priceIndexID> { }
        #endregion

        #region CategoryID
        [PXDBInt(IsKey =true)]
        [PXUIField(DisplayName = "Category ID")]
        [PXDefault(typeof(PESKPriceIndex.categoryID))]
        [PXParent(typeof(Select<PESKPriceIndex, Where<PESKPriceIndex.categoryID, Equal<Current<categoryID>>>>),LeaveChildren =true)] //,LeaveChildren =true
        [PXForeignReference(typeof(Field<categoryID>.IsRelatedTo<PESKPriceIndexCat.categoryID>))]
        public virtual int? CategoryID { get; set; }
        public abstract class categoryID : PX.Data.BQL.BqlInt.Field<categoryID> { }
        #endregion

        #region EffDate
        [PXDBDate(IsKey =true)]
        [PXDefault(typeof(AccessInfo.businessDate))]
        [PXUIField(DisplayName = "Eff Date")]        
        public virtual DateTime? EffDate { get; set; }
        public abstract class effDate : PX.Data.BQL.BqlDateTime.Field<effDate> { }
        #endregion

        #region BaseIndex
        [PXDBInt()]
        [PXUIField(DisplayName = "Base Index")]
        public virtual int? BaseIndex { get; set; }
        public abstract class baseIndex : PX.Data.BQL.BqlInt.Field<baseIndex> { }
        #endregion

        #region CreatedDateTime
        [PXDBCreatedDateTime()]
        public virtual DateTime? CreatedDateTime { get; set; }
        public abstract class createdDateTime : PX.Data.BQL.BqlDateTime.Field<createdDateTime> { }
        #endregion

        #region CreatedByID
        [PXDBCreatedByID()]
        public virtual Guid? CreatedByID { get; set; }
        public abstract class createdByID : PX.Data.BQL.BqlGuid.Field<createdByID> { }
        #endregion

        #region CreatedByScreenID
        [PXDBCreatedByScreenID()]
        public virtual string CreatedByScreenID { get; set; }
        public abstract class createdByScreenID : PX.Data.BQL.BqlString.Field<createdByScreenID> { }
        #endregion

        #region LastModifiedDateTime
        [PXDBLastModifiedDateTime()]
        public virtual DateTime? LastModifiedDateTime { get; set; }
        public abstract class lastModifiedDateTime : PX.Data.BQL.BqlDateTime.Field<lastModifiedDateTime> { }
        #endregion

        #region LastModifiedByID
        [PXDBLastModifiedByID()]
        public virtual Guid? LastModifiedByID { get; set; }
        public abstract class lastModifiedByID : PX.Data.BQL.BqlGuid.Field<lastModifiedByID> { }
        #endregion

        #region LastModifiedByScreenID
        [PXDBLastModifiedByScreenID()]
        public virtual string LastModifiedByScreenID { get; set; }
        public abstract class lastModifiedByScreenID : PX.Data.BQL.BqlString.Field<lastModifiedByScreenID> { }
        #endregion

        #region Tstamp
        [PXDBTimestamp()]
        [PXUIField(DisplayName = "Tstamp")]
        public virtual byte[] Tstamp { get; set; }
        public abstract class tstamp : PX.Data.BQL.BqlByteArray.Field<tstamp> { }
        #endregion
    }
}

enter image description here

when I delete the price index record, it doesn't restrict the deletion.

I hope my query is clear.

Thanks in advance.

Marco A.
  • 27
  • 5

1 Answers1

1

As far as I know for referential integrity you need to only assign foreign references and when such references are attempted to be deleted they should be prevented from deletion. There is an example of this in the INTran DAC

Taking the INTran example first they defined the FK

public static class FK
{
    public class Site : INSite.PK.ForeignKeyOf<INTran>.By<siteID> { }
}

Then they defined the field as follows

#region SiteID
public abstract class siteID : PX.Data.BQL.BqlInt.Field<siteID> { }

[IN.SiteAvail(typeof(INTran.inventoryID), typeof(INTran.subItemID))]
[PXDefault(typeof(INRegister.siteID))]
[PXForeignReference(typeof(FK.Site))]
[InterBranchRestrictor(typeof(Where<SameOrganizationBranch<INSite.branchID, Current<INRegister.branchID>>>))]
public virtual Int32? SiteID {get; set;}
#endregion

On the other hand the PXParent attribute which specifies the master-detail relationship does not prevent deletion. Although it has the LeaveChildren Attribute which defaults to false, and thus deletes the child data record when the parent is deleted.

Jean Claude Abela
  • 782
  • 1
  • 9
  • 26