Dynamics AX Blog - Seite 28

Modal Form in Dynamics AX erstellen/aufrufen

Um in Dynamics AX ein Formular modal aufzurufen, kann man folgendes Code-Fragment aus der clicked()-Methode einer Schaltfläche (Button) verwenden:

void clicked()
{
    FormRun formRun;
    Args args = new Args();

    super();
    
    args.name(formStr(MyFormName));
    args.record(SalesLine);

    formRun = classFactory::formRunClassOnClient(Args);

    formRun.init();
    formRun.run();
    If (!formRun.closed())
    {
        formRun.wait(true);
    }
}

Auf diese Art & Weise kann man praktisch jedes Formular als modales - also als ein Formular öffnen, welches erst geschlossen werden muss, bevor mit der Anwendung weitergearbeitet werden kann - öffnen.


 
 

Word-Dokument per Code erstellen II

Microsoft WordAnbei ein einfach gehaltener Job, der ein einfaches Word-Dokument mit Überschriften per Code erstellt. Voraussetzung ist ein lokal installiertes Microsoft Word.

static void CreateWordFile(Args _args)
{
    COM wordApplication;
    COM wordDocuments;
    COM wordDocument;
    COM wordRange;
    COM wordSelection;
    COM wordStyles;
   
    #define.Heading1(-2)
    #define.Heading2(-3)
    #define.Heading3(-4)
    #define.Heading4(-5)
    #define.Heading5(-6)   
   
    void insertHeader(str _str, int _level)
    {
        COM wordStyle;
        wordSelection = wordApplication.selection();

        switch( _level )
        {
            case 1:
                wordStyle = wordStyles.item(#Heading1);
                break;
            case 2:
                wordStyle = wordStyles.item(#Heading2);
                break;
            case 3:
                wordStyle = wordStyles.item(#Heading3);
                break;
            case 4:
                wordStyle = wordStyles.item(#Heading4);
                break;
            case 5:
                wordStyle = wordStyles.item(#Heading5);
                break;
            default:
                wordStyle = wordStyles.item(#Heading3);
        }       
       
        wordSelection.style(wordStyle);

        wordSelection.TypeText(_str);

        wordSelection.TypeParagraph();
    }   
   
    wordApplication = new COM("word.application");
    wordApplication.visible(TRUE);
    wordDocuments = wordApplication.Documents();
    wordDocument = wordDocuments.add();
    wordDocument.saveas(@"c:\temp\LoremIpsum.doc");
    wordDocument.activate();

    wordStyles = wordDocument.styles();

    wordRange = wordDocument.range(0,0);   
   
    // Let's go
    insertHeader("Lorem ipsum", 1);
    wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam");
    wordSelection.TypeParagraph();
   
    insertHeader("Lorem ipsum", 2);
    wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam");
    wordSelection.TypeParagraph();
   
    wordSelection.TypeText("Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut");
    wordSelection.TypeParagraph();
   
    // Finish
    wordDocument.save();
    wordDocument.close();
    wordApplication.quit();   

}

So sieht das Word-Dokument aus, daß mit obigem Code erstellt wurde:

Lorem Ipsum Word-file


 
 

AX 2012: LedgerDimension generieren

Die folgende Methode erstellt eine sog. LedgerDimension (EDT RecId) unter Verwendung des angebenen Hauptkontos und der angegebenen Finanzdimension.

static recid createLedgerDimensionRecId()
{
    AccountNum accountNum = '60000';
    str 255 dimensionValue = '300';
    Name DimensionName = 'Kostenstelle';
    
    MainAccount MainAccount;
    LedgerDimensionAccount LedgerDimensionAccount;
    DimensionAttributeValue DimensionAttributeValue;
    DimensionAttribute DimensionAttribute;
    dimensionAttributeValueSetStorage dimensionAttributeValueSetStorage;
    dimensionDefault dimensionDefault;
    
    DimensionAttribute = DimensionAttribute::findByName(DimensionName);
    if (dimensionValue)
    {
        DimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute, dimensionValue, false, true);
        if (!DimensionAttributeValue)
        {
            throw error(strFmt("@SYS24602", "@SYS13911", dimensionValue));
        }
    }    
    
    // Konto
    MainAccount = MainAccount::findByMainAccountId(accountNum);
    if(MainAccount)
    {
        LedgerDimensionAccount = DimensionDefaultingEngine::getLedgerDimensionFromAccountAndDim(
            MainAccount.RecId,
            DimensionHierarchy::getAccountStructure(MainAccount.RecId));

        if( !LedgerDimensionAccount)
        {
            throw error("LedgerDimensionAccount konnte nicht ermittelt werden.");
        }
    }
    // Konto und Dimension verbinden
    if (DimensionAttributeValue && LedgerDimensionAccount)
    {
        dimensionAttributeValueSetStorage = new DimensionAttributeValueSetStorage();
        if(dimensionAttribute)
        {
            dimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimensionAttribute, dimensionValue, false, true);
            dimensionAttributeValueSetStorage.addItem(dimensionAttributeValue);
        }
         
        dimensionDefault = dimensionAttributeValueSetStorage.save();
        
        LedgerDimensionAccount =
        DimensionDefaultingService::serviceCreateLedgerDimension(LedgerDimensionAccount, dimensionDefault);
    }
    
    return LedgerDimensionAccount;
}

Wichtig: Die Methode prüft nicht, ob es die Dimension gibt, d.h. werden ungültige Werte für DimensionName oder DimensionValue angegeben, bricht die Methode mir einer Fehlermeldung ab.


 
 

Formular per Code öffnen

Nachstehend ein paar Beispiele, wie man ein Formular per Code aufrufen kann. Wobei jede Variante ihr Vor- oder Nachteile bietet. Beispielsweise gibt es Varianten, wo man einen Datensatz übergeben kann, der angezeigt werden soll. Andere wieder bieten die Möglichkeit ganze Queries zu übergeben oder aber festzulegen, ob man im Grid oder im Detail-View öffnen möchte. Es sollte also für ziemlich jeden Anwendungsfall etwas dabei sein ;-)

static void openFormThroughCode_0(Args _args)
{
    menuFunction menuFunction;
    args args;
    CustTable custTable = CustTable::find('1101');
   
    args = new args();
    args.record(CustTable);
    args.formViewOption(FormViewOption::Grid);
   
    menuFunction::runClient(identifierStr(custTable), MenuItemType::Display, false, args);
}

 

static void openFormThroughCode_I(Args _args)
{
    FormRun formRun;
    args args = new args();
    args.name(formstr(CustTable));
    args.formViewOption(FormViewOption::Grid);
   
    formRun = classFactory.formRunClass(args);
    formRun.run();
    formRun.wait();
}

 
 

AX 2012: Nützliche Funktionen rund um das Thema Finanzdimensionen

Wenn man in AX beispielsweise Finanzdimensionen aus einer externen Quelle verarbeiten soll, dann können die beiden folgenden Methoden möglicherweise hilfreich sein.

Die Erste Methode namens existDimension() prüft ob es die übergebene, benannte Dimension in AX überhaupt gibt und ob der übergebene Dimensionswert ebenfalls gültig ist.

boolean existDimension(str 255 _dimensionName, str 255 _dimensionValue)
{
    boolean isValid = false;
    DimensionAttribute DimensionAttribute;
    DimensionAttributeValue DimensionAttributeValue;
       
    DimensionAttribute = DimensionAttribute::findByName(_dimensionName);           
       
    if(DimensionAttribute)
    {
        DimensionAttributeValue = DimensionAttributeValue::findByDimensionAttributeAndValue(DimensionAttribute, _dimensionValue);
           
        if(DimensionAttributeValue)
        {
            isValid = true;   
        }
        else
        {
            isValid = checkFailed(strFmt("'%1' für Dimension '%2' nicht gefunden.", _dimensionValue, _dimensionName));       
        }
    }           
    else
    {
        isValid = checkFailed(strFmt("Dimension '%1' unbekannt.", _dimensionName));   
    }
    return isValid;
}

Beispielaufruf: existDimension("Costcenter", "3100");

Die Zweite Methode namens existDimensionCombination() prüft, ob die Kombination des übergebenen Hauptkontos und des übergebenen Dimensionswertes gültig ist.

boolean existDimensionCombination(str 255 _mainAccount, str 255 _dimensionName, str 255_dimensionValue)
{
    boolean isValid = false;
    FinancialDimensionValidationService FinancialDimensionValidationService;
    ledgerAccountValidationContract ledgerAccountValidationContract;
    ledgerAccountContract ledgerAccountContract;
    dimensionAttributeValueContract dimensionAttributeValueContract;
      
    FinancialDimensionValidationService = new FinancialDimensionValidationService();

    ledgerAccountValidationContract = new LedgerAccountValidationContract();
    ledgerAccountContract = new LedgerAccountContract();
    dimensionAttributeValueContract = new DimensionAttributeValueContract();
    ledgerAccountContract.parmMainAccount(_mainAccount);
    ledgerAccountContract.parmValues(new List(Types::Class));
    dimensionAttributeValueContract.parmName(_dimensionName);
    dimensionAttributeValueContract.parmValue(_dimensionValue);
    ledgerAccountContract.parmValues().addEnd(dimensionAttributeValueContract);
    ledgerAccountValidationContract.parmLedgerAccount(ledgerAccountContract);
       
    isValid = FinancialDimensionValidationService.validateLedgerAccount(ledgerAccountValidationContract);   
       
    if( !isValid)
    {
        error(strFmt("Ungültige Kombination: %1 - %2: %3", _mainAccount, _dimensionName, _dimensionValue));   
    }
      
    return isValid;
}

Beispielaufruf: existDimensionCombination("60000", "Costcenter", "3100");

In der realen AX-Entwickler-Welt wird eine solche Prüfung vermutlich etwas komplexer werden und wahrscheinlich auch eine Kombination beider Methoden notwendig sein.


 
 

AX 2012: SysOperation-Framework: Ein eigenes Attribut erstellen

Die Attribute des SysOperation-Frameworks sind über Klassen abgebildet, die von SysAttribute abgeleitet sind. Dadurch ist es relativ einfach möglich, sich eigene Attribute zu erstellen.
Im folgenden habe ich ein solches Attribute erstellt, mit Hilfe dessen ich die Hintergrundfarbe eines Controls im vom Framework generierten Dialog verändern kann.

Folgende Schritte sind dafür notwendig:

  1. Erstellen einer Klasse, welche von SysAttribute abgeleitet ist
    Dabei ist die Methode new() Dreh- und Angelpunkt der Logik, da man über die Parameter der new()-Methode die möglichen Parameter des Attributes festlegt. 
  2. Erweitern der Klasse SysOperationDataMemberInfo
    Hier wird vor allem die new()-Methode um den neuen Wert für die Hintergrundfarbe erweitert.
  3. Erweitern der Klasse SysOperationAttributedDataMemberInfo
    Hier wird das neue Attribut abgefragt und entsprechend berücksichtigt.
  4. Erweitern der Klasse SysOperationAutomaticUIBuilder
    In dieser Klasse wird das neue Attribut abgefragt und die Hintergrundfarbe dem Control zugewiesen.

 
 

AX 2012: SysOperation-Framework: Häufig verwendete Attribute

Attribute des Sysoperation-Frameworks werden in Dynamics AX 2012 über Klassen abgebildet, die von SysAttribute abgeleitet sind. Solche Klassen bestehen oft nur aus eine new()-Methode, über welche die Parameter des Attributes gesteuert werden können, sowie aus einer Accessor-Methode je Parameter.


 
 
Seiten « 1 ... 25 26 27 28 29 30 31 ... 53 » 

 

 
 
 
Beiträge des aktuellen Monats
Mai 2024
MoDiMiDoFrSaSo
 12345
6789101112
13141516171819
20212223242526
2728293031 
 
© 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