Willkommen auf schweda.net | EN | DE
 
 
 
 
 

Microsoft Dynamics AX 2012 Management ShellWenn man von Microsoft einen Hotfix oder von einem Microsoft-Partner ein Modul bekommt, bekommt man oft nur ein oder mehrere AXMODEL-Files. Und da ist der Wunsch oft gross, vorab zu wissen, welche Objekte durch das Einspielen dieses Files betroffen ist.

Solche Informationen kann man sich mit der Microsoft Dynamics AX 2012 Management Shell auslesen:

Get-AXModel -File 'c:\temp\dynamicsax2012r3_cl4555332.axmodel' -Details

Das sieht wie folgt aus:

Manifest                   Summary                    Elements
--------                   -------                    --------
Microsoft.Dynamics.AX.F... {\Classes: 3}              {\Classes\WHSLoadLineI...

Wer mal in die Verlegenheit kommt, eine Kostenstelle per Code anlegen zu müssen, dem kann vielleicht dieser Job als Inspiration dienen:

static void createCostCenter(Args _args)
{
    str 30 _costCenter = "0815"; // Cost center id to create

    OMOperatingUnit omOperatingUnit;
    NumberSeqFormHandler numberSeqFormHandler;
    NumberSeq numberSeq;

    if (_costCenter)
    {
        if (!OMOperatingUnit::findName(
            _costCenter, OMOperatingUnitType::OMCostCenter))
        {
            ttsbegin;
            numberSeq = NumberSeq::newGetNumFromId(
                OMOperatingUnit::getNumberSequenceReference().NumberSequenceId);

            omOperatingUnit.clear();

            omOperatingUnit.initValue();
            omOperatingUnit.omOperatingUnitNumber = numberSeq.num();
            omOperatingUnit.Name = _costCenter;    // Id used as name
            omOperatingUnit.NameAlias = _costCenter;
            omOperatingUnit.omOperatingUnitType = OMOperatingUnitType::OMCostCenter;
            omOperatingUnit.LanguageId = CompanyInfo::languageId();

            if (omOperatingUnit.validateWrite())
            {
                omOperatingUnit.insert();
            }
            ttscommit;
        }
    }
}

Im folgenden Szenario sollen an ein SysOperation-Konstrukt alle Datensätze einer temporären Tabelle übergeben werden.

Dafür brauchen wir:

  • Im DataContract eine Zugriffsmethode (parm-Methode), die einen Container aufnimmt
  • Im Controller eine Logik, welche die Datensätze einer aufrufenden Datenquelle iteriert und in einen Container packt, und diesen über die obige Methode an das Service übergibt
  • In der Service-Klasse Logik, welche den übergebenen Container auspackt und verarbeitet

 

Controller

class TutorialSysOperationController extends SysOperationServiceController
{
}

Eine häufige Anforderung in Projekten ist es, daß Auftrags- oder Bestellpositionen durch irgendeine Programmlogik erstellt werden sollen, beispielsweise durch Datenimporte o.ä.

Zuletzt hatte ich erstmalig die Anforderung, daß per Code generierten Auftragspositionen anschließend aber manuell bearbeitet werden sollen, wobei die Preisinformationen wie Verkaufspreis und -rabatt aber unbedingt erhalten bleiben sollten.

Bearbeitet man in Dynamics AX aber bestimmte Felder einer Position, löst dies aber u.U. eine Preisfindung aus. Diese galt es also zu verhindern bzw. durch eine Abfrage den Benutzer zumindest davor hinzuweisen. Glücklicherweise gibt es eine solche Abfrage bereits, die über die folgenden Felder gesteuert wird:

Feld Beschreibung
ManualEntryChangepolicy Referenz auf Tabelle PriceDiscChangePolicy
SystemEntryChangePolicy Referenz auf Tabelle PriceDiscChangePolicy
SystemEntrySource BaseEnum

Die nachstehenden Snippets sollen zeigen, wie man aus einem String mit fixen Trennzeichen die einzelnen Elemente extrahieren kann.

Variante 1: Den String mithilfe der Funktion str2con() in einen Container umwandeln

static void Job1(Args _args)
{
    str paramAsStr = "Wert1@@Wert2@@Wert3";
    container paramAsCon;
    int i;

    paramAsCon = str2con(paramAsStr, "@@");
    
    for (i=1;i<=conLen(paramAsCon);i++)
    {
        info(conPeek(paramAsCon, i));    
    }
}

Variante 2: Den String unter Verwendung der Funktion strSplit() in eine List umzuwandeln

static void Job1(Args _args)
{
    str paramAsStr = "Value 1|Value 2|Value 3";
    List paramAsList;
    ListEnumerator le;

    paramAsList = strSplit(paramAsStr, "|");
    
    le = paramAsList.getEnumerator();
    while(le.moveNext())
    {
        info(le.current());    
    }
}

 


Das folgende Code-Schnipsel zeigt, wie man per Code Wellen und Arbeiten für eine oder mehrere Lieferungen erzeugen kann. Dies wird normalerweise auch aufgerufen, wenn man die Funktion "Für Lagerort freigeben" ausführt.

WHSWaveTable::buildWaveFromShipments(['USMF-000006','USMF-000007']);

Vor kurzem habe ich mein lokal installiertes AX 2012 R3 CU8 auf einen aktuelleren Programmstand bringen wollen. Dazu wird folgendes benötigt:

  • Zugang zu den Lifecycle Services (LCS)
  • Zumindest ein paar Stunden Zeit

Nachstehend findet Ihr einige Screenshots sowie Anmerkungen die ich während der Aktualisierung gemacht habe.

Anmeldung in LCS und Downloaden des Installers

Screenshot


Seiten 1 2 3 4 ... 50 » 

 

 
Kategorien / Themen
Feeds
RSS RSS-Feed
 
 
Beiträge des aktuellen Monats
Dezember 2018
MoDiMiDoFrSaSo
 12
3456789
10111213141516
17181920212223
24252627282930
31 
 
 
© 2006-2018 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