CompnayID in tables and DAC in Acumatica

Hello everybody,

today just short notice of DAC and tables. If you create new functionality in Acumatica and look for creating tables, you should know, that all tables which you'll create should have column CompnayID, and that column shouldn't be reflected in DAC.

Cannot insert explicit value for identity column in table when identity_insert is set to off in Acumatica

Hello everybody,

today I received the following error message in Acumatica:

Cannot insert explicit value for identity column in table when identity_insert is set to off.

After executing SQL


problem wasn't solved, so I needed to search deeper. After attaching with SQL Profiler, I noticed that Acumatica generated SQL, which tried to insert null into key field. Then was time to look in manual. 

And then I noticed that for key fields statement IsKey = true is not used. Instead is used 


So I replaced [PXDBInt(IsKey = true)] with [PXDBIdentity] and problem disappeared.

GoFirstRecord and Configuration screens in Acumatica

Hello everybody,

today I want to share with you one of my mistakes. 

Few days ago I started to develop Configuration screen, or screen which should end at xx101000. After I completed it and passed for testing I faced a challenge. The page should display only the first record. So I implemented some logic which selected the first record. After that I re-read one of the manuals and found that DataSet have property PageLoadBehavior which can be set to GoFirstRecord!!!!

After I removed my code which loaded first record, and added beforementioned property my configuration screen behaved as really configuration screeen. 

Saving complex objects in Acumatica

Hello everybody,

today I want to share one nesessary step which is needed for graph in order to save graph which has more then one DAC ( data access class ).

In my case I have DAC PRPayRoll, which is joined with classes PRPayrollDetails, PRPaySlip, PRTran.

In that case it is needed to mention in graph declaration primary dac.

So instead of writing 

public class PayRollManager : PXGraph<PayRollManager>
I wrote
public class PayRollManager : PXGraph<PayRollManager, PRPayroll>

Where PRPayroll is primary DAC. Or if to quote Acumatica manual PRPayroll is primary DAC for business logic container

Undefined: Cannot read property "length" of undefined

Hello everybody.

Today I want to share how to deal with Acumatica error message

undefined: Cannot read property "length" of undefined.

If you face it, you need to know that some members of your DAC need attribute either PXInt or PXDbInt or something similar. 

One more detail, DAC should have at least one IsKey = true property

Failed to subscribe event CacheAttached in graph

Hello everybody, who follows my blog.

Today I want to share with you some surpsise of Acumatica which taken me some time. 

In one of my graphs I added CacheAttached event in order to modify way of displaying title. As outcome I got something like this:

Failed to subscribe event Graph::Table_Row_CacheAttached in graph Graph. 
Method signature looks like event handler, 
but cache Table has not been found in the list of auto initialized caches.
Remove unused event handlers from code.

Let's assume that Table name is BAccount. 

It is possible to solve with the following statement:

public PXSelect<BAccount> HiddenBacount;

The following statement added BAccount into list of auto initalized caches and solved my problem.

11 lessons you will never learn in School

Hello Everybody,

I want to share what I found here some ideas:

RULE 1: Life’s not fair. Get used to it

You could be the smartest, hardest working most noble person alive and still not get that A. Or promotion. Or the girl, whatever floats your boat. The sooner you stop expecting life to hand you the things you think you “deserve”, the easier it will be to bounce back in those times when life knocks you down and just keeps kicking. You could earn your way to that promotion and still have it snatched from under you – get over it. That doesn’t mean sit back and take it. It means that you need to learn from those ugly situations and better position yourself to reap the benefits of your diligence.

RULE 2: The World Doesn’t care about your self esteem

“The world expects you to accomplish something BEFORE you feel good about yourself” … so get on it. Start making something of yourself today. Right now. That idea you’ve been pushing to the back of your mind might be just the thing to propel you to the limelight, so get on it. You only truly fail if you never try.

RULE 3: You will not make six figure salary right after school

“You won’t be a vice president with a car phone until you earn both.” This addresses the entitled behavior that young people display on a daily basis. It’s not a good look for anyone to act like the world should unfurl a red carpet at their feet just because they showed up. You have to work hard for what you get – I’m talking sweat and blood here, and don’t expect anyone’s gratitude for it.

RULE 4: If you think your teacher is tough, wait till you meet your boss

All those deadlines you think are unreasonable at best, those times she locked you out of class because you showed up late? Ten times worse with a boss. Only, instead of chewing you out infront of a classroom, it’s a whole office. Teachers are legally mandated to show some restraint, bosses aren’t. He’ll call you all sorts of names your teacher only dreams of saying to your face, then show you the way to the unemployment line. This isn’t to scare you off of gainful employment, just to encourage you to practice dealing with difficult authority figures, to better prepare you for the future, so you can avoid an emotional outburst at the office.

RULE 5: Flipping buggers is not beneath your dignity

“Your grandparents had a different word for burger flipping – they called it OPPORTUNITY.” So get over yourself and take that job that you think is beneath you. A waiter/waitress position opens up at your favorite restaurant? Swallow your pride and take it. Use that as a stepping stone. The richest men in the world started off as paper boys – remember that.

RULE 6: If you mess up, it’s not your parents fault

“So don’t whine about your mistake – learn from them.” Too many people fall into the trap of claiming “mommy” and “daddy” issues when they mess up. According to Bill Gates, you need to stop spreading the blame around and take responsibility for your failures. Only then do you earn the right to own your successes as well.

RULE 7: Your folks know something you don’t know     

“Before you were born, your parents weren’t as boring as they are now. They got that way from paying your bills, cleaning your clothes and listening to you talk about how cool you think you are. So before you save the rainforests from the parasites of your parents’ generation, try delousing the closet in your own room.” Self-explanatory.

RULE 8: Your school may have done away with winners and losers, but life has not

“In some schools, they have abolished failing grades and they’ll give you as many tries as you want to get the right answer. This doesn’t bear the slightest resemblance to ANYTHING in real life.” Only the strong survive. This doesn’t mean that it’s okay to do whatever it takes to come out ahead – the end does not justify the means. It just means that you need to keep the big picture in mind – to remember that while it’s okay to do your best, it’s better to always ensure that you go the extra mile to prove yourself.

RULE 9: Life is not divided into semesters

“You don’t get summer off and very few employers are interested in helping you “find yourself”. Do that on your own time.” This is one thing most students don’t realize. The real world won’t give you time off to recoup your strength. Once life starts it just goes on and on, and on. The sooner you shift your way of thinking from seeing your holiday as time off, but as time to be spent making something worthwhile of yourself, the easier the transition to real life will be.

RULE 10: Television is not real life

“In real life, people actually have to leave the coffee shop and go to jobs.” This applies to more than just an episode of friends. Life seems a lot easier on TV than it is in real life. Sounds like common sense, but you’d be surprised at how many people expect to sleep in every morning and still be able to afford that dream holiday.

RULE 11: Be Nice to Nerds

“Chances are you’ll end up working for one.” Laugh all you want, but he showed that this is a very real possibility. That book worm you keep picking on for choosing the library over a twerk session could end up being your boss in the future, so be nice.

I like those statements.

Rename created grid column in Acumatica for specific graph only

Hello everybody,

today I want to share trick about renaming item in grid. Suppose you want to use developed by Acumatica data access class of acumatica, which has name BAccount, and you have huge desire to rename it in column from "Account name" to "Employee Name".

You can use for such purpose CacheAttached event. In my case following code helped to achieve renaming:

        [PXDBString(60, IsUnicode = true)]
        [PXUIField(DisplayName = "Employee Name", Visibility = PXUIVisibility.SelectorVisible)]
        protected virtual void BAccount_AcctName_CacheAttached(PXCache sender)

MQL4 round numbers Indicator

Hello everybody,

Today I want to share with you another area. I had small order for MQL4 indicator for round numbers for Metatrader4 or as it is named MT4. The task was to draw lines at screen with some step at any currency pair. In order to implement it I started first of all Googling. Then I found almost implemented indicator at forexfactory just without option for modification steps. After wondering about code purpose of variables I created the following code:

//*  RoundNr.mq4 (No Copyright)                    *
//*                                                *
//*  Draws horizontal lines at round price levels  *
//*                                                *
//*  Written by: Totoro @         *
//*  Modified by Yuriy Zaletskyy                   *
#property indicator_chart_window
extern double LineSpace     = 1; // 1 unit = 0.01 of basic value (e.g. 1 USD cent)
extern color  LineColor     = Turquoise;
extern int    LineStyle     = 2;
extern string LineStyleInfo = "0=Solid,1=Dash,2=Dot,3=DashDot,4=DashDotDot";
extern string LineText      = "RoundNr ";
extern double stepSize = 0.1;
extern string stepSizeComment = "step size for jpy = 0.1, for others 0.001";
extern int digitsAfterComma = 2;
extern string digitsAfterCommaComment = "2 for jpy and 3 for non jpy pair";

double LineSpaceOld;
double HighScreen;
double Tief;
bool   FirstRun = true;

int deinit()
   double AbSpace = stepSize*LineSpace;
   double HigherScreen    = MathRound(110*HighScreen)/100;
   double LowerScreen   = MathRound(80*Tief)/100;
   for(double i=0; i<=HigherScreen; i+=AbSpace)
      if(i<LowerScreen) { continue; }

int start()
      HighScreen = NormalizeDouble( High[iHighest(NULL,0,MODE_HIGH,Bars-1,0)], digitsAfterComma );
      Tief = NormalizeDouble( Low[iLowest(NULL,0,MODE_LOW,Bars-1,0)], digitsAfterComma );
      FirstRun = false;
   else if(LineSpace != LineSpaceOld)
      HighScreen = NormalizeDouble( High[iHighest(NULL,0,MODE_HIGH,Bars-1,0)], digitsAfterComma );
      Tief = NormalizeDouble( Low[iLowest(NULL,0,MODE_LOW,Bars-1,0)], digitsAfterComma );
   LineSpaceOld = LineSpace;

void DrawLines()
   double AbSpace = stepSize*LineSpace;
   double HigherScreen    = MathRound(110*HighScreen)/100;
   double LowerScreen   = MathRound(80*Tief)/100;

   for(double i=0; i<=HigherScreen; i+=AbSpace)
      if(i<LowerScreen) { continue; }
      string StringNr = DoubleToStr(i,digitsAfterComma); // digits number in object name
if (ObjectFind(LineText+StringNr) != 0) // HLine not in main chartwindow { ObjectCreate(LineText+StringNr, OBJ_HLINE, 0, 0, i); ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle); ObjectSet(LineText+StringNr, OBJPROP_COLOR, LineColor); } else // Adjustments { ObjectSet(LineText+StringNr, OBJPROP_PRICE1, i); ObjectSet(LineText+StringNr, OBJPROP_STYLE, LineStyle); ObjectSet(LineText+StringNr, OBJPROP_COLOR, LineColor); } } WindowRedraw(); }


SQL Formatting tool

Few days ago I faced following challenge. SQL profiler gave me ugly SQL, which was unreadable for my eyes.

For example like this:

exec sp_executesql N'SELECT APAddress.AddressID, APAddress.VendorID, APAddress.VendorAddressID, APAddress.IsDefaultAddress, APAddress.RevisionID, APAddress.AddressLine1, APAddress.AddressLine2, APAddress.AddressLine3, APAddress.City, APAddress.CountryID, APAddress.State, APAddress.PostalCode, APAddress.IsValidated, APAddress.tstamp, APAddress.CreatedByID, APAddress.CreatedByScreenID, APAddress.CreatedDateTime, APAddress.LastModifiedByID, APAddress.LastModifiedByScreenID, APAddress.LastModifiedDateTime FROM APAddress APAddress WHERE (APAddress.CompanyID = 2) AND  ( APAddress.AddressID = @P0) ORDER BY APAddress.AddressID /* admin@AP.30.40.00 */',N'@P0 int',@P0=-2147483647

If you can read it, congratulations, you are genius and I'm envy of you so you can stop reading further. But if you are just programmer as me, then the next step is the following:

1. remove exec sp_executesql 

2. In some editor find and replace @P0 with value -2147483647

3. remove tail /* admin@AP.30.40.00 */',N'@P0 int',@P0=-2147483647

4. Navigate in your browser to

5. Copy/Paste in window and choose format mssql

6. Press format SQL.


Compare previous sql with the following:

SELECT apaddress.addressid,
FROM   apaddress APAddress
WHERE  ( apaddress.companyid = 2 )
       AND ( apaddress.addressid = -2147483647 )
ORDER  BY apaddress.addressid 

IMHO the second option is easier to read.