Dynamics AX Blog - Seite 12

Beim Öffnen einer Form den Filter aufmachen

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

 


 
 

Auftragsposition per Code stornieren

Der folgende Code basiert auf der Logik im Formular SalesUpdateRemain (Schaltfläche "Rest liefern" im Auftragskopf).

static void cancelSalesLine(Args _args)
{
    boolean updated;
    SalesLine salesLine; 
    
    try
    {
        ttsBegin;        
        
        salesLine = SalesLine::findInventTransId('012411', true);
    
        updated = SalesUpdateRemain::updateDeliveryRemainder(salesLine, 0, 0);
    
        if(updated)
        {
            info("Salesline canceled");    
        }        
        
        ttsCommit;
    }
    catch
    {
        error("SalesLine could not be canceled");
    }
}

 
 

Geänderte Objekte innerhalb eines Layers ausgeben, die noch nicht zur Versionskontrolle hinzugefügt wurden

Mithilfe der SysModel*-Tabellen kann man in Dynamics AX den AOT nach bestimmten Objekten bzw. deren Eigenschaften durchsuchen. Ein Beispiel dazu habe ich bereits hier gepostet.

Der folgende job ist eine Erweiterung der oben genannten Beitrags und listet alle Ojekte auf, die im aktuellen Layer verändert wurden und noch nicht zur Versionskontrolle hinzugefügt wurden.


 
 

SysOperation: Formular mit bestimmten Datensatz nach dem Verarbeiten öffnen

Stellt euch folgende Aufgabenstellung vor: Es soll über eine vom SysOperation-Framework abgeleitete Klasse ein Datensatz erstellt oder aktualisiert werden. Danach soll sich ein bestimmtes Formular mit eben diesem Datensatz öffnen damit der Benutzer gleich mit evtl. weiteren manuellen Änderungen am Datensatz fortfahren kann.

Ich nutze für eine solche Aufgabenstellung gerne die afterOperation() der Kontroller-Klasse. In dieser kann ich den operationReturnValue meiner Service-Klasse auslesen und entsprechend verarbeiten.


 
 

Statt Parameter-Listen einen DataContract verwenden

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.
 

 


 
 

CSV-Datei in Dynamics AX importieren/einlesen

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:	empcsvimport.csv";
    CommaTextIo commaTextIo = new CommaTextIo(fileName, "r");
    container lineCon;

    commaTextIo.inFieldDelimiter(';');
    commaTextIo.inRecordDelimiter(' ');
    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.

 

Folgende Beispieldatei würde anders verarbeitet, als vielleicht vom Entwickler erwartet. Die dritte Spalte in der dritten Zeile würde von der read()-Methode als zwei Spalten interpretiert werden.

100;450,00;Customername1
101;1200,00;Customername2
102;50,28;"Customername 3; Second customername"

 
 

Label eines MenuItems ermitteln

static void getLabelFromMenuItem(Args _args)
{
    MenuItemBuild menuItemBuild = new menuItemBuild(menuitemDisplayStr(ProdTableDelayedListPage), MenuItemType::Display);
    
    info(menuItemBuild.menuFunction().label());
}

 
 
Seiten « 1 ... 9 10 11 12 13 14 15 ... 53 » 

 

 
 
 
Beiträge des aktuellen Monats
April 2025
MoDiMiDoFrSaSo
 123456
78910111213
14151617181920
21222324252627
282930 
 
© 2006-2025 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