Dynamics AX Blog - Dynamics AX 4.0 - Beiträge von 2009

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
Momentan angezeigt werden nur Beiträge von »2009«.

Was man bei Base Enums beachten sollte

Schon einmal einen Base Enum in Dynamics AX erstellt? Oder einen bestehenden erweitert?

Ja?! Dabei auch auf das folgende geachtet?

.) Das erste Element eines Base Enums sollte den Wert 0 aufweisen und dieser sollte "Undefiniert", "Kein", "Unbekannt" oder ähnlichem entsprechen. Vor allem wenn man den Base Enum später in Tabellen verwenden möchte, die bereits Daten enthalten.
Selbst wenn man davon ausgehen kann, daß man einen solchen undefinierten Zustand nicht benötigt, sollte man die 0 reserviert halten, sprich der erste "echte" Wert des Base Enums sollte 1 entsprechen.


 
 
 

PageFooter sind nicht immer dort, wo sie sein sollten

Ich kenne kein einziges AX-Projekt, in dem nicht zumindest einer der Berichte Auftragsbestätigung, Ausgangslieferschein oder Ausgangsrechnung angepasst worden sind. Und deshalb stolpere ich auch immer wieder über das selbe Problem: Man erweitert einen Bericht (Report) um einen PageFooter, der aber nicht auf jeder Seite angedruckt werden soll.


 
 
 

Alle Felder einer Tabelle auflisten

Kurzes Codebeispiel, wie man alle Felder einer Tabelle auflistet:

static void ListFieldOfTable(Args _args)
{
    dictTable   dictTable;
    int         currFieldId = 0;
    counter     c = 0;
    ;
    dictTable = new dictTable(tableNum(custtable));

    do
    {
        currFieldId = dictTable.fieldNext(currFieldId);

        info(dictTable.fieldName(currFieldId));

        c++;
    }
    while (c < dictTable.fieldCnt());
}

 


 
 
 

Arbeiten mit dem aufrufenden Objekt einer Form (Caller)

Nachstehende Methode enthält einige Snippets, die in einem Formular verwendet werden können, um in Dynamics AX diverse Funktionen/Methoden des Aufrufenden Objektes aufzurufen.

Ändert man element.args() auf z.b. _args und übergibt der Methode diese als Parameter, kann die selbe Logik auch aus einer Klasse heraus verwendet werden.

void workWithCallingRecord()
{
    common          common;
    object          object;
    formDataSource  formDataSource;
    formRun         formRun;
    inventDim       inventDim;
    salesTable      salesTable;
    int             i;
    ;
    // Call method from calling record
    if( element.args() &&
        element.args().record() )
    {
        common = element.args().record();
        if(common.isFormDataSource())
        {
            info(tableId2Name(common.TableId));
            if(formDataSourceHasMethod(common.dataSource(), identifierStr("someMethod")))
            {
                object = common.dataSource();
                object.someMethod();
            }
        }
    }
 

    // Call method from calling form
    if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun'))
    {
        formRun = element.args().caller();
        if(sysFormRun::hasMethod(formRun, identifierStr("someFormMethod")))
        {
            object = formRun;
            object.someFormMethod();
        }
    }

    // Get value from calling record
    if( element.args() &&
        element.args().record() )
    {
        common = element.args().record();
        if(common.TableId == tableNum(salesTable))
        {
            info(common.(fieldNum(salesTable, salesId)));
        }
    }

    // Get value from calling datasource (form with multiple datasources)
    if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun'))
    {
        formRun = element.args().caller();
        for (i = 0; i <= formRun.dataSourceCount(); i++)
        {
            formDataSource = formRun.datasource(i);
            if (formDataSource && formDataSource.table() == tablenum(inventDim))    // Search for specific table
            {
                inventDim = formDataSource.cursor();
                break;
            }
        }
        if(inventDim)
        {
            info(inventDim.InventLocationId);
        }
    }

    // Change data in calling datasource
    if(element.args() && element.args().caller() && element.args().caller().handle() == className2Id('formRun'))
    {
        formRun = element.args().caller();
        for (i = 0; i <= formRun.dataSourceCount(); i++)
        {
            formDataSource = formRun.datasource(i);
            if (formDataSource && formDataSource.table() == tablenum(salesTable))    // Search for specific table
            {
                salesTable = formDataSource.cursor();
                break;
            }
        }
        if(salesTable)
        {
            // Update data
            salesTable.PurchOrderFormNum = "Some value";
            salesTable.update();
        }
    }

    // Refresh calling datasource
    if( element.args() &&
        element.args().record() )
    {
        common = element.args().record();
        if(common.isFormDataSource())
        {
            formDataSource = common.dataSource();
            formDataSource.research(true);
        }
    }
}

 
 
 

Datenquelle eines Formulares aus einer Klasse heraus aktualisieren

Ich weiß nicht, wie es anderen Entwicklern geht, aber ich habe immer wieder das selbe Thema:

In einem Formular soll eine Schaltfläche eingebunden werden, die einen oder mehrere der gerade angezeigten Datensätze über eine Klasse aktualisiert.

So ein MenuItemButton ist schnell eingebunden, allerdings sorgt dieser in der Regel nicht dafür, daß die angezeigten Daten nach dem Betätigen dieses Buttons (und dem Ausführen der dahinterliegenden Programmlogik) auch aktualisiert werden.


 
 
 

#PreFixField und #PreFixFieldValue

Im Standard-Code werden in Verbindung mit dem Befehl setPrefix des öfteren die Makros PreFixField und PreFixFieldValue verwendet. Was die Verwendung dieser Makros für eine Auswirkung auf die Darstellung des Infologs hat, möchte ich im folgenden anhand einfacher Beispiele demonstrieren.

Beispiel für PreFixField

setPrefix('Beispiel fuer #PreFixField');

select firstonly salesTable;

setPrefix(#PreFixField(salesTable, salesId));
info('Datensatz in Tabelle "Auftrag" gefunden.');

Screenshot

 


 
 
 

Dynamics AX: Datumslookup um Anzeige der Kalenderwoche erweitern

LookupUm im Lookup von Datumsfelder zusätzlich die Kalenderwoche angezeigt zu bekommen, ist eine Anpassung der Form SysDataLookup notwendig.

Es muss lediglich die Eigenschaft ShowRowlabels des Table-Controls DaysTable auf YES geändert werden.

Warum diese Eigenschaft nicht standardmässig auf YES gesetzt ist, wundert mich zwar, da ja die dahinterliegende Logik komplett vorhanden ist, aber das darf jemand anderer mit Microsoft diskutieren :-)

Nachtrag vom 19.11.2009
Zuständig für die Berechnung der Kalenderwoche ist die Methode drawMonth() des Formulares. In dieser wird standardmässig die Funktion weekOfYear() verwendet. Diese Funktion sollte - zumindest für nicht amerikanische Unternehmen - durch wkOfYr() ersetzt werden. Erstere berechnet nämlich die Kalenderwoche nach amerikanischem Vorbild.


 
 

 

 
 
 
Beiträge des aktuellen Monats
April 2009
MoDiMiDoFrSaSo
 12345
6789101112
13141516171819
20212223242526
27282930 
 
© 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