Dynamics AX Blog - Dynamics AX 2009 - Microsoft Dynamics AX (Axapta) - Seite 7

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
Berichte lassen sich nicht über die Stapelverarbeitung ausführen
06.07.2011Microsoft Dynamics AX (Axapta)
|
Berechtigung eines Benutzers für einen Sicherheitsschlüssel abfragen
24.06.2011Microsoft Dynamics AX (Axapta)
Mit diesem Stückchen Code kann man in Dynamics AX prüfen, welche Berechtigung ein Benutzer für einen bestimmten Sicherheitsschlüssel (Securitykey) hat. static void GetSecurityKeyAccess4User(Args _args) { Dictionary Dictionary = new Dictionary(); securityKeyId securityKeyId; SecurityKeySet securityKeySet = new SecurityKeySet(); UserId userId = 'user1'; SelectableDataArea dataArea = 'ceu'; AccessType accessType; ; securityKeyId = Dictionary.securityKeyName2Id("BatchReport"); securityKeySet.loadUserRights(userId, dataArea); AccessType = securityKeySet.access(securityKeyId); info(enum2str(AccessType)); } |
Notizen zu Systemdatum und -zeit
22.05.2011Microsoft Dynamics AX (Axapta)
Im folgenden sind einige Gedankennotizen zum Thema Datum und Uhrzeit in Dynamics AX notiert. In allen mir bekannten Versionen von Dynamics AX bzw. Axapta gibt es die nachstehenden Funktionen:
Ab Dynamics AX 2009 stehen u.a. zusätzliche folgende Funktionen zur Verfügung:
In allen bisherigen Dynamics AX-Versionen wird das Systemdatum und die Systemzeit von der Zeit des Clients initialisiert. Diese Werte kann sich der Benutzer - entsprechende Rechte vorausgesetzt - jederzeit selbst ändern (die Uhrzeit allerdings erst seit Dynamics AX 2009). Sie gelten aber nur für die aktuelle Sitzung und nur für diesen Benutzer.
| ||||||||||||||||
Druckeinstellungen und Filterkriterien eines Reports vorbelegen II
08.05.2011Microsoft Dynamics AX (Axapta)
Wie startet man einen Bericht, bei dem eine von RunBaseReport abgeleitete Klasse vorgeschalten ist, per X++ und gibt diesem Bericht bereits den Query und die Druckeinstellungen vor? Wer sich diese Frage schon einmal stellen musste, für den liefert dieser Blogbeitrag vielleicht einen Lösungsansatz: static void setPrintJobSettingsQuery4ReportClass_II(Args _args) { custReport custReport = new custReport(); printJobSettings printJobSettings = new printJobSettings(); ; custReport.makeReportRun(); // Modify Query sysQuery::findOrCreateRange(custReport.reportRun().query().dataSourceTable(tableNum(custTable)), fieldNum(custTable, custGroup)).value(queryValue('10')); custReport.reportRun().query().interactive(false); // Create printJobSettings printJobSettings.setTarget(PrintMedium::File); printJobSettings.format(PrintFormat::PDF); printJobSettings.fileName(@"C:\Temp\CustTableReport.pdf"); // Apply printJobSettings custReport.reportRun().printJobSettings(printJobsettings.packPrintJobSettings()); custReport.reportRun().report().interactive(false); // Disable default printer-dialog custReport.reportRun().run(); } Obiger Code instanziiert ein Objekt der Klasse custReport, deren wesentliche Methoden wie folgt aussehen: class CustReport extends runBaseReport { }
public identifiername lastValueElementName() { identifiername ret; //ret = super(); ret = reportStr(Cust); return ret; }
static ClassDescription description() { return "Custreport"; }
static void main(Args args) { CustReport CustReport; ; CustReport = new CustReport(); if (CustReport.prompt()) { CustReport.run(); } } |
Tabellen mit doppelten RecIDs ermitteln
04.05.2011Microsoft Dynamics AX (Axapta)
Wenn man in Dynamics AX (4.0 bzw. 2009) einmal in die Verlegenheit kommen sollte, prüfen zu müssen, ob es Tabellen mit doppelten RecIDs gibt, kann folgendes SQL-Script dabei behilflich sein: use ax2009_standard_sp1
set nocount on declare @tableName char(100) declare db_cursor CURSOR FOR select name from dbo.sysobjects where xtype = 'U' and name <> 'ROWSTAT' and name <> 'ROWSTATUS' and name <> 'SQLSYSTEMVARIABLES' and name <> 'SYSTEMSEQUENCES' -- SYSTEMSEQUENCES enthält immer doppelte RecIDs order by name asc -- Temporäre Tabelle aufbauen IF OBJECT_ID(N'tempdb..#tmp_duplrecid', N'U') IS NOT NULL begin drop table #tmp_duplrecid end create table #tmp_duplrecid (tablename char(100), recordcounter bigint) OPEN db_cursor FETCH NEXT FROM db_cursor INTO @tableName WHILE @@FETCH_STATUS = 0 BEGIN -- Tabellen mit doppelten RecIds ermitteln exec('insert into #tmp_duplrecid select ''' + @tableName + ''', COUNT(*)' + ' from ' + @tableName + ' group by RECID ' + ' having COUNT(*) > 1') FETCH NEXT FROM db_cursor INTO @tableName END CLOSE db_cursor DEALLOCATE db_cursor set nocount off -- Tabellen mit doppelten RecIDs select 'Tabelle enthält doppelte RecIDs: ' + tablename from #tmp_duplrecid
|
Report auf Basis eines Query erstellen
30.04.2011Microsoft Dynamics AX (Axapta)
Die Feldgruppe AutoReport einer Tabelle und deren Verwendung beim Drucken von Daten aus einem Formular heraus sollte wohl jedem Dynamics AX-Entwickler bekannt sein. Auf Basis dieser Standard-Funktionalität habe ich versucht, selbst einen Report per X++ auf Basis eines Query zu erstellen. static void createReportFromQuery(Args _args)
{ query query; report report; reportDesign reportDesign; reportRun reportRun; reportSection reportSection; sysReportRun sysReportRun; reportName reportTemplateName = 'FrontPage'; reportAutoDesignSpecs reportAutoDesignSpecs; int ds; int f; printJobSettings printJobSettings = new printJobSettings(); ; // Build query query = new query(); query.addDataSource(tableNum(vendTable)); query.dataSourceTable(tableNum(vendTable)).addRange(fieldNum(vendTable, vendGroup)).value('10'); // Add Fieldlist query.dataSourceTable(tableNum(vendTable)).addSelectionField(fieldNum(vendTable, accountNum)); query.dataSourceTable(tableNum(vendTable)).addSelectionField(fieldNum(vendTable, name)); query.dataSourceTable(tableNum(vendTable)).addSelectionField(fieldNum(vendTable, vendgroup)); // Build printJobSettings printJobSettings.setTarget(PrintMedium::Screen); printJobSettings.format(PrintFormat::PDF); printJobSettings.fileName(@"C:\Temp\TempReportFromQuery.pdf"); // Create report if( hasSecurityKeyAccess(securityKeyNum(SysDevelopment), AccessType::Edit)) { report = new report(); sysReportRun = classfactory.reportRunClass(new Args(reportstr(SysReportAuto))); sysReportRun.init(); sysReportRun.query(query); if (!sysReportRun.queryRun()) { sysReportRun.queryRun(new SysQueryRun(query)); } sysReportRun.queryRun().query().interactive(false); Report.interactive(!printJobSettings); Report.query(sysReportRun.queryRun().query()); reportDesign = report.addDesign(); reportDesign.caption("TmpReportFromQuery"); reportDesign.reportTemplate(reportTemplateName); reportDesign.orientation(printerOrientation::Auto); reportAutoDesignSpecs = reportDesign.autoDesignSpecs(); // Add body for(ds = 1;ds <= sysReportRun.queryRun().query().dataSourceCount(); ds++) { reportSection = reportAutoDesignSpecs.addSection(reportBlockType::Body, sysReportRun.queryRun().query().dataSourceNo(ds).table()); reportSection.arrangeMethod(arrangeMethod::Vertical); for(f=1;f<=sysReportRun.queryRun().query().dataSourceNo(ds).selectionCount();f++) { reportSection.addControl(sysReportRun.queryRun().query().dataSourceNo(ds).table(), sysReportRun.queryRun().query().dataSourceNo(ds).fields().field(f)); } } // Run the report reportRun = new reportRun(report); reportRun.fetch(); // Print the report if(printJobSettings) { reportRun.printJobSettings(printJobSettings.packPrintJobSettings()); } reportRun.print(); } } Das Ergebnis des obigen Codes ist ein sehr einfacher Report: |
Arbeiten mit dem aufrufenden Objekt einer Form (Caller) II
26.03.2011Microsoft Dynamics AX (Axapta)
Um in einem Objekt auf das aufrufende Objekte zuzugreifen, habe ich anhand von einigen Zeilen Code ja schon demonstriert (siehe hier und hier). Dabei hatte ich aber immer ausser Acht gelassen, daß das aufrufende Objekt ja auch eine Klasse sein kann. Nun also hier ein entsprechendes Beispiel: if (element.args() && element.args().caller() && classidget(element.args().caller()) == classnum(nameOfClass )) { nameOfClass = element.args().caller(); someValue = nameOfClass.someMethod(); } |
|
|
|
|
|
|
Wenn bei einem Benutzer der Register Stapel beim Aufruf eines Berichtes nicht angezeigt wird, kann dies u.U. daran liegen, daß der Benutzer keine oder unzureichende Berechtigung für den Sicherheitsschlüssel Stapelverarbeitungsbericht (SecurityKey BatchReport) hat.