Dynamics AX Blog - Dynamics AX 2009 - Seite 10

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

RSS-Feed dieser Version

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.

 

 


 
 

Palette verlagern per X++

Folgend etwas X++ Code, mit dessen Hilfe man eine Palette verlagern kann, also genau das, was die Schaltfläche "Palette verlagern" in Formular Palette tut.

WMSPalletMove wmsPalletMove = new wmsPalletMove();
wmsPalletMove.parmWMSPalletId('00000022_117');
wmsPalletMove.parmToInventLocationId('300');
wmsPalletMove.parmToLocationId('01');
if(wmsPalletMove.validate())
{
   wmsPalletMove.run();
}

 


 
 

Liste aller Felder einer Tabelle ausgeben

Unlängst benötigte ich eine Liste aller Felder einer Tabelle mit deren Datentypen. Dafür habe ich mir den folgenden Job - im Beispiel für die Tabelle custGroup - geschrieben:

static void listAllFields4Table(Args _args)
{
    dictTable   dictTable = new dictTable(tableNum(custGroup));
    int         currFieldId = 0;
    counter     c = 0;
    dictField   dictField;
    counter     a = 0;
    common      common;
    str         enumName;
    ;

    common = DictTable.makeRecord();
    setPrefix(strFmt("Fields of table %1",  tableId2name(common.TableId)));

    currFieldId = 0;
    c = 0; 
    do
    {
        currFieldId = dictTable.fieldNext(currFieldId); 
        if(currFieldId != 0)
        {
            dictField = new dictField(common.TableId, currFieldId); 
            if(dictField.arraySize() == 1)
            {
                info(   strFmt("%1: %2 [%3%4]",
                        dictTable.fieldName(currFieldId),
                        dictField.label(),
                        dictField.baseType(),
                        dictField.enumId() ? strFmt(" %1", enumId2Name(dictField.enumId())) : "")
                     );
            }
            else if(dictField.arraySize() > 1)
            {
                for(a=1;a<=dictField.arraySize();a++)
                {
                    info(   strFmt("%1 [%2]: %3 [%4]",
                            dictTable.fieldName(currFieldId),
                            a,
                            dictField.label(),
                            dictField.baseType())
                         );
                }
            }
        }
        c++;
    }
    while (c < dictTable.fieldCnt());
}

 
 

Prüfungen durchführen beim/vor dem Schliessen eines Formulares

Möchte/muß man beim bzw. vor dem Schliessen eines Formulares etwas tun, z.B. Prüfungen durchführen, so stellt Dynamics AX dafür einige Methoden zur Verfügung, die in einer bestimmten Reihenfolge abgearbeitet werden. Da ich selbst mir diese Reihenfolge nicht merke, habe ich sie hier kurz notiert.

Beim Schliessen eines Formulares über einen OK-Commandbutton:

  • closeOK
  • canClose
  • close

Beim Schliessen eines Formulares über einen CANCEL-Commandbutton:

  • closeCancel
  • canClose
  • close

Beim Schliessen eines Formulares über "das rote X" bzw. der ESC-Taste:

  • canClose
  • close

 


 
 

Feldwert eines aufrufenden Objektes ermitteln

In vielen Objekten sieht man Kontrukte wie das folgende, die dazu dienen, einen Wert aus dem aufrufenden Datensatz zu ermitteln.

if (element.args() && element.args().record())
{
    switch (element.args().dataset())
    {
        case tablenum(PurchLine)    :
            itemIdCaller = element.args().record().(fieldNum(purchLine, ItemId));
            break;
        case tablenum(SalesLine)    :
            itemIdCaller = element.args().record().(fieldNum(SalesLine, ItemId));
            break;
        case tablenum(SalesQuotationLine)    :
            itemIdCaller = element.args().record().(fieldNum(SalesQuotationLine, ItemId));
            break;
    }
}

Einfacher geht’s mit unten dem stehenden Stückchen Code! Der grosse Vorteil von diesem ist, daß wann immer man das Objekt von einem Datensatz aus aufruft, der ein Feld namens itemId enthält, die Logik abgearbeitet wird ohne daß man jede Tabelle einzeln im switch-Statement berücksichtigen muss.


 
 

Ansprechen der seriellen Schnittstelle unter Dynamics AX 2009

Mithilfe der Klasse SerialPorts aus dem .net-Framework kann man unter Dynamics AX 2009 recht bequem auf die serielle Schnittstelle zugreifen. Nachstehend dazu ein kurzes Code-Beispiel, wie man ein Display, wie man es z.B. von Kassensystemen kennt, ansteuern kann.

static void sendText2SerialPort(Args _args)
{
    System.IO.Ports.SerialPort SerialPort;
    str deleteDisplay = num2char(hex2int("0C"));
    ;
    SerialPort = new System.IO.Ports.SerialPort('com4');
    SerialPort.Open();
    if(SerialPort.get_IsOpen())
    {
        SerialPort.Write(deleteDisplay);
        SerialPort.Write('Welcome World!');
        SerialPort.Close();
    }
}

 


 
 
Seiten « 1 ... 7 8 9 10 11 12 13 ... 20 » 

 

 
 
 
Beiträge des aktuellen Monats
Mai 2024
MoDiMiDoFrSaSo
 12345
6789101112
13141516171819
20212223242526
2728293031 
 
© 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