today I want to present a bit differnt code sample on how to append to behavior of Actions menu items of Sales Orders screen.
Quite often there are tasks like add something before ( preprocessing ) or after some menu item action was executed. Once I've described it alredy here, but just want to give another example with usage of Func.
Take a look on following code sample:
public IEnumerable Action(PXAdapter adapter, int? actionID, DateTime? shipDate, String siteCD, String operation,
Func<PXAdapter, int?, DateTime?, string, string, string, IEnumerable> baseMethod)
as you can see, it's very similar to previous post, just … more
recently I was asked to modify behavior of Process shipments screen in Acumatica. Issue was the following: in case if one of the rows on Process shipments generated error, it was needed to show on the status of processing.
Default behavior was like showed on the screenshot:
as you can see on the screenshot, despite errors were generated on the row level, whole status of processing is fine ( green in the top ).
Of course for my QA such kind of behavior is weird and he asked me to fix it.
Such behavior happens because Process shipments screen ( SO503000 ) uses PXProcessing.SetProcessTarget() to set the processing delegate which doesn't care at all about errors in the … more
today I want to write a note about interesting case I faced recently.
I was asked to load from Acumatica database Sales orders joined with PO Receipts by inventory, but I had one issue. It was needed to join only by latest PO Receipt, not by allo PO Receipts. In other words it was needed to take only one element of each group.
As usually such kind of implementation is done with help of overloading delegate, which loads all data from SQL Server into memory and then does grouping operaions in memory. Such approach is workable on relatively small cases, but if database of customer
is around 130 Gb, then we faced timeout issue.
How to deal with it.
After some trial … more
today I want to leave a short notice on how to send a message from your graph for cases, when your graph is used in processing screen which is implemented through Automation steps. For this purpose you can use new property of PXAdapter class. It has property
MassProcess. In case if your graph will be executed from processing screen that property will be set to true. Then you'll get a chance to notify processing screen about error with help of SetError message. In that case in your graph you can write something like this:
var currentSoOrder = currentSoOrderBoxed.GetItem<SOOrder>();
string errorMessage = string.Format(WorkFlowMessages.creditLimitExceededTemplate, … more
recently I debugged code of Acumatica, and found following expression:
[PXFormula(typeof (Switch<Case<Where<Add<SOOrder.releasedCntr, SOOrder.billedCntr>, Equal<PX.Objects.CS.int0>>, SOOrder.curyOrderTotal, Case<Where<Current<SOSetup.freightAllocation>, Equal<FreightAllocationList.prorate>>, Add<SOOrder.curyUnbilledOrderTotal, IsNull<Mult<Div<SOOrder.curyUnbilledOrderTotal, NullIf<SOOrder.curyLineTotal, decimal0>>, SOOrder.curyFreightTot>, decimal0>>>>, SOOrder.curyUnbilledOrderTotal>))]
I always got scared when I see such kind of expressions. I have a feeling that it was written by somebody who can easily pass zebra puzzle. Unfortunately I'm not such a men.
While … more
today I want to tell interesting behavior of method RowPeristing in Acumatica graphs. Try to guess, after which actions of user that event is getting called? Save ? Yes. Delete? Also yes! Insert? Also yes.
If you ask me why? I'll not provide you an anser. But I want to leave a piece of code which describes how to understand which action was called. I'll demonstrate it on sample of SOShipLine, and you'll be able to use it for other DAC classes, with slight modificaitons.
Here you can see two cases:
protected void SOShipLine_RowPersisting(PXCache sender, PXRowPersistingEventArgs e)
var soShipLine = e.Row as SOShipLine;
if (sender.GetStatus(soShipLine) == … more
today I want to leave a short notice on how to use PXUIVisible attribute. I already mentioned that attribute in this article but today just want to give one more example of it's usage.
Take a look on the following code:
[PXUIField(DisplayName = "Shipment display")]
[PXUIVisible(typeof(Where<Terms.visibleTo, Equal<TermsVisibleTo.all>, Or<Terms.visibleTo, Equal<TermsVisibleTo.customer>>>))]
protected void Terms_UsrShipmentDisplay_CacheAttached(PXCache sender)
As you can see from the example, PXUIvisible expectes from you to get some kind of where condition. Another important detail is that control, from which visibility depends should have … more
today I want to leave a short notice on how to override ExecuteSelect method in your own graph for debugging purposes. I found following code useful:
public override IEnumerable ExecuteSelect(string viewName, object parameters, object searches, string sortcolumns, bool descendings, PXFilterRow filters, ref int startRow, int maximumRows, ref int totalRows)
//Here you can analyze what is coming into your select
var result = base.ExecuteSelect(viewName, parameters, searches, sortcolumns, descendings, filters, ref startRow, maximumRows, ref totalRows);
//And here you can … more
today I want to leave a note about few abbreviations in Acumatica related to Price/Cost info tab.
Min. Markup % - percentage. In other words that is minimal addition to price which your company adds to cost of buying of something
MSRP - manufacturer suggested retail price
Markup - extra cost added to price. more
today I want to leave this piece of advice that I agree.
As our business grows, it becomes increasingly necessary to delegate responsibility and to encourage men and women to exercise their initiative. This requires considerable tolerance. Those men and women, to whom we delegate authority and responsibility, if they are good people, are going to want to do their jobs in their own way. Mistakes will be made. But if a person is essentially right, the mistakes he or she makes are not as serious in the long run as the mistakes management will make if it undertakes to tell those in authority exactly how they must do their jobs. Management that is destructively critical when … more
today I want to leave a short note on Default value for the inquiry screens for Data type. For date you can use following predefined values:
@WeekStart and @WeekEnd - as name suggests start and the end of Current week
@MonthStart and @MonthEnd - start and the end of Current Month
@PeriodStart and @PeriodEnd - start and the end of Current period
@QuarterStart and @QuarterEnd - start and the end of Current quarter
@YearStart and @YearEnd - start and the end of Current year
@Today - today is always today
I hope this short notice will help you better feed dates into your inquiries. more