Eigenes Lookup-Formular mit Hilfe der Klasse SysTableLookup gestalten

Ab und an kommt man als Entwickler in die Verlegenheit, ein Formularfeld, welches weder an eine Datenquelle (DataSource) oder einen Extended Datatyp gebunden ist, um ein Lookup-Formular zu erweitern. Dafür stellt Dynamics AX die Klasse SysTableLookup zur Seite, die man in die lookup-Methode des jeweiligen Feldes einbinden kann.

Hier ein einfaches Beispiel unter Verwendung eines Queries, bei dem prinzipiell ein Lookup auf die Kundengruppen möglich sein soll, aber nur bestimmte angezeigt werden sollen. Diese Einschränkung kann über sysQuery::findOrCreateRange abgebildet werden.

Das Beispiel funktioniert übrigens sowohl in Dynamics AX 2009 als auch AX 2012.

public void lookup()
{
    sysTableLookup sysTableLookup;
    query query;
   
    super();

    query = new query();
    query.addDataSource(tableNum(custGroup));
   
    sysQuery::findOrCreateRange(query.dataSourceTable(tableNum(custGroup)), fieldNum(custGroup, name)).value("*inter*");
   
    sysTableLookup = sysTableLookup::newParameters(tableNum(custGroup), this);
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldNum(custGroup, custGroup));
    sysTableLookup.addLookupfield(fieldNum(custGroup, name));
    sysTableLookup.performFormLookup();
}

Im nächsten Beispiel sollen nur Kundengruppen angezeigt werden, wo es auch Kunden/Debitoren dazu gibt, dies wurde über einen ExistsJoin mit der Tabelle CustTable realisiert.

Weiteres werden die im Lookup angezeigten Spalten die Labels über die Methode setLabel geändert und es wird nicht - wie es standardmässig der Fall ist - die erste Spalte als zu retournierender Wert angegeben sondern die Spalte mit dem Namen der Kundengruppe (dafür wird der zweite, boolsche Parameter der Methode addLookupfield verwendet):

public void lookup()
{
    sysTableLookup sysTableLookup;
    query query;
    queryBuildDataSource qbds_custGroup;
    queryBuildDataSource qbds_custTable;

    super();

    query = new query();
    qbds_custGroup = query.addDataSource(tableNum(custGroup));
   
    qbds_custTable = qbds_custGroup.addDataSource(tableNum(custTable));
    qbds_custTable.joinMode(joinMode::ExistsJoin);
    qbds_custTable.relations(true);
    sysTableLookup = sysTableLookup::newParameters(tableNum(CustGroup), this);
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldNum(custGroup, custGroup));
    sysTableLookup.setLabel("Custgroup ID");
    sysTableLookup.addLookupfield(fieldNum(custGroup, name), true);
    sysTableLookup.setLabel("Name of custgroup");
    sysTableLookup.performFormLookup();
}

Auch dieses Beispiel funktioniert sowohl in Dynamics AX 2009 als auch AX 2012.

Zusätzlich zu den oben beschriebenen Möglichkeiten können auch Display-Methoden von Tabellen eingebunden werden. Wichtig dabei ist lediglich, daß sämtliche Felder, die von der anzuzeigenden Display-Methode benötigt werden, auch im Lookup angezeigt werden. Im Beispiel wird die Methode bankAccountNum eingebunden, diese benötigt die Werte aus den Feldern accountNum und bankAccount der Tabelle custTable:

public void lookup()
{
    sysTableLookup sysTableLookup;

    super();

    sysTableLookup = sysTableLookup::newParameters(tableNum(custTable), this, true);
    sysTableLookup.addLookupfield(fieldNum(custTable, accountNum));
    sysTableLookup.addLookupMethod(tableMethodStr(custTable, name));
    sysTableLookup.addLookupfield(fieldNum(custTable, bankaccount));
    sysTableLookup.addLookupMethod(tableMethodStr(custTable, bankAccountNum));
    sysTableLookup.performFormLookup();
}

Im folgenden Beispiel gehe ich noch einen Schritt weiter und befülle zuerst eine temporäre Tabelle, aus der anschließend die Daten angezeigt werden. Ganz konkret werden sämtliche Kundengruppen inkl. einer Anzahl der zugewiesenen Kunden.

Notiz:Als temporäre Tabelle habe ich im Beispiel die TmpJobSelect verwendet, schöner wäre natürlich eine eigene Tabelle. Auch bin ich mir darüber im klaren, daß das kontruierte Beispiel auch ohne temporäre Tabelle lösbar gewesen wäre.

public void lookup()
{
    sysTableLookup sysTableLookup;
    query query;
    TmpJobSelect TmpJobSelect;
    custGroup custGroup;

    super();

    // Fill temp-table   
    while select custGroup
    {
        TmpJobSelect.ClassName = custGroup.CustGroup;
        TmpJobSelect.ClassDescription = custGroup.name;
        TmpJobSelect.id = (select count(recId) from CustTable where custtable.CustGroup == custGroup.CustGroup).recid;
        TmpJobSelect.insert();
    }

    query = new query();
    query.addDataSource(tableNum(TmpJobSelect));
   
    sysTableLookup = sysTableLookup::newParameters(tableNum(TmpJobSelect), this);
    sysTableLookup.parmTmpBuffer(TmpJobSelect);
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldNum(TmpJobSelect, ClassName));
    sysTableLookup.setLabel("Custgroup");
    sysTableLookup.addLookupfield(fieldNum(TmpJobSelect, ClassDescription));
    sysTableLookup.setLabel("Name");
    sysTableLookup.addLookupfield(fieldNum(TmpJobSelect, id));
    sysTableLookup.setLabel("Count of customers");
    sysTableLookup.performFormLookup();
}

Auch dieses Beispiel funktioniert sowohl in Dynamics AX 2009 als auch AX 2012.

Dieser Beitrag bezieht sich auf die Versionen:
Dynamics AX 2009, Dynamics AX 2012

Kommentar hinzufügen
 
 

 

 
 
 
Beiträge des aktuellen Monats
Januar 2021
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
© 2006-2021 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