How to get started with Acumatica development

Hi everybody,

below goes video, which describes on how to get started with Acumatica development:

In that video you'll find out:

1. How to install specific Acumatica build

2. How to debug C# code written by you in Visual Studio and Customization designer

3. How to get possibility to debug Acumatica source code

4. Default user name and password of Acumatica instnace

And much much more. Please watch and support with your likes!

 

 

How To Avoid Navigation Away From Created Item After Calling Presssave Or Persist Action

 

Hello everybody,

today I want to tell you a story, that swallowed quite big amount of time of whole team.

Recently we've got seemingly easy to fulfil requirement: 

  1. Add button to the grid
  2. Inside of the button fullfil 
    1. Persist
    2. Call to db with modifications
    3. Persist one more time
  3. Leave the page opened on created item in UI

Initially our code looked like this:

public PXAction<SOOrder> SomeAction;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Some Action", Visible = true)]
protected virtual IEnumerable someAction(PXAdapter adapter)
{
    Base.Actions.PressSave();
    //API call
    Base.Actions.PressSave();
    return adapter.Get();
}

I could say that everything worked perfectly except one tiny detail: after clicking of the button page was navigated away to creation of new Sales order. After plenty of research inside of Acumatica source code we have found this option:

public PXAction<SOOrder> SomeAction;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Some Action", Visible = true)]
protected virtual IEnumerable someAction(PXAdapter adapter)
{
    Base.Actions.PressSave();
    List<SOOrderresult = new List<SOOrder>();
    //API Call
    result.Add(Base.CurrentDocument.Current);
    return result;
}

Another way of dealing with this bug is this:

public PXAction<SOOrder> SomeAction1;
[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Some Action", Visible = true)]
protected virtual IEnumerable btnCreatingNew(PXAdapter adapter)
{
    Base.Actions.PressSave();
    //some other code
    adapter.Searches[adapter.Searches.Length - 1] = Base.CurrentDocument.Current.RefNbr;
    return adapter.Get();
}

Summary

Reason of such behavior is fact that Acumatica uses value returned from action in order to know which order to open. Then happens this:

  1. on the first line of the code your adapter has information that Acumatica should go to <New> sales order
  2. Base.Actions.PressSave() generates sales order and persists it to Db, but doesn't notify adapter about this fact
  3. When adapter.Get is executed, Acumatica reads from it order which should be opened, finds there <New> and navigates away from created SO

In order to deal with you can choose option 1, or option 2. Option 1 I've discovered in Acumatica source code, and option 2 is mentioned at stackoverflow by Ruslan

 

 

 

 

Some Notes On Buttons Creation In Acumatica

 

Hello everybody,

today I want to write few words about buttons usage in Acumatica.

So, first of all, if you just need to add button at your form, you can use following syntax:

public PXAction<PrimaryDACClass> SomeAction;

[PXButton(CommitChanges = true)]
[PXUIField(DisplayName = "Some Action")]
protected virtual void someAction()
{
      ...
}

Following syntax will create a button for you in the top buttons panel of Acumatica.

Take note of CommitChanges=true attribute. In case if you need just some activity without persistance to database, then you can set it to false. But if you want button to save some changes to database then set it always to true.

There is one more way of declaring buttons:

[PXButton]
[PXUIField(DisplayName = "Some action")]
protected virtual IEnumerable someAction(PXAdapter adapter)
{
...
return adapter.Get();
}

take note that in comparison with previous time method of button returns ienumerable, and also in the end has return adapter.Get();

This type of calling should be used if button is called from processing page or if button initializes background operation.

No Comments

Add a Comment
 

 

Two Kinds Of Buttons In Acumatica

 

Hello everybody,

today I want to write a few words about two types of buttons in Acumatica.

  • usual form of declaration
  • unusual form of declaration

What is difference from code prospecitve?

In the begining they are equal:

public PXAction<Shipment> CancelShipment; 

Even very similar with attributes:

1. 

         [PXButton(CommitChanges = true)]

         [PXUIField(DisplayName = "Cancel Shipment")] 

2. 

        [PXButton]

        [PXUIField(DisplayName = "Release")] 

But different with declaration:

  • protected virtual void cancelShipment() 
  • protected virtual IEnumerable release(PXAdapter adapter) 

and different with last statement. Those with PXAdaapter should return adapter.get(); Like  this:

[PXButton]

[PXUIField(DisplayName = "Release")]

protected virtual IEnumerable release(PXAdapter adapter)

{    

             ...    

             return adapter.Get();

And one more. Unusual should be used when click on button initates background operation or is called from processing pages

No Comments

Add a Comment