Dynamics AX Blog - Dynamics AX 2012 - Seite 10
RSS-Feed dieser Version
SysOperation-Klassen per Job erstellenWer schon einmal eine Funktion mit Hilfe des SysOperation-Frameworks umgesetzt hat weiß, daß das Erstellen der bis zu vier notwendigen Klassen doch etwas Tipparbeit ist. Für Man gibt im Job über die Variable baseClassName einen "Basisnamen" für seine Funktion an und der Job erstellt alle vier Klassen (Controller, Dataprovider, UIBuilder und Service). Zusätzlich gibt es im Job noch eine Map namens dataContractParmsMap aus der - soferne man Inhalte in diese Map eingefügt hat - bei der Generierung des Dataproviders auch gleich passende parm-Methoden erstellt werden. Im Job enthält die Map zwei Einträge für eine Debitorenkontonummer und eine Artikelnummer. |
Erstellen einer Nicht-Primären Adresse mit zwei Rollen
27.12.2015Microsoft Dynamics AX (Axapta)
Beispiel, wie man per Code eine nicht-primäre Adresse mit zwei Rollen für einen Eintrag im Globalen Adressbuch erstellen kann. static void createPartyInvoiceAndHomeAddress(Args _args) { DirPartyTable dirPartyTable = DirPartyTable::findByNum("???100000??"); DirParty dirParty; DirPartyPostalAddressView dirPartyPostalAddressView; // Create instance of dirParty dirParty = DirParty::constructFromCommon(dirPartyTable, DirUtility::getCurrentDateTime(), dirPartyTable.partyType()); // Create primary address dirPartyPostalAddressView.LocationName = "Invoice & Home"; dirPartyPostalAddressView.City = "Vienna"; dirPartyPostalAddressView.Street = "Kärtnerring"; dirPartyPostalAddressView.StreetNumber = "22"; dirPartyPostalAddressView.CountryRegionId = "AUT"; dirPartyPostalAddressView.IsPrimary = NoYes::No; dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView, [LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Invoice).RecId, LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Home).RecId]); } |
Aufruf des SysOperation-Frameworks per CodeWenn man eine Funktion die über das SysOperation-Framework abgebildet ist per Code aufrufen möchte, kann der folgende Job zeigen, wie man das machen kann. static void runSysOperationThroughCode(Args _args) { TutorialSysOperationServiceController controller; TutorialSysOperationDataContract dataContract; SysOperationStartResult sysOperationStartResult; controller = TutorialSysOperationServiceController::newFromArgs(new Args()); dataContract = controller.getDataContractObject('_dataContract'); controller.parmExecutionMode(SysOperationExecutionMode::Synchronous); dataContract.parmFilenameSave(@"c:\temp\myFile.txt"); dataContract.parmCustAccount('US-006'); sysOperationStartResult = controller.startOperation(); } |
Debuggen von SSRS-DataproviderBei der Entwicklung bzw. Anpassung von Dataprovidern eines SSRS-Reports hatte ich in der Vergangenheit immer wieder das Thema, daß das Aufrufen/Testen des SSRS-Reports oft mehr Zeit beansprucht, als die eigentliche Anpassung im Code. Deshalb ist folgender Job entstanden, der mir lediglich den Inhalt der vom Dataprovider erstellten (temporären) Tabelle als einfaches Infolog ausgibt. Das ist vor allem dann hilfreich, wenn man den Dataprovider (abgeleitet von SRSReportDataProviderBase) zur Fehleranalyse debuggen möchte, das aber aufgrund seiner Programmierung aber vielleicht nicht so ohne weiteres möglich ist. Im Beispiel handelt es sich um den Bericht "Arbeitsbeschreibung" aus dem Service-Modul. static void testSSRSDatProvider(Args _args) { SMAWorkNoteTmp tempTable; SMAWorkNoteDP dataProvider = new SMAWorkNoteDP(); SMAWorkNoteContract contract = new SMAWorkNoteContract(); Query query = new Query(identifierStr(SMAWorkNote)); try { SysQuery::findOrCreateRange( query.dataSourceTable( tableNum(SMAServiceOrderTable)), fieldNum(SMAServiceOrderTable, ServiceOrderId)).value("00018"); contract.parmItemConsumption(true); contract.parmItemRequirement(true); contract.parmExpense(true); contract.parmFee(true); contract.parmAdditionalNotes(true); contract.parmLineText(true); if( !contract.validate()) { throw error(error::missingParameter(contract)); } dataProvider.parmDataContract(contract); dataProvider.parmQuery(query); dataProvider.processReport(); tempTable = dataProvider.getSMAWorkNoteTmp(); while select tempTable { info(tempTable.otServiceOrderId); } } catch (Exception::Break) { info("Aborted"); } } |
Label eines Dialogfeldes ermitteln/auslesen
29.11.2015Microsoft Dynamics AX (Axapta)
In diesem Blog-Beitrag habe ich schon einmal beschreiben, wie man in Dynamics AX das Label eines Dialogfeldes auslesen kann, das folgende Beispiel macht das gleiche in Dynamics AX 2012. static void getDialogFieldLabel(Args _args) { Dialog dialog = new Dialog(); DialogField df_Project; DialogField df_AmountMST; str getLabel(DialogField _df) { formStringControl fsc; fsc = _df.fieldControl(); return fsc.labelText(); } df_project = dialog.addField(extendedTypeStr(ProjId), "Mein Projekt"); df_AmountMST = dialog.addField(extendedTypeStr(AmountMST)); dialog.run(); info(getLabel(df_project)); info(getLabel(df_AmountMST)); } |
TableId einer abgeleiteten Tabelle in einem View ausgeben
25.11.2015Microsoft Dynamics AX (Axapta)
Vor kurzem benötigte ich in einem View, dessen Datenquelle eine abgeleitete Tabelle (im Beispiel EcoResDistinctProductVariant) enthielt, die TableId dieser Tabelle als Feld. Also erstellte ich ein neues Feld, wählte die Tabelle aus und das Feld TableId aus dem DropDown. Der View Eigenschaften des Feldes TableId1 Leider brachte dies nicht das erwartete Ergebnis, wenn ich den View öffnete, wurde das Feld immer mit NULL ausgegeben. |
|
|
|
|
|
|
Bei Verwendung des Formulares "Security entry point permissions" aus dem Security Development Tool kann beim Umschalten der Ansicht des Typs (Aufgabe/Rolle/Recht) folgender Fehler auftreten.
Ursache ist, daß das Tool im Hintergrund ein Objekt im AOT erstellen möchte, daß im Namen das jeweilige Benutzerkürzel trägt. Enthält dieses Benutzerkürzel Zeichen, die in einem Objektnamen nicht zulässig sind (beispielsweise Bindestriche), tritt genau dieser Fehler auf.
Einfachster Workaround: Mit einem anderen Benutzer arbeiten.