[gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 12:55

Moin moin,

ich möchte gern eine Codeunit schreiben, die mir PDF's aus einer Warteschlange erzeugt. Diese soll möglichst einfach zu händeln sein und nicht jedesmal angepasst werden müssen, falls mal ein neuer Report dazukommt. Ich habe dazu schon diesen Post gefunden (http://www.msdynamics.de/viewtopic.php?f=40&t=13158&p=90603&hilit=variant+report#p90603), dass es mit RecordRef und Variant-Variablen gehen soll. Leider funktioniert es bei mir aber noch nicht. Folgenden Testcode habe ich dazu erstellt:

Code:
StructPlanLine.RESET;
StructPlanLine.SETFILTER("JSP Code", '994740');
IF StructPlanLine.FINDFIRST THEN
BEGIN
  StructRef.GETTABLE(StructPlanLine);
  MESSAGE(FORMAT(StructRef.COUNT));
  MESSAGE(FORMAT(StructRef.RECORDID));
  RefVariant2 := StructRef;
  MESSAGE(FORMAT(RefVariant2.ISRECORD));
  MESSAGE(FORMAT(RefVariant2)); 
  REPORT.RUNMODAL(50003,TRUE,TRUE,RefVariant2);
END;


StructRef hat immer nur ein Element und auch die RECORDID ist die vorher gefilterte. Die Abfrage nach RefVariant2.ISRECORD liefert aber leider immer false und der Report geht dann alle Records in der Tabelle durch und nicht nur den einen, der in RefVariant2 drin sein sollte. Mache ich da noch etwas falsch oder kann es sein, dass es in gewissen Versionen von NAV nicht mit Variants funktioniert?
Wir setzen die 6.0.32011.0 bei uns ein.

Gruß

rif
Zuletzt geändert von rifmetroid am 18. Februar 2014 14:21, insgesamt 1-mal geändert.

Re: Report mit generischem Record aufrufen [CC]

18. Februar 2014 13:38

Auf den ersten Blick sieht mir der Code richtig aus. Welcher Fehlermeldung erhältst du denn?

Re: Report mit generischem Record aufrufen [CC]

18. Februar 2014 13:53

Es gibt keine Fehlermeldung, aber anstatt nur den einen Record zu drucken, läuft der Report durch die komplette Tabelle mit allen Einträgen.
Die Variantvariable scheint nicht richtig als Filter beim Report zu wirken.

Nehme ich einfach die gefilterte StructPlanLine, wird mir auch nur die eine Seite für den einen Record gedruckt.

Re: Report mit generischem Record aufrufen [CC]

18. Februar 2014 14:14

rifmetroid hat geschrieben:Die Variantvariable scheint nicht richtig als Filter beim Report zu wirken.

So ist es.

Re: Report mit generischem Record aufrufen [CC]

18. Februar 2014 14:21

Ok,
habe jetzt auch den nötigen Hinweis dazu gefunden:

It appears that in Classic Client the the VarRecRef does not pick up filters or selected records. So the usage is limited here.
But in NAV 2013 it works. I didn’t test in NAV 2009 RTC, but I assume that it works the same as with NAV 2013.

Siehe hier: http://www.kauffmann.nl/blog/index.php/2013/04/09/run-a-page-or-report-with-recordref-variable/

Schade, dass hätte mir einiges an Arbeit erspart. Aber kann man dann leider nicht ändern.
Vielen Danke trotzdem für eure Hilfe!

Gruß rif

Re: [gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 14:54

Falls es so wie in deinem Code ablaufen soll, dann übergib dem Report den Wert aus GetView doch per Funktion.

Re: [gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 15:11

Wenn ich dich richtig verstehe, müsste ich dafür ja trotzdem immer wieder etwas anpassen, entweder verschiedene Reports, falls weitere eingebunden werden, um die Filter mitzugeben oder die Codeunit, da ich dann anhand der RecordRef den eigentlichen Record suchen muss. So werde ich es jetzt jedenfalls machen, muss nur noch rausbekommen, wie ich es hinbekomme, dass anhand des RecRef den eigentlichen Record wieder korrekt gesetzt bekomme um diesen dem Report mitzugeben. Aber das bekomme ich mit ein bißchen Suchen hier schon hin.

Re: [gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 15:24

Danke für den Hinweis, hab es zuerst falsch verstanden, jetzt funktioniert es aber super mit GetView.

Vielen Dank!

Gruß
rif

Re: [gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 15:25

Ich weiß auch nicht, ob ich dich richtig verstehe :wink: . Aber ob du in deinem Beispiel nun
Code:
REPORT.RUNMODAL(50003,TRUE,TRUE,RefVariant2);

oder
Code:
Rep50003.setFilterView(StructRef.getview);
Rep50003.settableview(RefVariant2);
Rep50003.userequestform := false;
Rep50003.runmodal;

aufrufst - da bliebe es ja bei einem Report.

rifmetroid hat geschrieben:die Codeunit, da ich dann anhand der RecordRef den eigentlichen Record suchen muss.

So habe ich das bei mir auch gelöst.

Re: [gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 15:27

rifmetroid hat geschrieben:jetzt funktioniert es aber super mit GetView.

Wenn du deine Lösung noch etwas ausführlicher beschreiben könntest? :)

Re: [gelöst] Report mit generischem Record aufrufen [CC]

18. Februar 2014 16:07

Sehr gern,

ich hab leider noch einen Denkfehler gehabt, da ich mit RecordID's anstatt mit den RecordRefs arbeiten muss. Funktioniert nun aber auch ohne Probleme. Alles in allem ist es jetzt so aufgebaut, dass man per Knopfdruck auf einem Windows Mobile Device per Webservice einen Datensatz erzeugt, der die ReportID, die RecordID und noch ein paar weitere Sachen in eine Tabelle schreibt.
Diese Tabelle wird zyklisch von der Warteschlange nach neuen Einträgen durchsucht. Wenn ein neuer dabei ist, ruft es eine Codeunit mit PDFCreator auf und übergibt den Pfad, Dateinamen, ReportID und die RecordID an die Codeunit. In der ersten Funktion wird der PDFCreator vorbereitet und eine weitere Funktion mit RecordID und ReportID aufgerufen. Hier suche ich dann anhand der RecordID den richtigen Record und übergebe diesen an den entsprechenden Report. Wenn jetzt weitere Reports mit anderen Tabellen dazukommen sollten, muss man nur die letzte Funktion um diese Records und Filterung erweitern.

Hier mal der Quelltext dazu, vielleicht hilft es dem ein oder anderen ja nochmal. Der OnRunTrigger ist nur zum schnellen Testen der Funktion gewesen.

Code:
OnRun()
StructPlanLine2.RESET;
StructPlanLine2.SETFILTER("JSP Code", '994740');
IF StructPlanLine2.FINDFIRST THEN
BEGIN
  StructRef.GETTABLE(StructPlanLine2);
  CreatePDF('\\server\test\temp\', 'Test', 50003, StructRef.RECORDID);
END;

CreatePDF(Path : Text[1024];FileName : Text[255];ReportID : Integer;RecID : RecordID)
IF Object.GET(Object.Type::Report,'',ReportID) THEN
BEGIN
  IF ISCLEAR(PDFCreator) THEN
    CREATE(PDFCreator);
  IF ISCLEAR(PDFCreatorError) THEN
    CREATE(PDFCreatorError);

  PDFCreatorError := PDFCreator.cError;

  IF PDFCreator.cStart('/NoProcessingAtStartup',TRUE) = FALSE THEN
       ERROR('Status: Error[' + FORMAT(PDFCreatorError.Number) + ']: ' + PDFCreatorError.Description);

  PDFCreatorOption := PDFCreator.cOptions;

  PDFCreatorOption.UseAutosave := 1;
  PDFCreatorOption.UseAutosaveDirectory := 1;
  PDFCreatorOption.AutosaveDirectory := Path;
  PDFCreatorOption.AutosaveFormat := 0;
  PDFCreatorOption.AutosaveFilename := FileName;

  PDFCreator.cOptions := PDFCreatorOption;
  PDFCreator.cClearCache();
  DefaultPrinter := PDFCreator.cDefaultPrinter;
  PDFCreator.cDefaultPrinter := 'PDFCreator';
  PDFCreator.cPrinterStop := FALSE;

  PrintReport(ReportID, RecID);

  SLEEP(2000);

  CLEAR(PDFCreator);
  CLEAR(PDFCreatorError);
END;

PrintReport(ReportID : Integer;RecID : RecordID)
IF RecRef.GET(RecID)THEN
BEGIN
  CASE RecRef.NUMBER OF
    DATABASE::"Structural Plan Line":
    BEGIN
      RecRef.SETTABLE(StructPlanLine);
      StructPlanLine.SETFILTER(StructPlanLine."JSP Code", StructPlanLine."JSP Code");
      IF StructPlanLine.FINDFIRST THEN
      BEGIN
        REPORT.RUNMODAL(ReportID,FALSE,TRUE, StructPlanLine);
      END;
    END;
  END;
END;