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

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 KategorieAX 2012: Erweitern des Formulares zur Anlage von Produkten/Artikel
02.09.2012Microsoft Dynamics AX (Axapta)
|
Erweitern von Dynamics AX um neue Icons
26.08.2012Microsoft Dynamics AX (Axapta)
Es ist allerdings nicht möglich, diese Embedded Ressources um eigene Icons/Bilder zu erweitern. |
AX 2012: Erfahrungen zum Thema Import von Modellen
22.08.2012Microsoft Dynamics AX (Axapta)
Um ein Modell in eine Instanz von Dynamics AX 2012 zu importieren wird das Kommandozeilen-Tool AXUTIL benötigt. Nach dem Import eines Modelles wird ein Hinweis ausgegeben, der leicht zu überlesen ist aber lt. meinen Erfahrungen ernorm wichtig ist. Dieser Hinweis lautet:
Auf Basis dieses Hinweises und aus der Erfahrung heraus führe ich nach dem Import eines Modelles immer folgende Schritte aus:
Wenn ich nur einen der genannten Schritte weggelassen habe, hatte ich immer wieder mit Phänomenen zu kämpfen. Einiger solcher Phänomene waren:
Leider sind die oben genannten Schritte teilweise recht zeitintensiv, die investierte Zeit war es in der Regel aber wert. |
AX 2012: Display-Methoden im Lookup
11.08.2012Microsoft Dynamics AX (Axapta)
Mit Hilfe der Klasse SysTableLookup kann man sich den Lookup von Formularfeldern anpassen. Über die Methode addLookupMethod() können in diese Lookup-Formulare auch Display-Methoden eingebunden werden. Wichtig dabei ist lediglich, daß im Lookup alle Felder angezeigt werden, die von der jeweiligen Display-Methode zur Ermittlung benötigt werden. Will man beispielsweise das Lookupformular der Artikelnummer um den Produktnamen erweitern, kann man dafür die folgende Methode nutzen. Hierbei ist beispielsweise das Feld Product der InventTable nur enthalten, um die Display-Methode itemName() im Lookup verwenden zu können. public client static void lookupItemId(FormStringControl _lookupCtrl) { sysTableLookup sysTableLookup; query query; QueryBuildDataSource qbds_inventTable; query = new query(); qbds_inventTable = query.addDataSource(tableNum(inventTable)); sysTableLookup = sysTableLookup::newParameters(tableNum(inventTable), _lookupCtrl); sysTableLookup.parmQuery(query); sysTableLookup.addLookupfield(fieldNum(inventTable, itemId)); sysTableLookup.addLookupMethod(tableMethodStr(inventTable, itemName)); sysTableLookup.addLookupfield(fieldNum(inventTable, NameAlias)); sysTableLookup.addLookupfield(fieldNum(inventTable, ItemType)); sysTableLookup.addLookupfield(fieldNum(inventTable, product), false); sysTableLookup.performFormLookup(); } |
Voucher/Beleg in Dynamics AX 2009 prüfenVor kurzem musste ich in Dynamics AX 2009 eine Belegnummer (Voucher) per Code auf evtl. vorhandene Duplikate prüfen. Die folgende Methode ist dafür sehr hilfreich: ledgerParameters::checkDuplicate(_voucher, _date); |
Parameter eines Jobs in den Nutzungsdaten speichern
03.06.2012Microsoft Dynamics AX (Axapta)
Dieser Job ruft einen Dialog auf, dessen Eingabewerte in den Nutzungsdaten gespeichert und auch von dort ausgelesen werden: static void SaveSysLastValue(Args _args) { identifiername identifiername = "Use sysLastValue through x++"; boolean boolVal1 = true; boolean boolVal2 = true; boolean boolVal3 = true; dialog dialog; dialogField df1; dialogField df2; dialogField df3; ; // Read from sysLastValue [boolVal1, boolVal2, boolVal3] = xSysLastValue::getValue( curExt(), identifiername); // Build dialog dialog = new dialog(identifiername); df1 = dialog.addField(typeId(NoYes), "Param 1"); df2 = dialog.addField(typeId(NoYes), "Param 2"); df3 = dialog.addField(typeId(NoYes), "Param 3"); df1.value(boolVal1); df2.value(boolVal2); df3.value(boolVal3); if( !dialog.run()) { return; } boolVal1 = df1.value(); boolVal2 = df2.value(); boolVal3 = df3.value(); // Do something info(strFmt("%1", boolVal1)); info(strFmt("%1", boolVal2)); info(strFmt("%1", boolVal3)); // Save to sysLastValue xSysLastValue::putValue( [boolVal1, boolVal2, boolVal3], curExt(), curUserId(), UtilElementType::Job, funcname(), identifiername); } |
AX 2012: Standardfinanzdimension eines Datensatzes setzen
19.05.2012Microsoft Dynamics AX (Axapta)
Der nachstehende Code soll zeigen, wie man in Dynamics AX 2012 bei einem Datensatz - im Beispiel handelt es sich um einen Debitor - die Standardfinanzdimensionen per X++ befüllen kann. Im Beispiel werden mehrere Dimensionen mit Werten befüllt. Bitte beachtet, daß die angeführten Dimensionen möglicherweise in Euren AX-Installationen nicht vorhanden sind. static void setDefaultDimension4CustTable(Args _args) { CustTable custTable; RecId getDefaultDimension(container _c) { DimensionAttribute dimensionAttribute; DimensionAttributeValue dimensionAttributeValue; DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage; int i; container dimensionCon; Name dimensionName; str 255 dimensionValue; dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage(); for (i=1;i<=conLen(_c);i++) { dimensionCon = conPeek(_c, i); dimensionName = conPeek(dimensionCon, 1); dimensionValue = conPeek(dimensionCon, 2); select dimensionAttribute where dimensionAttribute.Name == dimensionName; if(dimensionAttribute) { dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, dimensionValue, false, true); dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue); } } return dimensionAttributeValueSetStorage.save(); } ; try { ttsbegin; custTable = CustTable::find('9101', true); custTable.DefaultDimension = getDefaultDimension([ ["Department", '100'], ["Debitor", '3010'], ["CustomerGroup", '80'], ["ParentProject", '2000'], ["CostCenter", '07'] ]); custTable.update(); ttscommit; info("Update custtable.defaultDimension sucessfull."); } catch { throw error("Error occured"); } } |
|
|
|
|
|
|
Um einen Artikel bzw. ein Produkt in Dynamics AX 2012 anzulegen, wird das Formular EcoResProductCreate verwendet.
Dieses Formular enthält entgegen den meisten Formularen keinerlei Datasources, womit beispielsweise neue Felder in der Tabelle InventTable vollständig anders implementiert werden müssen.
Im folgenden eine Kurzbeschreibung zur Einbindung eines Beispielfeldes MyCustomField (vom Extended Datatype MyCustomId):
1.) Hinzufügen einen Formcontrols auf Basis des EDT MyCustomId zum Formular und setzen der Eigenschaft AutoDeclaration auf YES und Vergabe eines eindeutigen Namens (beispielsweise gleichlautend wie der Name des Feldes)
2.) Anpassen der Methode createData2Controls() des Formulares wie folgt:
{
data2Controls = [
//--> (1)
//[tableStr(InventTable), [[fieldNum(InventTable, bomUnitId), formControlStr(EcoResProductCreate, BOMUnitId)]]],
[tableStr(InventTable), [[fieldNum(InventTable, bomUnitId), formControlStr(EcoResProductCreate, BOMUnitId)],
[fieldNum(InventTable, MyCustomId), formControlStr(EcoResProductCreate, MyCustomField)]]],
//<-- (1)
[identifierStr(Purch), [[fieldNum(InventTableModule, UnitId), formControlStr(EcoResProductCreate, PurchUnitId)],
[fieldNum(InventTableModule, TaxItemGroupId), formControlStr(EcoResProductCreate, PurchTaxItemGroupId)]]],
[identifierStr(Invent),[[fieldNum(InventTableModule, UnitId), formControlStr(EcoResProductCreate, InventUnitId)]]],
[identifierStr(Sales), [[fieldNum(InventTableModule, UnitId), formControlStr(EcoResProductCreate, SalesUnitId)],
[fieldNum(InventTableModule, TaxItemGroupId), formControlStr(EcoResProductCreate, SalesTaxItemGroupId)]]],
[tableStr(EcoResStorageDimensionGroupItem), [[fieldNum(EcoResStorageDimensionGroupItem, StorageDimensionGroup), formControlStr(EcoResProductCreate, StorageDimensionGroup)]]],
[tableStr(EcoResTrackingDimensionGroupItem), [[fieldNum(EcoResTrackingDimensionGroupItem, TrackingDimensionGroup), formControlStr(EcoResProductCreate, TrackingDimensionGroup)]]],
[tableStr(InventItemGroupItem), [[fieldNum(InventItemGroupItem, ItemGroupId), formControlStr(EcoResProductCreate, ItemGroupId)]]],
[tableStr(InventModelGroupItem), [[fieldNum(InventModelGroupItem, ModelGroupId), formControlStr(EcoResProductCreate, ModelGroupId)]]]
];
}