Dynamics AX Blog - Beiträge von 2008 - Seite 5
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(); |
Inside Microsoft Dynamics AX 4.0
16.04.2008Microsoft Dynamics AX (Axapta)
Ich habe schon seit einiger Zeit das Buch Inside Microsoft Dynamics AX 4.0 auf meinem Schreibtisch liegen und verwende es immer wieder um kurz etwas nachzuschlagen. Und so manche Funktion bzw. Funktionsweise habe ich nur in diesem Buch erklärt bekommen, deshalb kann ich - obwohl ich leider noch nicht dazugekommen bin es komplett zu lesen - dieses Buch nur empfehlen. Und das Beste daran: bei mfp's two cents habe ich folgenden Link gefunden: http://download.microsoft.com/down...2579eBook.pdf Über diesen kann man sich das komplette Buch als PDF herunterladen. Kostenlos! Wem allerdings - so wie mir - die gebundene Variante lieber ist, kann sich das Buch natürlich gerne bei Amazon kaufen ;-) |
Dynamics AX: Versionskontrolle in 4.0
15.04.2008Microsoft Dynamics AX (Axapta)
Nachdem wir AX-Entwickler in der Version 4.0 leider der Möglichkeit des Sperrens und Entsperrens von Objekten beraubt wurden, habe ich in letzter Zeit vermehrt Zeit investieren müssen, um die in dieser Version integrierte Versionskontrolle (Microsoft Visual SourceSafe) an Stelle dessen zu verwenden. Leider mit der - mittlerweile auch von Microsoft selbst bestätigten - Erkenntnis, daß bei aktivierter Versionskontrolle pro Applikation und AOS nur ein Entwickler unterstützt wird :-( D.h. besteht die Notwendigkeit, daß mehrere Entwickler gleichzeitig an einer Applikation entwickeln, die Versionskontrolle in eigenem Interesse deaktiviert werden muß. Ansonsten kann es zu Verlust von Programmzeilen kommen! Wozu ein einzelner Entwickler allerdings ein "schweres" Versionskontroll-System verwenden soll, ist mir persönlich allerdings schleierhaft. Übrigens: Laut Microsoft soll in Dynamics AX 2009 dieser Mißstand behoben sein. Ich bin gespannt... |
Dynamics AX: Rechnungen per Code druckenÜber nachstehenden Code kann ganz einfach jederzeit eine Verkaufsrechnung nachträglich ausgedruckt werden. Durch leichte Modifikationen des Codes gilt dies auch für sämtliche anderen verkaufs- und einkaufsseitigen Dokumente. Hier ein kurzes Beispiel unter AX 2009 static void PrintSalesInvoice(Args _args) { custInvoiceJour custInvoiceJour; SalesFormLetter salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice, false); PrintJobSettings printJobSettings = new PrintJobSettings(); Args args = new Args(); boolean prompt = true; boolean printIt = true; ; if (prompt) { // Auswahl des Benutzers über Dialog printIt = printJobSettings.printerSettings('SysPrintForm'); } else { // Printjobsettings per Code steuern printJobSettings.setTarget(PrintMedium::File); printJobSettings.format(PrintFormat::PDF); printJobSettings.fileName(@'c:\temp\myfile.pdf'); } if (!printIt) { return; // Benutzerabbruch } salesFormLetter.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings()); select firstOnly custInvoiceJour where custInvoiceJour.salesid == '100001'; args.record(custInvoiceJour); args.caller(salesFormLetter); new MenuFunction(menuitemoutputstr(SalesInvoice), MenuItemType::Output).run(args); } Nachstehend ein Code-Beispiel unter AX 4.0 static void PrintSalesInvoice(Args _args) { custInvoiceJour custInvoiceJour; SalesFormLetter salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice, false); PrintJobSettings printJobSettings = new PrintJobSettings(); Args args = new Args(); boolean prompt = true; boolean printIt = true; salesPrintSetup salesPrintSetup; ; if (prompt) { // Auswahl des Benutzers über Dialog printJobSettings = new PrintJobSettings(salesPrintSetup.PrintJobSettings); printIt = printJobSettings.printerSettings('SysPrintForm'); salesPrintSetup.PrintJobSettings = printJobSettings.packPrintJobSettings(); } else { // Printjobsettings per Code steuern printJobSettings.setTarget(PrintMedium::File); printJobSettings.format(PrintFormat::PDF); printJobSettings.fileName(@'c:\temp\myfile.pdf'); } if (!printIt) { return; // Benutzerabbruch } salesFormLetter.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings()); select firstOnly custInvoiceJour where custInvoiceJour.salesid == '100001'; args.record(custInvoiceJour); args.caller(salesFormLetter); new MenuFunction(menuitemoutputstr(SalesInvoice), MenuItemType::Output).run(args); } |
Dynamics AX: CRM aktiv oder nicht?
03.04.2008Microsoft Dynamics AX (Axapta)
Ob CRM in der jeweiligen AX-Umgebung aktiv ist, erfährt man ganz einfach über folgende Abfrage: smmLicense::CRM() // returns boolean |
|
|
|
|
|
|
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
{
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
{
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();
}
}