Dynamics AX Blog - Dynamics AX 2012 - Seite 31

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

RSS-Feed dieser Version

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

 
 

Zertifizierungsprüfung Microsoft Dynamics AX 2012 Development Introduction

10.06.2012In eigener Sache

Vor kurzem habe ich meine erste Zertifizierungsprüfung zu Dynamics AX 2012 abgelegt, es handelte sich dabei um die Prüfung MB6-869 Microsoft Dynamics AX 2012 Development Introduction.

 

MB6-869


 
 

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

 
 

AX 2012: Standardfinanzdimension eines Datensatzes auslesen und Inhalt prüfen

Der folgende Job demonstriert, wie man den Inhalt der Standardfinanzdimensionen eines Datensatzes - im Beispiel jene eines Debitoren - per X++ prüft.

Im Beispiel werden die Dimensionen namens CustomerGroup, Debitor und NonExistingDimension als zu prüfen angegeben. Bitte beachtet, daß nicht alle Dimensionen in jeder AX-Instanz vorhanden sind. Vor allem letztere dient lediglich zur Demonstration, wie sich der Code verhält, wenn eine Dimensionen ausgelesen werden soll, die es gar nicht gibt.

static void validateDefaultDimensionValues(Args _args)
{
    CustTable custTable = CustTable::find('9101', true);
    container validateCon;
    container helpCon;
    int ii;

    container getDimensionValue(RecId _dimensionAttributeValueSetRecId, container _c)
    {
        DimensionAttributeValueSetItem dimensionAttributeValueSetItem;
        DimensionAttributeValue dimensionAttributeValue;
        DimensionAttribute dimensionAttribute;
        Common dimensionValueEntity;
        int i;
        Name dimensionName;
        str 255 dimensionValue;
        container retCon;

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

            if( !DimensionAttribute::findByName(dimensionName))
                error(strFmt("Dimension %1 not found", dimensionName));

            while select dimensionAttributeValueSetItem
                where   dimensionAttributeValueSetItem.DimensionAttributeValueSet   == _dimensionAttributeValueSetRecId
            {
                // Find the dimension 'value' (DimensionAttributeValue) that the set item points to.
                dimensionAttributeValue = DimensionAttributeValue::find(dimensionAttributeValueSetItem.DimensionAttributeValue);

                // Find the underlying attribute.
                dimensionAttribute = DimensionAttribute::find(dimensionAttributeValue.DimensionAttribute);

                // Use the helper class to obtain a reference to the underlying entity (can be anything)
                dimensionValueEntity = DimensionDefaultingControllerBase::findBackingEntityInstance(
                    curext(),
                    dimensionAttribute,
                    dimensionAttributeValue.EntityInstance);

                if(dimensionAttribute.Name == dimensionName)
                {
                    retCon = conIns(retCon, conLen(retCon)+1, [dimensionAttribute.Name, dimensionAttributeValue.getValue()]);
                }
            }
        }

        return retCon;
    }
    ;

    validateCon = getDimensionValue(custTable.DefaultDimension, ["CustomerGroup", "Debitor", "NonExistingDimension"]);
    for (ii=1;ii<=conLen(validateCon);ii++)
    {
        helpCon = conPeek(validateCon, ii);

        if(conPeek(helpCon, 1) == "CustomerGroup" && conPeek(helpCon, 2) != custTable.CustGroup)
        {
            warning(strFmt("Dimension %1 should be %2.", conPeek(helpCon, 1), conPeek(helpCon, 2)));
        }
        if(conPeek(helpCon, 1) == "Debitor" && conPeek(helpCon, 2) != custTable.AccountNum)
        {
            warning(strFmt("Dimension %1 should be %2.", conPeek(helpCon, 1), conPeek(helpCon, 2)));
        }
        if(conPeek(helpCon, 1) == "NonExistingDimension" && conPeek(helpCon, 2) != custTable.AccountNum)
        {
            warning(strFmt("Dimension %1 should be %2.", conPeek(helpCon, 1), conPeek(helpCon, 2)));
        }
    }
}

 
 

AX 2012: Benutzerdefinierte Finanzdimension anlegen

MIt Hilfe des folgenden Jobs kann in Dynamics AX 2012 ein neuer Eintrag für eine benutzerdefinierte Finanzdimension erstellt werden. Im Beispiel ist der Name der Dimension ParentProject und der einzufügende Wert ist 4600.

static void createCustomDimensionValue(Args _args)
{
    DimensionValueService dimensionValueService;
    DimensionValueContract dimensionValueContract;

    dimensionValueService = new DimensionValueService();
    dimensionValueContract = new DimensionValueContract();
    dimensionValueContract.parmDescription('Project 4500');
    dimensionValueContract.parmValue('4600');
    dimensionValueContract.parmDimensionAttribute('ParentProject');
    if(dimensionValueService.createDimensionValue(dimensionValueContract))
    {
        info(strFmt("Dimension value %1 for dimension %2 created", dimensionValueContract.parmValue(), dimensionValueContract.parmDimensionAttribute()));
    }
}

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

 

 
 
 
Beiträge des aktuellen Monats
April 2024
MoDiMiDoFrSaSo
1234567
891011121314
15161718192021
22232425262728
2930 
 
© 2006-2024 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