Dynamics AX Blog - Beiträge vom March 2017
Inhalt eines Containers mit ConView ansehen
static void conViewExample(Args _args) { container con; con = conIns(con, conLen(con)+1, ["Mazda", 2]); con = conIns(con, conLen(con)+1, ["Volkswagen", 1]); con = conIns(con, conLen(con)+1, ["Ferrari", 3]); conView(con); } |
Tipp: Länge eines Extended Datatypes (EDT) ermittelnManchmal braucht man einfach nur die Länge eines Extended Datatypes (EDT): new SysDictType(extendedtypenum(costingversionid)).stringLen() |
SysOperation-Framework: Eigenschaften eines Dialogfeldes abhängig von anderen Dialogfeldern ändernStellt euch folgendes Szenario vor: Im Dialog eines SysOperation-Konstruktes muss ein Feld abhängig von anderen Feldern manipuliert werden, beispielsweise soll die Eigenschaft AllowEdit verändert werden. Im folgenden findet ihr den Code für einen DataContract und den dazugehörigen UIBuilder, in welchem letztlich die entsprechende Programmlogik einzubauen ist. Hier wir abhängig von der Auswahl im Feld Module entweder das Feld Customer account oder das Feld Vendor account freigeschalten.
DataContract[DataContractAttribute, SysOperationContractProcessingAttribute(classStr(TutorialSysOperationUIBuilder))] public class TutorialSysOperationDataContract { ModuleCustVend moduleCustVend; CustAccount custAccount; VendAccount vendAccount; }
[DataMemberAttribute, SysOperationControlVisibilityAttribute(true), SysOperationDisplayOrderAttribute('1')] public ModuleCustVend parmModuleCustVend(ModuleCustVend _moduleCustVend = moduleCustVend) { moduleCustVend = _moduleCustVend; return moduleCustVend; }
[DataMemberAttribute, SysOperationControlVisibilityAttribute(true), SysOperationDisplayOrderAttribute('2')] public CustAccount parmCustAccount(CustAccount _custAccount = custAccount) { custAccount = _custAccount; return custAccount; }
[DataMemberAttribute, SysOperationControlVisibilityAttribute(true), SysOperationDisplayOrderAttribute('3')] public VendAccount parmVendAccount(VendAccount _vendAccount = vendAccount) { vendAccount = _vendAccount; return vendAccount; }
UIBuilderpublic class TutorialSysOperationUIBuilder extends SysOperationAutomaticUIBuilder { DialogField df_ModuleCustVend; DialogField df_CustAccount; DialogField df_VendAccount; } In der methode build() werden die vom Framework generierten Dialogfelder zugänglich gemacht. Hier wird bereits erstmalig die Methode modifyDialogFields() aufgerufen, damit gleich beim Öffnen des Dialogs das jeweils gewünschte Feld freigeschalten wird. public void build() { super(); df_ModuleCustVend = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(TutorialSysOperationDataContract, parmModuleCustVend)); df_CustAccount = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(TutorialSysOperationDataContract, parmCustAccount)); df_VendAccount = this.bindInfo().getDialogField(this.dataContractObject(), methodStr(TutorialSysOperationDataContract, parmVendAccount)); this.modifyDialogFields(); } In der Methode postRun() wird die modify()-Methode des Feldes Module überschrieben. public void postRun() { super(); // Override modified method df_ModuleCustVend.registerOverrideMethod(methodStr(FormComboBoxControl, modified), methodStr(TutorialSysOperationUIBuilder, moduleCustVend_modified), this); } In dieser überschriebenen Methode rufen wir die Methode modifyDialogFields() auf. Hier ist wichtig, daß die Methode das richtige Parameterprofil erhält und den von AX erwarteten Datentyp retourniert. private boolean moduleCustVend_modified(FormComboBoxControl _control) { this.modifyDialogFields(); return _control.modified(); } Die "Zauberei" passiert in der Methode modifyDialogFields(). Hier werden die Felder ent- oder gesperrt, je nach Auswahl des Wertes im Feld Module. private void modifyDialogFields() { df_CustAccount.allowEdit(df_ModuleCustVend.value() == ModuleCustVend::Cust); df_VendAccount.allowEdit(df_ModuleCustVend.value() == ModuleCustVend::Vend); } Natürlich können auf die selbe Art & Weise zahlreiche andere Eigenschaften von Dialogfeldern dynamisch verändert werden. |
Tipp: Länge eines Tabellenfeldes ermittelnManchmal braucht man einfach nur die Länge eines Feldes einer Tabelle: new SysDictType(SysDictField::findFieldByName(tableStr(SalesTable), identifierStr(SalesId)).typeId()).stringLen(); |
SysOperation-Framework: Datensätze einer temporären Tabelle übergebenIm folgenden Szenario sollen an ein SysOperation-Konstrukt alle Datensätze einer temporären Tabelle übergeben werden. Dafür brauchen wir:
Controllerclass TutorialSysOperationController extends SysOperationServiceController { } |
SysOperation-Framework: Einfaches Klassenkonstrukt mit DataproviderDer nachstehende Code stellt ein einfaches Klassenkonstrukt für das SysOperation-Framework dar. Datacontract[DataContractAttribute] public class TutorialSysOperationDataContract { CustAccount custAccount; }
[DataMemberAttribute] public CustAccount parmCustAccount(CustAccount _custAccount = custAccount) { custAccount = _custAccount; return custAccount; }
Serviceclass TutorialSysOperationService extends SysOperationServiceBase { } Die Methode runService() ist die eigentliche Service-Methode. Über das Attribute SysEntryPointAttribute steuern wir hier, daß keine weiteren Berechtigungsprüfungen notwendig sind. [SysEntryPointAttribute(false)] public void runService(TutorialSysOperationDataContract _dataContract) { info("Done"); } |
|
|
|
|
|
|
Wenn innerhalb eines SysOperation-Konstruktes ein Feld im Dialog gesperrt werden soll, daß über eine parm-Methode eingebunden ist, kann man im UIBuilder Code wie den folgenden verwenden.