Dashboards based on Real Screen

Hi All, You may know that it is easy to do a dashboard in Acumatica based on Generic Inquiry. But you also can enable your custom real screen to be a dashboard source. To do this you actually need only 3 things: Mark your Graph as dashboard source: [PX.Objects.GL.TableAndChartDashboardType] Mark you Data View as Filterable: [PXFilterable] Add a Data View delegate. For some reason dashboard does not work without it. I hope this issue will be solved soon. Full code source: using System; using System.Collections; using System.Collections.Generic; using PX.Data; using PX.Objects.AR; namespace CUrrentBranch { [PX.Objects.GL.TableAndChartDashboardType] public class CurrentBranchInvoices : PXGraph<CurrentBranchInvoices> { public PXCancel<ARInvoice> Cancel; [PXFilterable] public PXSelect<ARInvoice> MasterView; public virtual… Read more

Depersonalize Acumatica Database

Hi All, If you need to give an Acumatica Database to someone but if you care about data privasy, you may a way to crear some sensetive data from the database. Here I want to share with you a script example that creares and depersonalise some of private information from database: View the code on Gist. Basicall this script resets all passwords, clears all contact and address details, remove files attached. Feel free to improve and extend it for other objects. Hope it helps!

Get Current Company Name

Hi All, Want to give you a short trick – how to extract company name from the currently logged in user: Company Name PX.Data.PXLogin.ExtractCompany(PX.Common.PXContext.PXIdentity.IdentityName) Here we have 2 things: PXSessionContext (PXContext.PXIdentity) – System class that stores environment variables in session like User, TimeZone, Branch, Locale. Actually this is used for user authentication authorization. However user here is stored with a full notation – like “user@company:branch”. But we can cut a part of it using special rules. PXLogin – set of tools that can help to login user and use username. In our case it can extract company name right from full identity name. Company ID PX.Data.Update.PXInstanceHelper.CurrentCompany Here we have an… Read more

Generic Inquiry with Filtering by Current Branch

Hi All, Want to show you an option how can you filter documents in Generic Inquiry by currently selected branch. In reports you have an option to use AccessInfo.BranchID, but in generic inquiries unfortunately such option is not available. You also can’t join this table as AccessInfor is virtual table that does not exist in database. However there is a workaround – we create a parameter in GI, that will get a default value from any branch field in Acumatica that has a default value from current branch and than use this filter for filtering. Let me guide you: We need to create a parameter that will store a current… Read more

Reporting Currency Conversion on the Fly

Hi All, In Acumatica you can use standard currency translation tool to translate base currency to any other reporting currency. However this process is available only for GL Balances. You can really translate AP/AP SO/PO balances and total using the same approach. Here I want to give you the idea of how can you do on the fly currency translation from any currency to any currency on any document in Acumatica for reporting purposes. Problem The biggest problem of this task are Rates. In Acumatica we store rates assigned to effective date. But if you have other dates where are no rates defined, we need to user the closest previous… Read more

Override Action – Confirmation Dialog

Hi Everyone, Want to give you an example of how to modify an action in Acumatica. specifically I’ll customize a Release action on Payments and Applications with adding a Confirmation Dialog with conditions. To customize an action we should follow the Acumatica customization guide. In simple words we should do following: Find the original action. Create a graph extension. Redefine the original action with the same parameters. Add own logic in the new action. Call base action code. Base Action Code To find the original Action you can use Source Code browser. Custom Code Your code will be called instead of the base action. You can put your custom code… Read more

Dynamic Drop-Down Control

Hi Everyone, Usually Acumatica Drop-Down controls have fixed lists of values. Of course you can use PXStringListAttribute.SetList<…>(…) method do change list of values dynamically, but how to make it more handy. The way I recommend you is to create an attribute that can encapsulate all the field related logic, so to use it you can just put the attribute on the proper place. So the plan: Create an attribute that will be inherited from PXStringList and provide the values Create IPrefetchable class that can be automatically load all possible list from DB and cache it. In the same time Acumatica will auto-reset when the linked table is changed. This is… Read more

Monitor Online Users

Hi All, Web technologies work the way where server know almost nothing about where is browser and what is user doing there. Is it active? Is it closed? It is online? Is computer sleeping? We don’t know if there browser does not inform us. Just for example – if you lost internet connection, should we treat this as online or inactive? In Acumatica Online/Offline is just a flag in users table. If users logs in, Acumatica rises this flag, if users is not active for some time, Acumatica clears this flag. This flag is automatically managed by Acumatica but in some cases it may be not in the consistency with… Read more

Send Documents to Printers

Hi All, There is an nice function in Acumatica 2018R1 – Device Hub. This service can be installed on any machine where printer is configured/available and automatically pull Acumatica for documents need to be printed. There are a lot of screens who uses this function in the standard Acumatica already, but today I want to give you a quick look on how you can write your custom code and send request to printers. Device Hub First of All device hub should be installed on your computer, connected to Acumatica and configured with Available printers. Printers also should be Configured in Acumatica. Customization Now we can write a bit of code.… Read more

In-Screen Popup Panels with iFrame

Hi Everyone, Most probably you have seen the function in Acumatica where you can open a new screen in a iframe on top of the existing screen without navigation. This approach has some benifits and disadvantages. Have inplace pupup helps to have less redirection and less windows, but in the same time it blocks the previous page and you cant modify/see background untill you close the popup. Choose the way you use wisely based on the requiranments and design you have. How to call inline popup? public PXAction<SOOrder> createPrepayment; [PXUIField(DisplayName = “Create Prepayment”, MapViewRights = PXCacheRights.Select, MapEnableRights = PXCacheRights.Update)] [PXButton(ImageKey = PX.Web.UI.Sprite.Main.AddNew)] protected virtual void CreatePrepayment() { ARPaymentEntry target =… Read more

Automate Inter-Company Transactions – Architecture

Hi All, I have this question quite a lot in Asia, mostly because there you probably have a big company already if you explore the ERP options. Many medium/big companies in Asia have multiple locations, multiple offices, multiple legal entities in multiple countries. This comes to the point where you have to do some inter-company transactions that affects multiple companies. Inter-Company Transaction Inter-company accounting is the process of recording financial transactions between different legal entities within the same parent company You can classify inter-company transactions in 2 types: One transaction that hits multiple companies. For example when you pay rent from one company to multiple others. This transactions can be… Read more

Replenishment In Acumatica

Hi Everyone, Today I want to briefly explain a replenishment functionality in Acumatica. Overview Acumatica has designed replenishment feature based on most common requirements of SMB companies, however it is extended with advanced algorithms of automatic calculation replenishment parameters based on seasonality or historical transactions. In the same time you need to understand that Acumatica replenishment may not support some powerful replenishment features like advanced demand forecasting based on future SO/PO orders or other forecasting methods. In case of such requirements you can use full power of Acumatica xRP platform flexibility and customizability and you can and there other required features features. Acumatica replenishment is split into the two steps:… Read more

Select Multiple Documents into One Grid

Hi Everyone, In some situations you may want to show different unconnected documents inside one grid. Just for example you want to create Customer Overview screen and show all Invoices, Payments and Sales Orders together in one place. Join tables together is not the best approach, as you will have to add different columns with same names for fields from different tables. Better Approach is select them independently in Data View delegate and merge them into one virtual DAC. So plan is the following: Create a new Virtual DAC that will represent any document in the system. Please note that this DAC should have a Key that should unique even… Read more

Order of Tenants On Login Screen.

Hi Everyone. You may notice sometimes that order of tenants on logins screen might be broken like on this screenshot. That usually happens because the order of companies is broken in the database (where Acumatica stores it). On this screens you can see select of data from Companies table and you see mess in “Sequence” column. Why it can happened? The most common case is snapshot restoration. When you create a snapshot it stores the position of the company to correctly restore it if you need. But if you restore the same snapshot in the different company you may have a situation that 2 companies have the same Sequence number.… Read more

Totals Calculation for Inquiry

Hi Everyone, Today want to give you an idea of better architecture for inquiry with some aggregated calculations. Problem Statenment Let assume that you have an inquiry when you need to calculate totals together on the filter together with printing details like described here: Than how can you do that? One of the obvious way may be to create a dataview and iterate thought ever record to calculate total: public PXFilter<InquiryFilter> Filter; public PXSelect<Batch> Records; public IEnumerable records() { decimal docsTotal = 0m; foreach(Batch row in Records.Select()) { docsTotal += res.ControlTotal; yield return row; } //… } However it is not really good idea to iterate thought all records if you need to get a total of records selected, as you have to ignore paging… Read more

Context Parameters

Hi Everyone, In this topic I want to cover another architecture pattern we have in Acumatica – Usage of context related parameters. Problem Statement Within the event model it is not easy to pass parameters into the other child or related events. There is a way with local variables how it is shown in T300 Training Guide and Override Release Action Lesson. However it is a really not nice approach if events happens in different objects like here: public class SomeGraph : PXGraph<SomeGraph> { public void CreateBatch() { bool needValidate = true; //Create Batch } } public class JournalEntry : PXGraph<JournalEntry> { public void DAC_RowUpdated(PXCache cache, PXRowUpdatedEventArgs) { if (needValidate) { … } } } Solution In Acumatica we use an approach that we call Scopes. Scope is a class that set… Read more

Loops in Notification Templates

Hi Everone, There is a nice functionality in Acumatica that allows you to print details of the document inside the notification template. Together with other Data Fields, now you can put additional constructions like Loops (or for-each loops) <foreach view=”Products”> ((Products.InventoryID)) – ((Products.Quantity)) – ((Products.CuryExtPrice)) <br> </foreach> Here you can find following important elements: ((Products.InventoryID)) – is link to the data view and field. You can use designer to insert fields like this using button “Insert” -> “Data Field” <foreach> – here it is the reserved word for the beginning of the loop view=”Products” – this is a view name that is used to get data from database. You can… Read more