Dynamics AX Blog - Microsoft Dynamics AX (Axapta) - Seite 31

Momentan angezeigt werden nur Beiträge der Kategorie »Microsoft Dynamics AX (Axapta)« Filter entfernen

In den letzten Jahren, in denen ich mich fast hauptsächlich mit der Entwicklung im Umfeld von Microsoft Dynamics AX (vormals Axapta) beschäftigt habe, ist das eine oder andere Code-Fragment entstanden, von dem ich mir vorstellen könnte, daß es auch für andere AX-Entwickler ganz nützlich sein könnte. Aber auch Tips und Tricks zu dem mächtigen ERP-System werde ich in dieser Kategorie präsentieren.

RSS-Feed dieser Kategorie

AX 2012: Erweitern des Formulares zur Anlage von Produkten/Artikel

Um einen Artikel bzw. ein Produkt in Dynamics AX 2012 anzulegen, wird das Formular EcoResProductCreate verwendet.
Dieses Formular enthält entgegen den meisten Formularen keinerlei Datasources, womit beispielsweise neue Felder in der Tabelle InventTable vollständig anders implementiert werden müssen.

Im folgenden eine Kurzbeschreibung zur Einbindung eines Beispielfeldes MyCustomField (vom Extended Datatype MyCustomId):

1.) Hinzufügen einen Formcontrols auf Basis des EDT MyCustomId zum Formular und setzen der Eigenschaft AutoDeclaration auf YES und Vergabe eines eindeutigen Namens (beispielsweise gleichlautend wie der Name des Feldes)

2.) Anpassen der Methode createData2Controls() des Formulares wie folgt:

private void createData2Controls()
{
     data2Controls = [
                     //--> (1)
                     //[tableStr(InventTable), [[fieldNum(InventTable, bomUnitId), formControlStr(EcoResProductCreate, BOMUnitId)]]],
                     [tableStr(InventTable), [[fieldNum(InventTable, bomUnitId), formControlStr(EcoResProductCreate, BOMUnitId)],
                                             [fieldNum(InventTable, MyCustomId), formControlStr(EcoResProductCreate, MyCustomField)]]],
                     //<-- (1)
                     [identifierStr(Purch), [[fieldNum(InventTableModule, UnitId), formControlStr(EcoResProductCreate, PurchUnitId)],
                               [fieldNum(InventTableModule, TaxItemGroupId), formControlStr(EcoResProductCreate, PurchTaxItemGroupId)]]],
                     [identifierStr(Invent),[[fieldNum(InventTableModule, UnitId), formControlStr(EcoResProductCreate, InventUnitId)]]],
                     [identifierStr(Sales), [[fieldNum(InventTableModule, UnitId), formControlStr(EcoResProductCreate, SalesUnitId)],
                               [fieldNum(InventTableModule, TaxItemGroupId), formControlStr(EcoResProductCreate, SalesTaxItemGroupId)]]],
                     [tableStr(EcoResStorageDimensionGroupItem), [[fieldNum(EcoResStorageDimensionGroupItem, StorageDimensionGroup), formControlStr(EcoResProductCreate, StorageDimensionGroup)]]],
                     [tableStr(EcoResTrackingDimensionGroupItem), [[fieldNum(EcoResTrackingDimensionGroupItem, TrackingDimensionGroup), formControlStr(EcoResProductCreate, TrackingDimensionGroup)]]],
                     [tableStr(InventItemGroupItem), [[fieldNum(InventItemGroupItem, ItemGroupId), formControlStr(EcoResProductCreate, ItemGroupId)]]],
                     [tableStr(InventModelGroupItem), [[fieldNum(InventModelGroupItem, ModelGroupId), formControlStr(EcoResProductCreate, ModelGroupId)]]]
                     ];
}

 


 
 

Erweitern von Dynamics AX um neue Icons

Custom IconsIn Dynamics AX kann man bekanntermaßen Menuitems oder Buttons mit Icons optisch aufwerten. Oft werden dafür die bereits in der Form SysImageRessources anzeigbaren sog. Embedded Resources verwendet.

Es ist allerdings nicht möglich, diese Embedded Ressources um eigene Icons/Bilder zu erweitern.

Dafür stellt AX den AOT-Knoten Resources zur Verfügung.


 
 

AX 2012: Erfahrungen zum Thema Import von Modellen

Um ein Modell in eine Instanz von Dynamics AX 2012 zu importieren wird das Kommandozeilen-Tool AXUTIL benötigt. Nach dem Import eines Modelles wird ein Hinweis ausgegeben, der leicht zu überlesen ist aber lt. meinen Erfahrungen ernorm wichtig ist.

Dieser Hinweis lautet:

Because of the changes made to the model stores, it is highly recommended to restart the AOS, run appropriate scripts, and compile and synchronize the application. Not doing that may cause runtime errors and loss of data.

Auf Basis dieses Hinweises und aus der Erfahrung heraus führe ich nach dem Import eines Modelles immer folgende Schritte aus:

  1. Neustart des/der AOS
  2. Synchronisation der Datenbank
  3. Vollständige Kompilierung der Applikation
  4. Vollständige Kompilierung der CIL

Wenn ich nur einen der genannten Schritte weggelassen habe, hatte ich immer wieder mit Phänomenen zu kämpfen.

Einiger solcher Phänomene waren:

  • Fehlermeldung hinsichtlich Ids
  • CIL-Kompilierfehler, daß bei irgendwelchen Methoden (Tabellen- oder Klassenmethoden) die Parameter nicht stimmen
  • CIL-Kompilierfehler wie: System.ArgumentException: Type UNKNOWN was not found in the CIL that was generated from X++
  • Anzeigefehler in Formularen (Spalten ohne Labels)

Leider sind die oben genannten Schritte teilweise recht zeitintensiv, die investierte Zeit war es in der Regel aber wert.


 
 

AX 2012: Display-Methoden im Lookup

Mit Hilfe der Klasse SysTableLookup kann man sich den Lookup von Formularfeldern anpassen. Über die Methode addLookupMethod() können in diese Lookup-Formulare auch Display-Methoden eingebunden werden. Wichtig dabei ist lediglich, daß im Lookup alle Felder angezeigt werden, die von der jeweiligen Display-Methode zur Ermittlung benötigt werden.

Will man beispielsweise das Lookupformular der Artikelnummer um den Produktnamen erweitern, kann man dafür die folgende Methode nutzen. Hierbei ist beispielsweise das Feld Product der InventTable nur enthalten, um die Display-Methode itemName() im Lookup verwenden zu können.

public client static void lookupItemId(FormStringControl _lookupCtrl)
{
    sysTableLookup sysTableLookup;
    query query;
    QueryBuildDataSource qbds_inventTable;

    query = new query();

    qbds_inventTable = query.addDataSource(tableNum(inventTable));

    sysTableLookup = sysTableLookup::newParameters(tableNum(inventTable), _lookupCtrl);
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldNum(inventTable, itemId));
    sysTableLookup.addLookupMethod(tableMethodStr(inventTable, itemName));
    sysTableLookup.addLookupfield(fieldNum(inventTable, NameAlias));
    sysTableLookup.addLookupfield(fieldNum(inventTable, ItemType));
    sysTableLookup.addLookupfield(fieldNum(inventTable, product), false);

    sysTableLookup.performFormLookup();
}

 
 

Voucher/Beleg in Dynamics AX 2009 prüfen

Vor kurzem musste ich in Dynamics AX 2009 eine Belegnummer (Voucher) per Code auf evtl. vorhandene Duplikate prüfen. Die folgende Methode ist dafür sehr hilfreich:

ledgerParameters::checkDuplicate(_voucher, _date);

 
 

Parameter eines Jobs in den Nutzungsdaten speichern

Dieser Job ruft einen Dialog auf, dessen Eingabewerte in den Nutzungsdaten gespeichert und auch von dort ausgelesen werden:

static void SaveSysLastValue(Args _args)
{
    identifiername identifiername = "Use sysLastValue through x++";

    boolean boolVal1 = true;
    boolean boolVal2 = true;
    boolean boolVal3 = true;
    
    dialog dialog;
    dialogField df1;
    dialogField df2;
    dialogField df3;
    ;

    // Read from sysLastValue
    [boolVal1, boolVal2, boolVal3] = xSysLastValue::getValue( curExt(),
                                                              identifiername);
    // Build dialog
    dialog = new dialog(identifiername);
    df1 = dialog.addField(typeId(NoYes), "Param 1");
    df2 = dialog.addField(typeId(NoYes), "Param 2");
    df3 = dialog.addField(typeId(NoYes), "Param 3");

    df1.value(boolVal1);
    df2.value(boolVal2);
    df3.value(boolVal3);

    if( !dialog.run())
    {
        return;
    }

    boolVal1 = df1.value();
    boolVal2 = df2.value();
    boolVal3 = df3.value();

    // Do something
    info(strFmt("%1", boolVal1));
    info(strFmt("%1", boolVal2));
    info(strFmt("%1", boolVal3));

    // Save to sysLastValue
    xSysLastValue::putValue(    [boolVal1, boolVal2, boolVal3],
                                curExt(), 
                                curUserId(), 
                                UtilElementType::Job, 
                                funcname(),
                                identifiername);
}

 
 

AX 2012: Standardfinanzdimension eines Datensatzes setzen

Der nachstehende Code soll zeigen, wie man in Dynamics AX 2012 bei einem Datensatz - im Beispiel handelt es sich um einen Debitor - die Standardfinanzdimensionen per X++ befüllen kann.

Im Beispiel werden mehrere Dimensionen mit Werten befüllt. Bitte beachtet, daß die angeführten Dimensionen möglicherweise in Euren AX-Installationen nicht vorhanden sind.

static void setDefaultDimension4CustTable(Args _args)
{
    CustTable custTable;

    RecId getDefaultDimension(container _c)
    {
        DimensionAttribute dimensionAttribute;
        DimensionAttributeValue dimensionAttributeValue;
        DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
        int i;
        container dimensionCon;
        Name dimensionName;
        str 255 dimensionValue;

        dimensionAttributeValueSetStorage = new  DimensionAttributeValueSetStorage();

        for (i=1;i<=conLen(_c);i++)
        {
            dimensionCon = conPeek(_c, i);

            dimensionName  = conPeek(dimensionCon, 1);
            dimensionValue = conPeek(dimensionCon, 2);

            select dimensionAttribute
            where dimensionAttribute.Name == dimensionName;

            if(dimensionAttribute)
            {
                dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, dimensionValue, false, true);
                dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
            }
        }

        return dimensionAttributeValueSetStorage.save();
    }
    ;

    try
    {
        ttsbegin;
        custTable = CustTable::find('9101', true);
        custTable.DefaultDimension =
            getDefaultDimension([
                                    ["Department",      '100'],
                                    ["Debitor",         '3010'],
                                    ["CustomerGroup",   '80'],
                                    ["ParentProject",   '2000'],
                                    ["CostCenter",      '07']
                                ]);

        custTable.update();
        ttscommit;

        info("Update custtable.defaultDimension sucessfull.");
    }
    catch
    {
        throw error("Error occured");
    }
}

 
 
Seiten « 1 ... 28 29 30 31 32 33 34 ... 52 » 

 

 
 
 
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