Dynamics AX Blog - Seite 23
Einen (einfachen) SSRS-Bericht in einer bestimmten Sprache aufrufenAm Beispiel des Berichtes CustTransList (Debitorenkonten > Berichte > Buchungen > Debitor > Buchungen) möchte ich zeigen, wie es möglich ist einen Bericht in einer beliebigen Sprache aufzurufen. Für diesen Bericht gibt es keinerlei Klassen in AX, also habe ich mir folgende Klasse selbst erstellt: class CustTransListController extends SrsReportRunController { }
public static str getReportName(Args _args) { str reportName = ssrsReportStr(CustTransList, Report); return reportName; }
public static void main(Args _args) { CustTransListController controller = new CustTransListController(); controller.parmReportName(CustTransListController::getReportName(_args)); controller.parmArgs(_args); controller.parmReportContract().parmRdlContract().parmLanguageId('en-us'); controller.startOperation(); } Mit dieser Klasse kann der Bericht nun in englischer Sprache aufgerufen werden (bzw. in jener Sprache, die man der Methode parmLanguageId() übergibt). |
AX 2012: Finanzdimension als Display-Methode anzeigenFolgende Display-Methode in der Datasource einer Form zeigt beispielsweise die Finanzdimension Costcenter eines Debitoren an. public display DimensionValue showCostCenter(CustTable _custTable) { DimensionAttributeValueSet dimensionAttributeValueSet; DimensionAttributeValueSetItem dimensionAttributeValueSetItem; DimensionAttributeValue dimensionAttributeValue; DimensionAttribute dimensionAttribute; #define.CostCenterDimensionName("CostCenter"); if( !_custTable || !_custTable.DefaultDimension) { return ''; } dimensionAttributeValueSet = DimensionAttributeValueSet::find(_custTable.DefaultDimension); select firstOnly RecId from dimensionAttributeValueSetItem where dimensionAttributeValueSetItem.DimensionAttributeValueSet == dimensionAttributeValueSet.RecId join DimensionAttributeValue where DimensionAttributeValue.RecId == dimensionAttributeValueSetItem.DimensionAttributeValue join RecId from dimensionAttribute where dimensionAttribute.RecId == DimensionAttributeValue.DimensionAttribute && dimensionAttribute.Name == #CostCenterDimensionName if(dimensionAttributeValue && dimensionAttribute) { return dimensionAttributeValue.getValue(); } return ''; } Einfachere Variante (siehe Kommentare) public display DimensionValue showCostCenter(CustTable _custTable) { #define.CostCenterDimensionName("CostCenter"); return ((select firstOnly DisplayValue from DefaultDimensionView where DefaultDimensionView.Name == #CostCenterDimensionName && DefaultDimensionView.DefaultDimension == _custTable.DefaultDimension).DisplayValue); } |
AX 2012: Finanzdimension auf Basis einer Formulareingabe eintragenOftmals hat man die Anforderung, daß auf Basis einer Eingabe in einem Formular auch eine bestimmte Finanzdimension eingetragen werden soll. Mit folgendem Code-Beispiel ist so etwas relativ einfach zu realisieren. Im Beispiel wird, wann immer ein bestimmtes Feld geändert wird - abgefragt über die Methode modified() des Feldes einer Datasource, die Finanzdimension Kostenstelle mit dem Wert 25 befüllt. Ist der einzutragende Wert ein ungültiger, passiert nichts (Fehlermeldung oder ähnliches). public void modified() { DimensionAttribute DimensionAttribute = DimensionAttribute::findByName("Kostenstelle"); DimensionValue newValue = '25'; // New dimension value super(); dimensionDefaultingController.setDimensionAttributeValue( DimensionAttribute, DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute, newValue).RecId, newValue); } Im Beispiel wird eine existierende Instanz von DimensionDefaultingController verwendet. |
Makro innerhalb eines SELECT-Statements verwendenDas Beispiel listet beispielsweise nur aktive Stücklistenpositionen (Tabelle BOM) auf (aktiv über die Felder FromDate und ToDate). Lässt man den zweiten Parameter des Makros leer (dateNull()), so werden alle Stücklistenpositionen gelistet. static void useMacroInSelectStatement(Args _args) { bom bom; date emptyDate; // parameters: %1 = table instance, %2 date, %3 empty date value #localmacro.bomDateFilter && ( %2 == dateNull() || ( ((%1.FromDate <= %2) && (%1.ToDate >= %2)) || ((%1.FromDate == %3) && (%1.ToDate == %3)) || ((%1.FromDate <= %2) && (%1.ToDate == %3)) || ((%1.FromDate == %3) && (%1.ToDate >= %2)) )) #endMacro ; while select bom where bom.ItemId == '123' #bomDateFilter(bom, systemDateGet(), emptyDate) { info(bom.bomid); } } |
Welche Felder werden in einem automatisch generierten Lookup angezeigt?Mir wurde diese Frage vor kurzem selbst gestellt und konnte diese allerdings nur zum Teil beantworten. Ich wusste aber noch, daß ich schon einmal eine Seite gesehen hatte, wo dies genau erklärt wird. Aber ich wusste weder noch wo, noch konnte ich sie über diverse Suchmaschinen finden. Aber in alten Unterlagen fand ich die Quelle dann doch, der Trick um die Quelle auch mit Google und Konsorten zu finden ist, mit dem altem Namen von Microsoft Dynamics AX - Axapta danach zu suchen! Tut man dies, so findet man rasch folgende Seite: |
Verwenden einer Assembly/DLL in Dynamics AXUm eine DLL in Dynamics AX verwenden zu können, muss diese im References-Knoten des AOT hinzugefügt werden.
In beiden Fällen muss nun der Dialog mit OK bestätigt werden. |
|
|
|
|
|
|
Vor kurzem hatte ich das Problem, daß beim Synchronisieren der Datenbank im Formular Datenbank synchronisieren Fehler und/oder Warnungen ausgegeben wurden, bei denen ich mir sicher war, daß diese bereits behoben wurden.
Eine einfache Lösung dafür ist den Inhalt der Tabelle SqlSyncInfo zu löschen.
Die Tabelle selbst findet man im AOT unter System Documentation > Tables > SqlSyncInfo.
Übrigens gibt es im AOT auch das Formular SysSqlSync, welches man jederzeit öffnen kann und sich dort das Ergebnis der jeweils letzten Synchronisierung ansehen kann.