Dynamics AX Blog - Axapta 3.0 - Microsoft Dynamics AX (Axapta) - Seite 3

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 Kategorie
RSS-Feed dieser Version
PageFooter sind nicht immer dort, wo sie sein sollten
04.12.2009Microsoft Dynamics AX (Axapta)
Ich kenne kein einziges AX-Projekt, in dem nicht zumindest einer der Berichte Auftragsbestätigung, Ausgangslieferschein oder Ausgangsrechnung angepasst worden sind. Und deshalb stolpere ich auch immer wieder über das selbe Problem: Man erweitert einen Bericht (Report) um einen PageFooter, der aber nicht auf jeder Seite angedruckt werden soll. |
Arbeiten mit dem aufrufenden Objekt einer Form (Caller)Nachstehende Methode enthält einige Snippets, die in einem Formular verwendet werden können, um in Dynamics AX diverse Funktionen/Methoden des Aufrufenden Objektes aufzurufen. Ändert man element.args() auf z.b. _args und übergibt der Methode diese als Parameter, kann die selbe Logik auch aus einer Klasse heraus verwendet werden. void workWithCallingRecord() { common common; object object; formDataSource formDataSource; formRun formRun; inventDim inventDim; salesTable salesTable; int i; ; // Call method from calling record if( element.args() && element.args().record() ) { common = element.args().record(); if(common.isFormDataSource()) { info(tableId2Name(common.TableId)); if(formDataSourceHasMethod(common.dataSource(), identifierStr("someMethod"))) { object = common.dataSource(); object.someMethod(); } } } // Call method from calling form if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun')) { formRun = element.args().caller(); if(sysFormRun::hasMethod(formRun, identifierStr("someFormMethod"))) { object = formRun; object.someFormMethod(); } } // Get value from calling record if( element.args() && element.args().record() ) { common = element.args().record(); if(common.TableId == tableNum(salesTable)) { info(common.(fieldNum(salesTable, salesId))); } } // Get value from calling datasource (form with multiple datasources) if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun')) { formRun = element.args().caller(); for (i = 0; i <= formRun.dataSourceCount(); i++) { formDataSource = formRun.datasource(i); if (formDataSource && formDataSource.table() == tablenum(inventDim)) // Search for specific table { inventDim = formDataSource.cursor(); break; } } if(inventDim) { info(inventDim.InventLocationId); } } // Change data in calling datasource if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun')) { formRun = element.args().caller(); for (i = 0; i <= formRun.dataSourceCount(); i++) { formDataSource = formRun.datasource(i); if (formDataSource && formDataSource.table() == tablenum(salesTable)) // Search for specific table { salesTable = formDataSource.cursor(); break; } } if(salesTable) { // Update data salesTable.PurchOrderFormNum = "Some value"; salesTable.update(); } } // Refresh calling datasource if( element.args() && element.args().record() ) { common = element.args().record(); if(common.isFormDataSource()) { formDataSource = common.dataSource(); formDataSource.research(true); } } } |
Laufzeitfehler im Enterprise Portal von Axapta 3.0
01.09.2009Microsoft Dynamics AX (Axapta)
Vor kurzem lief mir im Enterprise Portal von Axapta 3.0 folgender Fehler über den Weg (gleich nach dem Login):
|
Leere Seiten im Enterprise-Portal von Axapta 3.0
09.08.2009Microsoft Dynamics AX (Axapta)
Szenario: Man hat in einer Entwicklungsumgebung eine Web page geändert (z.B. unter AOT/Web/Web Pages/HTML Pages/Standard pages) und diese per XPO in eine Zielumgebung eingespielt. Wird diese neu eingespielte Web page nun zum ersten Mal im Enterprise-Portal der Zielumgebung aufgerufen, wird stattdessen nur eine leere Seite angezeigt. |
Datenquelle eines Formulares aus einer Klasse heraus aktualisieren
23.04.2009Microsoft Dynamics AX (Axapta)
Ich weiß nicht, wie es anderen Entwicklern geht, aber ich habe immer wieder das selbe Thema: In einem Formular soll eine Schaltfläche eingebunden werden, die einen oder mehrere der gerade angezeigten Datensätze über eine Klasse aktualisiert. So ein MenuItemButton ist schnell eingebunden, allerdings sorgt dieser in der Regel nicht dafür, daß die angezeigten Daten nach dem Betätigen dieses Buttons (und dem Ausführen der dahinterliegenden Programmlogik) auch aktualisiert werden. |
#PreFixField und #PreFixFieldValue
26.03.2009Microsoft Dynamics AX (Axapta)
Im Standard-Code werden in Verbindung mit dem Befehl setPrefix des öfteren die Makros PreFixField und PreFixFieldValue verwendet. Was die Verwendung dieser Makros für eine Auswirkung auf die Darstellung des Infologs hat, möchte ich im folgenden anhand einfacher Beispiele demonstrieren. Beispiel für PreFixField setPrefix('Beispiel fuer #PreFixField');
select firstonly salesTable; setPrefix(#PreFixField(salesTable, salesId)); info('Datensatz in Tabelle "Auftrag" gefunden.');
|
|
|
|
|
|
|
Hinweis: Zu diesem Thema ist eine aktuellere Version verfügbar
Sollen in einem Formular nur bestimmte Felder zur Bearbeitung freigegeben sein, kann man die Eigenschaft allowEdit sämtlicher Felder der DataSource der Tabelle entsprechend umsetzen.
Einfacher geht’s mit folgendem Codebeispiel, welches in der init-Methode der DataSource eingebunden wurde und - im konkreten Fall in der Tabelle SalesLine - nur bei einem einzigen Feld die Bearbeitung erlaubt.
{
sqlDictionary sqlDictionary;
;
super();
while select sqlDictionary
where sqlDictionary.tabId == tableNum(salesLine)
&& sqlDictionary.fieldId != 0
{
if(sqlDictionary.name != "dataareaid" &&
sqlDictionary.name != "recversion" &&
sqlDictionary.name != "recId"
)
{
salesline_ds.object(sqlDictionary.fieldId).allowEdit(false);
}
}
salesline_ds.object(fieldNum(salesLine, blocked)).allowEdit(true);
}
Getestet in AX 3.0