Dynamics AX Blog - Dynamics AX 2009 - Seite 6

Momentan angezeigt werden nur Beiträge, welche für die Dynamics AX-Version »Dynamics AX 2009« relevant sind. Filter entfernen

RSS-Feed dieser Version

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:


 
 

Abfragen der aktiven Lagerungsdimensionen

Um für einen Artikel über X++ zu ermitteln, ob eine bestimmte Lagerungsdimension verwendet wird, gibt es abhängig von der verwendeten AX-Version verschiedene Ansätze. In den beiden Beispielen wird ermittelt, ob die Dimension Palettennummer aktiv ist:

Dynamics AX 2009

inventDimSetup::find(inventTable::find(_itemId).DimGroupId,
    fieldnum(InventDim, wmsPalletId)).Active

Dynamics AX 2012

EcoResDimensionGroupSetup::isInventoryDimensionActiveForItem(
    _itemId, fieldNum(InventDim, wmsPalletId))

 
 

Eigenes Lookup-Formular mit Hilfe der Klasse SysTableLookup gestalten

Ab und an kommt man als Entwickler in die Verlegenheit, ein Formularfeld, welches weder an eine Datenquelle (DataSource) oder einen Extended Datatyp gebunden ist, um ein Lookup-Formular zu erweitern. Dafür stellt Dynamics AX die Klasse SysTableLookup zur Seite, die man in die lookup-Methode des jeweiligen Feldes einbinden kann.

Hier ein einfaches Beispiel unter Verwendung eines Queries, bei dem prinzipiell ein Lookup auf die Kundengruppen möglich sein soll, aber nur bestimmte angezeigt werden sollen. Diese Einschränkung kann über sysQuery::findOrCreateRange abgebildet werden.

Das Beispiel funktioniert übrigens sowohl in Dynamics AX 2009 als auch AX 2012.

public void lookup()
{
    sysTableLookup sysTableLookup;
    query query;
   
    super();

    query = new query();
    query.addDataSource(tableNum(custGroup));
   
    sysQuery::findOrCreateRange(query.dataSourceTable(tableNum(custGroup)), fieldNum(custGroup, name)).value("*inter*");
   
    sysTableLookup = sysTableLookup::newParameters(tableNum(custGroup), this);
    sysTableLookup.parmQuery(query);
    sysTableLookup.addLookupfield(fieldNum(custGroup, custGroup));
    sysTableLookup.addLookupfield(fieldNum(custGroup, name));
    sysTableLookup.performFormLookup();
}

 
 

Windows 7: Als anderer Benutzer ausführen

Als Entwickler muss ich Dynamics AX immer wieder mal mit einem anderen Windows-Login starten, als dem eigenen. Deshalb habe ich in Windows 7 die Option Als anderer Benutzer ausführen im Kontext-Menü schmerzlich vermisst und statt dessen  immer Batch-Dateien dafür verwendet.

Über einen Blog-Eintrag bin ich aber auf einen wertvollen Tip gestossen: Wenn man die [SHIFT]-Taste hält, während man über die rechte Maustaste das Kontext-Menü einer Applikation aufruft, steht die Option Als anderer Benutzer ausführen wieder zur Verfügung.

Als anderer Benutzer ausführen


 
 

SID für einen Active-Directory-User auslesen

Wer schon einmal eine Applikation inkl. Datenbank von einer Netzwerk-Domäne in eine andere übertragen hat, der kennt vielleicht die Situation. Man hat die Applikation und die Datenbank eingerichtet, kann sich in Dynamics AX aber nicht anmelden und erhält die Fehlermeldung:

You are not recognized user of Dynamics AX. Please contact your system administrator

Die Ursache dafür ist, daß in der Tabelle UserInfo - das ist jene Tabelle wo die AD-Benutzer verwaltet werden - natürlich noch die Benutzer der Ursprungsdomäne hinterlegt sind. Im einfachsten Fall ändert man in dieser Tabelle den Eintrag für den Administrator, indem man die Felder NetworkDomain, NetworkAlias und SID entsprechend ändert. NetworkDomain und NetworkAlias sind selbsterklärend, woher bekommt man aber die SID?

Eine einfache Internet-Recherche nach "GET SID" liefert einige Möglichkeiten, weniger bekannt ist aber, daß auch Dynamics AX 2009 selbst eine Methode zur Verfügung stellt, um die SID für einen Benutzer auszulesen.

Jetzt braucht man also nur noch ein anderes, bereits lauffähiges AX, wo man sich anmelden und den Job absetzen kann ;-)

static void getUserSid(Args _args)
{
    ;
    info(new xAxaptaUsermanager().getUserSid('h.schweda', 'schweda.net'));
}

 
 

Bearbeiten von Formularfeldern beschränken II

Sollen in einem Formular nur bestimmte Felder zur Bearbeitung freigegeben sein, kann man die Eigenschaft allowEdit sämtlicher Felder der DataSource der Tabelle entsprechend umsetzen.

Einfacher geht’s mit folgendem Codebeispiel, welches in der init-Methode der DataSource eingebunden wurde und - im konkreten Fall in der Tabelle SalesLine - nur bei einem einzigen Feld die Bearbeitung erlaubt.

Im Gegensatz zu einem früher veröffentlichten Beitrag mit dem gleichen Thema werden bei diesem Codebeispiel auch Array-Felder korrekt berücksichtigt.

public void init()
{
    FormDataObject  fdo;
    int             f;
    SysDictTable    sysDictTable;
    MapEnumerator   fdoMapEnumerator;
    ;
    sysDictTable = new SysDictTable(tablenum(SalesLine));
    for(f=1;f<=sysDictTable.fieldCnt();f++)
    {
        fdoMapEnumerator = new MapEnumerator(formDataSourceArrayFieldExtObjects(salesLine_ds, sysDictTable.fieldCnt2Id(f)));
        while (fdoMapEnumerator.moveNext())
        {
            fdo = fdoMapEnumerator.currentValue();
            if(fdo)
            {
                fdo.allowEdit(false);
            }
        }
    }

    fdo = salesLine_ds.object(fieldnum(SalesLine, QtyOrdered));
    fdo.allowEdit(true);
}

Getestet in Dynamics AX 2009


 
 

Datensatzvorlagen ermitteln

Wer einmal in die Verlegenheit kommt, ermitteln zu müssen ob für eine bestimmte Tabelle Datensatzvorlagen vorhanden sind, für den kann folgendes Code-Beispiel hilfreich sein.

Im Beispiel wird ermittelt, wieviele Benutzer- bzw. Unternehmensvorlagen es für die Tabelle InventTable gibt und ob der aktuelle Benutzer sich den Vorlagendialog anzeigen lässt, wenn er/sie einen neuen Artikel anlegt.

static void SysRecordTemplatesActive(Args _args)
{
    tableId tableId = tableNum(inventTable);
    common common = new sysdictTable(tableId).makeRecord();
    SysRecordTemplateStorageUser storageUser       = SysRecordTemplateStorage::newCommon(common, SysRecordTemplateType::User);
    SysRecordTemplateStorageCompany storageCompany = SysRecordTemplateStorage::newCommon(common, SysRecordTemplateType::Company);
    sysRecordTemplateSelect sysRecordTemplateSelect;
    container userTemplates;
    container companyTemplates;
    ;
    // Liste der Vorlagen
    userTemplates = storageUser.get();
    info(strFmt("Anzahl Benutzervorlagen für Tabelle %1: %2", new sysdictTable(tableId).label(),
                                                              conLen(userTemplates)));

    companyTemplates = storageCompany.get();
    info(strFmt("Anzahl Unternehmensvorlagen für Tabelle %1: %2", new sysdictTable(tableId).label(), 
                                                                  conLen(companyTemplates)));
    
    // Soll der aktive Benutzer nach Vorlagen gefragt werden?
    sysRecordTemplateSelect = SysRecordTemplateSelect::newTableId(tableId);
    sysRecordTemplateSelect.load();
    
    info(strFmt("Datensatzvorlagen für die Tabelle %1 in Verwendung: %2", new sysdictTable(tableId).label(),
                                                                          enum2str(sysRecordTemplateSelect.parmPrompt()))); 
}

 
 
Seiten « 1 ... 3 4 5 6 7 8 9 ... 20 » 

 

 
 
 
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