Dynamics AX 2012 - Custom Lookup in a dialog

khosla picture khosla · Jul 16, 2014 · Viewed 7.7k times · Source

So, I am working on a class called DMFWriteExportData and trying to get it run in Batch. I am at a point where I need to figure out a way to get rid of fieldControl and the reason being it does not let me Run the class on the server and throws an error because it is not supposed to be running on server? (not sure)

Error: "The method Dialog Control.control cannot be called from the server; use methods on the Dialog Field class instead."

-

public Object dialog()
{   
    DialogRunbase       dialog = new DialogRunbase("@DMF372", this);
    FormStringControl   control;
    dialogExecution = dialog.addFieldValue(extendedTypeStr(dMFExecutionId), executionId);
    control         = dialogExecution.fieldControl();
    control.mandatory(true);
    control.displayLength(24);
    control.registerOverrideMethod(methodstr(FormStringControl, lookup), methodstr(DMFWriteExecutionParameters, executionIdLookup), this);
    control.registerOverrideMethod(methodstr(FormStringControl, modified), methodstr(DMFWriteExecutionParameters, executionIdModified), this);
    dialogdescription=dialog.addFieldValue(extendedTypeStr(description),DMFExecution::find(executionId).Description);
    dialogdescription.enabled(false);

    return dialog;
}

I am wondering:

  1. If it is actually true that this class cannot be set to server when using control.registerOverrideMethod
  2. If yes, what would be the ideal solution to overcome this situation, is there any way I can create custom lookups? I see there is method called registerOverrideMethod in the DialogField class.

Any help would be appreciated.

Thanks, Khosla

Answer

Klaas Deforche picture Klaas Deforche · Jul 17, 2014

The reason why you cannot (and should) run the code above in batch is because it uses dialog controls that only exist on the client side. You should never run this kind of code on server. Please check runon property of your class and set it to called from.

However, I assume you are using RunBaseBatch. If you are on AX 2012, you should use the SysOperation framework instead.

When using RunBaseBatch, all code is on the same class. This way, you are mixing client side code (main method, dialog method etc) with the code that should run on server (run method). For this reason you should set the "runon" property of the class to CalledFrom, not Server. You can solve this by using SysOperation which applies the Model View Controller (MVC) pattern that neatly sepperates the two.

For an introduction to SysOperation, check my blog here: AX2012: SysOperation introduction