Dynamics AX Blog - Dynamics AX 2012 - Microsoft Dynamics AX (Axapta) - Seite 38

Momentan angezeigt werden nur Beiträge der Kategorie »Microsoft Dynamics AX (Axapta)« Filter entfernen

In den letzten Jahren, in denen ich mich fast hauptsächlich mit der Entwicklung im Umfeld von Microsoft Dynamics AX (vormals Axapta) beschäftigt habe, ist das eine oder andere Code-Fragment entstanden, von dem ich mir vorstellen könnte, daß es auch für andere AX-Entwickler ganz nützlich sein könnte. Aber auch Tips und Tricks zu dem mächtigen ERP-System werde ich in dieser Kategorie präsentieren.

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

RSS-Feed dieser Version

Dynamics AX: Methode des "Callers" aufrufen

Immer wieder besteht die Notwendigkeit, ein Formular über ein anderes zu öffnen und aus diesem heraus Methoden des Aufrufers aufzurufen.

Einfaches Beispiel: Ich öffne aus der Auftragsmaske (Salestable) irgendein anderes Formular (über einen MenuItemButton) und möchte nun beim Schliessen dieses Formulares eine Methode in der Salestable-Maske aufrufen.
Um dies zu realisieren muß ich einfach in der Close-Methode des Subformulars folgenden Code einbinden. myMethod steht dabei für die aufzurufende Methode des Salestable-Formulares.

Achtung: IntelliSense funtioniert in diesem Fall nicht (außer ich möchte eine Methode aufrufen, die im FormRun-Objekt enthalten ist).

if (element.args() && element.args().caller())
{
    if (element.args().caller().name() == formStr(Salestable))
    {
        element.args().caller().myMethod();
    }
}

 
 

Dynamics AX: FileIOPermission - Was ist das?

Die CodeAccessPermission-Klasse ist ein Mechanismus aus dem .NET-Framework, um den Zugriff von server-seitig ausgeführtem Quellcode auf geschützte Bereiche (z.b. einer Dateistruktur) vor bösartigen Attacken zu schützen.

Ob Code server- oder client-seitig ausgeführt wird, steuert bekanntermaßen das sogenannte RunOn-Property. Diese Eigenschaft ist z.b. beim Neuanlegen einer Klasse immer auf Called from eingestellt. D.h. wird diese Klasse über einen Menuitembutton aufgerufen läuft sie client-seitig, wird diese Klasse aber z.B. aus einem Stapellauf heraus aufgerufen, läuft sie am AOS.

 

Hat man also eine Klasse, die server-seitig laufen kann und bei der auf geschützte Bereiche zugegriffen wird, muß man eine der CodeAccessPermission-Klassen in seinen Programmcode einbinden.

Die bekannteste Klasse, die von der CodeAccessPermission abgeleitet ist, ist die FileIOPermission-Klasse, die für den Zugriff auf Dateien (über AsciiIo, TextIo, …) verwendet wird. Diese Klasse wird wie folgt verwendet:

FileIoPermission FileIoPermission;
AsciiIo          AsciiIo;
;
FileIoPermission = new FileIoPermission("c:\\File.txt",'w');
FileIoPermission.assert();

AsciiIo = new AsciiIo("c:\\File.txt",'w');
// ...

Muß man innerhalb einer Methode die assert-Methode mehrmals aufrufen, ist dies nur möglich wenn man zwischen den einzelnen Aufrufen CodeAccessPermission::revertAssert() einbindet.

FileIoPermission FileIoPermission;
AsciiIo          AsciiIo;
;
FileIoPermission = new FileIoPermission("c:\\File.txt",'w');
FileIoPermission.assert();

AsciiIo = new AsciiIo("c:\\File.txt",'w');
// ...

CodeAccessPermission::revertAssert()

FileIoPermission = new FileIoPermission("c:\\File_2.txt",'w');
FileIoPermission.assert();

AsciiIo = new AsciiIo("c:\\File_2.txt",'w');
// ...

Näheres zu den CodeAccessPermission-Klassen bzw. derer Kinder sind in der MSDN zu finden. 


 
 

Dynamics AX: Excel-Datei erstellen aus einer CSV-Datei

Manchmal ist es notwenig, aus Dynamics AX heraus per X++ eine "echte" Excel-Datei zu erstellen. Dazu stellt AX ja bekanntermaßen Objekte wie SysExcelApplication, SysExcelWorkBooks usw. zur Verfügung. Der Nachteil dieser Objekte ist rasch erwähnt: Sie sind langsam!

Aber es geht auch wesentlich rascher, allerdings mit dem Umweg per TextIO zuerst eine CSV-Datei zu erstellen und diese anschließend von AX in eine Excel-Datei umzuwandeln.

Der Code für letztere Umwandlung ist diesem Microsoft-Knowlegebase-Artikel zu entnehmen (erfordert PartnerSource-Zugriff).


 
 

CSV-Datei und Zeilenumbrüche

Wenn man aus AX Daten in eine CSV-Datei exportieren muss, gibt es immer wieder Probleme mit Zeilenumbrüchen in mehrzeiligen AX-Feldern.

Um diese zu umgehen, müssen lediglich folgende Punkte beachtet werden:

  • Der Text muss in doppelte Anführungszeichen (") eingeschlossen werden
  • Der RecordDelimiter des TextIO-Objekts muss ein Linefeed sein [=num2char(10)]
  • Doppelte Anführungszeichen im Text müssen "verdoppelt" werden

 

static void Export_CSV(Args _args)
{
    TextIO      textFile;
    CustTable   CustTable;

    str csv(str _str)
    {
        _str = strReplace(_str, """, """");
       
        return """ + _str + """;
    }
    ;

    textFile = new TextIO("c:\temp\csv_test.csv","W",0);
    textFile.outFieldDelimiter(";");
    textFile.outRecordDelimiter(num2char(10));  // Wichtig wegen Zeilenumbrüchen!!!


    while select CustTable
    {
        textFile.write(
            csv(CustTable.Name) +
            ";" +
            csv(CustTable.Address) +
            ";"
            );
    }
   
    textFile = null;
}

 
 

Fehlermeldungen in AX aussagekräftiger gestalten

Info, warning und error sind das täglich Brot des AX-Entwicklers. Schließlich kann er über diese Befehle dem Benutzer mitteilen, was er getan hat, zu tun hat oder nicht hätte tun sollen. Und dies erfolgt in der Regel mit einer mehr oder weniger aussagekräftigen Fehlermeldung. Unterstützen kann man diese auf einfache Art und Weise mit dem zusätzlichen Parameter sysInfoAction. Anbei einige Beispiele, wie man diesen einsetzen kann:

static void InfoWarningErrorExamples(Args _args)
{
    query query;
    CustTable CustTable;
    sysInfoAction_MenuFunction sysInfoAction_MenuFunction;
    ;

    // Öffnet ein Formular mit einer Auswahl an Datensätzen (über eine Query)
    // Zusätzlich kann man hier ein FormControl angeben, welches nach dem öffnen den Fokus erhält
    query = new query();
    query.addDataSource(tableNum(CustTable)).addRange(fieldNum(CustTable, AccountNum)).value('401*');
    info(   'Bitte überprüfen Sie, ob bei allen betroffenen Debitoren die selbe Debitorengruppe eingetragen ist',
             'APPLDOC://Tables/CustTable/CustGroup',
             sysInfoAction_FormRunQuery::newFormnameControlnameQuery(formStr(CustTable),'Posting_CustGroup', query));

    // Öffnet nur das Formular ohne einen bestimmten Datensatz auszuwählen, man kann aber den Names
    // eines FormControl angeben, welches den Fokus zu öffnenden Formular erhalten soll
    warning(   'Bitte überprüfen Sie die Einstellungen der am Debitoren hinterlegten Debitorengruppe',
                'APPLDOC://Tables/CustTable/CustGroup',
                sysInfoAction_FormRun::newFormnameControlnameDesc(  formStr(CustTable),
                                                                    'Posting_CustGroup'
                                                                    'Debitorengruppe anzeigen'));

    // Öffnet das Formular mit einem bestimmten Datensatz und setzt den Fokus auf ein bestimmtes Feld
    CustTable = CustTable::find('4011');
    error(  'Bitte überprüfen Sie die Einstellungen der am Debitoren hinterlegten Debitorengruppe',
            'APPLDOC://Tables/CustTable/CustGroup',
            sysInfoAction_TableField::newBufferField(CustTable, fieldNum(CustTable, custGroup)));


    // Öffnet ein Formular über die Angabe des entsprechenden MenuItems
    // Dabei kann ein Datensatz ausgewählt werden, welcher angezeigt werden soll
    // ACHTUNG: Funktioniert nicht bei allen Formularen (Tabellenrelationen werden benötigt)
    sysInfoAction_MenuFunction = new sysInfoAction_MenuFunction();
    sysInfoAction_MenuFunction.parmDataAreaId(curext());
    sysInfoAction_MenuFunction.parmMenuItemType(MenuItemType::Display);
    sysInfoAction_MenuFunction.parmMenuItemName(identifierStr(CustTable));
    sysInfoAction_MenuFunction.parmCallerBuffer(CustTable::find('4011'));

    info('Bitte überprüfen Sie die Stammdaten des Debitoren', '', sysInfoAction_MenuFunction);
}

Nachstehend die äquivalenten Befehle in AX 3.0.

static void InfoWarningErrorExamples(Args _args)
{
    query query;
    CustTable CustTable;

    sysInfoAction_FormRunQuery sysInfoAction_FormRunQuery;
    sysInfoAction_FormRun sysInfoAction_FormRun;
    sysInfoAction_TableField sysInfoAction_TableField;
    ;

    // Öffnet ein Formular mit einer Auswahl an Datensätzen (über eine Query)
    // Zusätzlich kann man hier ein FormControl angeben, welches nach dem öffnen den Fokus erhält
    query = new query();
    query.addDataSource(tableNum(CustTable)).addRange(fieldNum(CustTable, AccountNum)).value('401*');
    sysInfoAction_FormRunQuery = new sysInfoAction_FormRunQuery(formStr(CustTable),'Posting_CustGroup', query);
    info(   'Bitte überprüfen Sie, ob bei allen betroffenen Debitoren die selbe Debitorengruppe eingetragen ist',
             'APPLDOC://Tables/CustTable/CustGroup',
             sysInfoAction_FormRunQuery);

    // Öffnet nur das Formular ohne einen bestimmten Datensatz auszuwählen, man kann aber den Names
    // eines FormControl angeben, welches den Fokus zu öffnenden Formular erhalten soll
    sysInfoAction_FormRun = new sysInfoAction_FormRun(formStr(CustTable),
                                                      'Posting_CustGroup',
                                                      'Debitorengruppe anzeigen');
    warning(   'Bitte überprüfen Sie die Einstellungen der am Debitoren hinterlegten Debitorengruppe',
                'APPLDOC://Tables/CustTable/CustGroup',
                sysInfoAction_FormRun);

    // Öffnet das Formular mit einem bestimmten Datensatz und setzt den Fokus auf ein bestimmtes Feld
    CustTable = CustTable::find('4011');
    sysInfoAction_TableField = new sysInfoAction_TableField(CustTable, fieldNum(CustTable, custGroup));
    error(  'Bitte überprüfen Sie die Einstellungen der am Debitoren hinterlegten Debitorengruppe',
            'APPLDOC://Tables/CustTable/CustGroup',
            sysInfoAction_TableField);
}

Aussehen tun solche Fehlermeldungen dann zum Beispiel wie folgt


 
 
Seiten « 1 ... 35 36 37 38 

 

 
 
 
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