[GELÖST] Einen Report als PDF ausgeben anhand einer Checkbox

28. März 2006 12:34

Hallo,

ich stehe gerade etwas auf dem Schlauch...

ich habe einen Report, der unter anderem reinweg als PDF ausgegeben werden soll. Die Auswahl geschieht über eine Checkbox.

Mein Problem: Ich möchte nicht jedesmal den PDF Drucker auswählen usw.

Es soll der PDF Drucker ausgewählt werden, die PDF Datei einen bestimmten Namen bekommen (KD-Nr-Preisliste.PDF) und das ganze ohne weitere Fenster durchlaufen.


Also: Checkbox= false --> wie jeder normale Report.

Checkbox = true --> drucken anklicken und fertige Datei erhalten.


Habt ihr eine Idee wie soetwas realisierbar ist?

Das I-Tüpfelchen was mir noch fehlt wäre dann eine einzelne Datei pro KD-Nr. aus dem vorher definierten Bereich der Req.Form.


Mfg. André
Zuletzt geändert von Andre M am 4. April 2006 19:28, insgesamt 1-mal geändert.

28. März 2006 13:09

Die Firma GOB (zu finden über MBS-Partnersuche) hat sowas schon mal realisiert. ist unter Navision 2.6 bei unserem Kunden in Mülheim installiert.
Da könntest du mal nachfragen.
Ich kann da leider nicht mehr zu sagen, da Navision bei diesem Kunden noch von GOB betreut wird.

28. März 2006 13:14

Hallo André

Ich würde den Report aus einem Trigger starten. Der Aufruf erfolgt dann z.B. so:

REPORT.RUN(REPORT::"Segment - Cover Sheet",FALSE ,FALSE,SegHeader);

Den Namen des Reports sowie die Rec-Variable am Schluss musst Du dann natürlich auf Deine Anwendung anpassen.

Unter Fibu -> Einrichtung -> Druckerauswahlen trägst Du den Report ein, ohne einen Benutzer einzugeben und wählst unter Druckername den PDF-Druckertreiber. Somit wird der PDF-Druckertreiber zum Default für diesen Report.

Wichtig ist, die beiden Boolean-Variablen auf FALSE zu setzen. Die erste gibt an, das kein Request-Form erscheint und die zweite nimmt dann nicht den System-Standarddrucker, sondern den aus der Druckerauswahl.

Einzig das mit dem Dateinamen geht meiner Meinung nach nicht. Das ist abhängig vom gewählten PDF-Programm. Wahrscheinlich kannst Du den Dateinamen erst vergeben, wenn der Druck gestartet wurde

28. März 2006 13:25

Hallo André,

ich denke auch, dass du nicht drumherumkommst, den Dateinamen manuell anzugeben. Wenn durch das PDF-Programm die Aufforderung zur Eingabe des Dateinamens kommt, ist Navision längst aus dem Spiel und hat nichts mehr damit zu tun.

Eventuell kann man auch eine entsprechende PDF-OCX einbinden und es darüber drucken... Aber das ist sehr viel Arbeit...

Gruß, Marc

28. März 2006 13:26

Hallo Andre M,

in der in der Finanzbuchhaltung --> Einrichtung--> Druckerauswahlen kann einem Report eine Bestimmter Drucker zugeordnet werden.

Wenn der User Checkbox --> TRUE wählt, dann würde ich einen anderen Report starten (Der gleich aufgebaut ist!) (Den Aufgerufenen beenden), dieser Report ist in der FiBu Einrichtung/Druckerauswahl auf den entsprechenden Drucker vorselektiert.
Wenn deine Checkbox --> FALSE ist, wird der Aufgerufene Report abgearbeitet.

Das wäre meine Idee als Lösungsansatz.

Eine einzelne Datei sollte nicht Schwer sein. Erstelle eine Variable fom Typ "FILE", diese öffnen, mit Daten füllen und wieder schliessen.
Bei jedem Wechsel der KD-Nr. wird eine neue Datei erstellt mit zB. der KD-NR. als Dateinamen. Entweder auf den Sektions oder dem OnAferGetRecord Trigger des DataItems.
Gruß Mikka

Nachtrag:
Uhi, 3 Beiträge während ich einen geschrieben habe.
Das mit den Dateien habe ich Missverstanden, ich dachte das noch zusätzlich Exportfiles generiert werden sollten :oops:

28. März 2006 16:36

Hallo,

vielen Dank erstmal für die rege Beteiligung!

Die einzelnen Dateien mit der Kd. Nr im Dateinamen sind zwingend.

Wir müssen diese Dateien (ca. 450) dann nachher weiterverteilen und somit zuordnen.

Ich habe bei Mibuso von PDF995 gelesen und dies auch installiert. Leider habe ich keine Ahnung, wie ich die Variablen (KD. Nr als Dateinamen) an einen Drucker übergeben kann.

Rein theoretisch ähnlich wie bei Tobit Faxware!?


Mfg. André

28. März 2006 17:10

@Andre

Wir haben das so gelöst, dass wir den Report auf den Teiber des PDF-Creator (Freeware) schicken. Dies kann man ja in der Druckeruswahl definieren.
Im PDF-Creator kann man einstellen, dass der Output immer fest an einen bestimmten Ort und mit einem definierten Namen gespeichert wird (ohne Dialog).

Dann kannst Du einfach nach Report.Runmodal den generierten PDF-Output renamen und z.B. automatisch per Mail versenden.

if exists('C:\Dokument.pdf') then
Rename('C:\Dokument.pdf', 'C:\Preisliste_Kunde_xy.pdf')

Läuft bei unseren Kunden einwandfrei.

Gruss

28. März 2006 20:35

Ich verwende für die Erstellung von PDF-Dateien immer die Broadgun pdfMachine.
Dort kann man entweder per Parser (also wie bei Tobit Faxware) die Parameter im Report angeben oder auch direkt die Windows-Registry verändern, da die Konfiguration im Klartext in der Registry gespeichert ist (abgesehen von dem Kennwort für die Verschlüsselung).

29. März 2006 08:06

Guten Morgen!

Das klingt doch schonmal sehr gut! - Ich denke, dass die Lösung von Martinst mit dem umbennen gut funktionieren sollte.

Werde nachher mal testen und mich wieder melden wie es nun gemacht wird.


Vielen Dank ersteinmal!

Mfg. André

29. März 2006 12:01

Andre M hat geschrieben:Guten Morgen!

Das klingt doch schonmal sehr gut! - Ich denke, dass die Lösung von Martinst mit dem umbennen gut funktionieren sollte.

Werde nachher mal testen und mich wieder melden wie es nun gemacht wird.


Vielen Dank ersteinmal!

Mfg. André


hat das mit dem pdf geklappt? Sonst hätte ich auch noch einen bzw. zwei vorschläge

mfg michael

29. März 2006 12:08

Hi Michael,

mespelage hat geschrieben:hat das mit dem pdf geklappt? Sonst hätte ich auch noch einen bzw. zwei vorschläge


Unabhängig ob es bei André klappt, würden mich deine Vorschläge interessieren.

Gruß, Marc

29. März 2006 12:10

Hallo mespelage.
Wilkommen hier im Forum.

Nur keine falsche Scheu und schreib uns deine Vorschläge / Ideen.
Gruß Mikka

29. März 2006 12:10

bin gerade noch dabei... das drucken würde klappen, wenn ich den einzelnen Aufruf pro Kunde besser hinbekommen würde... teste da gerade noch.

Habe leider nur den normalen Report Designer Kurs mitgemacht und dort sind wir weniger auf soetwas eingegangen.

Ich habe ein DataItem "Ganzzahl" hinzugefügt und eingerückt unter der Kundentabelle. Dort möchte ich abfiltern auf eine Kundennr. , den Report erneut starten und das PDF erstellen, umbenennen, schliessen, auf den nächsten Kunden abfiltern in Ganzzahl usw.

Dabei hängt es zur Zeit leider noch.

Für andere Vorschläge bin ich aber immer offen und so sieht man auch mal unterschiedliche Möglichkeiten!


Mfg. André

29. März 2006 13:46

ich habe das bei uns so gelöst:

Als Drucker verwende ich den "maxx PDFMAILER Professionell" (ca. 100€).
Dieser Drucker kann sowohl sofort eine email versenden, als auch die Datei als pdf ablegen
In Duckerwahl (Finanzbuchaltung) den entsprechenden Report mit diesem Drucker verknüpfen.

Dann habe ich eine Form erstellt und im "On Timer Trigger" scanne ich die Kundendatei nach bestimmten Kriterien ab.
Dann übergebe ich per Funktion die Kundennummer an den Report
Im Report ist eine zusätzlicher Header der entsprechende "@@-Befehle" an der Druckertreiber übergibt

zB
@@an die gewünschte Adresse@@
@@ed den Betreff@@
@@attach c:\1.pdf@@

siehe Anlage
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

29. März 2006 14:47

@mespelage
PDFMailer kannte ich noch nicht. Coole Sache mit den Steuerbefehlen.
Danke für den Tipp

30. März 2006 12:40

Hallo,

ich habe noch 2 wahrscheinlich kleinere Probleme mit meiner Lösung...

"Tempdeb": temporäre Tabelle mit den gefilterten Daten der Quelltabelle !deb"

1. Er druckt mir immer nur den ersten Record der Tabelle Tempdeb. eigentlich sollte er sich ja dort durcharbeiten und den Preislistendruck pro Datensatz in der Tempdeb einmal anwerfen.

Die Tabelle tempdeb wird richtig gefüllt.

2. das Umbennen der PDF Datei klappt nicht, da wenn Navision das DataItem abgearbeitet hat, der Daten noch im PDF Drucker verarbeitet werden und somit nichts da ist zum umbenennen. Wenn ich es mit einer Schleife versuche, greift Navision die ganze Zeit auf die Datei zu und PDF Creator kann den Druck nicht abschliessen und die Datei erstellen.

Anbei mein Code:



Code:
OnPreDataItem()
tempdeb.DELETEALL;

OnAfterGetRecord()
deb.RESET;
deb.SETCURRENTKEY("Nr.");
IF CustFilter <> '' THEN

  BEGIN
  deb.SETFILTER(deb."Nr.",CustFilter);
  Preislistendruck.Preisliste(liste.Code);
  END;

IF deb.FIND('-') THEN REPEAT
  tempdeb.INIT;
  tempdeb."Nr." := deb."Nr.";
  tempdeb.INSERT;
UNTIL deb.NEXT = 0;


FORM.RUNMODAL(FORM:: "Datanorm Customer", tempdeb);

OnPostDataItem()
tempdeb.RESET;
IF tempdeb.FIND('-') THEN REPEAT
//  CASE deb."Nr." OF Tempdeb."Nr." :
//  BEGIN
      deb.RESET;
      deb.SETRANGE("Nr.",tempdeb."Nr.");
      Preislistendruck.USEREQUESTFORM(FALSE);
      Preislistendruck.SETTABLEVIEW(deb);
      Preislistendruck.RUN;
 
      dateiname := '"tempdeb."Nr.".pdf';
      dateinameOLD := pfad +'VK-Preisliste.pdf';

              IF EXISTS(dateinameOLD) THEN

                 BEGIN
 //                    RENAME(dateinameOLD, dateiname);
                 END

//  END;
   
     UNTIL tempdeb.NEXT = 0;
     
     tempdeb.DELETEALL;

30. März 2006 13:23

Versuche doch einmal den Inhalt von Trigger "OnPostDataItem() " in den Trigger "OnPostReport()" zu setzen

30. März 2006 13:27

bringt leider nichts. Kommt auf das gleiche Ergebnis heraus.

*grübel*

30. März 2006 13:29

>>1.
Dein erstes Problem verstehe ich nicht ganz.
Nur soviel:
Wenn Du im Report ein DataItem Integer hast, musst Du Dich um die Satzzeigerbewegung in der anzuzeigenden Tabelle selber kümmern.
Ein Beispiel dafür findest Du im Standard Report 111.
(Integer - OnAfterGetRecord())

>>2. das Umbennen der PDF Datei klappt nicht, da wenn Navision das >>DataItem abgearbeitet hat, der Daten noch im PDF Drucker >>verarbeitet werden und somit nichts da ist zum umbenennen.

Verwende vor dem Rename Sleep(2000)

Gruss
Martin

30. März 2006 13:41

ich wußte nicht dass du mit einem integer arbeitest.
Dann versuche dieses
Code:
OnPreDataItem()
Integer.SETRANGE(Nummer,1, tempdeb.COUNT;

OnAfterGetRecord()
If  Integer.Nummer = 1 Then tempdeb.FIND('-') ELSE tempdeb.NEXT;

deb.RESET;
deb.SETRANGE("Nr.",tempdeb."Nr.");
Preislistendruck.USEREQUESTFORM(FALSE);
Preislistendruck.SETTABLEVIEW(deb);
Preislistendruck.RUN;
 
dateiname := '"tempdeb."Nr.".pdf';
dateinameOLD := pfad +'VK-Preisliste.pdf';

IF EXISTS(dateinameOLD) THEN BEGIN
 // RENAME(dateinameOLD, dateiname);
END

<Offtoppic>
Der Code wurde der besseren Lesbarkeit in ein "Code-Tag" abgelegt.
Ich möchte dich bitten künftig Source Code ebenfalls in diesen abzulegen. Bei Fragen zum erstellen und editieren von Beiträgen, stehen Euch die Moderatoren gerne zur Verfügung.
Gruß Mikka

30. März 2006 15:10

Hallo,

es klappt leider nicht. Der erste Datensatz wird gedruckt- die anderen nicht.

Das hier kann ich ja so nicht verbauen:

OnPreDataItem()
Integer.SETRANGE(Nummer,1, tempdeb.COUNT);

Das einzige DataItem ist Ganzzahl. Im OnAfterGetRecord wird ja erst die tempdeb gefüllt- daher kann ich doch im OnPreDataItem() noch keine Datensätze zählen!?

Code:
OnPreDataItem()
tempdeb.DELETEALL;


OnAfterGetRecord()
deb.RESET;
deb.SETCURRENTKEY("Nr.");
IF CustFilter <> '' THEN

  BEGIN
  deb.SETFILTER(deb."Nr.",CustFilter);
  Preislistendruck.Preisliste(liste.Code);
  END;

IF deb.FIND('-') THEN REPEAT
  tempdeb.INIT;
  tempdeb."Nr." := deb."Nr.";
  tempdeb.INSERT;
UNTIL deb.NEXT = 0;
Ganzzahl.SETRANGE(Nummer,1, tempdeb.COUNT);

IF Ganzzahl.Nummer = 1 THEN tempdeb.FIND('-') ELSE tempdeb.NEXT;

deb.RESET;
deb.SETRANGE("Nr.",tempdeb."Nr.");
Preislistendruck.Preisliste(liste.Code);
Preislistendruck.USEREQUESTFORM(FALSE);
Preislistendruck.SETTABLEVIEW(deb);
Preislistendruck.RUN;

dateiname := pfad+'tempdeb."Nr.".pdf';
dateinameOLD := pfad+'VK-Preisliste.pdf';
SLEEP(2000);

IF EXISTS(dateinameOLD) THEN BEGIN

//      RENAME(dateinameOLD, dateiname);
END ;

30. März 2006 15:39

Ich finde den ganzen Code etwas merkwürdig, zumindest dann wenn Du folgendes erreichen willst.
- Durchlaufen aller Debitoren
- Alle Debitoren die eine Bedingung erfüllen in Temp. Tabelle schreiben.
- Anschliessend Temp. Tabelle durchlaufen und pro Debitor einen Report drucken.

Ist es das, was erreicht werden soll?

30. März 2006 15:46

Ja genau,

-ich gebe einen bestimmten Filter auf die Kd.Nr. vor.

-Diese Kunden werden in die Temptabelle geschrieben <- bis hierhin kein Problem!

-Pro Datensatz soll anschliessend der Report gedruckt und die PDF Datei entsprechend umbenannt werden.

Mfg. André

30. März 2006 15:59

Andre

Wieso denn dieser Report auf Basis von Integer?
Und wieso die Temp. Tabelle?
Das ganze könnte doch auch so aussehen.
Code:
Report ohne DataItem

Var Debitor Rec Debitor
Var Debitor2 Rec Debitor

Debitor.Reset
Debitor.SetFilter(<Dein Filter);
if Debitor.find('-') then
  repeat
    Debitor2.Get(Debitor.Nummer);
    Debitor2.SetRecFilter;
    Report.UseRequestForm(FALSE);
    Report.SETTABLEVIEW(Debitor2);
    Report.RUNModal;
    if exists(PDFDatei) then begin
       Rename usw.
       irgendwas machen....
    end;
  until Debitor.next = 0;

Gruss

30. März 2006 16:47

Hallo Martin...


läuft perfekt- warum einfach, wenn auch kompliziert geht? ;)

Vielen Dank für eure Hilfe!


Mfg. André