Willkommen auf schweda.net | EN | DE
 
 
 
 
 
Momentan angezeigt werden nur Einträge, welche für die Dynamics AX-Version »Dynamics AX 2009« relevant sind. Filter entfernen

RSS-Feed dieser Version

Manchmal muss man im XML-Header einer Methode Sonderzeichen verwenden, um den Code gut dokumentieren zu können. Damit dieser Header trotzdem wohlgeformt ist und nicht als Best-Practice-Abweichung gekennzeichnet wird, kann man einen CDATA-Abschnitt einsetzen.

/// <version>
///  1.0
/// </version>
/// <summary>
/// <![CDATA[ Replaces following special characters: &, % ]]>
/// </summary>
private void someMethod()
{
    //...do something...
}

Ohne diesen CDATA-Abschnitt würde AX folgende BP-Abweichung ausgeben:

Die XML-Dokumentation ist nicht wohlgeformt.


Um sich alle (Shared-)Projekte ausgeben zu lassen, die einen bestimmten Text im Namen tragen, kann man den folgenden Code verwenden.

static void searchProjectName(Args _args)
{
    ProjectNode projectNode;

    #AOTExport

    projectNode    = infolog.projectRootNode();
    projectNode    = projectNode.AOTfindChild(#expProjectShared);
    projectNode    = projectNode.AOTfirstChild();

    while(projectNode)
    {
        setPrefix(projectNode.name());

        if(strScan(projectNode.name(), "BR_", 0, 60))
        {
            info(projectNode.name());
        }

        projectNode    = projectNode.AOTnextSibling();
    }
}

Um direkt beim Öffnen eines Formulares das Filter-Fenster zu öffnen, kann man beispielsweise diesen Code verwenden:

public void run()
{
    super();

    if(dataSourceName_ds.queryRun().prompt())
    {
        dataSourceName_ds.research();
    }
}


Wer schon einmal die Parameter einer Methode erweitern musste, kennt vielleicht das Problem: Wenn man Glück hat kann man seinen neuen Parameter am Ende einfügen und mit einem Default-Wert vorbelegen.

Hat man nicht ganz so viel Glück und muss entweder der Parameter zwischen den vorhandenen einbauen oder darf/kann keinen Default-Wert angeben so muss man den gesamten AOT nach den Aufrufen dieser Methode durchsuchen (die Querverweise helfen hier enorm) und diese entsprechend anpassen.

Aufgrund dieser Problematik gehe ich bei meinen Methoden nun oft den Weg, daß ich nur einen einzigen Parameter einfüge, und zwar vom Typ einer - nennen wir sie einfach einmal DataContract-Klasse.

DataContracts sind dem einen oder anderen vielleicht aus dem SSRS-Umfeld bekannt, aber die selbe Logik kann ich auch in vielen anderen Situationen anwenden.

So sieht eine solche DataContract-Klasse beispielweise wie folgt aus:

classDeclaration MyDataContract
{
    ItemId itemId;     Qty qty;
}

 

Public ItemId parmItemId(ItemId _itemId = itemId)
{
    itemId = _itemId;
    return itemId;
}

 

Public Qty parmQty(Qty _qty = qty)
{
    qty = _qty;
    return qty;
}


Eine Methode könnte dann wie folgt aussehen:

Public void myMethod(MyDataContract _dataContract)
{
    // … do something…
    info(_dataContract.parmItemId());
}


Aufrufen muss ich eine solche Methode so:

MyDataContract dataContract;
dataContract = new MyDataContract();
dataContract.parmItemId("A1000");
dataContract.parmQty(123);

Object.myMethod(dataContract);


Kommt nun später ein neuer Parameter hinzu, muss ich den lediglich entsprechend in der DataContract-Klasse einfügen und die Logik in der Methode erweitern. Die Methodenaufrufe können u.U. so bleiben wie sie waren, lediglich die Aufrufe wo die geänderten Parameter berücksichtigt werden müssen, müssen angepasst werden.

Und zu guter Letzt kann ich solche DataContract-Klassen natürlich für mehrere Methoden verwenden.
 

 


MIt Hilfe der CommaTextIo-Klasse kann man CSV-Dateien in Dynamics AX einlesen. Der hier gezeigte Job zeigt ein einfaches Beispiel für die Verwendung dieser Klasse.

static void importCSVFile(Args _args)
{
    Filename fileName = @"c:\temp\csvimport.csv";
    CommaTextIo commaTextIo = new CommaTextIo(fileName, "r");
    container lineCon;

    commaTextIo.inFieldDelimiter(';');
    commaTextIo.inRecordDelimiter('\r\n');
    while (commaTextIo.status() == IO_Status::OK)
    {
        lineCon = commaTextIo.read();

        info(strFmt("%1 %2 %3", conPeek(lineCon, 1), conPeek(lineCon, 2), conPeek(lineCon, 3)));
    }
}

Prinzipiell ginge dies auch genauso mit der TextIo-Klasse (oder AsciiIo), allerdings muss man dabei beachten, daß diese Klassen beispielsweise unerwartete Ergebnisse liefern können, wenn der inFieldDelimiter - in meinem Beispiel ein Strichpunkt - innerhalb eines Textes vorkommt.


Kurzer Tipp für zwischendurch: Wer längere Zeit an ein und dem selben Projekt arbeitet, kann sich dieses Projekt in den Benutzeroptionen unter Extras > Optionen im Register Entwicklung als Start Projekt hinterlegen.

Screesnhot


Ein einfach gehaltenes Beispiel wir man unter Verwendung der AX<Table>-Klasse der Tabelle PurchLine eine Bestellposition per Code erstellen kann.

static void createPurchLine(Args _args)
{
    axPurchLine axPurchLine;
    purchLine purchLine;
   
    axPurchLine = AxPurchLine::newPurchLine(purchLine);
    axPurchLine.validateInput(true);
    axPurchLine.continueOnError(false);
   
    axpurchLine.parmPurchId("P00001");
    axpurchLine.parmItemId("1000");
    axPurchLine.parmPurchQty(10);
    axPurchLine.parmPurchPrice(24.50);
    axPurchLine.save();
}
 

Seiten 1 2 3 4 ... 14 » 

 

 
Kategorien / Themen
Feeds
RSS RSS-Feed
Atom Atom-Feed
 
 
Beiträge des aktuellen Monats
Dezember 2017
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
 
© 2006-2016 Heinz Schweda | Impressum | Kontakt | English version (BETA) | 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