Viele Wege führen nach Rom, so auch in Microsoft Dynamics AX beim Anpassen der Masken (Forms).
Eine Form direkt anzupassen kann auf den ersten Blick immer ein einfachere Weg sein, nur sollte man bedenken das es hier bei einem Update mit die meißten Schwierigkeiten bzw. die meißte Arbeit geben kann. Dabei kann man fast jede Anpassung an der Maske auch über X++ steuern.
Hier ein paar einfache Beispiele dafür:
Manipulation der Datasource.
FormRun fr;Args args = new Args();FormDataSource fds;;// Form Name InventTableargs.name(formstr(InventTable));fr = new FormRun(args);// init der Form fr.init();// Datasource der Formfds = fr.dataSource(1);// Neue Range auf der Datasource erzeugenfds.query().dataSourceTable(tablenuM(InventTable)).addRange(fieldnum(InventTable, itemID)).value(“Wert”);fr.run();fr.wait();
In dem o.g. Beispiel wird eine neue Range auf der Datasource „InventTable“ erzeugt, ohne einen direkten Eingriff auf der Form zu machen.
Weitere Möglichkeiten der Datasource Manipulation
// Datasource darf nicht editierbar sein fds = fr.dataSource(1); fds.allowEdit(False);
Prinzipiell kann über X++ alles manipuliert werden, was auch direkt in der Form manipuliert werden kann.
Der Zugriff auf einzelne Felder der Datasource erfolgt über die Methode object(), es muss nur noch die Kennung des Objektes übergeben (Feldnummer) um Zugriff zu erhalten.
// Artikelnummer ausblenden fds = fr.dataSource(1); fds.object(fieldnum(InventTable, ItemID)).visible(false);
Die einzigen wirklichen Probleme die ich bei solchen Formanpassungen hatte, war das Einfügen einer neuen Formdatasource. Man kann die FormDatasource zur Laufzeit in die Form einfügen, leider muss die Form aber geschlossen und wieder neu aufgerufen werden um Zugriff auf die Formdatasource zu erhalten und um diese dann im Design der Form nutzen zu können. Bei manchen Forms kam es beim Neuaufruf der Form zu sehr seltsamen Verhalten, wie zum Beispiel, das Formcontrols die automatisch Deklariert wurden (Autodeclaration = Yes) ihre Wertigkeit verlieren. So wurde bespielsweise aus einer FormStringControl eine FormDataSource. Hier ist also bei der Anwendung Vorsicht geboten.
Anbei noch ein Job der die Kreditorenmaske manipuliert. Es wird hier eine neue Datasource (Bestellungen) angefügt und in einem neuen Grid angezeigt. Seltsamerweiße klappt dieses Vorgehen mit der Kreditormaske sehr gut, bei den Debitoren bekam ich nur o.g. Fehlermeldungen bei Aufruf.
Der ursprünglich Link scheint nicht zu funktionieren. Hier nochmal ein neuer Versuch
// Changed on 15 Mär 2007 at 21:14:18 by jinx (starside.eu)// Manipulation des Aufrufes der Maske Kreditorenstatic void MaskeKreditorBestellung(Args _args){FormRun fr;Args args = new Args();FormRun neuformRun;FormBuildDataSource formBuildDataSource;FormGridControl fgc;FormGroupControl fGroupCtrl;;// Form Name VendTable -> Kreditorenargs.name(formstr(VendTable));fr = new FormRun(args);// Neue DataSource einfügenformBuildDataSource = fr.form().addDataSource("PurchTable");// Tabelle der Datasource zuordnenformBuildDataSource.table(tablenum(PurchTable));// Datasource mit der Tabelle "VendTable" verknüpfen// Wichtig: Unbedingt den Namen der Datasource übergeben!formBuildDataSource.joinSource(fr.form().dataSource(1).name());// Art der Verknüpfung festlegenformBuildDataSource.linkType(1);formBuildDataSource.allowCreate(false);formBuildDataSource.allowDelete(false);formBuildDataSource.allowEdit(false);// Neue Gruppe ErzeugenfGroupCtrl = fr.form().design().addControl(FormControlType::Group,"PurchOderGroup");// Die Neue Datasource der neuen Gruppe zuordnenfGroupCtrl.dataSource(formBuildDataSource.id());// Neues Grid erzeugenfgc = fGroupCtrl.addControl(FormControlType::Grid,"PurchOderGrid");// Die Neue Datasource dem neuen Grid zuordnenfgc.dataSource(formBuildDataSource.id());// Feld "Bestellnummer" ins Grid einfügenfgc.addDataField(formBuildDataSource.id(), fieldnum(PurchTable, PurchID));// Feld "Kreditorennummer" ins Grid einfügenfgc.addDataField(formBuildDataSource.id(), fieldnum(PurchTable, OrderAccount));// Die Form in der wir gerade die Datasource eingefügt haben, den Args übergebenargs.object(fr.form());// Neue FormRun aufgrund der Manipulierten Form erzeugen und aufrufenneuformRun = classFactory.formRunClass(args);neuformRun.init();neuformRun.run();neuformRun.wait();}
Subscribe in a reader