Skip to main content
Answer

How to use custom field in BQL quary

  • June 9, 2025
  • 3 replies
  • 62 views

Forum|alt.badge.img+2

I have created an extension for  ARRegister DAC as bellow.
 

   public class ARRegisterExt : PXCacheExtension<PX.Objects.AR.ARRegister>
{


#region Activation
public static bool IsActive()
{
return true;
}
#endregion


#region UsrLinksoftARInvoiceNumber
[PXDBString(50)]
[PXUIField(DisplayName = "Linksoft AR Invoice Number")]
public virtual string UsrLinksoftARInvoiceNumber { get; set; }
public abstract class usrLinksoftARInvoiceNumber : PX.Data.BQL.BqlString.Field<usrLinksoftARInvoiceNumber> { }
#endregion
}

In the ARPaymentEntry extension I have add an event as below
 

        protected void _(Events.FieldUpdated<ARAdjust, ARAdjustExt.usrLinksoftARInvoiceNumber> e)
{
ARAdjust row = e.Row;
var ext = e.Cache.GetExtension<ARAdjustExt>(row);

if (ext?.UsrLinksoftARInvoiceNumber == null)
return;

//ARRegister arRegister = SelectFrom<ARRegister>
// .Where<ARRegisterExt.usrLinksoftARInvoiceNumber.IsEqual<PX.Data.BQL.@P.AsString>>
//.View.Select(Base, ext.UsrLinksoftARInvoiceNumber);

ARRegister arRegister = PXSelect<ARRegister,
Where<ARRegisterExt.usrLinksoftARInvoiceNumber, Equal<Required<ARRegisterExt.usrLinksoftARInvoiceNumber>>>>
.Select(Base, ext.UsrLinksoftARInvoiceNumber);



if (arRegister != null)
{
e.Cache.SetValueExt<ARAdjust.adjdRefNbr>(row, arRegister.RefNbr);
}
}

Here the arRegister always returns null. but relevant data is exists in database. I manually check the database. I did a debug and found that event is triggered correctly and the ext.UsrLinksoftARInvoiceNumber value also pass correctly.

my question is is it need to do a inner join between the DAC and Extention is such cases. But my extension is declared as public class ARRegisterExt : PXCacheExtension<PX.Objects.AR.ARRegister> so it is not implimnet the IBqlTable interface
how can i get the correct ARRegister DAC?

Best answer by PDharmasena10

 I able to resolve this with the support of Acumatica support team. 
I had to add a extention as bellow for the ARRegister2 also.
  public class ARRegister2Ext : PXCacheExtension<PX.Objects.AR.ARRegister2>
    {
        #region Activation
        public static bool IsActive()
        {
            return DialTow.Activation.IsActive();
        }
        #endregion

        #region UsrLinksoftARInvoiceNumber
        public abstract class usrLinksoftARInvoiceNumber : PX.Data.BQL.BqlString.Field<ARAdjustExt.usrLinksoftARInvoiceNumber> { }
        #endregion
    }
Then I add the event handler as below. Then it is works as expected

        protected void _(Events.FieldUpdated<ARAdjust, ARAdjustExt.usrLinksoftARInvoiceNumber> e)
        {
            ARAdjust row = e.Row;
            var ext = e.Cache.GetExtension<ARAdjustExt>(row);

            if (ext?.UsrLinksoftARInvoiceNumber == null)
                return;

            ARRegister2 arRegister = PXSelect<ARRegister2,
                Where<ARRegister2Ext.usrLinksoftARInvoiceNumber, Equal<Required<ARRegister2Ext.usrLinksoftARInvoiceNumber>>>>
                .Select(Base, ext.UsrLinksoftARInvoiceNumber);

            if (arRegister != null)
            {
                e.Cache.SetValueExt<ARAdjust.adjdRefNbr>(row, arRegister.RefNbr);
            }
        }

3 replies

DipakNilkanth
Pro III
Forum|alt.badge.img+13

Hi ​@PDharmasena10,

I noticed that your custom field is declared under the ARRegisterExt DAC, but in your graph, you're accessing the field from the ARAdjustExt DAC. That’s why you’re getting a null result.

Please update your FieldUpdated event handler with the code snippet below. This change should resolve the issue.

   protected void _(Events.FieldUpdated<ARRegister, ARRegisterExt.usrLinksoftARInvoiceNumber> e)
{
ARRegister row = e.Row;
var ext = e.Cache.GetExtension<ARRegisterExt>(row);

if (ext?.UsrLinksoftARInvoiceNumber == null)
return;

//ARRegister arRegister = SelectFrom<ARRegister>
// .Where<ARRegisterExt.usrLinksoftARInvoiceNumber.IsEqual<PX.Data.BQL.@P.AsString>>
//.View.Select(Base, ext.UsrLinksoftARInvoiceNumber);

ARRegister arRegister = PXSelect<ARRegister,
Where<ARRegisterExt.usrLinksoftARInvoiceNumber, Equal<Required<ARRegisterExt.usrLinksoftARInvoiceNumber>>>>
.Select(Base, ext.UsrLinksoftARInvoiceNumber);



if (arRegister != null)
{
e.Cache.SetValueExt<ARAdjust.adjdRefNbr>(row, arRegister.RefNbr);
}
}

Hope, it helps!


Forum|alt.badge.img+2
  • Author
  • Semi-Pro I
  • June 9, 2025

Hi ​@Nilkanth Dipak,
Thanks for your response. I have added usrLinksoftARInvoiceNumber field to both ARAdjust and ARRegister DAC. now i need to get the related ARRegister DAC when the usrLinksoftARInvoiceNumber of ARAdjust changed. The logic is 
ARAdjustExt.usrLinksoftARInvoiceNumber == ARRegisterExt.usrLinksoftARInvoiceNumber
So, I hope I have declared the event correctly. isn’t it?


Forum|alt.badge.img+2
  • Author
  • Semi-Pro I
  • Answer
  • June 16, 2025

 I able to resolve this with the support of Acumatica support team. 
I had to add a extention as bellow for the ARRegister2 also.
  public class ARRegister2Ext : PXCacheExtension<PX.Objects.AR.ARRegister2>
    {
        #region Activation
        public static bool IsActive()
        {
            return DialTow.Activation.IsActive();
        }
        #endregion

        #region UsrLinksoftARInvoiceNumber
        public abstract class usrLinksoftARInvoiceNumber : PX.Data.BQL.BqlString.Field<ARAdjustExt.usrLinksoftARInvoiceNumber> { }
        #endregion
    }
Then I add the event handler as below. Then it is works as expected

        protected void _(Events.FieldUpdated<ARAdjust, ARAdjustExt.usrLinksoftARInvoiceNumber> e)
        {
            ARAdjust row = e.Row;
            var ext = e.Cache.GetExtension<ARAdjustExt>(row);

            if (ext?.UsrLinksoftARInvoiceNumber == null)
                return;

            ARRegister2 arRegister = PXSelect<ARRegister2,
                Where<ARRegister2Ext.usrLinksoftARInvoiceNumber, Equal<Required<ARRegister2Ext.usrLinksoftARInvoiceNumber>>>>
                .Select(Base, ext.UsrLinksoftARInvoiceNumber);

            if (arRegister != null)
            {
                e.Cache.SetValueExt<ARAdjust.adjdRefNbr>(row, arRegister.RefNbr);
            }
        }