AX 2012: Eigene Lookups mit Hilfe der Klasse SysLookupMultiSelectCtrl erstellen
21.02.2012Microsoft Dynamics AX (Axapta)
|
Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012
Dynamics AX 2012
|
|
|
|
|
|
Dieser Beitrag bezieht sich auf die Version:
Dynamics AX 2012
|
In AX 2012 gibt es über die Klasse SysLookupMultiSelectCtrl eine neue Möglichkeit, um bei einem Formularfeld, welches weder an eine DataSource noch an einen Extended Datatyp gebunden ist, dem Benutzer ein Lookup-Formular anzubieten.
Diese Klasse hat gegenüber der Klasse SysTableLookup, die es schon in Dynamics AX 2009 gegeben hat, sowohl einige Vorteile aber auch ein paar Nachteile:
Vorteile
Nachteile
Hier ein einfaches Anwendungsbeispiel:
Es soll bei dem FormStringControl namens LookupStingEdit eine Lookup-Möglichkeit auf die Debitorengruppen geschaffen werden. Es sollen aber nur bestimmte Gruppen angezeigt werden (realisiert über einen QueryBuildRange auf einen Query) und es soll der Name der Debitorengruppe retourniert werden (realisiert über den 5 Parameter der Methode SysLookupMultiSelectCtrl::constructWithQuery).
{
Query query;
super();
query = new query();
query.addDataSource(tableNum(CustGroup));
SysQuery::findOrCreateRange(query.dataSourceTable(tableNum(CustGroup)), fieldNum(CustGroup, Name)).value("*inter*");
SysLookupMultiSelectCtrl::constructWithQuery(this, LookupStringEdit, query, false, [tableNum(CustGroup), fieldNum(CustGroup, Name)]);
}
Diese neue Klasse kann man auch für Dialog-Felder verwenden, beispielsweise innerhalb eines Jobs:
{
Dialog dialog;
DialogField dialogField;
Query query;
;
// Build dialog
dialog = new Dialog();
dialogField = dialog.addField(("name"));
// Build query for lookup
query = new Query();
query.addDataSource(tableNum(CustGroup));
SysQuery::findOrCreateRange(query.dataSourceTable(tableNum(CustGroup)), fieldNum(CustGroup, Name)).value("*inter*");
// Run dialog
dialog.run(true);
// Add lookup to dialogfield
SysLookupMultiSelectCtrl::constructWithQuery(dialog.formRun(), dialogField.control(), query, false, [tableNum(CustGroup), fieldNum(CustGroup, Name)]);
dialog.wait();
// Get values from dialog
if(dialog.closedOk())
info(dialogField.value());
}
Führt man den Job aus, öffnet sich der Dialog wie folgt:
Auch innerhalb einer von RunBasebatch abgeleiteten Klasse kann der Dialog um einen Lookup erweitert werden. Dafür müssen die Methoden dialog und dialogPostRun angepasst werden. Im Beispiel wird ein Lookup auf die Debitoren ermöglicht, wobei auch Informationen aus der jeweiligen Debitorengruppe angezeigt werden:
{
DialogRunbase dialog = super();
queryBuildDataSource qbds;
#resAppl
;
dialogField = dialog.addField(("name"));
// Build query for lookup
query = new Query();
qbds = query.addDataSource(tableNum(custTable));
qbds.fields().clearFieldList();
qbds.addSelectionField(fieldNum(CustTable, AccountNum));
qbds.addSelectionField(fieldNum(CustTable, segmentId));
qbds = qbds.addDataSource(tableNum(custGroup));
qbds.fields().clearFieldList();
qbds.addSelectionField(fieldNum(CustGroup, CustGroup));
qbds.addSelectionField(fieldNum(CustGroup, name));
qbds.joinMode(JoinMode::InnerJoin);
qbds.relations(true);
SysQuery::findOrCreateRange(query.dataSourceTable(tableNum(CustGroup)), fieldNum(CustGroup, Name)).value("*inter*");
return dialog;
}
{
;
// Add lookup to dialogfield
SysLookupMultiSelectCtrl::constructWithQuery(dialog.formRun(), dialogField.control(), query, false, [tableNum(custTable), fieldNum(custTable, segmentId)]);
super(dialog);
}
Hinweis: Wenn innerhalb des Lookups mehrere Tabellen verjoint werden, können nur Werte aus der "Haupttabelle" des Queries retourniert werden. Wichtig ist weiters, daß nur jene Felder der Tabelle retourniert werden können, die auch im Lookup angezeigt werden.