Dynamics AX Blog - report - Microsoft Dynamics AX (Axapta) - Seite 2

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, bei denen das Schlagwort »report« eingetragen wurde. Filter entfernen

Druckeinstellungen und Filterkriterien eines Reports vorbelegen

In einem früheren Beitrag habe ich ja schon demonstriert, wie man einen Report in Dynamics AX per Code aufruft, und diesem dabei einen Query übergibt. Der folgende Code erweitert diesen Aufruf um die Druckeinstellungen (printJobSettings), sodaß es nun möglich ist, einen Report vollautomatisch mit vorgegebenen Filterkriterien und definierten Druckeinstellungen aus X++ heraus aufzurufen.


 
 

Eingeblendete Dimensionen in Reports abfragen

In manchen Berichten ist es möglich, Lagerdimensionen über den Dialog ein- bzw. auszublenden. Um im Bericht selbst abzufragen, ob eine bestimmte Dimension eingeblendet wurde, kann man den unten stehenden Code verwenden, der eine Instanz der Klasse InventReport_OnHand voraussetzt. Dieser fragt zum Beispiel ab, ob die Palettennummer eingeblendet wurde,

if(InventReport_OnHand.parmInventDimParm().WMSPalletIdFlag))
   // ...do something

 


 
 

Druckoptionen von Berichten können nicht geändert werden

In Dynamics AX 2009 scheint es einen kleinen Bug zu geben, der bei Reports, welche über eine von RunBaseReport abgeleitete Klasse gestartet werden, dazu führt, daß sich die Druckoptionen nicht ändern lassen.

Um diesen Bug zu umgehen, kann man die Methode dialogUpdatePrinterSettings, wie in nachstehendem Beispiel beschrieben, überschreiben.

public void dialogUpdatePrinterSettings(Dialog dialog)
{
    ;
    // --> (1) Workaround to update printJobSettings and dialog
    this.printJobSettings().unpackPrintJobSettings(this.reportRun().packPrintJobSettings());
    // <-- (1)

    super(dialog);
}

Update 27.12.2010
Mittlerweile gibt es einen funktionierenden Fix von Microsoft, siehe http://blogs.msdn.com/b/emeadaxsupport/archive/2010/12/20/print-medium-change-in-dialog-not-working-on-certain-reports.aspx


 
 

PageFooter sind nicht immer dort, wo sie sein sollten

Ich kenne kein einziges AX-Projekt, in dem nicht zumindest einer der Berichte Auftragsbestätigung, Ausgangslieferschein oder Ausgangsrechnung angepasst worden sind. Und deshalb stolpere ich auch immer wieder über das selbe Problem: Man erweitert einen Bericht (Report) um einen PageFooter, der aber nicht auf jeder Seite angedruckt werden soll.


 
 

Temporäre Tabelle in einem Report verwenden

Um eine temporäre Tabelle in einem Report zu verwenden, kann diese in der fetch-Methode mit Daten befüllt werden.

public boolean fetch()
{
    boolean ret = true;
    QueryRun localQuery = new QueryRun(this);
    ;
 
    localQuery.setRecord(TmpCustVendTrans::custTransBalanceCurrency("200030", true, "EUR"));  // Befüllt die Tabelle mit den Salden eines Debitors
 
    while (localQuery.next())
    {
        TmpCustVendTrans = localQuery.get(TableNum(TmpCustVendTrans));
        element.send(TmpCustVendTrans);
    }
 
    return ret;
}

Die Variable TmpCustVendTrans ist dabei in der classDeclaration des Reports deklariert.


 
 

Dynamics AX: Report per Code aufrufen

Anbei ein Beispiel wie so mancher Report per Code ausgeführt werden kann, und dem Report dabei gleichzeitig ganz bestimmte Datensätze per Query übergeben werden können.

static void PrintCustCollectionLetterJour()
{
    CustCollectionLetterJour    CustCollectionLetterJour;
    query                       query;
    args                        args = new args();
    reportRun                   reportRun;
    ;

    select firstonly CustCollectionLetterJour;  // Irgendein Datensatz

    // Query aufbauen (mit obigen Datensatz)
    query = new query();
    query.addDataSource(tableNum(CustCollectionLetterJour));

    SysQuery::findOrCreateRange(query.dataSourceTable(TableNum(CustCollectionLetterJour)),
        fieldNum(CustCollectionLetterJour, CollectionLetterNum)).value(CustCollectionLetterJour.CollectionLetterNum);
    SysQuery::findOrCreateRange(query.dataSourceTable(TableNum(CustCollectionLetterJour)),
        fieldNum(CustCollectionLetterJour, AccountNum)).value(CustCollectionLetterJour.AccountNum);

    // Den Query dem Report übergeben
    args.name(reportstr('CustCollectionJour'));

    reportRun = classFactory.reportRunClass(args);

    reportRun.query().interactive(false);
    reportRun.report().interactive(false);
    reportRun.query(query);

    reportRun.init();

    reportRun.run();
}

 
 

Dynamics AX: Rechnungen per Code drucken

Über nachstehenden Code kann ganz einfach jederzeit eine Verkaufsrechnung nachträglich ausgedruckt werden. Durch leichte Modifikationen des Codes gilt dies auch für sämtliche anderen verkaufs- und einkaufsseitigen Dokumente.

Hier ein kurzes Beispiel unter AX 2009

static void PrintSalesInvoice(Args _args)
{
   custInvoiceJour     custInvoiceJour;
   SalesFormLetter     salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice, false);
   PrintJobSettings    printJobSettings = new PrintJobSettings();
   Args                args = new Args();
   boolean             prompt = true;
   boolean             printIt = true;
   ;

   if (prompt)
   {
       // Auswahl des Benutzers über Dialog
       printIt = printJobSettings.printerSettings('SysPrintForm');
   }
   else
   {
       // Printjobsettings per Code steuern
       printJobSettings.setTarget(PrintMedium::File);
       printJobSettings.format(PrintFormat::PDF);
       printJobSettings.fileName(@'c:\temp\myfile.pdf');
   }

   if (!printIt)
   {
       return; // Benutzerabbruch
   }

   salesFormLetter.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings());

   select firstOnly custInvoiceJour
       where custInvoiceJour.salesid == '100001';

   args.record(custInvoiceJour);
   args.caller(salesFormLetter);

   new MenuFunction(menuitemoutputstr(SalesInvoice), MenuItemType::Output).run(args);
}

Nachstehend ein Code-Beispiel unter AX 4.0

static void PrintSalesInvoice(Args _args)
{
   custInvoiceJour     custInvoiceJour;
   SalesFormLetter     salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice, false);
   PrintJobSettings    printJobSettings = new PrintJobSettings();
   Args                args = new Args();
   boolean             prompt = true;
   boolean             printIt = true;
   salesPrintSetup     salesPrintSetup;
   ;

   if (prompt)
   {
       // Auswahl des Benutzers über Dialog
       printJobSettings = new PrintJobSettings(salesPrintSetup.PrintJobSettings);
       printIt = printJobSettings.printerSettings('SysPrintForm');
       salesPrintSetup.PrintJobSettings = printJobSettings.packPrintJobSettings();
   }
   else
   {
       // Printjobsettings per Code steuern
       printJobSettings.setTarget(PrintMedium::File);
       printJobSettings.format(PrintFormat::PDF);
       printJobSettings.fileName(@'c:\temp\myfile.pdf');
   }

   if (!printIt)
   {
       return; // Benutzerabbruch
   }

   salesFormLetter.updatePrinterSettingsFormLetter(printJobSettings.packPrintJobSettings());

   select firstOnly custInvoiceJour
       where custInvoiceJour.salesid == '100001';

   args.record(custInvoiceJour);
   args.caller(salesFormLetter);

   new MenuFunction(menuitemoutputstr(SalesInvoice), MenuItemType::Output).run(args);
}

 
 
Seiten « 1 2 

 

 
 
 
Beiträge des aktuellen Monats
März 2024
MoDiMiDoFrSaSo
 123
45678910
11121314151617
18192021222324
25262728293031
 
© 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