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

Generic Events Declaration

Hi Everyone, Starting from Acumatica 2017 R2 you may notice a different events declaration. We call in generic events or new events declaration. Here you can see an example for row and : protected virtual void _(Events.FieldUpdated<DAC, DAC.field> e) {} protected virtual void _(Events.FieldDefaulting<DAC, DAC.field> e) {} protected virtual void _(Events.RowUpdated e) {} protected virtual void _(Events.RowSelected e) {} protected void _(Events.CacheAttached e) {} From the functional side there is not difference between old and new events declarations. However with generic events you have 2 main benifits: No more mistakes in names of DACs or Fields. As you rerefence it by tipe whong name won’t be even compiled. Don’t need to cast DACs anymore from e.Row anymore. It will have a typeinside. PXCache cache = e.Cache; DAC row = e.Row; However there are a couple of… Read more

Acumatica MVP Program

Hi Everione, For someone who hasn’t notices that – Acumatica has very internstion badge for developers – MVP (Most Valuable Professionals). It can be used for promotional purposes by the company and by the individual MVP as well. This is designed to actively encourage greater contribution to our growing developer community and ecosystem. Please read more on Acumatica ADN Portal. And feel free to promote developers you know!

Team Development – Process and Responsibilities

Hi Everyone, Today want to give you one more view on the development process in Acumatica. When you have a team you have a different types of people with different skills. And everyone within a team should know their part of the whole process. In Acumatica every team has following members: Product Manager Developer Quality Asurance Engeneer Technical Writer They all and together participate in the feature delivery. And this diagram describes the best how feature workflow is organized between them: Now Let me describe it with details: Product Manager works with partners, clients and other information sources to prepare specification that will describe what feature should have from business… Read more

Continues Integration with Acumatica Platform

Hi Everyone, A bit earlier on Acumatica Cloud Development Conference I had a Black Belt Development practices. As part of it I covered an automation tools Acumatica supports. In this article I want to extend this topic a bit with more examples and links. Automate Acumatica Wizard Installation Acumatica installation wizard is a standard MSI (Microsoft Installer) package that can be managed with standard windows tools. For example there is msiexec.exe tool that can do installation and de-installation from console. Here you can read more about msiexec parameters. With Acumatica you can use following command to install it: msiexec.exe /i /a /qn “AcumaticaERPInstall.msi” /i – installation command /qn – quiet… Read more

Custom field on CR Quote screen

Hi Everyone, If you try to add a custom field on CR Quotes in Acumatica 2018 R2 you may face very weird behavior – field is added, can be saved to database but as soon as you refresh screen or record valued disappears. The reason of this issues is PXProjection that is described in my separate article: PXProjection – SQL Views using BQL  This image show you how projection is defined in Acumatica CRM PXProjection uses 2 Data Access Classes for quotes: One class represents the table – PX.Objects.CR.Standalone.CRQuote Another represents view as combination of DACs in select – PX.Objects.CR.CRQuote And to correctly work, custom field needs to be added in… Read more

Team Development with Acumatica

Hi Everyone, Today want to share with you some ideas on how to organize your team development with Acumatica. In the Asia region we are getting more and more big implementation project where customization is involved. In the same time we have a lot of new ISVs with own development. With that I’m getting more and more a question on how to organize continues team development with Acumatica. So here I want to answer * on this image you see Git as a source control. This is only an example and you may use other source controls like SVN, TFS, Mercury and others. Acumatica does not have preferences in source… Read more

Acumatica 6-tiers Web Architecture

Hi All, Recently got a question about Acumatica web architecture and tires. To answer it I have prepared slide that I would like to share with you now: Acumatica 6-tiers Web Architecture: Acumatica Cloud xRP Platform (Presentation, Business and Data Access tiers): The basic diagram of Acumatica SaaS hosting Have a nice development!

Use Split Container from Customization Browser

Hi Everyone, You may know that in Acumatica you can put several large containers (like grids and forms) together. But to controls or optimize space usage on small screen Acumatica uses special Split Container control. Basically this is the panel that you can drag and drop to reallocate space used by nested controls. To handle it Acumatica ASPX markup has special element: <px:PXSplitContainer runat=”server” ID=”PXSplitContainer1″ Orientation=”Horizontal”>   <AutoSize Enabled=”true” Container=”Window” />   <Template1> </Template1>   <Template2> </Template2> </px:PXSplitContainer> Under the Template1 and Template2 elements you can place other container controls like Form and Grid.  Here I have an example for putting grid into the Template1. <Template1>   <px:PXGrid runat=”server” ID=”grid11″ Height=”150px” SkinID=”DetailsInTab”  Width=”100%” SyncPosition=”True”>     <AutoSize Enabled=”True” MinHeight=”150″ />     <Levels>       <px:PXGridLevel DataMember=”DataMember1″>         <Columns></Columns>       </px:PXGridLevel>     </Levels>   </px:PXGrid> </Template1> Do not forget… Read more

Toggle List as Entry Point

Hi All, List as entry point is very nice feature that allows yoг to see multiple documents together. However in some cases you may want to get document faster and eliminate unnecessary clicks. Luckily Acumatica gives your options to choose if you want to enable it or now. You can control this for Modern UI and Classic UI separately.  Just go to screen Lists as Entry Points (SM208500) In the end to make my life few seconds easier I have created a simple button that can toggle On and Off lists as entry point wherever I need them or not. View the code on Gist. Have a easy UI.

Auto-Numbering Customization

Hi All, In Acumatica PX.Objects.CS.AutoNumberAttribute is responsible for almost all auto-numbering. However sometimes you may want to have control on it. For example change sequence depend on conditions or add specific numbers related to vendor or customer. These things quite easy to do with customization. Here I’m going to show you 2 scenarios: How to change numbering sequence How to change new number Change Numbering Sequence on the fly. AutoNumber Attribute generates new number on RowPersisting event. As you may remember from T200 Development Training guide RowPersisting of graph will be executed prior to attributes, so we can control what Attributes will do. This is correct for all  *ing events… Read more