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
Aufruf aus der init-Methode eines Formulares aus möglich (d.h. es muss die lookup-Methode des jeweiligen Feldes nicht überschrieben werden)
Mehrfachauswahl von Werten ist möglich
Nachteile
Es können keine (Display-)Methoden in den Lookup eingebunden werden
Man muss den Lookup verwenden um einen Wert auszuwählen, eine "freie" Eingabe ist nicht möglich
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).
public void init()
{
Query query;
super();
query = new query();
query.addDataSource(tableNum(CustGroup));
// 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:
public void dialogPostRun(DialogRunbase 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.
Dieser Beitrag bezieht sich auf die Version: Dynamics AX 2012
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
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.