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

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

Fertigmeldung eines Produktionsauftrags prüfen/buchen

Der nachstehende Job prüft (bzw. bucht) eine Fertigmeldung eines Produktionsauftrages. Über den Enum JournalCheckPostType kann festgelegt werden, ob geprüft oder gebucht werden soll.

static void checkPostProdJournalTablePostProd(Args _args)
{
    JournalCheckPost journalCheckPost;
    ProdJournalTable prodJournalTable = ProdJournalTable::find("00943", true);

    // Check/Post journal
    journalCheckPost = ProdJournalCheckPostProd::newJournalCheckPost(false,
                                                                    true,
                                                                    JournalCheckPostType::Check,
                                                                    prodJournalTable.TableId,
                                                                    prodJournalTable.JournalId);
    journalCheckPost.run();
}

 
 

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

 
 

Erstellen einer Lieferadresse per Code

Die nachstehenden Zeilen Code zeigen ein Beispiel, wie man per X++ eine (nicht primäre) Adresse für eine vorhandene Partei im Globalen Adressbuch erstellen kann.

Dabei wird gleichzeitig über den Base Enum LogisticsLocationRoleType der Typ der Adresse als Lieferadresse angegeben, natürlich ist es auch möglich, der Adresse einen anderen Typ zuzuweisen.

static void createPartyDeliveryAddressNonPrimary(Args _args)
{
    DirPartyTable dirPartyTable = DirPartyTable::findByNum("?100000??");
    DirParty dirParty;
    DirPartyPostalAddressView dirPartyPostalAddressView;

    // Create instance of dirParty
    dirParty = DirParty::constructFromCommon(dirPartyTable, DirUtility::getCurrentDateTime(), DirPartyType::Organization);

    // Create primary address
    dirPartyPostalAddressView.LocationName      = "Delivery";
    dirPartyPostalAddressView.City              = "Vienna";
    dirPartyPostalAddressView.Street            = "Kärtnerring";
    dirPartyPostalAddressView.StreetNumber      = "21";
    dirPartyPostalAddressView.CountryRegionId   = "AUT";
    dirPartyPostalAddressView.IsPrimary         = NoYes::No;

    dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView,
        [LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Delivery).RecId]);
}

 
 

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


 
 

AX 2012: Erstellen einer DefaultDimension/LedgerDimension

Nachstehend ein Code-Beispiel, wie man eine RecId vom Typ DefaultDimension für mehrere Dimensionen generieren kann.
Anschließend wird diese DefaultDimension mit einem Hauptkonto zu einer RecId vom Typ LedgerDimension kombiniert.

static void buildDefaultAndLedgerDimension(Args _args)
{
    DimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
    DimensionAttribute dimensionAttribute;
    DimensionAttributeValue dimensionAttributeValue;
    DimensionDefault dimensionDefault;
    LedgerDimensionAccount ledgerDimensionAccount;

    dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage();

    // BusinessUnit
    dimensionAttribute = DimensionAttribute::findByName('BusinessUnit');
    if(dimensionAttribute)
    {
        dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '069', false, true);
        dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
    }

    // CostCenter
    dimensionAttribute = DimensionAttribute::findByName('CostCenter');
    if(dimensionAttribute)
    {
        dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '010', false, true);
        dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
    }

    // Department
    dimensionAttribute = DimensionAttribute::findByName('Department');
    if(dimensionAttribute)
    {
        dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, '024', false, true);
        dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
    }
 
    dimensionDefault = dimensionAttributeValueSetStorage.save();

    // Merge main account and source dimension values and return RecId which can be used as ledgerDimension
    ledgerDimensionAccount = DimensionDefaultingService::serviceCreateLedgerDimension(DimensionStorage::getDefaultAccountForMainAccountNum("110110"),
                                                                                      dimensionDefault);

    info(strFmt("Default dimension recId: %1", dimensionDefault));
    info(strFmt("DefaultDimension (Source RecId): %1 LedgerDimension (Merged RecId): %2", dimensionDefault, ledgerDimensionAccount));
}

Notiz: Aufmerksamen Lesern ist sicherlich nicht entgangen, daß ich beides bereits in anderen Beiträgen geposted habe. Dieser Beitrag ist lediglich eine Kombination davon.


 
 

Kommissionierlisten-Kopf eines Produktionsauftrages erstellen

Der folgende Job erstellt eine "Kopfdatensatz" für eine Kommissionierliste eines Produktionsauftrages.

static void createProdJournalTable_PickingList_III(Args _args)
{
    ProdJournalCreate prodJournalCreate;

    prodJournalCreate = new ProdJournalCreate();

    prodJournalCreate.parmProdId('P000188');
    prodJournalCreate.parmJournalNameId(
        ProdJournalName::standardJournalName(
            ProdJournalType::Picklist, 
            prodJournalCreate.parmProdId()));
    prodJournalCreate.initProdJournalTableData(ProdJournalType::Picklist);

    prodJournalCreate.usedProdJournalTable().insert();

    prodJournalCreate.run();
}

 
 

Bestellung per Code buchen

Mit Hilfe der folgenden Zeilen möchte ich zeigen, wie man eine Bestellung per Code buchen kann.

Wer etwas mehr Kontrolle über die zu buchenden Daten haben möchte, sollte sich die verfügbaren Parameter der purchFormLetter.update() näher ansehen.

static void postPurchaseOrder(Args _args)
{
    PurchTable purchTable = PurchTable::find("000025");
    PurchFormLetter purchFormLetter;

    purchFormLetter = PurchFormLetter::construct(DocumentStatus::PurchaseOrder);
    purchFormLetter.update(purchTable, "", systemDateGet(), PurchUpdate::All);
}

 
 
Seiten « 1 ... 13 14 15 16 17 18 19 ... 52 » 

 

 
 
 
Beiträge des aktuellen Monats
Mai 2025
MoDiMiDoFrSaSo
 1234
567891011
12131415161718
19202122232425
262728293031 
 
© 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