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

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

Fehler beim Aufrufen des ActiveX-Controls NETRONIC VARCHART XGantt in Dynamics AX

Ich habe mich schon seit längerem über zahlreiche Fehlermeldungen gewundert, die immer dann aufgetreten sind, wenn ich ein Formular geöffnet habe wo das ActiveX-Control NETRONIC VARCHART XGantt eingebettet war, z.B. das Formular Simultanplanungslauf.

Folgende Fehlermeldungen hatte ich da am Bildschirm:

ActXBaseControl::Open failure

D\Work\Projects\Ganft
4.O\NewGanttChart\NewGanttC ha rt_ActiveXsettings\GanttReqTransExplosioniFD

Loading the interface with identifier GanttReqTransExplosion failed

This is an unlicensed version of NETRONIC VARCHART XGantt. 1 Please contact NETRONIC for a Iicensed version.

Eigentlich ist die Lösung ganz einfach! Ich arbeite natürlich auf einer Entwickler-Maschine, wo unterschiedlichste Versionen von Dynamcs AX/Axapta parallel installiert sind. Und die zuerst installierte und somit älteste Version bestimmt die aktuell verwendete Version der ActiveX-Komponente.

Also ist folgendes zu tun: Deinstallieren der "veralteten" Version und installieren bzw. registrieren einer neueren Version z.B. über die Kommandozeile.

REM Uninstall old version
regsvr32.exe /u "C:\Program Files\Microsoft Business Solutions\Axapta\Client\Bin\vcgantt.ocx"

REM Install new version
regsvr32.exe "C:\Program Files\Microsoft Dynamics AX\Common\vcgantt.ocx"

 


 
 

Funktion "Gehe zur Haupttabelle" abfragen

Um in einem Formular zu ermitteln, ob dieses über die "Gehe zur Haupttabelle"-Funktion aufgerufen wurde, kann man sich des folgenden Code bedienen:

if( element.args().record() ||
    element.args().refField() ||
    element.args().lookupValue())
{
    // ...do something ...
}

 
 

Als MenuItem eingebundene Jobs ermitteln

Im Zuge eines Upgrades auf die aktuelle Version von Dynamics AX benötigte ich vor kurzem einen Job, der mir alle Jobs auflistet, die über ein MenuItem möglicherweise laufend in Verwendung sind:

static void ListJobsUsedAsMenuItem(Args _args)
{
    treeNode        treeNode;
    treeNode        treeNodeMenuItems;
    menuFunction    menuFunction;
    MenuItemType    MenuItemType;

    #AOT
    ;

    treeNodeMenuItems = TreeNode::findNode(#MenuItemsPath);
    treeNodeMenuItems = treeNodeMenuItems.AOTfirstChild();

    while(treeNodeMenuItems)
    {
        setPrefix("Jobs used in MenuItems");

        treeNode = treeNodeMenuItems.AOTfirstChild();

        while(treeNode)
        {
            menuFunction = new menuFunction(treeNode.treeNodeName(), str2enum(MenuItemType, treeNodeMenuItems.treeNodeName()));

            if(menuFunction.objectType() == utilelementType::Job)
            {
                setPrefix(strFmt("%1: %2", treeNodeMenuItems.treeNodeName(), treeNode.treeNodeName()));
                info(menuFunction.object());
            }

            treeNode = treeNode.AOTnextSibling();
        }

        treeNodeMenuItems = treeNodeMenuItems.AOTnextSibling();
    }
}

Der Job wurde in Dynamics AX 2009 entwickelt. 


 
 

Label in einer bestimmten Sprache auslesen

Um in X++ ein Label in einer ganz bestimmten Sprache auszugeben, nutzt man am besten die Methode labelId2String2 der SysLabel-Klasse:

info(any2str(SysLabel::labelId2String2(literalStr("@SYS14204"),"de-at")));

 
 

Auslesen von HTML-Quelltext in Dynamics AX 2009

Vor kurzem wurde ich gefragt, wie man denn in Dynamics AX 2009 den HTML-Quelltext einer Webseite ausliest. Bitteschön...

static void GetHTMLSourceCode(Args _args)
{
    CLRObject                   castObject      = null;
    System.Net.HttpWebRequest   request         = null;
    System.Net.HttpWebResponse  response        = null;
    System.IO.StreamReader      streamReader    = null;
    System.Text.Encoding        encoding        = null;

    url                         url = "http://www.yourdomain.com/yoursite.html";
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    castObject = System.Net.WebRequest::Create(url);
    request = castObject;
    response = request.GetResponse();
    encoding = System.Text.Encoding::get_UTF8();
    streamReader = new System.IO.StreamReader(response.GetResponseStream(), encoding);
    info(streamReader.ReadToEnd());
}

 
 

selectMultiple und selectSingle

Beim Stöbern in den vorgefertigten Methoden in der global-Klasse bin ich auf zwei Funktionen gestossen, die ich schon früher das eine oder andere Mal gebraucht hätte: selectMultiple und selectSingle.

Was können diese Funktionen? Man übergibt Ihnen einen Container mit möglichen Werten und als Rückgabewert erhält man ebenfalls einen Container mit den vom Benutzer ausgewählten Werten. Dazwischen wird ein Dialog generiert, der nicht benutzerfreundlicher sein könnte, wie ich finde.


 
 

Shared Project mit X++ erstellen II

In einem früheren Beitrag habe ich ja hier schon einen Job veröffentlicht, mit dessen Hilfe man sich per X++ ein Shared Project erstellen kann. Basierend auf der neu entdeckten Funktion selectMultiple habe ich diesen nun etwas erweitert, der Benutzer hat mit dessen Hilfe nun die Möglichkeit, ein Shared Project zu erstellen und dabei für die aktuell benötigten Datentypen eigene Gruppenknoten innerhalb dieses Projektes zu erstellen.

static void CreateSharedProjectUsingSelectMultiple(Args _args)
{
    DictEnum            DictEnum;
    container           conValues;
    container           conSelectedValues;
    container           conSelectMultiple;
    int                 i;
    projectNode         projectNode;
    projectGroupNode    projectGroupNode;
    projectNode         myProjectNode;
    treeNodeName        nameOfProject;
    groupNodeType       groupNodeType;
    treeNodeName        groupNodeName;
    dialog              dialog;
    dialogField         dfProjectName;
    #AOTExport
    ;
    // Create dialog
    dialog = new dialog();
    dfProjectName = dialog.addFieldValue(typeId(treeNodeName), "NameOfproject", "Name of project");
    if( !dialog.run())
    {
        return;
    }
    nameOfProject = dfProjectName.value() ? dfProjectName.value() : "Unknown";
    
    // Add available values to container
    DictEnum = new DictEnum(enumName2Id(identifierStr(GroupNodeType)));
    for(i=1;i<DictEnum.values();i++)
    {
        conValues = conIns(conValues, conLen(conValues)+1, [DictEnum.index2Label(i), i, false]);
    }
   
    // Call selectMultiple
    conSelectMultiple = selectMultiple("Please select", "Please select the needed project-groups", conValues);
    conSelectedValues = conPeek(conSelectMultiple, 2);
    if( !conPeek(conSelectMultiple, 1))
    {
        return;
    }

    // Create shared project
    projectNode    = infolog.projectRootNode();
    projectNode    = projectNode.AOTfindChild(#expProjectShared);
    myProjectNode  = projectNode.AOTfindChild(nameOfProject);

    if( !myProjectNode)
    {
        myProjectNode = projectNode.AOTadd(nameOfProject);
        myProjectNode.AOTsave();
    }

    myProjectNode     = myProjectNode.getRunNode();

    if(conPeek(conSelectMultiple, 1))
    {
        for (i=1; i<=conLen(conSelectedValues); i++)
        {
           
            groupNodeName = DictEnum.index2Label(conPeek(conSelectedValues, i));
            projectGroupNode = myProjectNode.AOTfindChild(groupNodeName);
            if( !projectGroupNode)
            {
                myProjectNode.AOTadd(groupNodeName);
                projectGroupNode = myProjectNode.AOTfindChild(groupNodeName);
                projectGroupNode.projectGroupType(DictEnum.name2Value(groupNodeName));
                myProjectNode.AOTsave();
            }
        }
    }

    projectGroupNode.AOTsave();

    myProjectNode.AOTsave();
    myProjectNode.AOTrefresh();
    myProjectNode.AOTrun();
}

Obiger Code funktioniert meines Wissens nach in Dynamics AX 4.0 und Dynamics AX 2009.

 

 


 
 
Seiten « 1 ... 35 36 37 38 39 40 41 ... 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