I have a customization that overrides the Purchase Order Line Account field drop-down lookup selector on the Purchase Order screen. It populates like I want, but the account selected from the dropdown doesn't display in the grid field after chosen. Here it is:
[PXSelector(
typeof(Search5<Account.accountID,
InnerJoin<PMCostBudget, On<Account.accountGroupID, Equal<PMCostBudget.accountGroupID>>>,
Where2<Where<PMCostBudget.projectID, Equal<Current<POLine.projectID>>, Or<Current<POLine.projectID>, IsNull>>,
And2<Where<PMCostBudget.projectTaskID, Equal<Current<POLine.taskID>>, Or<Current<POLine.taskID>, IsNull>>,
And2<Where<PMCostBudget.costCodeID, Equal<Current<POLine.costCodeID>>, Or<Current<POLine.costCodeID>, IsNull>>,
And<Where<Current<POLine.lineType>, Equal<POLineType.nonStock>, Or<Current<POLine.lineType>, IsNull>>>>>>,
Aggregate<GroupBy<Account.accountID>>,
OrderBy<Asc<Account.accountCD>>>),
DescriptionField = typeof(Account.description),
Filterable = false,
SelectorMode = PXSelectorMode.DisplayModeValue
)]
It basically filters on the line type, project, task, and cost code selected on the same PO line. What am I missing or doing wrong so that the selected AccountCD value will display?
Assuming the rest of your customization properly handled the override and the selector itself works (I think that is what you are saying)... If you need to display AccountCD, you should add SubstituteKey = typeof(Account.accountCD). Without that, the selector is set right now to display the AccountID.
[PXSelector(
typeof(Search5<Account.accountID,
InnerJoin<PMCostBudget, On<Account.accountGroupID, Equal<PMCostBudget.accountGroupID>>>,
Where2<Where<PMCostBudget.projectID, Equal<Current<POLine.projectID>>, Or<Current<POLine.projectID>, IsNull>>,
And2<Where<PMCostBudget.projectTaskID, Equal<Current<POLine.taskID>>, Or<Current<POLine.taskID>, IsNull>>,
And2<Where<PMCostBudget.costCodeID, Equal<Current<POLine.costCodeID>>, Or<Current<POLine.costCodeID>, IsNull>>,
And<Where<Current<POLine.lineType>, Equal<POLineType.nonStock>, Or<Current<POLine.lineType>, IsNull>>>>>>,
Aggregate<GroupBy<Account.accountID>>,
OrderBy<Asc<Account.accountCD>>>),
SubstituteKey = typeof(Account.accountCD),
DescriptionField = typeof(Account.description),
Filterable = false,
SelectorMode = PXSelectorMode.DisplayModeValue
)]
On PXSelector, the first "typeof" is the value to be selected. You can add subsequent typeof() references if you want to designate fields to display in the PXSelector (if your intent is to display an actual selector).
SubstituteKey = typeof(DAC Field) alters the selector's display to show the designated field rather than the actual value. It is very common to select the recordID field and substitute the recordCD field.
DescriptionField displays the field designated after the displayed valued (the specifically selected field or the SubstituteKey field if specified). I could be wrong, but I don't believe this shows when the selector is displayed in a grid. I believe it only applies to form fields, such as if you toggle the grid row to a form view.
Filterable is optional, but it allows you to set filters in the selector, such as when you have a lot of records to retrieve and may want to quickly locate a value. I believe there is some overhead to using it, so setting to false as you did could be a tiny performance gain.
I never used SelectorMode before, so you taught me something new here! If adding SubstituteKey does not resolve your issue, you might try removing the SelectorMode line to see if that resolves your issue. By the way it reads, that could be changing the behavior of the selector from what I would expect.
Acumatica support's suggestion solved my problem. Since the Account id is a segmented key, I needed to manually change the PXSegmentedValue to a PXSelector in the .ASPX to get it to work. I also got it to work without that change by using a PXDimensionSelector instead of a plain PXSelector in the override.
[PXDimensionSelector(AccountAttribute.DimensionName,
typeof(Search5<Account.accountID>...
The field in the DAC is defined like this.
#region NextMonthHours
[PXDBDecimal(2, MinValue = 0.0, MaxValue = 280.0)]
[PXUIField(DisplayName = "Next Month Hours")]
[PXDefault(TypeCode.Decimal, "0.0")]
public virtual Decimal? NextMonthHours { get; set; }
public abstract class nextMonthHours : PX.Data.BQL.BqlDecimal.Field<nextMonthHours> { }
#endregion
I change the display name of the field in RowSelected event.
PXUIFieldAttribute.SetDisplayName<EVEPPlannedHoursDetails.nextMonthHours>(sender, nextMonth+"Hours");
where nextMonth is "February".
I need to add this field to Acumatica Mobile Screen. When I go to web service schema the field name is "FebruaryHours"
<s:element minOccurs="0" maxOccurs="1" name="FebruaryHours" type="tns:Field"/>
I cannot use the name "FebruaryHours" because it changes every month but I also when I use field name NextMonthHours it is not added in the mobile screen.
Any idea how to solve this issue?
Thanks
There's quite a few ways to workaround this depending on the use case and whether the label value is static or dynamic.
If all you want to do is to change a static label in UI without having to change the display name property you can add a separate label and merge group.
Here's an example to change Billable in UI without changing DisplayName property using that technique.
Set SuppressLabel property to true to hide the original label bounded to DisplayName on UI.
Use ADD CONTROLS tab to add a Layout Rule with Merge property set to true.
Use ADD CONTROLS tab to add a label control in the merged group.
Put the original field in the merge group so they show up together on the same line in UI.
End result, label is now a UI control and wouldn't interfere with DisplayName property.
We have a few needs to have a time field in Acumatica (PXDBInt as total minutes) to show the value to the user and allow the user to enter in a negative value. The standard formatting of the PXDBTimeSpanLong attribute doesn't allow a negative value to be entered or correctly displayed (db value or unbound formula value is negative already).
Has anyone created a custom class that inherits PXDBTimeSpanLongAttribute and been able to get a negative value to display and be entered? We are using the TimeSpanFormatType.ShortHoursMinutesCompact format which displays in hh:mm
Example user entries:
"01:30" (1 hour and 30 minutes)
"-02:45" (negative 2 hours and 45 minutes)
"00:05" (5 minutes)
Sample DAC usage for PXDBTimeSpanLongAttribute:
public abstract class myTime : PX.Data.IBqlField
{
}
[PXDBTimeSpanLong(Format = TimeSpanFormatType.ShortHoursMinutesCompact)]
[PXUIField(DisplayName = "My Time")]
public virtual Int32? MyTime { get set; }
Testing the formatting using ShortHoursMinutesCompact
A positive value between "00:00" (int 0) and "23:59" (int 1439) works correctly
A negative number while stored in the database correctly is not correctly displayed (assuming the entry allows for negative entry). For example an expected "-02:45" (int -165) value results in a display of " 0:2 ". When I click in the field then click out the value is changed to "00:02" without entering any new value.
There is no field restriction from entering in a value greater than 24 hours even though the intent of the ShortHoursMinutesCompact format is a 24 hour entry. The field will allow and accept any value that fits the hh:mm format (values between "00:00" and "99:99"). When the user enters for example "29:00" the displayed value is changed to "05:00" but the database value is 1740 (29 hours as total minutes).
Found a workaround
While I need the PXDBTimeSpanLongAttribute to accept negative values for all allowable formats I was able to solve the more important issue for my requirement of needing a negative value 24 hour time field (which validates the entry within -24 to +24 hours).
I found PXTimeListAttribute is a working version of PXDBTimeSpanLongAttribute (when using the ShortHoursMinutesCompact format).
Benefits of using PXTimeList vs PXDBTimeSpanLong (ShortHoursMinutesCompact)
Using an int data type - no need to change the database field type. (Need to include the PXDBInt attribute with PXTimeListAttribute vs before PXDBTimeSpanLong was both)
Allows for both positive and negative numbers
Restricts the entry from within +/- 23:59
In a perfect world it would be nice to allow -24:00 to +24:00 but topic for another day.
In addition to changing the attribute used on my DAC/field I had to update the page entry for my field from a PXMaskEdit to PXTimeSpan using the following example:
Page grid - RowTemplate:
<px:PXTimeSpan ID="edMyTimeField" TimeMode="True" runat="server" DataField="MyTimeField" InputMask="hh:mm" CommitChanges="True" />
Page grid - Columns:
<px:PXGridColumn DataField="MyTimeField" Width="60px" AutoCallBack="True" RenderEditorText="True"/>
Sample usage of the attribute:
#region MyTimeField
public abstract class myTimeField : PX.Data.IBqlField
{
}
[PXDBInt]
[PXTimeList]
[PXDefault(0)]
[PXUIField(DisplayName = "My Time")]
public virtual Int32? MyTimeField { get; set; }
#endregion
I have a custom screen with a multiple custom selectors, which change what they select based on dropdown lists.
The solution I implemented is shown in a previous case:
Dynamically changing PXSelector in Acumatica (thanks).
My challenge is twofold:
1.) If the dropdown selection is "No Lookup", then I want the PXSelector Attribute to essentially be removed - leaving just a text entry. Not sure if this is even possible...
2.) If one of the selectors (let's say Projects) is selected, I'd like the selection of the following selector (let's say Tasks) to filter based on the Project selected.
Thanks much...
1) I think the only way to do this is to create your own attribute.
Something like that:
public class PXSelectorTextEditAttribute : PXSelectorAttribute
{
bool selectorMode;
public PXSelectorTextEditAttribute(Type type, bool selectorOn):base(type)
{
selectorMode = selectorOn;
}
public override void FieldVerifying(PXCache sender, PXFieldVerifyingEventArgs e)
{
if(selectorMode)
base.FieldVerifying(sender, e);
}
public static void SwitchSelectorMode(PXSelectorTextEditAttribute attribute, bool onOff)
{
attribute.selectorMode = onOff;
}
}
You will be able to turn on and off the 'selector' part of the attribute. With the field verifying turned off you will be able to put any value to the field just like in simple TextEdit field. However, the lookup button in the right end of the field still will be visible. I have no idea how to hide it.
2) This behavior can be implemented easily. You will need something like that(example based on cashaccount):
[PXSelector(typeof(Search<CABankTran.tranID, Where<CABankTran.cashAccountID, Equal<Current<Filter.cashAccountID>>>>))]
If you want to see all records when the cashaccount is not defined then you just modify the where clause by adding Or<Current<Filter.cashAccountID>, isNull>
Also don't forget to add AutoRefresh="true" to the PXSelector in the aspx. Without it your selector will keep the list of the records untill you press refresh inside of it.
In Scout Eclipse with every field comes label for it. But my problem is that is a lot of free space there and because of that fields are smaller that they should be.
For example :
I tried :
To set label width in pixel: It works, but you should set and calculate it for every field and you can forget about translations, because text don't have same size in other languages.
To set Label Horizontal Alignment to Right - text is positioned by fields but then free space is on the left side.
How to handle that?
P.S.
I don't need label without any free space, but with smaller one.
EDIT :
With spy tool it look like :
I have no idea what your problem really is, here some generic advices I can give you (based on some guesses I have made. I will be happy to extend this answer, when I know more about your use case).
From-To fields:
When you have 2 fields for “From” and “To”, a good practice is to use a sequence box.
Here an example for a “from-to date” sequence box (taken in the Widgets Demo Application):
#Order(50.0)
public class DateBox extends AbstractSequenceBox {
#Override
protected String getConfiguredLabel() {
return TEXTS.get("DateColumn");
}
#Order(10.0)
public class DateFrom extends AbstractDateField {
#Override
protected String getConfiguredLabel() {
return TEXTS.get("from");
}
}
#Order(20.0)
public class DateTo extends AbstractDateField {
#Override
protected String getConfiguredLabel() {
return TEXTS.get("to");
}
}
}
Money field:
We have discussed how you can combine an amount and currency field in a sequence box in order to look like this.
See this solution: Amount and currency field.