Formular als Dialog verwenden

Im AOT befinden sich einige tutorial-Objekte, die dem Entwickler dabei helfen können, die eine oder andere Anforderung zu lösen. Eine dieser Klassen ist die Klasse tutorial_RunbaseForm, die erklärt wie man statt einem Dialog ein eigens erstelltes Formular als Dialog verwendet.

Auf Basis dieses Turorials habe ich in Dynamics AX 2012 eine Anforderung wie folgt gelöst:

In der Klasse wmsArrivalStart - das ist jene Klasse, die aus der Wareneingangsübersicht aus aufgerufen werden kann und Wareneingangsjournale erstellt - eine neue Methode MyDialog eingebaut, die ein Formular namens MyWMSArravialStart als Dialog aufruft. Diesem Formular wird eine temporäre Tabelle wmsArrivalDetailTmp übergeben und in einem Grid dargestellt.

Das Formular baut auf Basis dieser Tabelle wmsArrivalDetailTmp eine weitere temporäre Tabelle namens TmpWMSArrivalStartReturn auf und retourniert diese an die Klasse WMSArrivalStart.

Die Methode MyDialog wird von der run-Methode der Klasse WMSArrivalStart aus aufgerufen und öffnet das Formular MyWMSArrivalStart. Dabei wird diesem Formular über eine entsprechende Parameter-Methode  die Tabelle wmsArrivalDetailTmp übergeben. Auf Basis dieser Tabelle wird im Formular eine temporäre Tabelle TmpWMSArrivalStart aufgebaut und in einem Grid angezeigt. Hat der Benutzer in diesem Grid seine Eingaben gemacht,  wird diese temporäre Tabelle über die Methode getTmpWMSArrivalStart an die Klasse retourniert.

public static client boolean MyDialog(wmsArrivalDetailTmp _wmsArrivalDetailTmp)
{
    DialogRunbase DialogRunbase;
    Object formRun;
    wmsArrivalDetailTmp wmsArrivalDetailTmpLocal;
    TmpWMSArrivalStart TmpWMSArrivalStartReturn;

    wmsArrivalDetailTmpLocal.setTmpData(_wmsArrivalDetailTmp);

    DialogRunbase = Dialog::newFormnameRunbase(formstr(MyWMSArrivalStart),null);

    DialogRunbase.run(false);

    if(DialogRunbase.formRun() && sysFormRun::hasMethod(DialogRunbase.formRun(), identifierStr("parmWmsArrivalDetailTmp")))
    {
        formRun = DialogRunbase.formRun();
        formRun.parmWmsArrivalDetailTmp(wmsArrivalDetailTmpLocal);
    }
    else
    {
        throw error(error::wrongUseOfFunction(funcName()));
    }
    DialogRunbase.run();

    DialogRunbase.wait();   // Waits for user-input

    if(formRun && sysFormRun::hasMethod(formRun, identifierStr("getTmpWMSArrivalStart")))
    {
        TmpWMSArrivalStartReturn = formRun.getTmpWMSArrivalStart();
    }

    while select TmpWMSArrivalStartReturn
    {
        // do something...
    }

    return DialogRunbase.closedOk();
}

Aufruf der Methode aus der run-Methode der Klasse wmsStartArrival

protected WMSJournalId run()
{
    //...code...
    if (!WMSArrivalStart::MyDialog(wmsArrivalDetailTmp))
    {
        return "";    // Empty WMSJournalId
    }
    //...code...
}

In der run-Methode des Formulares wird die Methode fillTables aufgerufen, welche die von der Klasse übergebenen Daten verarbeitet (über die Methode parmWmsArrivalDetailTmp)

public void run()
{
    this.fillTables();

    super();
}

Die Methode parmWmsArrivalDetailTmp dient zum Übergeben der Datensätze der Tabelle WmsArrivalDetailTmp

public wmsArrivalDetailTmp parmWmsArrivalDetailTmp(WmsArrivalDetailTmp _wmsArrivalDetailTmp = wmsArrivalDetailTmp)
{
    wmsArrivalDetailTmp = _wmsArrivalDetailTmp;

    return wmsArrivalDetailTmp;
}

Die Methode fillTables baut auf Basis der Tabelle WmsArrivalDetailTmp eine weitere Tabelle auf. Diese Tabelle dient gleichzeitig als DataSource des Formulares und wird in einem Grid dargestellt.

private void fillTables()
{
    while select WMSArrivalDetailTmp
    where WMSArrivalDetailTmp.Selected   == NoYes::Yes
    &&    WMSArrivalDetailTmp.InventQty  >  0
    {
        TmpWMSArrivalStartReturn.itemid                       = WMSArrivalDetailTmp.ItemId;
        TmpWMSArrivalStartReturn.InventTransId                = WMSArrivalDetailTmp.InventTransId;
        TmpWMSArrivalStartReturn.WMSStandardPalletQuantity    = InventTable::find(TmpWMSArrivalStartReturn.itemid).standardPalletQuantity;
        TmpWMSArrivalStartReturn.WMSPalletCount               = WMSArrivalDetailTmp.NoOfPallets;
        TmpWMSArrivalStartReturn.insert();
    }
    TmpWMSArrivalStart.setTmpData(TmpWMSArrivalStartReturn);

    TmpWMSArrivalStart_ds.executeQuery();
}

Klickt der Benutzer auf den OK-Button des Formulares wird über die Methode getTmpWMSArrivalStart der Inhalt der Tabelle TmpWMSArrivalStart an die Klasse retourniert.

public TmpWMSArrivalStart getTmpWMSArrivalStart()
{
    return TmpWMSArrivalStartReturn;
}

Abschliessend noch ein paar Anmerkungen zum Formular selbst:

  • Die Form muss eine Gruppe namens dialogStartGrp enthalten
  • Die Form benötigt auch die entsprechenden Buttons (dafür am besten die gesamte Gruppe BottomButtonGrp des Formulares tutorial_RunbaseForm übernehmen

Das Beispiel funktioniert prinzipiell in AX 2009 genauso wie in AX 2012.

Dieser Beitrag bezieht sich auf die Versionen:
Dynamics AX 2009, 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