Dynamics AX Blog - Dynamics AX 4.0 - Microsoft Dynamics AX (Axapta) - Seite 6

Momentan angezeigt werden nur Beiträge der Kategorie »Microsoft Dynamics AX (Axapta)« Filter entfernen

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
Momentan angezeigt werden nur Beiträge, welche für die Dynamics AX-Version »Dynamics AX 4.0« relevant sind. Filter entfernen

RSS-Feed dieser Version

Dynamics AX: Methode des "Callers" aufrufen

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.
Um dies zu realisieren muß ich einfach in der Close-Methode des Subformulars folgenden Code einbinden. myMethod steht dabei für die aufzurufende Methode des Salestable-Formulares.

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

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

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

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

Es gibt vier verschiedene Dateien, in welchen serverseitig Informationen zu Labels gespeichert werden:

Datei-erweiterung Beschreibung
*.ald Axapta Application Label Data
  Kann per Editor bearbeitet werden (z.b. Notepad). Ist gleichzeitig auch die einzige Datei, die man selbst bearbeiten kann/soll
*.alc Axapta Application Label Comments
  Axapta Application Label Comments
*.ali Axapta Application Label Index
  Diese Dateien können eigentlich jederzeit gelöscht werden, sie werden zu verschiedenen Zeitpunkten automatisch neu generiert (z.B. wenn der Client gestartet wird, wird zumindest jenes Index-File in der gerade verwendeten Sprache erstellt; Wenn man im Labeleditor nach einem Label sucht, werden die Index-Files aller Sprachen neu aufgebaut)
*.alt Axapta Application Label Temp Store
  Hier werden Labels temporär gespeichert, wenn ein Entwickler welche anlegt Erst bei Beenden des Clients bzw. des AOS werden diese neuen Label ins ald-File übertragem (dazu wird übrigens kurzfristig ein alb-file generiert)

 

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:

Datei-erweiterung Beschreibung
*.ktd Axapta Application Kernel Translation Data
  Kann per Editor bearbeitet werden (z.b. Notepad). Ist gleichzeitig auch die einzige Datei, die man selbst bearbeiten kann/soll
*.kti Axapta Application Kernel Translation Index

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

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

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 ;-)


 
 
Seiten « 1 ... 3 4 5 6 7 8 » 

 

 
 
 
Beiträge des aktuellen Monats
November 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
252627282930 
 
© 2006-2024 Heinz Schweda | Impressum | Kontakt | English version | Mobile Version
Diese Webseite verwendet Cookies, um Benutzern einen besseren Service anzubieten. Wenn Sie weiterhin auf der Seite bleiben, stimmen Sie der Verwendung von Cookies zu.  Mehr dazu