Dynamics AX Blog - Microsoft Dynamics AX (Axapta) - Seite 16

In den letzten Jahren, in denen ich mich fast hauptsächlich mit der Entwicklung im Umfeld von Microsoft Dynamics AX (vormals Axapta) beschäftigt habe, ist das eine oder andere Code-Fragment entstanden, von dem ich mir vorstellen könnte, daß es auch für andere AX-Entwickler ganz nützlich sein könnte. Aber auch Tips und Tricks zu dem mächtigen ERP-System werde ich in dieser Kategorie präsentieren.
RSS-Feed dieser KategorieLabel eines Dialogfeldes ermitteln/auslesen
23.12.2014Microsoft Dynamics AX (Axapta)
Vor kurzem wollte ich in der validate()-Methode einer von RunBase abgeleiteten Klasse ein Fehlermeldung einbauen, die als Teil das Label eines Dialogfeldes verwendet. Dabei musste ich feststellen, daß dies gar nicht so einfach ist, wie ich es mir vorgestellt hätte. Die verfügbare Methode dialogField.fieldControl().Label() funktioniert offenbar nur dann, wenn man dem Dialogfeldes explizit ein eigenes Label zugewiesen hat (und dieses nicht dynamisch über den EDT gezogen wird). Deshalb im folgenden ein kurzer Job, der zeigt wie man das Label eines Dialogfeldes auslesen kann. Die gleiche Logik lässt sich natürlich u.a. auch in einer Klasse, die von RunBase/RunBaseBatch abgeleitet wurde, verwenden. 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(typeId(ProjId), "Mein Projekt"); df_AmountMST = dialog.addField(typeId(AmountMST)); dialog.run(); info(getLabel(df_project)); info(getLabel(df_AmountMST)); } |
Erstellen einer Lieferadresse per Code
21.12.2014Microsoft Dynamics AX (Axapta)
Die nachstehenden Zeilen Code zeigen ein Beispiel, wie man per X++ eine (nicht primäre) Adresse für eine vorhandene Partei im Globalen Adressbuch erstellen kann. Dabei wird gleichzeitig über den Base Enum LogisticsLocationRoleType der Typ der Adresse als Lieferadresse angegeben, natürlich ist es auch möglich, der Adresse einen anderen Typ zuzuweisen. static void createPartyDeliveryAddressNonPrimary(Args _args) { DirPartyTable dirPartyTable = DirPartyTable::findByNum("?100000??"); DirParty dirParty; DirPartyPostalAddressView dirPartyPostalAddressView; // Create instance of dirParty dirParty = DirParty::constructFromCommon(dirPartyTable, DirUtility::getCurrentDateTime(), DirPartyType::Organization); // Create primary address dirPartyPostalAddressView.LocationName = "Delivery"; dirPartyPostalAddressView.City = "Vienna"; dirPartyPostalAddressView.Street = "Kärtnerring"; dirPartyPostalAddressView.StreetNumber = "21"; dirPartyPostalAddressView.CountryRegionId = "AUT"; dirPartyPostalAddressView.IsPrimary = NoYes::No; dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView, [LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Delivery).RecId]); } |
Eine bestimmte Dimension als Dialogfeld einbindenWenn man in Dynamics AX 2009 (oder früheren Versionen) eine bestimmte Dimension als Dialogfeld verwenden möchte, kann man sich einen eigenen Extended Datatype (abgeleitet von Criterias) wie im folgenden beschrieben anlegen. Entscheidend sind dabei die Relations dieses EDTs. Der Beispiel-Code ist einer von RunBase abgeleitenden Klasse entnommen. protected Object dialog(DialogRunbase dialog, boolean forceOnClient) { Object ret; ret = super(dialog, forceOnClient); df_project = ret.addField(TypeId(DimensionCostCenter)); return ret; } Der so angepasste Dialog sollte wie folgt aussehen: |
AX 2012: Erstellen einer DefaultDimension/LedgerDimensionNachstehend ein Code-Beispiel, wie man eine RecId vom Typ DefaultDimension für mehrere Dimensionen generieren kann. static void buildDefaultAndLedgerDimension(Args _args) { DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage; DimensionAttribute dimensionAttribute; DimensionAttributeValue dimensionAttributeValue; DimensionDefault dimensionDefault; LedgerDimensionAccount ledgerDimensionAccount; dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage(); // BusinessUnit dimensionAttribute = DimensionAttribute::findByName('BusinessUnit'); if(dimensionAttribute) { dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '069', false, true); dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue); } // CostCenter dimensionAttribute = DimensionAttribute::findByName('CostCenter'); if(dimensionAttribute) { dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '010', false, true); dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue); } // Department dimensionAttribute = DimensionAttribute::findByName('Department'); if(dimensionAttribute) { dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '024', false, true); dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue); } dimensionDefault = dimensionAttributeValueSetStorage.save(); // Merge main account and source dimension values and return RecId which can be used as ledgerDimension ledgerDimensionAccount = DimensionDefaultingService::serviceCreateLedgerDimension(DimensionStorage::getDefaultAccountForMainAccountNum("110110"), dimensionDefault); info(strFmt("Default dimension recId: %1", dimensionDefault)); info(strFmt("DefaultDimension (Source RecId): %1 LedgerDimension (Merged RecId): %2", dimensionDefault, ledgerDimensionAccount)); } Notiz: Aufmerksamen Lesern ist sicherlich nicht entgangen, daß ich beides bereits in anderen Beiträgen geposted habe. Dieser Beitrag ist lediglich eine Kombination davon. |
Kommissionierlisten-Kopf eines Produktionsauftrages erstellenDer folgende Job erstellt eine "Kopfdatensatz" für eine Kommissionierliste eines Produktionsauftrages. static void createProdJournalTable_PickingList_III(Args _args) { ProdJournalCreate prodJournalCreate; prodJournalCreate = new ProdJournalCreate(); prodJournalCreate.parmProdId('P000188'); prodJournalCreate.parmJournalNameId( ProdJournalName::standardJournalName( ProdJournalType::Picklist, prodJournalCreate.parmProdId())); prodJournalCreate.initProdJournalTableData(ProdJournalType::Picklist); prodJournalCreate.usedProdJournalTable().insert(); prodJournalCreate.run(); } |
Bestellung per Code buchenMit Hilfe der folgenden Zeilen möchte ich zeigen, wie man eine Bestellung per Code buchen kann. static void postPurchaseOrder(Args _args) { PurchTable purchTable = PurchTable::find("000025"); PurchFormLetter purchFormLetter; purchFormLetter = PurchFormLetter::construct(DocumentStatus::PurchaseOrder); purchFormLetter.update(purchTable, "", systemDateGet(), PurchUpdate::All); } |
|
|
|
|
|
|
Der nachstehende Job prüft (bzw. bucht) eine Fertigmeldung eines Produktionsauftrages. Über den Enum JournalCheckPostType kann festgelegt werden, ob geprüft oder gebucht werden soll.