Dynamics AX Blog - Beiträge von 2012 - Seite 3
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); |
Zertifizierungsprüfung Microsoft Dynamics AX 2012 Development Introduction
10.06.2012In eigener Sache
Vor kurzem habe ich meine erste Zertifizierungsprüfung zu Dynamics AX 2012 abgelegt, es handelte sich dabei um die Prüfung MB6-869 Microsoft Dynamics AX 2012 Development Introduction.
|
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"); } } |
AX 2012: Standardfinanzdimension eines Datensatzes auslesen und Inhalt prüfen
16.05.2012Microsoft Dynamics AX (Axapta)
Der folgende Job demonstriert, wie man den Inhalt der Standardfinanzdimensionen eines Datensatzes - im Beispiel jene eines Debitoren - per X++ prüft. Im Beispiel werden die Dimensionen namens CustomerGroup, Debitor und NonExistingDimension als zu prüfen angegeben. Bitte beachtet, daß nicht alle Dimensionen in jeder AX-Instanz vorhanden sind. Vor allem letztere dient lediglich zur Demonstration, wie sich der Code verhält, wenn eine Dimensionen ausgelesen werden soll, die es gar nicht gibt. static void validateDefaultDimensionValues(Args _args) { CustTable custTable = CustTable::find('9101', true); container validateCon; container helpCon; int ii; container getDimensionValue(RecId _dimensionAttributeValueSetRecId, container _c) { DimensionAttributeValueSetItem dimensionAttributeValueSetItem; DimensionAttributeValue dimensionAttributeValue; DimensionAttribute dimensionAttribute; Common dimensionValueEntity; int i; Name dimensionName; str 255 dimensionValue; container retCon; for (i=1;i<=conLen(_c);i++) { dimensionName = conPeek(_c, i); if( !DimensionAttribute::findByName(dimensionName)) error(strFmt("Dimension %1 not found", dimensionName)); while select dimensionAttributeValueSetItem where dimensionAttributeValueSetItem.DimensionAttributeValueSet == _dimensionAttributeValueSetRecId { // Find the dimension 'value' (DimensionAttributeValue) that the set item points to. dimensionAttributeValue = DimensionAttributeValue::find(dimensionAttributeValueSetItem.DimensionAttributeValue); // Find the underlying attribute. dimensionAttribute = DimensionAttribute::find(dimensionAttributeValue.DimensionAttribute); // Use the helper class to obtain a reference to the underlying entity (can be anything) dimensionValueEntity = DimensionDefaultingControllerBase::findBackingEntityInstance( curext(), dimensionAttribute, dimensionAttributeValue.EntityInstance); if(dimensionAttribute.Name == dimensionName) { retCon = conIns(retCon, conLen(retCon)+1, [dimensionAttribute.Name, dimensionAttributeValue.getValue()]); } } } return retCon; } ; validateCon = getDimensionValue(custTable.DefaultDimension, ["CustomerGroup", "Debitor", "NonExistingDimension"]); for (ii=1;ii<=conLen(validateCon);ii++) { helpCon = conPeek(validateCon, ii); if(conPeek(helpCon, 1) == "CustomerGroup" && conPeek(helpCon, 2) != custTable.CustGroup) { warning(strFmt("Dimension %1 should be %2.", conPeek(helpCon, 1), conPeek(helpCon, 2))); } if(conPeek(helpCon, 1) == "Debitor" && conPeek(helpCon, 2) != custTable.AccountNum) { warning(strFmt("Dimension %1 should be %2.", conPeek(helpCon, 1), conPeek(helpCon, 2))); } if(conPeek(helpCon, 1) == "NonExistingDimension" && conPeek(helpCon, 2) != custTable.AccountNum) { warning(strFmt("Dimension %1 should be %2.", conPeek(helpCon, 1), conPeek(helpCon, 2))); } } } |
AX 2012: Benutzerdefinierte Finanzdimension anlegen
14.05.2012Microsoft Dynamics AX (Axapta)
MIt Hilfe des folgenden Jobs kann in Dynamics AX 2012 ein neuer Eintrag für eine benutzerdefinierte Finanzdimension erstellt werden. Im Beispiel ist der Name der Dimension ParentProject und der einzufügende Wert ist 4600. static void createCustomDimensionValue(Args _args) { DimensionValueService dimensionValueService; DimensionValueContract dimensionValueContract; dimensionValueService = new DimensionValueService(); dimensionValueContract = new DimensionValueContract(); dimensionValueContract.parmDescription('Project 4500'); dimensionValueContract.parmValue('4600'); dimensionValueContract.parmDimensionAttribute('ParentProject'); if(dimensionValueService.createDimensionValue(dimensionValueContract)) { info(strFmt("Dimension value %1 for dimension %2 created", dimensionValueContract.parmValue(), dimensionValueContract.parmDimensionAttribute())); } } |
|
|
|
|
|
|
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.
{
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();
}