Dynamics AX Blog - Dynamics AX 2009 - report

Momentan angezeigt werden nur Einträge, bei denen das Schlagwort »report« eingetragen wurde. Filter entfernen
Momentan angezeigt werden nur Einträge, welche für die Dynamics AX-Version »Dynamics AX 2009« relevant sind. Filter entfernen

RSS-Feed dieser Version

Druckeinstellungen und Filterkriterien eines Reports vorbelegen II

Wie startet man einen Bericht, bei dem eine von RunBaseReport abgeleitete Klasse vorgeschalten ist, per X++ und gibt diesem Bericht bereits den Query und die Druckeinstellungen vor?

Wer sich diese Frage schon einmal stellen musste, für den liefert dieser Blogbeitrag vielleicht einen Lösungsansatz:

static void setPrintJobSettingsQuery4ReportClass_II(Args _args)
{
    custReport          custReport = new custReport();
    printJobSettings    printJobSettings = new printJobSettings();
    ;
    custReport.makeReportRun();

    // Modify Query
    sysQuery::findOrCreateRange(custReport.reportRun().query().dataSourceTable(tableNum(custTable)), fieldNum(custTable, custGroup)).value(queryValue('10'));
    custReport.reportRun().query().interactive(false);
    // Create printJobSettings
    printJobSettings.setTarget(PrintMedium::File);
    printJobSettings.format(PrintFormat::PDF);
    printJobSettings.fileName(@"C:\Temp\CustTableReport.pdf");

    // Apply printJobSettings
    custReport.reportRun().printJobSettings(printJobsettings.packPrintJobSettings());
    custReport.reportRun().report().interactive(false);  // Disable default printer-dialog
    custReport.reportRun().run();
}

Obiger Code instanziiert ein Objekt der Klasse custReport, deren wesentliche Methoden wie folgt aussehen:

class CustReport extends runBaseReport
{
}

 

public identifiername lastValueElementName()
{
    identifiername ret;

    //ret = super();

    ret = reportStr(Cust);

    return ret;
}

 

static ClassDescription description()
{
    return "Custreport";
}

 

static void main(Args args)
{
    CustReport  CustReport;
    ;
    CustReport = new CustReport();
    if (CustReport.prompt())
    {
        CustReport.run();
    }
}

 
 
 

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: 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);
}

 
 

 

 
 
 
Beiträge des aktuellen Monats
Dezember 2019
MoDiMiDoFrSaSo
 1
2345678
9101112131415
16171819202122
23242526272829
3031 
 
© 2006-2019 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