Dynamics AX Blog - Dynamics AX 2009 - Beiträge von 2010 - Seite 3

Momentan angezeigt werden nur Beiträge, welche für die Dynamics AX-Version »Dynamics AX 2009« relevant sind. Filter entfernen

RSS-Feed dieser Version
Momentan angezeigt werden nur Beiträge von »2010«.

Liste aller Felder einer Tabelle ausgeben

Unlängst benötigte ich eine Liste aller Felder einer Tabelle mit deren Datentypen. Dafür habe ich mir den folgenden Job - im Beispiel für die Tabelle custGroup - geschrieben:

static void listAllFields4Table(Args _args)
{
    dictTable   dictTable = new dictTable(tableNum(custGroup));
    int         currFieldId = 0;
    counter     c = 0;
    dictField   dictField;
    counter     a = 0;
    common      common;
    str         enumName;
    ;

    common = DictTable.makeRecord();
    setPrefix(strFmt("Fields of table %1",  tableId2name(common.TableId)));

    currFieldId = 0;
    c = 0; 
    do
    {
        currFieldId = dictTable.fieldNext(currFieldId); 
        if(currFieldId != 0)
        {
            dictField = new dictField(common.TableId, currFieldId); 
            if(dictField.arraySize() == 1)
            {
                info(   strFmt("%1: %2 [%3%4]",
                        dictTable.fieldName(currFieldId),
                        dictField.label(),
                        dictField.baseType(),
                        dictField.enumId() ? strFmt(" %1", enumId2Name(dictField.enumId())) : "")
                     );
            }
            else if(dictField.arraySize() > 1)
            {
                for(a=1;a<=dictField.arraySize();a++)
                {
                    info(   strFmt("%1 [%2]: %3 [%4]",
                            dictTable.fieldName(currFieldId),
                            a,
                            dictField.label(),
                            dictField.baseType())
                         );
                }
            }
        }
        c++;
    }
    while (c < dictTable.fieldCnt());
}

 
 

Prüfungen durchführen beim/vor dem Schliessen eines Formulares

Möchte/muß man beim bzw. vor dem Schliessen eines Formulares etwas tun, z.B. Prüfungen durchführen, so stellt Dynamics AX dafür einige Methoden zur Verfügung, die in einer bestimmten Reihenfolge abgearbeitet werden. Da ich selbst mir diese Reihenfolge nicht merke, habe ich sie hier kurz notiert.

Beim Schliessen eines Formulares über einen OK-Commandbutton:

  • closeOK
  • canClose
  • close

Beim Schliessen eines Formulares über einen CANCEL-Commandbutton:

  • closeCancel
  • canClose
  • close

Beim Schliessen eines Formulares über "das rote X" bzw. der ESC-Taste:

  • canClose
  • close

 


 
 

Feldwert eines aufrufenden Objektes ermitteln

In vielen Objekten sieht man Kontrukte wie das folgende, die dazu dienen, einen Wert aus dem aufrufenden Datensatz zu ermitteln.

if (element.args() && element.args().record())
{
    switch (element.args().dataset())
    {
        case tablenum(PurchLine)    :
            itemIdCaller = element.args().record().(fieldNum(purchLine, ItemId));
            break;
        case tablenum(SalesLine)    :
            itemIdCaller = element.args().record().(fieldNum(SalesLine, ItemId));
            break;
        case tablenum(SalesQuotationLine)    :
            itemIdCaller = element.args().record().(fieldNum(SalesQuotationLine, ItemId));
            break;
    }
}

Einfacher geht’s mit unten dem stehenden Stückchen Code! Der grosse Vorteil von diesem ist, daß wann immer man das Objekt von einem Datensatz aus aufruft, der ein Feld namens itemId enthält, die Logik abgearbeitet wird ohne daß man jede Tabelle einzeln im switch-Statement berücksichtigen muss.


 
 

Ansprechen der seriellen Schnittstelle unter Dynamics AX 2009

Mithilfe der Klasse SerialPorts aus dem .net-Framework kann man unter Dynamics AX 2009 recht bequem auf die serielle Schnittstelle zugreifen. Nachstehend dazu ein kurzes Code-Beispiel, wie man ein Display, wie man es z.B. von Kassensystemen kennt, ansteuern kann.

static void sendText2SerialPort(Args _args)
{
    System.IO.Ports.SerialPort SerialPort;
    str deleteDisplay = num2char(hex2int("0C"));
    ;
    SerialPort = new System.IO.Ports.SerialPort('com4');
    SerialPort.Open();
    if(SerialPort.get_IsOpen())
    {
        SerialPort.Write(deleteDisplay);
        SerialPort.Write('Welcome World!');
        SerialPort.Close();
    }
}

 


 
 

Eine von RunBasebatch abgeleitete Klasse ist nicht im Stapel lauffähig

Vor kurzem hatte ich die Aufgabenstellung, eine Klasse die bereits von RunBase abgeleitet worden war, stapelfähig zu gestalten. So weit so einfach, dachte ich mir und habe in der ClassDeclaration der Klasse extends runBase durch extends runBaseBatch ersetzt. Ich hatte danach zwar den entsprechenden Register im Dialog, die Klasse wurde aber dennoch immer sofort ausgeführt :-(

Nach etwas herumprobieren hatte ich schlussendlich in der Methode getFromDialog den Fehler entdeckt: Diese war so programmiert, daß sie per return true immer true retouniert, das runBaseBatch-Framework benötigt an dieser Stelle allerdings ein return super().

Kleine Ursache, grosse Wirkung.


 
 

Druckoptionen von Berichten können nicht geändert werden

In Dynamics AX 2009 scheint es einen kleinen Bug zu geben, der bei Reports, welche über eine von RunBaseReport abgeleitete Klasse gestartet werden, dazu führt, daß sich die Druckoptionen nicht ändern lassen.

Um diesen Bug zu umgehen, kann man die Methode dialogUpdatePrinterSettings, wie in nachstehendem Beispiel beschrieben, überschreiben.

public void dialogUpdatePrinterSettings(Dialog dialog)
{
    ;
    // --> (1) Workaround to update printJobSettings and dialog
    this.printJobSettings().unpackPrintJobSettings(this.reportRun().packPrintJobSettings());
    // <-- (1)

    super(dialog);
}

Update 27.12.2010
Mittlerweile gibt es einen funktionierenden Fix von Microsoft, siehe http://blogs.msdn.com/b/emeadaxsupport/archive/2010/12/20/print-medium-change-in-dialog-not-working-on-certain-reports.aspx


 
 

AxInventTable: Artikel per Code anlegen in Dynamics AX 2009

Um einen Artikel in Dynamics AX 2009 anzulegen kann man sich - wie schon in früheren Versionen - der Klasse axInventTable bedienen. Dies Klasse hat den grossen Vorteil, daß sie sich auch um jene Tabellen kümmert, die neben der inventTable befüllt werden müssen, also die drei Datensätze in der inventTableModule und jenen in der InventItemLocation, sodaß der Artikel sofort in der Form InventTable aufscheint.

static void createItemUsingAxInventTable(Args _args)
{
    axInventTable axInventTable;
    ;
    axInventTable = axInventTable::construct();
    axInventTable.parmItemId('NewItemId');
    axInventTable.save();
}

Etwas sollte man bei Verwendung der Klasse allerdings berücksichtigen: Obiger Job erstellt den Artikel, ohne eventuelle Pflichtfelder wie z.B. die Artikelgruppe zu befüllen. Das aber auch nur, wenn es keine Datensatzvorlage vom Typ Unternehmensvorlage gibt. Gibt es eine solche Standardvorlage für den Artikelstamm, so nutzt AX diese!

 


 
 
Seiten « 1 2 3 4 5 » 

 

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