Template for usage of PXLineNbr attribute in Acumatica

Hello everybody,

today I want to leave a note on how to use PXLineNbr attribute in Acumatica pages. Recently myself and one of my team members struggled a bit with a question on how to add it properly. Below goes a bit changed worked tempalte:

public class PrimaryTable : IBqlTable
{
    #region LineId
    public abstract class lineId : PX.Data.BQL.BqlInt.Field<lineId> { }
 
    [PXDBInt]
    [PXDefault(0)]
    public virtual int? LineId { getset; }
    #endregion
 
    #region LineCntr
    public abstract class lineCntr : PX.Data.BQL.BqlInt.Field<lineCntr> { }
 
    [PXDBInt]
    [PXDefault(0)]
    public virtual int? LineCntr { getset; }
    #endregion
}
 
public class DetailsTable : IBqlTable
{
    #region LineNbr
    public abstract class lineNbr : IBqlField { }
 
    [PXDBInt(IsKey = true)]
    [PXDefault]
    [PXLineNbr(typeof(PrimaryTable.lineCntr))]
    [PXParent(typeof(SelectFrom<PrimaryTable>.Where<PrimaryTable.lineId.IsEqual<PrimaryTable.lineId
        .FromCurrent>>))]
    public virtual int? LineNbr { getset; }
    #endregion
}

Summary

As you see, nothing special in this code. Add PXParent, PXLineNbr and enjoy with line counter feature.

 

How to override BuildTAxRequest method of APInvoiceEntryExternalTax class

Hello everybody,

today I want to leave a short techy post on how to override method BuildTaxRequest of APInvoiceEntryExternalTax class.

public class APInvoiceEntryExternalTaxExtPXGraphExtension<APInvoiceEntryExternalTaxAPInvoiceEntry>
{
    [PXOverride]
    protected virtual GetTaxRequest BuildTaxRequest(APInvoice invoiceFunc<APInvoiceGetTaxRequestbaseAction)
    {
        var result = baseAction(invoice);
        //Your code
 
        return result;
    }
}

Reason for such a behavior is a fact that class APInvoiceEntryExternalTax is graph extension for graph. That's why such a construction is needed.

How to override the Persist method properly

Hello everybody,

today I want to write a few words on how to override persist method of Acumatica properly. When I say properly I mean not save just some fragment of data, but use transaction like approach.

In other words how to achieve all or noghint during persisting.

Quite often I see template like this:

public void Method1()
{
    //normal flow
}
 
string message = "Forbidden to do anything at 18 hour";
public void Method2()
{
    if (DateTime.Now.Hour == 18)
    {
        throw new PXException(message);
    }
}
 
public void RollBackMethod1AndMethod2()
{
 
}
 
 
[PXOverride]
public void Persist(Action del)
{
    try
    {
        del();
        Method1();
        Method2();
    }
    catch (Exception ex)
    {
        if(ex.Message == message)
        {
            RollBackMethod1AndMethod2();
        }
    }

Take a note how it works. Initially it will persist some base data to db, and then executes Method1 and Method2 which throws exception. As usually it is logically to conclude that if Method1 or Method2 generated some or another exception, that it would be good not to persist data into Acumatica. How to achieve this? You can use for this purpose PXTransactionScope. 

Take a look on this sample:

public void Method1()
{
    //normal flow
}
 
string message = "Forbidden to do anything at 18 hour";
public void Method2()
{
    if (DateTime.Now.Hour == 18)
    {
        throw new PXException(message);
    }
}
 
public void RollBackMethod1AndMethod2()
{
 
}
 
 
[PXOverride]
public void Persist(Action del)
{
    using (var ts = new PXTransactionScope())
    {
        del();
        Method1();
        Method2();
    }

As you probably can guess, PXTransactionScope will make sure that either all data remained persisted, or nothing.

Summary

In case if you need to have all or nothing during persistance to database, then feel free to use PXTransactionScope, it will help you to get all or nothing during persitance to database, and also it will help you to avoid adding complicated logic of tracking what was persisted, what wasn't persisted, and how to clean up the data.

Why Acumatica can't restore snapshot bigger then 2Gb?

Hello everybody,

today I want to share with you my guess regarding why Acumatica can't restore snapshot bigger then 2 Gb. As far as I see at database level, all files are going into table UploadFileRevision. If to look into structure of this table, you'll find that it has column data, which looks like this: 

 

if to google a bit, you'll find that maximum size which Varbinary(MAX) can accomodate is 2 Gb. 

That's why if you snapshot is bigger then 2 Gb, look for other way of restoring of your snapshot

Summary

As of now it is my guess on why snapshot can't be restored. I'll update everybody how to deal with this, once I'll find solution, which satisfies me completely.

Accounting terms in Acumatica English <-> Ukrainian

Hello everybody,

I want to make post of Accountancy terms between English and Ukrainian language.

English term Ukrainian term
Account  
Accounting concept  
Accounting entry  
Accounting method  
Accounting record  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   
   

Gross income and net income

Hello everybody,

today I want to leave a note on gross income and net income from two standpoints: business and employee.

Gross income = Total sales - Cost of goods sold

Net Income = Total sales - Cost of goods sold - Selling expenses. 

Because Gross income = Total sales - Cost of goods sold quite often Net income is recorded in this form:

Net Income = Gross income - Selling expenses

 

If some business had 1 000 000 $ sales and cost of goods sold is 600 000 $ and selling expenses are 250 000 then

Gross income = 1 000 000 - 600 000 = 400 000

Net Income = 400 000 - 250 000 = 150 000

But if you are an employee, then for you differnet definitions are applied.

Gross income = all salary without any deductions

Net income = what left for employee.

If a person has salary 1000, and 300 of deductions of taxes then his net income is 700 ( his selling expenses considered to be equal zero )

How to implement PXStringListAttribute in Acumatica

Hello,

today I want to leave a post about code quality regarding of PXStringListAttribute. If to look in older versions of Acumatica manuals ( for example T200 manual ) you can see something like this:

public class Something : IBqlTable
{
 
    [PXStringList(
        new string[]
        {
            ShipmentTypes.CollectorNew,
            ShipmentTypes.CollectorSent,
            ShipmentTypes.CollectorResponded,
            ShipmentTypes.CollectorExpired
        },
        new string[]
        {
            "New",
            "Sent",
            "Responded",
            "Expired"
        })]
    [PXString]
    public virtual string Field { getset; }
}

Recommended syntax as of now looks like this:

public class Something : IBqlTable
{
 
    [SurveyResponseStatus.List]
    [PXString]
    public virtual string Field { getset; }
}
 
 
public static class SurveyResponseStatus
{
    public class ListAttribute : PXStringListAttribute
    {
        public ListAttribute() : base(
            new string[] { CollectorNew, CollectorSent, CollectorResponded, CollectorExpired },
            new string[] { Messages.CollectorNew, Messages.CollectorSent, Messages.CollectorResponded, Messages.CollectorExpired })
        { }
    }
 
    public const string CollectorNew = "N";
    public const string CollectorSent = "S";
    public const string CollectorResponded = "R";
    public const string CollectorExpired = "E";
 
    public class CollectorNewStatus : PX.Data.BQL.BqlString.Constant<CollectorNewStatus> { public CollectorNewStatus() : base(CollectorNew) { } }
    public class CollectorSentStatus : PX.Data.BQL.BqlString.Constant<CollectorSentStatus> { public CollectorSentStatus() : base(CollectorSent) { } }
    public class CollectorRespondedStatus : PX.Data.BQL.BqlString.Constant<CollectorRespondedStatus> { public CollectorRespondedStatus() : base(CollectorResponded) { } }
    public class CollectorExpiredStatus : PX.Data.BQL.BqlString.Constant<CollectorExpiredStatus> { public CollectorExpiredStatus() : base(CollectorExpired) { } }
}

and also class Messages looks somehow like this:

[PXLocalizable(Prefix)]
public static class Messages
{

    #region Survey Response Status
 
    public const string CollectorNew = "New";
    public const string CollectorSent = "Sent";
    public const string CollectorResponded = "Responded";
    public const string CollectorExpired = "Expired";

also new code from initial standpoint looks as much bigger amount of lines, but from standpoint of reusability, it's much better. It's easier to decorate any String column, which is much easier to use. Also in your code, you can make comparisons against compiled constant instead of hard coding string values.

Summary

Take your time to kind of memorize, or bookmark new way of using syntax, which will be easier to re-use and maitan.

How to deal with Could not load file or assembly in Acumatica

Hello everybody,

today I want to share one workaround, which I sometime use as temporary measure for migration projects. Imagine, that you've added reference to your bin folder of one of your old customizations. Then you build it, and you've got this error message:

Server Error in '/xxx' Application.


Could not load file or assembly 'xxxx' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

 

This error happens because you have in your customization C# part references to some older dll's which are not compatible with current version of Acumatica. So ideal solution would be to re-add to your current class library proper dll.

Another TEMPORARY measure would be add something like this to your Post-build event command line:

command similar to this:

xcopy /Y /I "d:\SourceCode\build20r1core\KNMCCore\obj\Debug\KNMCCore.*" "c:\Program Files\Acumatica ERP\Matrix\Bin\"

Summary

xcopy says to visual studio please make copy

/Y - don't ask for confirmation

/I - copy multiple items

and then goes two string parameters - source with it's mask, and destination.

Пандемія коронавірусу? Ні! Пандемія егоїзму!

Це мій перший пост українською на мому блозі. 

Якщо ви не любите багато читати, то прочитайте наступне речення. Суть того що я хоч�� сказати наступна: «Якщо кожен у світі затримався б удома на 2 тижні або, скажімо, протягом одного місяця, COVID-19 уже б закінчився». Але через те, що всі кажуть: "У мене дуже важлива причина вийти на вулицю, інакше я помру", ми бачимо, як розростається COVID-19. І пандемія годується такими людьми, пожираючи частину з них, і частину невинних. Знову ж таки, якщо ви не любите читати, далі можете не читати.

Вітаєю тих, хто має достатньо сміливості для продовження читання. Подумай над цим. Карантин протягом 2 тижнів безумовно показує, чи є у вас COVID-19 чи ні. Щоб отримати лікування від COVID-19, вам потрібно максимум один місяць щоб вилікуватись, якщо ви хворі на щось подібне до діабету, хронічної обструктивної хвороби легень, певної стадії раку чи інших медичних факторів, що збільшує ваші шанси на смерть. Але це не завжди так. Моя дружина знає хлопця, якому було 30 років, він регулярно відвідувала спортзал, і він помер. Знову ж, якби кожен закрив себе в хаті себе на один місяць, то COVID-19 помер. Але щодня я бачу крики людей, які кажуть: ми помремо від голоду! Наші заводи будуть закриті! Наш бізнес буде закритий! Від повного заперечення COVID-19 до чогось подібного: ці люди все одно помруть, COVID-19 був винайдений штучним шляхом, COVID-19 був створений в лабораторії для вбивства старшого покоління. Згодом ці люди показують в соціальних мережах, що виходять на вулицю без маски, облизують туалетні кришки, роблячи анти-COVID-19 вечірки.

З дитинства багато батьків навчають своїх дітей: егоїзм це погано. На жаль, не всі батьки цього вчать. Багато батьків навчають своїх дітей: ти єдина важлива людина у Всесвіті. Що призводить до що раз більшої кількості я-центр-всесвіту людей. І ці люди поширюють COVID-19 все більше і більше. Чому? Тому що у них є супер важливі причини вийти на вулицю, ніж життя тих кількох відсотків людей.

Це відображено не тільки в COVID-19. Досить багато інших захворювань мають таку ж картину. Подумайте про СНІД. Чому він поширюється? Якщо виключити переливання крові, він поширюється, тому що є ті, хто має важливі причини передати його далі. Ці люди не думають або не хочуть думати про життя інших людей після зараження. Вони мають важливі причини для подальшого поширення СНІДу. Подібна історія трапляється і з туберкульозом. Ця хвороба також поширюється майже подібним чином, просто рівень смертності не такий швидкий. І знову ж таки: чому він поширюється? Бактерії/віруси - це лише одна ланка передачі. Інша ланка передачі - це люди, які мають важливі причини припинити приймати таблетки і мають важливу причину виходити на вулицю, і передавати віруси/бактерії далі.

Егоїзм проявляється на всіх рівнях людського суспільства. Розглянемо історію Китаю з першим лікарем, який повідомив про небезпечний COVID-19. Його вперше оштрафували. Але чому це сталося? Тому що хтось егоїстично подумав: у нас дуже важливі причини не закривати місто. Розглянемо Великобританію і це твердження: "ми втратимо дорогих нам людей". Це не егоїзм? Які причини були для початкової ігнорації вірусу? Приблизно так само, як спочатку думали чиновники Китаю: як ми будемо замикати таке і таке місто? А як щодо США? Приблизно такі ж міркування. Як я буду блокувати таке і таке місто/державу? Що стоїть за такоми міркуваннями? Егоїзм. Подумайте про Іспанію, Францію, Італію, Росію тощо. Я можу продовжувати цей список далі і далі, але ви знову і знову побачите цю закономірність: одні егоїсти шукають виправдання для виходу назовні, інші егоїсти шукають причини, щоб дозволити їм вийти назовні, а треті егоїсти думають, як на цьому заробити. Як результат, всі втрачають.

Потратьте зараз, щоб не тратись пізніше. Кожен шукає тих/того, хто витратить на нього замість того, щоб витрачати самому. В результаті втрачають всі. Егоїстичні і не егоїстичні. Який(а) ти людина/країна/уряд/політичний діяч?

P.S. Хочу додати, що не всі поводяться егоїстично, в боротьбі з коронавірусом є багато саможертовних людей. Але кількість егоїстів настільки велика, що ми бачимо поширення коронавірусу, СНІДу, туберкульозу та багатьох інших захворювань. Якщо людство не знайде способу боротьби з егоїзмом ... Далі не хочу думати

Pandemic of COVID-19? No! Pandemic of selfishness

If you don't like long read, then read next sentence. Essence of the article: If everybody in the world would lock himself at home for 2 weeks, or at let's say for one month, COVID-19 will die. But because of everybody says "I have the most important reason to go outside, or I will die" we see unstopping spread of COVID-19. And pandemic is fed by such people. Again, if you don't like long read, then skip rest of the article.

Congratulations to those who have enough courage to continue reading. Think about it. Quarantine during 2 weeks definitely shows if you have COVID-19 or not. It takes at maximum one month to get medical treatment from COVID-19 if you are sick with something like diabetes, chronic obstructive pulmonary disease, some stage of cancer, or some other medical factors which increases your chances to die. But that not always the case. My wife knows the guy, which was 30 years old, regularly visited gym, and he died. Again, if everybody would lock himself for one month, then COVID-19 would die. But each and every day I'm seeing yelling of people which say: we are going to die from hunger! Our factories will be closed! Our businesses will be closed! From rejecting COVID-19 completely to something like: those people will die anyway, COVID-19 was invented artificially, COVID-19 was created in laboratory to kill older generation. Afterwards those people make posts in social media of themselves going outside without mask, leaking toilet cover, making anti-COVID-19 party.

From childhood a lot of parents teach their children: selfishness is bad. Unfortunately not all of parents teach it. A lot of parents teach their children: you are the only important person in the universe. Which leads to creation of only-me people. And those people spread COVID-19 more and more. Why? Because they have more important reason to go outside, then life of somebody else.

It is reflected not only in COVID-19. Pretty much other diseases have the same picture. Think about AIDS. Why it is spreading? If to exclude blood transfusion, it spreads because there are those, who have important reason to transmit it further. Those people don't think or don't want to think about life of others after infecting. They have important reasons to spread AIDS further. Similar story happens with tuberculosis. This disease also spreads in pretty much similar way, just mortality rate is not as fast. And again, why it spreads? Germs is just one chain of transportation. Other chain of transportation are people, which have important reason to stop taking pills, and have important reason to go outside!

Egoism is shown on all the levels of human society. Consider the story of China with first doctor which reported about dangerous COVID-19. He was fined for the first time. But why that happened? Because somebody selfishly thought: we have very important reasons not to close the city. Consider Great Britain and this statement: "many more people will lose loved ones to coronavirus". Is it not egoism? What were the reasons of making initial decisions? Pretty much the same, as initially thought China officials: how are we going to lock such and such city? Or what about USA? Pretty much the same reasoning. How I'm going to lock such and such city/state? What is behind such and such statement? Egoism. Think about Spain, France, Italy, Russia, and so on. I can continue this list on and on, but you'll see this pattern again and again: some egoists looks for excuses to go outside, other egoists think for reasons to permit them to go outside and third egoists think how to earn on it. As outcome everybody loosing.

Spend now, to avoid meltdown later. Everyone looks for those, who will spend for him instead of spending themselves. In the end everybody loose. Selfish and non selfish. What kind of person/country/government/politician you are?

P.S. I want to add, that not everyone behaves selfishly, there are a lot of self sacrificing people in fighting with coronavirus. But number of egoists is so big, that we see spread of coronavirus, AIDS, tuberculosis and much more other diseases. If humankind will not find a way of dealing with egoism...