How to configure a custom selector for a custom table's alternate key on a custom edit screen
I have a custom edit screen (single record at a time) with corresponding custom table. Similar to other edit pages, I have a primary text/search field where I want the user to enter a new value for a new record, or an existing value that selects an existing record (e.g. Stock Item or Project). The primary key of the table is an internal identity, but the UI field is a string field and unique/alternate key. Can someone remind me how to get the field to be more than a search and allow new values? I was first using a PXSelector, but I couldn’t get it to allow new values. I also then tried creating a Segmented Key with one segment for it, and then using a PXDimensionSelector and PXSegmentMask as the control, thinking it may need that to allow a new value to be entered, but that didn’t help. When attempting to save, it is not allowing a new value -- it’s showing an error that the value doesn’t exist, which of course it shouldn’t. The DAC field is shown below. What am I missing in code or UI settings, or do I need to approach it completely differently?
Â
    >PXDBString(50, IsUnicode = true, InputMask = "")]     MPXUIField(DisplayName = "Connection Name", Required = true)]     qPXDimensionSelector("SRCCONN", typeof(Search<AKTDataExtractionSource.name>),       typeof(AKTDataExtractionSource.name), SupportNewValues = true       )]     public virtual string Name { get; set; }     public abstract class name : PX.Data.BQL.BqlString.Field<name> { }     #endregion Â
Page 1 / 1
If this field (Name) is your key field for the DAC, then you have to mark that as key -Â PXDBString(50, IsUnicode = true, InputMask = "", IsKey = true)].Â
@Raj Gopinathan , It’s not the primary key, though. Similar to InventoryCD not being the primary key for InventoryItem.
@tlanzer25, yes yet at the DAC level if this field is a key, then you’ll have to set that IsKey flag.
InventoryCD is the key for inventory item DAC and InventoryID is the identity field. Please try that and let me know if it helps.
#region InventoryCD [PXDefault] [InventoryRaw(IsKey = true, DisplayName = "Inventory ID")] public virtual String InventoryCD { get; set; } public abstract class inventoryCD : BqlString.Field<inventoryCD> { } #endregion
Â
I went ahead and moved my IsKey = true parameter from my primary identity key to the Name field. The result when entering a value and moving off the field is that it blanks out. Maybe I’ll try going back to a PXSelector.
Â
Update: Going back to PXSelector allows me to enter a value now, but it still throws the error that the value entered doesn’t exist. Still looking for a solution.
Could you post your DAC code and also where you’re implementing the selector?
My DAC fields have changed often while trying different things, but the current state of it is below:
Â
    PXDBIdentity(IsKey = true)]     ÂPXUIField(DisplayName = "Data Extraction Source")]     public virtual int? DataExtractionSourceID { get; set; }     public abstract class dataExtractionSourceID : PX.Data.BQL.BqlInt.Field<dataExtractionSourceID> { }     #endregion
    #region Name     rPXDBString(50, IsUnicode = true, InputMask = "")]     nPXUIField(DisplayName = "Connection Name", Required = true)]     //RPXDimensionSelector("SRCCONN", typeof(Search<AKTDataExtractionSource.name>),     //   typeof(AKTDataExtractionSource.name), SupportNewValues = true     //   )]     PXSelector(typeof(Search<AKTDataExtractionSource.name>),       ValidateValue = false,       SubstituteKey = typeof(AKTDataExtractionSource.dataExtractionSourceID))]     public virtual string Name { get; set; }     public abstract class name : PX.Data.BQL.BqlString.Field<name> { } Â
...and the .aspx field looks like this:
Â
  <px:PXSelector runat="server" ID="CstPXSegmentMask18" DataField="Name" AllowAddNew="True" />
Your selector definition is backwards. It should be:
[PXSelector(typeof(Search<AKTDataExtractionSource.dataExtractionSourceID>), ValidateValue = false, SubstituteKey = typeof(AKTDataExtractionSource.name))] public virtual string Name { get; set; } public abstract class name : PX.Data.BQL.BqlString.Field<name> { }
Also, as was mentioned earlier, IsKey=true should be on the string field, not the identity.
As I mentioned previously, I had tried many permutations, including indication of key on the string field. The error goes away, but it just blanks out the text I enter when I move off or save. Your suggestion was tried already, but thanks.
That's not the only difference. If you look closely, you'll see that the selector needs to reference the database key field with the natural key as the description. You had it backwards.
Are you saying you tried that?
Actually, I checked the Acumatica documentation and it appears that the Selector attribute should go on the identity field. So your code should look like this:
No luck yet, nothing has worked so far. I have tried putting a PXSelector on the ID field as well with IsKey, and no luck. When I enter a value into the field then, it shows a negative number in the field, probably the cache id prior to saving. The existing screens that do what I’m trying to accomplish use segmented keys, so I’ll probably go back to trying that again.
Hi, @tlanzer25 As indicated by Raj and Daryl, the Selector should allow entering a new value when that field is part of the KEY field, otherwise it looks for the entered value and says Value cannot be found in the system, which the normal behavior of Selector field.
As you still facing the issue with this, can you please share the DAC file here?
As I mentioned, all combinations of using PXSelector are not working, so I’m trying to use a Segment Key with PXDimensionSelector again. Here’s what I have now in the DAC...
#region DataExtractionSourceID PXDBIdentity] PXUIField(DisplayName = "Data Extraction Source")] public virtual int? DataExtractionSourceID { get; set; } public abstract class dataExtractionSourceID : PX.Data.BQL.BqlInt.Field<dataExtractionSourceID> { } #endregion
#region Name PXDBString(50, IsUnicode = true, InputMask = "", IsKey = true)] PXUIField(DisplayName = "Connection Name", Required = true)] PXDimensionSelector("SRCCONN", typeof(Search<AKTDataExtractionSource.name>), typeof(AKTDataExtractionSource.name), SupportNewValues = true )] public virtual string Name { get; set; } public abstract class name : PX.Data.BQL.BqlString.Field<name> { } #endregion
The current behavior is that I enter a value and tab off the field, and it disappears.
I took off all selectors just to try to get it to save a record with a plain text box, and that’s not working either. I’m going to create an Acumatica ticket and see where that gets me.
Update: After comparing to a simpler example that works, I found the difference was that I was using FormTab as a master page, and had some empty tabs on my page. After taking off the tabs and changing to reference FormView as master page, things started working, and even when putting the PXSelector back in. Feels like a bug to me, but at least it’s working now.
Thank you for sharing your solution with the community @tlanzer25Â !