Dynamics AX Blog - Dynamics AX 2012 - Seite 7

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

RSS-Feed dieser Version

SysOperation-Framework: Einfaches Klassenkonstrukt mit Dataprovider

Der nachstehende Code stellt ein einfaches Klassenkonstrukt für das SysOperation-Framework dar.

Datacontract

[DataContractAttribute]
public class TutorialSysOperationDataContract
{
    CustAccount custAccount;
}

 

[DataMemberAttribute]
public CustAccount parmCustAccount(CustAccount _custAccount = custAccount)
{
    custAccount = _custAccount;
    return custAccount;
}

 

Service

class TutorialSysOperationService extends SysOperationServiceBase
{
}

Die Methode runService() ist die eigentliche Service-Methode. Über das Attribute SysEntryPointAttribute steuern wir hier, daß keine weiteren Berechtigungsprüfungen notwendig sind.

[SysEntryPointAttribute(false)]
public void runService(TutorialSysOperationDataContract _dataContract)
{
    info("Done");
}

 
 

SysOperation-Framework: Einfaches Klassenkonstrukt

Der nachstehende Code stellt ein ganz einfaches Klassenkonstrukt für das SysOperation-Framework dar. Ganz ohne Dataprovider und UIBuilder.

Service

class TutorialSysOperationService extends SysOperationServiceBase
{
}

Die Methode runService() ist die eigentliche Service-Methode. Über das Attribute SysEntryPointAttribute steuern wir hier, daß keine weiteren Berechtigungsprüfungen notwendig sind.

[SysEntryPointAttribute(false)]
public void runService()
{
    info("Done");
}

 

Controller

class TutorialSysOperationController extends SysOperationServiceController
{
}

In der new() verknüpfen wir den Controller mit der Service-Klasse.

void new()
{
    super();

    this.parmClassName(classStr(TutorialSysOperationService));
    this.parmMethodName(methodStr(TutorialSysOperationService, runService));
}

Die main() ist der klassische Einstiegspunkt, wenn der Controller über ein MenuItem aufgerufen wird.

public static void main(Args _args)
{
    TutorialSysOperationController controller;

    controller = new TutorialSysOperationController();
    controller.parmArgs(_args);

    controller.parmExecutionMode(SysOperationExecutionMode::Synchronous);

    controller.startOperation();
}

 
 

Shared Project per Code erstellen, Objekte hinzufügen und dabei Gruppen je Objekttyp erzeugen

Mit Hilfe des hier gezeigten Jobs kann man per Code ein Shared Project erstellen, Objekte hinzufügen und diese dabei in Gruppen je Objekttyp einordnen lassen.

static void AddNodeToSharedProject(Args _args)
{
    projectNode projectNode;
    TreeNode treeNode;
    ProjectName projectName = "MyProject";
    
    #AOT
    #AOTExport
    
    void addTreeNodeToProjectNode(treeNode _treeNode)
    {
        TmpIdRef tmpIdRef;
            
        tmpIdRef.clear();
        tmpIdRef.Name = SysTreeNode::getPath(_treeNode);
        tmpIdRef.Mode = SysTreeNode::path2ApplObjectType(tmpIdRef.Name);
        tmpIdRef.useMode = UtilFileType::Application;
        tmpIdRef.insert();
        
        SysProjectFilterRunBase::addProjectNodes(tmpIdRef, projectNode);           
    }

    projectNode    = infolog.projectRootNode();
    projectNode    = projectNode.AOTfindChild(#expProjectShared);
    projectNode    = projectNode.AOTfindChild(projectName);
   
    // Create shared project if neccessary
    if( !projectNode)
    {
        projectNode = SysTreeNode::createProject(projectName, ProjectSharedPrivate::ProjShared);        
    }
    
    // Add objects (and create groups)
    treenode = TreeNode::findNode(#TablesPath+#AOTRootPath+tableid2name(tablenum(AccountingDistribution)));
    addTreeNodeToProjectNode(treenode);

    treenode = TreeNode::findNode(#TablesPath+#AOTRootPath+tableid2name(tablenum(VendGroup)));
    addTreeNodeToProjectNode(treenode);
   
    treenode = TreeNode::findNode(#ClassesPath+#AOTRootPath+classStr(PriceDisc));
    addTreeNodeToProjectNode(treenode);

}

Auf die gleiche Art & Weise kann man natürlich auch ein Private Project erstellen, einfach die Vorkommnisse von Shared durch Private ersetzen.

Das erstellte Projekt sieht wie folgt aus:

Sceenshot


 
 

SysOperation-Framework: Asynchrone Verarbeitung

Über das SysOperation-Framework kann man Funktionen auch asynchron ausführen lassen. Dafür wird der ExecutionMode auf SysOperationExecutionMode::Asynchronous gesetzt.

Dies macht beispielsweise dann Sinn, wenn eine zeitintensive Aktion gestartet werden soll, der Benutzer aber nicht zwinged auf das Ende dieser Aktion warten muss und dafür bereits an anderen Themen weiterarbeiten können soll.

Allerdings funktioniert eine solche asynchrone Verarbeitung nur, wenn folgende Kriterien erfüllt sind:

  • Die Funktion wurde im AOT als Service eingebunden
  • Dieses Service wurde zur Servicegruppe AxClient hinzugefügt und bereitgestellt
  • Der Benutzer hat die Option Geschäftliche Arbeitsgänge in CIL ausführen aktiviert

 
 

CreateNavigationPropertyMethods

Schon mal im Code den Aufruf der Methode product() einer InventTable-Instanz gesehen und sich dabei gewundert, woher diese Methode kommt und warum man sich diese nicht ansehen kann?

inventTable.product()

Verantwortlich für diese Methode ist die Eigenschaft CreateNavigationPropertyMethods einer (Foreign key-)Relation.

Über die Eigenschaft NavigationPropertyMethodNameOverride der Relation kann man Einfluss auf den Namen dieser Methode nehmen.

Screenshot AOT


 
 

Zwei Maps zu einer zusammenführen

Vor kurzem wollte ich zwei Maps zu einer zusammenführen, habe dafür aber keine geeignete Funktion gefunden, deshalb habe ich mir die folgende selbst geschrieben.

private Map mergeMaps(Map _map1, Map _map2)
{
    Map retMap;
    MapEnumerator mapEnum;
    // Initate first map from second map if empty
    if( !_map1)
    {
        _map1 = new Map(_map2.keyType(), _map2.valueType());
    }
    // Check compatibility
    if(_map1 && _map2)
    {
        if(_map1.keyType() != _map2.keyType() || _map1.valueType() != _map2.valueType())
        {
            throw error(Error::wrongUseOfFunction(funcName()));
        }
    }

    retMap = _map1;
    mapEnum = _map2.getEnumerator();
    while(mapEnum.moveNext())
    {
        if( !retMap.exists(mapEnum.currentKey()))
        {
            retMap.insert(mapEnum.currentKey(), mapEnum.currentValue());
        }
    }
    return retMap;
}

 
 

Eigenschaft PreviewPartRef einer Tabelle nutzen

Preview partSchon einmal darüber gewundert, wie Dynamics AX beispielsweise bei Arbeitskräften/Mitarbeitern dieses Fenster aufbaut, wenn man mit der Maus über den Namen eines Mitarbeiters fährt?

Verantwortlich dafür ist die Eigenschaft PreviewPartRef einer Tabelle, mit der man sich rasch solche Vorschauansichten aufbauen kann.

Folgende Schritte sind dafür notwendig:

  • Erstellen einer Form
  • Erstellen eines Formparts, der auf die zuvor erstelle Form zeigt
  • Erstellen eines (Display-)MenuItems, daß auf diese Formpart zeigt
  • Eintragen des MenuItems in der Eigenschaft PreviewPartRef der Tabelle

Ich habe mir beispielsweise für die Tabelle CustGroup ein einfaches Form erstellt und wie oben beschrieben eingebunden.

Enhanced preview part

Ohne meine Anpassung sieht die Vorschau üblicherweise wie folgt aus:

Original previw part
 


 
 
Seiten « 1 ... 4 5 6 7 8 9 10 ... 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