Dynamics AX Blog - Beiträge vom September 2019
SysOperation-Framework: Stapelverarbeitung erzwingenWenn man sicherstellen möchte, daß eine Funktion die über das SysOperation-Framework umgesetzt wurde, immer über die Stapelverarbeitung ausgeführt wird, kann man den SysOperationExecutionMode auf ScheduledBatch setzen (beispielsweise über das MenuItem des Controllers - siehe hier). Handelt es sich dabei um eine Funktion, die einen Benutzerdialog erfordert, hat man allerdings das Problem, daß standardmässig der Register "Stapel" eingeblendet wird und dort aber beispielsweise das Kontrollkästchen Stapel nicht aktiviert ist. Natürlich kann man dieses Kontrollkästchen nun aktivieren, in dem man einen Aufruf von parmBatchExecute() im UIBuilder integriert: public void build() { super(); this.controller().batchInfo().parmBatchExecute(this.controller().parmExecutionMode() == SysOperationExecutionMode::ScheduledBatch); } |
Erstellen und Buchen einer Freitextrechnung per CodeDer nachstehende Job soll zeigen, wie man per Code eine Freitextrechnung erstellen und buchen kann. static void createAndPostFreeTextInvoice(Args _args) { CustInvoiceTable custInvoiceTable; CustInvoiceLine custInvoiceLine; DimensionDefault dimensionDefault; LedgerDimensionAccount ledgerDimensionAccount; CustPostInvoice custPostInvoice; try { ttsBegin; // Create header custInvoiceTable.clear(); custInvoiceTable.initValue(); custInvoiceTable.OrderAccount = "US-004"; custInvoiceTable.modifiedField( fieldNum(CustInvoiceTable, OrderAccount)); custInvoiceTable.insert(); // Create line custInvoiceLine.clear(); custInvoiceLine.initValue(); custInvoiceLine.ParentRecId = custInvoiceTable.RecId; custInvoiceLine.initFromCustInvoiceTable(custInvoiceTable); custInvoiceLine.Description = "Test"; custInvoiceLine.Quantity = 10; custInvoiceLine.modifiedField( fieldNum(CustInvoiceLine, Quantity)); custInvoiceLine.UnitPrice = 200; custInvoiceLine.modifiedField( fieldNum(CustInvoiceLine, UnitPrice)); ledgerDimensionAccount = DimensionDefaultingService::serviceCreateLedgerDimension( DimensionStorage::getDefaultAccountForMainAccountNum( "110110"), dimensionDefault); custInvoiceLine.LedgerDimension = ledgerDimensionAccount; custInvoiceLine.modifiedField( fieldNum(CustInvoiceLine, LedgerDimension)); custInvoiceLine.insert(); // Post custPostInvoice = new CustPostInvoice(custInvoiceTable); custPostInvoice.run(); ttsCommit; } catch { throw error(error::wrongUseOfFunction(funcName())); } } So sieht eine wie oben erstellte Freitextrechnung aus: |
|
|
|
|
|
|
Wenn man in einem SysOperation-Konstrukt den SysOperationExecutionMode und/oder die auszuführende Servermethode über das MenuItem steuern möchte, kann man dies über die Eigenschaften des MenuItems steuern.
Szenario: Ohne eigenen Controller
Die folgenden beiden MenuItems zeigen, wie man dafür die Eigenschaften setzen kann:
Dieses MenuItem ruft die Methode runService() einer Serviceklasse auf und setzt den SysOperationExecutionMode auf Synchronous: