Dynamics AX Blog - Dynamics AX 4.0 - Seite 6

RSS-Feed dieser Version
Dynamics AX: Methode des "Callers" aufrufen
17.06.2008Microsoft Dynamics AX (Axapta)
Immer wieder besteht die Notwendigkeit, ein Formular über ein anderes zu öffnen und aus diesem heraus Methoden des Aufrufers aufzurufen. Einfaches Beispiel: Ich öffne aus der Auftragsmaske (Salestable) irgendein anderes Formular (über einen MenuItemButton) und möchte nun beim Schliessen dieses Formulares eine Methode in der Salestable-Maske aufrufen. Achtung: IntelliSense funtioniert in diesem Fall nicht (außer ich möchte eine Methode aufrufen, die im FormRun-Objekt enthalten ist). if (element.args() && element.args().caller()) { if (element.args().caller().name() == formStr(Salestable)) { element.args().caller().myMethod(); } } |
Dynamics AX: SysMailerAddressField.appendAddress
30.04.2008Microsoft Dynamics AX (Axapta)
In Dynamics AX 4.0 haben sich in der Klasse SysMailerAddressField in Methode appendAddress einige Fehler eingeschlichen. Diese Fehler treten immer dann auf, wenn man per SysMailer Mails an mehr als einen Empfänger versenden möchte bzw. zusätzlich zur Empfängeradresse auch Empfängernamen angibt. Hier wird bisweilen das Mail entweder nur an die zuletzt hinzugefügte Mail-Adresse versandt oder aber die send-Methode des SysMailers verweigert ganz ihren Dienst, wenn man Empfängernamen angibt. Nachstehend der - aus meiner Sicht - korrekte Code: // Add item to the collection void appendAddress(str addr, str name='') { str address; str addresses; if (prmisdefault(name)) { address = addr; } else { address = name + ' <' + addr + '>'; } addresses = this.get(); if (strlen(addresses) > 0) { address = addresses + ',' + address; } this.set(address); addressCount++; }
Aufgefallen sind mir die Fehler bislang bei Version 4.0 bis inkl. SP2. |
Dynamics AX: Report per Code aufrufen
28.04.2008Microsoft Dynamics AX (Axapta)
Anbei ein Beispiel wie so mancher Report per Code ausgeführt werden kann, und dem Report dabei gleichzeitig ganz bestimmte Datensätze per Query übergeben werden können. static void PrintCustCollectionLetterJour() { CustCollectionLetterJour CustCollectionLetterJour; query query; args args = new args(); reportRun reportRun; ; select firstonly CustCollectionLetterJour; // Irgendein Datensatz // Query aufbauen (mit obigen Datensatz) query = new query(); query.addDataSource(tableNum(CustCollectionLetterJour)); SysQuery::findOrCreateRange(query.dataSourceTable(TableNum(CustCollectionLetterJour)), fieldNum(CustCollectionLetterJour, CollectionLetterNum)).value(CustCollectionLetterJour.CollectionLetterNum); SysQuery::findOrCreateRange(query.dataSourceTable(TableNum(CustCollectionLetterJour)), fieldNum(CustCollectionLetterJour, AccountNum)).value(CustCollectionLetterJour.AccountNum); // Den Query dem Report übergeben args.name(reportstr('CustCollectionJour')); reportRun = classFactory.reportRunClass(args); reportRun.query().interactive(false); reportRun.report().interactive(false); reportRun.query(query); reportRun.init(); reportRun.run(); } |
Dynamics AX: Zugriff auf externe Datenbank via ADO
25.04.2008Microsoft Dynamics AX (Axapta)
Um aus AX4 auf eine externe Datenbank zugreifen zu können, kann man sich der Klasse CCADOConnection bedienen, nachstehend findet Ihr zwei Beispiele wie diese verwendet werden kann.
Aufruf über DSN static void TestADO_via_DSN(Args _args)
{ CCADOConnection adoConnection; CCADORecordSet adoRecordSet = new CCADORecordSet(); str SQLstring = "SELECT * FROM table"; ; adoConnection = new CCADOConnection(); adoConnection.connectionString("Dsn=NameOfDSN"); // Am lokalen PC installierte System-DSN adoConnection.open(); adoRecordSet.open(SQLstring, adoConnection); while (!adoRecordSet.EOF()) { info(adoRecordSet.fields().itemIdx(1).value()); // Erstes Feld info(adoRecordSEt.fields().itemName("fieldname").value()); // Bestimmtes Feld adoRecordSet.moveNext(); } } Aufruf ohne DSN static void TestADO(Args _args) { CCADOConnection adoConnection; CCADORecordSet adoRecordSet = new CCADORecordSet(); str SQLstring = "SELECT * FROM table"; ; adoConnection = new CCADOConnection(); adoConnection.connectionString("Driver={SQL Server};Server=servername;Database=databasename;UID=user; PWD=pass"); adoConnection.open(); adoRecordSet.open(SQLstring, adoConnection); while (!adoRecordSet.EOF()) { info(adoRecordSet.fields().itemIdx(1).value()); // Erstes Feld info(adoRecordSEt.fields().itemName("fieldname").value()); // Bestimmtes Feld adoRecordSet.moveNext(); } } |
Dynamics AX: Notizen zu Labelfiles
22.04.2008Microsoft Dynamics AX (Axapta)
Es gibt vier verschiedene Dateien, in welchen serverseitig Informationen zu Labels gespeichert werden:
Bei den Datetypen, ald, alc und ali existiert pro Sprache und Labelfile jeweils eine Datei im AX-Applikationsverzeichnis (z.b. axSYSde-at wobei SYS für die Labeldatei und de-at für die jeweilige Sprache steht). Bei den alt-Dateien existiert lediglich pro Sprache eine eigene Datei (z.b. axap*.alt wobei * für die jeweilige Sprache steht). Einige Labels werden allerdings clientseitig im bin-Verzeichnis gespeichert. Dies sind z.b. jene des Menüs (Datei - Bearbeiten - Werkzeuge ...). Hier gibt es eigene Dateitypen:
Bei beiden Dateitypen existiert pro verwendeter Sprache jeweils eine Datei. Da die Dateien clientseitig installiert sind, kann rein theoretisch jeder Client zumindest diese Texte anpassen, ob das Sinn macht bleibt dahingestellt. Außerdem besteht die Gefahr die Datei, durch Tippfehler oder wenn man die ktd-Datei im falschen Zeichensatz bearbeitet, zu zerstören. Dann ist der Client nicht mehr startbar! In dieser ktd-datei werden übrigens auch einige andere Dinge gesteuert. Zum Beispiel liefert in einem deutschen AX die Abfrage if("a" == "ä") immmer true zurück. Grund hierfür ist die nachstehende Passage im zur deutschen Sprache gehörigen axsysde-at.ktd >#97 >TC_COLSEQ >Definition of collating sequence mapping >This table is used when sorting letters and strings >First line is the letters to be mapped >Second line is the corresponding letter to map to AàáâãäÀÁÂÃÄBCçÇDEèéêëÈÉÊËFGHIìíîïÌÍÎÏJKLMNñÑOòóôõöÒÓÔÕÖPQRSTUùúûüÙÚÛÜVWXYýÝZæøåÆØÅ aaaaaaaaaaabcccdeeeeeeeeefghiiiiiiiiijklmnnnooooooooooopqrstuuuuuuuuuvwxyyyz~¦Ç~¦Ç
| ||||||||||||||||||||||||||
Methode eines Reports aufrufen
18.04.2008Microsoft Dynamics AX (Axapta)
Um einen Report per X++ aufzurufen, und dabei eine bestimmte Methode des Reports anzusprechen kann man reportRun.owner() benutzen. Zwar steht hierbei IntelliSense nicht zur Verfügung, aber ich denke das ist zu verschmerzen. args.name(reportstr('Reportname')); reportRun = classFactory.reportRunClass(args); reportRun.init(); reportRun.owner().myMethod(myParms); reportRun.run(); |
|
|
|
|
|
|
In der Auftragserfassung gibt es im Auftragskopf Felder, die, wenn sie aktualisiert werden, entweder vollautomatisch bzw. nach Rückfrage beim Benutzer in den Auftragszeilen ebenfalls aktualisiert werden. Welche Felder das sind kann in den Debitorenparametern, Register Aktualisierungen über die Schaltfläche Auftragspositionen aktualisieren eingesehen werden. Dort kann auch parametriert werden, wie sich Dynamics AX bei der Aktualisierung dieser Felder verhalten soll.
Um nun ein weiteres Feld in diese Logik mitaufzunehmen bedarf es einiger Schritte. Im folgenden demonstriere ich die notwendigen Änderungen anhand des neuen Feldes DevReceiptDateRequested (abgeleitet vom EDT DevSalesReceiptDateRequested):
Übrigens, die gleiche Logik gibt es natürlich auch einkaufsseitig. Die obige Abfolge und die Codebeispiele wurden unter AX3 entwickelt.
Update vom 28.07.2010: In Dynamics AX 2009 funktioniert die beschriebene Lösung genauso. Lediglich beim auszuführenden Job hat sich der Datentyp des Feldes table2LineUpdate geändert.