Dynamics AX Blog - Dynamics AX 2012 - Seite 10

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

RSS-Feed dieser Version

Fehler "Ungültiger Objektname" im Formular Security entry point permissions

Bei Verwendung des Formulares "Security entry point permissions" aus dem Security Development Tool kann beim Umschalten der Ansicht des Typs (Aufgabe/Rolle/Recht) folgender Fehler auftreten.

Ungültiger Objektname

Ursache ist, daß das Tool im Hintergrund ein Objekt im AOT erstellen möchte, daß im Namen das jeweilige Benutzerkürzel trägt. Enthält dieses Benutzerkürzel Zeichen, die in einem Objektnamen nicht zulässig sind (beispielsweise Bindestriche), tritt genau dieser Fehler auf.

Einfachster Workaround: Mit einem anderen Benutzer arbeiten.


 
 

SysOperation-Klassen per Job erstellen

Wer schon einmal eine Funktion mit Hilfe des SysOperation-Frameworks umgesetzt hat weiß, daß das Erstellen der bis zu vier notwendigen Klassen doch etwas Tipparbeit ist.

ScreenshotFür faule effiziente Zeitgenossen habe ich deshalb den nachstehenden Job entwickelt, mit dessen Hilfe sich diese zeitraubende Arbeit deutlich verkürzen kann.

Man gibt im Job über die Variable baseClassName einen "Basisnamen" für seine Funktion an und der Job erstellt alle vier Klassen (Controller, Dataprovider, UIBuilder und Service).

Zusätzlich gibt es im Job noch eine Map namens dataContractParmsMap aus der - soferne man Inhalte in diese Map eingefügt hat - bei der Generierung des Dataproviders auch gleich passende parm-Methoden erstellt werden. Im Job enthält die Map zwei Einträge für eine Debitorenkontonummer und eine Artikelnummer.


 
 

Erstellen einer Nicht-Primären Adresse mit zwei Rollen

Beispiel, wie man per Code eine nicht-primäre Adresse mit zwei Rollen für einen Eintrag im Globalen Adressbuch erstellen kann.

static void createPartyInvoiceAndHomeAddress(Args _args)
{
    DirPartyTable dirPartyTable = DirPartyTable::findByNum("???100000??");
    DirParty dirParty;
    DirPartyPostalAddressView dirPartyPostalAddressView;

    // Create instance of dirParty
    dirParty = DirParty::constructFromCommon(dirPartyTable, DirUtility::getCurrentDateTime(), dirPartyTable.partyType());

    // Create primary address
    dirPartyPostalAddressView.LocationName      = "Invoice & Home";
    dirPartyPostalAddressView.City              = "Vienna";
    dirPartyPostalAddressView.Street            = "Kärtnerring";
    dirPartyPostalAddressView.StreetNumber      = "22";
    dirPartyPostalAddressView.CountryRegionId   = "AUT";
    dirPartyPostalAddressView.IsPrimary         = NoYes::No;

    dirParty.createOrUpdatePostalAddress(dirPartyPostalAddressView, 
                                         [LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Invoice).RecId,
                                          LogisticsLocationRole::findBytype(LogisticsLocationRoleType::Home).RecId]);
}

 
 

Aufruf des SysOperation-Frameworks per Code

Wenn man eine Funktion die über das SysOperation-Framework abgebildet ist per Code aufrufen möchte, kann der folgende Job zeigen, wie man das machen kann.

static void runSysOperationThroughCode(Args _args)
{
    TutorialSysOperationServiceController controller;
    TutorialSysOperationDataContract dataContract;
    SysOperationStartResult sysOperationStartResult;
    
    controller = TutorialSysOperationServiceController::newFromArgs(new Args()); 

    dataContract = controller.getDataContractObject('_dataContract'); 

    controller.parmExecutionMode(SysOperationExecutionMode::Synchronous); 

    dataContract.parmFilenameSave(@"c:\temp\myFile.txt");
    dataContract.parmCustAccount('US-006');
       
    sysOperationStartResult =
    controller.startOperation();
}

 
 

Debuggen von SSRS-Dataprovider

Bei der Entwicklung bzw. Anpassung von Dataprovidern eines SSRS-Reports hatte ich in der Vergangenheit immer wieder das Thema, daß das Aufrufen/Testen des SSRS-Reports  oft mehr Zeit beansprucht, als die eigentliche Anpassung im Code.

Deshalb ist folgender Job entstanden, der mir lediglich den Inhalt der vom Dataprovider erstellten (temporären) Tabelle als einfaches Infolog ausgibt.

Das ist vor allem dann hilfreich, wenn man den Dataprovider (abgeleitet von SRSReportDataProviderBase) zur Fehleranalyse debuggen möchte, das aber aufgrund seiner Programmierung aber vielleicht nicht so ohne weiteres möglich ist. Im Beispiel handelt es sich um den Bericht "Arbeitsbeschreibung" aus dem Service-Modul.

static void testSSRSDatProvider(Args _args)
{
    SMAWorkNoteTmp      tempTable;
    SMAWorkNoteDP       dataProvider = new SMAWorkNoteDP();
    SMAWorkNoteContract contract = new SMAWorkNoteContract();
    Query               query = new Query(identifierStr(SMAWorkNote));

    try
    {
        SysQuery::findOrCreateRange(
            query.dataSourceTable(
                tableNum(SMAServiceOrderTable)),
                fieldNum(SMAServiceOrderTable, ServiceOrderId)).value("00018");

        contract.parmItemConsumption(true);
        contract.parmItemRequirement(true);
        contract.parmExpense(true);
        contract.parmFee(true);
        contract.parmAdditionalNotes(true);
        contract.parmLineText(true);

        if( !contract.validate())
        {
            throw error(error::missingParameter(contract));    
        }

        dataProvider.parmDataContract(contract);
        dataProvider.parmQuery(query);
        dataProvider.processReport();

        tempTable = dataProvider.getSMAWorkNoteTmp();

        while select tempTable
        {
            info(tempTable.otServiceOrderId);
        }
    }
    catch (Exception::Break)
    {
        info("Aborted");
    }
}

 
 

Label eines Dialogfeldes ermitteln/auslesen

In diesem Blog-Beitrag habe ich schon einmal beschreiben, wie man in Dynamics AX das Label eines Dialogfeldes auslesen kann, das folgende Beispiel macht das gleiche in Dynamics AX 2012.

static void getDialogFieldLabel(Args _args) 
{ 
     Dialog dialog = new Dialog(); 
     DialogField df_Project; 
     DialogField df_AmountMST;
 
     str getLabel(DialogField _df) 
     { 
         formStringControl fsc; 
         
         fsc = _df.fieldControl(); 
         
         return fsc.labelText(); 
     } 
      
     df_project   = dialog.addField(extendedTypeStr(ProjId), "Mein Projekt"); 
     df_AmountMST = dialog.addField(extendedTypeStr(AmountMST)); 
     
     dialog.run();

     info(getLabel(df_project)); 
     info(getLabel(df_AmountMST)); 
}

 
 

TableId einer abgeleiteten Tabelle in einem View ausgeben

Vor kurzem benötigte ich in einem View, dessen Datenquelle eine abgeleitete Tabelle (im Beispiel EcoResDistinctProductVariant) enthielt, die TableId dieser Tabelle als Feld. Also erstellte ich ein neues Feld, wählte die Tabelle aus und das Feld TableId aus dem DropDown.

Der View

Screenshot

Eigenschaften des Feldes TableId1

Screenshot

Leider brachte dies nicht das erwartete Ergebnis, wenn ich den View öffnete, wurde das Feld immer mit NULL ausgegeben.

Screenshot


 
 
Seiten « 1 ... 7 8 9 10 11 12 13 ... 38 » 

 

 
 
 
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