AX 2012: Eigene Lookups mit Hilfe der Klasse SysLookupMultiSelectCtrl erstellen

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));
   
    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:

static void dialogAddCustomLookup(Args _args)
{
    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:

public Object dialog()
{
    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;
}

 

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

Kommentar hinzufügen
 
 

 

 
 
 
Beiträge des aktuellen Monats
April 2024
MoDiMiDoFrSaSo
1234567
891011121314
15161718192021
22232425262728
2930 
 
© 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