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

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 »2014«.

Label eines Dialogfeldes ermitteln/auslesen

Vor kurzem wollte ich in der validate()-Methode einer von RunBase abgeleiteten Klasse ein Fehlermeldung einbauen, die als Teil das Label eines Dialogfeldes verwendet.

Dabei musste ich feststellen, daß dies gar nicht so einfach ist, wie ich es mir vorgestellt hätte.

Die verfügbare Methode dialogField.fieldControl().Label() funktioniert offenbar nur dann, wenn man dem Dialogfeldes explizit ein eigenes Label zugewiesen hat (und dieses nicht dynamisch über den EDT gezogen wird).

Deshalb im folgenden ein kurzer Job, der zeigt wie man das Label eines Dialogfeldes auslesen kann. Die gleiche Logik lässt sich natürlich u.a. auch in einer Klasse, die von RunBase/RunBaseBatch abgeleitet wurde, verwenden.

static void getDialogFieldLabel(Args _args) 
{ 
    Dialog dialog = new Dialog(); 
    DialogField df_Project; 
    DialogField df_AmountMST; 

    str getLabel(DialogField _df) 
    { 
        formStringControl fsc; 
        
        fsc = _df.fieldControl(); 
        
        return fsc.labelText(); 
    } 
     
    df_project   = dialog.addField(typeId(ProjId), "Mein Projekt"); 
    df_AmountMST = dialog.addField(typeId(AmountMST)); 
    
    dialog.run(); 

    info(getLabel(df_project)); 
    info(getLabel(df_AmountMST)); 
}

 
 
 

Eine bestimmte Dimension als Dialogfeld einbinden

Wenn man in Dynamics AX 2009 (oder früheren Versionen) eine bestimmte Dimension als Dialogfeld verwenden möchte, kann man sich einen eigenen Extended Datatype (abgeleitet von Criterias) wie im folgenden beschrieben anlegen. Entscheidend sind dabei die Relations dieses EDTs.

Im Beispiel soll beispielsweise der Kostenträger als Dialogfeld angeboten werden.

Screenshot EDT

Der Beispiel-Code ist einer von RunBase abgeleitenden Klasse entnommen.

protected Object dialog(DialogRunbase dialog, boolean forceOnClient)
{
    Object ret;

    ret = super(dialog, forceOnClient);

    df_project = ret.addField(TypeId(DimensionCostCenter));

    return ret;
}

Der so angepasste Dialog sollte wie folgt aussehen:

Screenshot Dialog


 
 
 

Ursache von Fehlermeldungen ermitteln

In Dynamics AX können unterschiedliche (Fehler-)Meldungen auftreten, die meisten kommen von der Applikation, es gibt aber auch Meldungen, die vom AX-Client ausgegeben werden.

Leider sind nicht alle Meldungen so sprechend, daß man (als Entwickler) sofort weiß, was nun zu tun ist. Deshalb gibt es, je nachdem um welche Art von Fehlermeldung es sich handelt, unterschiedliche Herangehensweisen, wie man die Ursache der Meldung findet.

Meldung über das Infolog der Applikation

Screenshot InfologBei manchen Meldungen genügt ein Doppelklick auf die Meldung im Infolog und man landet im Code, welcher die Meldung geworfen hat (vorausgesetzt man befindet sich als Benutzer gerade im Entwicklungsmodus).


 
 
 

Beispiel für die Verwendung von RecordInsertList

Ein kurzes Code-Beispiel wie man unter der Verwendung von RecordInsertList Datensätze in einer Tabelle auf sehr performante Art & Weise erstellen kann. Wer RecordInsertList nicht kennt, kann hier mehr darüber erfahren.

static void HowToUseRecordInsertList(Args _args)
{
    DMOPerfTest DMOPerfTest;
    RecordInsertList RecordInsertList;
    Counter c;
    FromTime fromTime = timeNow();
    
    RecordInsertList = new RecordInsertList(tableNum(DMOPerfTest));
    
    for (c=1;c<=10000;c++)
    {
        DMOPerfTest.clear();    
        DMOPerfTest.AccountNum = int2str(c);
        
        if(DMOPerfTest.validateWrite())
        {
            RecordInsertList.add(DMOPerfTest);
        }
    }
    
    RecordInsertList.insertDatabase();
    
    info(strFmt("Total time consumed: %1", timeConsumed(fromTime, timeNow())));
}

Die im Beispiel verwendete Tabelle DMOPerfTest wurde für dieses Beispiel erstellt und ist Out-of-the-box nicht Bestandteil von Dynamics AX.


 
 
 

Objekte per Code zu einem Projekt hinzufügen

Nachstehend ein kurzer Job, mit dessen Hilfe man AOT-Elemente zu einem bestehenden Shared Project hinzufügen kann.

static void AddNodeToSharedProject(Args _args)
{
    projectNode projectNode;
    TreeNode treeNode;
    #AOT
    #AOTExport

    projectNode    = infolog.projectRootNode();
    projectNode    = projectNode.AOTfindChild(#expProjectShared);
    projectNode    = projectNode.AOTfindChild('MyProject');
   
    // Add objects
    treenode = TreeNode::findNode(#TablesPath+'\\'+tableid2name(tablenum(CustGroup)));
    projectNode.addNode(treenode);

    treenode = TreeNode::findNode(#TablesPath+'\\'+tableid2name(tablenum(VendGroup)));
    projectNode.addNode(treenode);
   
    treenode = TreeNode::findNode(#ClassesPath+'\\'+classStr(PriceDisc));
    projectNode.addNode(treenode);
}

Das geänderte Projekt sieht beispielsweise wie folgt aus:

Screenshot


 
 
 

Werte eines Base-Enums durchlaufen

SysDictEnum SysDictEnum = new SysDictEnum(enumNum(SalesStatus));
int i;

for (i=0;i<SysDictEnum.values();i++)
{
    info(SysDictEnum.index2Label(i));
}

 
 
 

SQL-Fehler beim Öffnen/Synchronisieren einer Tabelle

Tritt beim Öffnen oder Synchronisieren einer - meist neu erstellten - Tabelle der folgende Fehler auf

Ein Datensatz in Table1 (Table1) kann nicht ausgewählt werden.
Die SQL-Datenbank hat einen Fehler gemeldet.

so kann die Ursache sein, daß die Tabelle ein Feld enthält, dessen Name ein "Reserved Word" der SQL-Datenbank ist. Beispielsweise darf ein Feld nicht Primary genannt werden.


 
 
Seiten 1 2 » 

 

 
 
 
Beiträge des aktuellen Monats
April 2014
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