[gelöst] - Übergabe an Tobit

25. Oktober 2011 13:20

Hi,

ich habe ein kleines Problem mit einem Report. Wir wollen Auflistungen der gekaufen Produkte per Fax versenden. Ich gebe also in den entsprechenden Report einen String mit Kundennummern ein, einen Datumsbereich und ab dafür an Tobit! Klappt auch wunderbar. Aber entweder nimmt Tobit immer wieder die selbe Faxnummer, oder schickt jede seite einzelnt.

Gut, habe ich mir folgendes Überlegt:

2 Header (der eine die Kopie vom aderen). Im ersten Header die Faxübergabe, im zweiten Header keine übergabe an das Faxsystem. Da der Druckauftrag ja läuft sollte das funktionieren. Unterschieden wird anhand von: currreprt.showoutput(curreport.pageno = 1 oder eben >1). Geht auch, bis ich auf den nächsten Kunden stoße. Der Report beginnt nicht wieder bei 1, sondern zählt die Seiten weiter hoch. Und schon werden die nächsten Kunden nicht mehr übertragen.

Wie bekomme ich es hin, dass der Report alle Seiten von Kunde A an Faxnummer A übrgibt und alle Seiten des Kunden B an die Faxnummer B?

Code:

currreport.showoutput(currreport.pageno = 1);
gCustomer2.RESET;
gCustomer2.SETRANGE("No.","Sales Invoice Line"."Therapy doctor");
IF gCustomer2.FIND('-') THEN BEGIN
  FAX := '@@SFX@@';
  FAX2 := STRSUBSTNO('@@nummer %1@@', gCustomer2."Fax No.");
  FAX3 := STRSUBSTNO('@@Betreff %1 %2 %3 %4@@', 'Auftrag:', "Sales Header"."No.", 'Kd-Nr.:',
                     "Sales Header"."Sell-to Customer No.");

END ELSE
CurrReport.SKIP;
CurrReport.PAGENO := 0;


Viele liebe Grüße

Chris
Zuletzt geändert von chri0211 am 28. Oktober 2011 11:50, insgesamt 1-mal geändert.

Re: Übergabe an Tobit

25. Oktober 2011 13:44

In diesem Fall würde ich nicht auf die Seitennummer gehen.
Lege dir eine Variable LastCustomerNo an.
Und prüfe diese im Header ab.
Code:
IF LastCustomerNo <> "Sales Invoice Line"."Therapy doctor" THEN BEGIN
  LastCustomerNo := "Sales Invoice Line"."Therapy doctor";
  CurrReport.SHOWOUTPUT(TRUE);
END ELSE
  CurrReport.SHOWOUTPUT(FALSE);

Das wäre das Beispiel für den Seite 1 Header.

Re: Übergabe an Tobit

26. Oktober 2011 08:19

Danke :-)

Ich werde es gleich mal ausprobieren. Bin gerade erst auf der Arbeit angekommen!
Sage dann bescheit ob es geklappt hat :-)


Chris

Re: Übergabe an Tobit

26. Oktober 2011 08:56

hm,

habe es geprüft! für den ersten kunden scheint das gut zu funktionieren! dann kommt der zweite kunde:

nehmen wir an Kunde A Nr.: 08/15 Kunde B: 4711

Kunde A läuft durch den Code, die erste Seite gibt das Signal zum Druck in Tobit! Alles gut! Nun läuft der zweite Kunde an! Die Kundennummer wird verglichen, die Kundennummer ist unterschiedliche, er läuft in Header 2. Also nicht mehr ins Faxsystem.

Lösung wird so also nicht funktionieren. Vielleicht passe ich es anstatt mit einem String auch einfach mit einem Flag auf den Kundenstammdaten an. Einfach Haken setzen und im Report abfragen: Haken gesetzt, ja/nein? Wenn ja, dann laufe in Report! Ende, nächster Datensatz. Dann fängt der Report auch wieder bei Seitenzahl 1 an und ich kann den Currreport. Showoutput mit pageno abfragen!

Grüße

Chris

Re: Übergabe an Tobit

26. Oktober 2011 09:14

Hallo,

2 Fragen/Antworten:
1. Kann Tobit in einem Druckdokument mehrere unterschiedliche Faxnummern ansprechen? Falls nein, musst du den Report für jeden Kunden neu starten.
2. Wird wenn der Kunde wechselt, eine spezielle Section ausgegeben, z.B. Adresse? Falls ja, gibst du den FAX- Befehl in dieser Section aus, und setzt die Variable im OnAfterGetRecord des steuernden Record, also "Customer" bzw. "Sales Header"


Gruß, Fiddi

Re: Übergabe an Tobit

26. Oktober 2011 09:49

pffff...

nun habe ich es so gelöst, dass der report eben zuerst ein boolean auf der contact tabelle abfragt. ist dieses boolean angehakt, soll der kunde einen ausdruck per fax erhalten.

nun das kurriose: beim ausdruck auf den drucker oder in der seitenansicht wird in den @@-Zeilen die Tobit Steuern die richtige Faxnummer angegeben. Beide Kunden werden richtig ausgedruckt. Kunde A mit Faxnummer A 3 Seiten. Kunde B mit Faxnummer B 10 Seiten. Nur wenn ich dann in Tobit Druck wird Kund A mit 3 Seiten, aber der Faxnummer von Kund B übergeben.

Habe auch noch ne Message eingebaut! Erst kommt die Rufnummer Kunde A, dann Kunde B. Warum macht der das bei der Übergabe zu Tobit umgekehrt?

@fiddi
Ob Tobit das kann... hmmmm... gute FRage. Aber daher versuche ich es ja jetzt über die Filterung! So sollte jeder Kunde ja einzeln angesprochen werden.
Wie starte ich den Report zwischen zwei Kunden neu?

Sowas doofes!

Viele Grüße

Chris

Re: Übergabe an Tobit

26. Oktober 2011 10:17

Jeder Aufruf eines Reports erzeugt genau einen Druckauftrag. Wenn Tobit nicht in einem Druckauftrag mehrere FAXe versenden kann (und das scheint nach deiner Beschreibung so zu sein), dann musst du den Report mehrmals aufrufen, und zwar einmal pro Debitor. Im Report musst du dann auf genau diesen Debitor filtern.
Den Neustart des Reports erledigst du durch einen vorgeschaltetes Form oder Codeunit, die die Debitoren filtert, und in einer while- Schleife für jeden Debitor den Report aufruft.

Gruß, Fiddi

Re: Übergabe an Tobit

26. Oktober 2011 10:41

ufff... das überteigt meinen Programmierer-Horizont um einiges!
Bin nämlich eine programmier-pfeife! Und zwar ne ordentliche :-)

wie mache ich denn ne "while" schleife?

Re: Übergabe an Tobit

26. Oktober 2011 12:07

Ich würde einen anderen Lösungsweg vorschlagen. Wenn du folgendes Codestück in den Report einbaust, wird für jeden Rechnungskopf der Report neu angestoßen. Das Problem dabei: entweder du lässt das Request-Form jedesmal anzeigen und der Anwender muss jedes Mal auf "Drucken" klicken und den Druck-Dialog bestätigen, oder du unterdrückst das Request-Form und der Anwender kann den Drucker nicht mehr auswählen. Das kann man natürlich auch alles mit entsprechenden Programmierungen abmildern. Eventuell könnte es sinnvoll sein den Report zu doppeln und dann die neue Report-ID mit dem Tobit-Faxdrucker in den Druckerauswahlen zu hinterlegen.

Hier nun der Code, der in den OnAfterGetRecord-Trigger muss. In meinem Beispiel habe ich die Rechnung benutzt:

Code:
IF NOT CurrReport.PREVIEW AND (COUNT > 1) THEN BEGIN
  SalesInvHeader := "Sales Invoice Header";
  SalesInvHeader.SETRECFILTER;
  EVALUATE(ReportID,COPYSTR(CurrReport.OBJECTID(FALSE),7));
  REPORT.RUNMODAL(ReportID,TRUE,FALSE,SalesInvHeader);
  CurrReport.SKIP;
END;

Hier noch eine kurze Erläuterung:
Code:
IF NOT CurrReport.PREVIEW AND (COUNT > 1) THEN BEGIN
Nur wenn nicht Seitenansicht und mehr als eine Rechnung gedruckt werden soll

Code:
  SalesInvHeader := "Sales Invoice Header";
  SalesInvHeader.SETRECFILTER;
SalesInvHeader ist vom gleichen Typ, wie das DataItem selbst. Danach wird auf genau einen Datensatz gefiltert.

Code:
  EVALUATE(ReportID,COPYSTR(CurrReport.OBJECTID(FALSE),7));
Report-Nummer des aktuellen Reports auslesen

Code:
  REPORT.RUNMODAL(ReportID,TRUE,FALSE,SalesInvHeader);
Report aufrufen, über die beiden boolschen Parameter steuerst du, ob das RequestForm angezeigt werden soll und ob der Windows-Standarddrucker oder der Drucker aus den Berichtsauswahlen verwendet werden soll

Das ist wirklich nur ein grobes Gerüst und fängt nicht alle Eventualitäten ab!

Re: Übergabe an Tobit

26. Oktober 2011 13:02

klingt auf jeden fall schon mal ganz gut! Habe es ausprobiert und in den "onaftergetrecord" trigger des Contact-DataItems gesetzt.

"ReportID" als Globale Variable gesetzt und die Reportnummer eingetragen.

Allerdings läuft er bei dem EVALUATE nun in einen Fehler:

Der Typ Report wurde nicht für die Funktion Definiert!



Oh man, ich weiß warum ich kein programmierer bin! Ich habe da echt noch keinen blassen schimmer von :-(

Vielen vielen lieben Dank für Euere Hilfe


sorry ist ja blödsinn was ich da erzählt habe:

ReportID muss ja auch integer sein und der code muss in den trigger auf dem data-item "sales invoice line"

hmmm...

nu bekomme ich folgenden fehler:
der Bericht hat kein Datenobjekt, das die Tabelle (Table 112 Verkaufsrechnungskopf) benutzt, die in der Funktion SetTableView angegeben wurde.

Re: Übergabe an Tobit

27. Oktober 2011 12:24

Hi zusammen,

habe mich nun entschieden den Auftruf über eine Codeunit zu machen.
Es scheint auch alles gut zu funktionieren. Es werden meherere Druckaufträge erstellt, die auch immer wieder mit Seite 1 anfangen.

Das Problem ist jetzt folgendes. Ich rufe die Funktion wie folgt auf:

Code:
OnRun()
contact.SETFILTER(contact.Auflistung,'%1',TRUE);
IF contact.FIND('-') THEN REPEAT
  MESSAGE('%1',contact);
  REPORT.RUNMODAL(50170,FALSE,FALSE,contact);
UNTIL contact.NEXT = 0;


Die Message soll mir im Prinzip nur sagen, was an den Report übergeben wird und im Report ist eine Message die mir sagt, was beim Report ankommt. Codeunit läuft los,
Message1 = Contact A. Report Läuft los Faxnummer von Contact A und dann Faxnummer von Contact B (schon sehr seltsam, weil ja bloß ein Kontakt übrgeben wird). Im nächsten durchgang der Codeunit wird dann Contact B übrgeben. Hier das gleiche Spiel: Message von Codeunit mit Übergabe von Contact B und dann zwei Messages aus dem Report mit Faxnummer von Contact B und dann Contact A. Ich verstehe das nicht.

Im Report gibt es keine Schleife, kein garnix! Mache ich beim Aufruf der Codeunit etwas falsch?

Hier mal der Code des Reports:

DataItems sind:
Contact
SalesInvLine1
SalesInvLine2

Nur auf der Section des SalesInvLine (Header) ist folgender Code für TObit hinterlegt:
Code:
Sales Invoice Line, Header (1) - OnPreSection()
CurrReport.SHOWOUTPUT(CurrReport.PAGENO = 1);
 
  MESSAGE(Contact."Fax No.");
  FAX := '@@SFX@@';
  FAX2 := STRSUBSTNO('@@nummer %1@@', Contact."Fax No.");


Das war es! Es macht mich wahnsinnig, warum das blöde System stur beide Faxnummern annimmt und dann natürlich Faxnummer A mit B überbügelt. Was dann der Grund ist, warum mittlerweile zwar zwei Faxe an Tobit übergeben werden, aber nur immer mit einer Faxnummer. Und zwar mit der falschen :-)

Vielen Dank und viele Grüße

Chris

Ach so,
wenn ich es ausdrucke, also auf einen normalen Drucker passiert folgendes: 1. Autrag = 1.Seite richtiger Kunde richtige Faxnummer in der Übergabezeile für Tobit. 2. Seite richtiger Kunde (also Kunde B) mit richtiger Faxnumme rin Übergabe an Tobit. Dann kommt der zweite Auftrag! Auch alles richtig!

Re: Übergabe an Tobit

27. Oktober 2011 14:05

Hab ich das jetzt richtig verstanden? Es geht nicht darum, dass der 1. Auftrag an Kunde A geht und der 2. Auftrag an Kunde B, sondern dass innerhalb eines Auftrages ein Teil an Kunde A und ein weiterer Teil an Kunde B gesendet wird? Da du ja nun schon weißt, dass zwei Faxe an unterschiedliche Nummern innerhalb eines Druckauftrages nicht geht (zumindest per Tobit nicht), dann ist doch klar, dass es auch weiterhin so nicht funktionieren kann. Bitte beschreibe mal deine Anforderung vollständig, damit man auch mal eine anständige Lösung präsentieren kann und nicht immer raten muss, was jetzt gewünscht sein könnte. Ist nicht böse gemeint, aber es macht so einfach keinen Sinn weiter zu raten, was dir helfen könnte.

Re: Übergabe an Tobit

27. Oktober 2011 14:09

@Tim,

Er hat einen Report, der über die Debitoren läuft, und an jeden Debitor ein FAX senden soll, was er bestellt hat. Was nur nicht geht, ist dass man das in einem Report macht, da Tobit pro Druckauftrag nur ein FAX versenden kann (anscheinend)

Gruß, Fiddi

Re: Übergabe an Tobit

27. Oktober 2011 14:12

genau!

und daher habe ich die codeunit mit dem aufruf erstellt. es sollte eigentlich so laufen:

- pro aufgerufenem report ein fax an einen kunden

aber es läuft so:

- irgendwie scheinen alle kundennummern trotz separatem auftruf in einem rutsch an den report übergeben zu werden. und so druckt der report wie folgt:

in tobit: erstellt zwei faxe, aber beide mit der selben rufnummern
auf dem drucker: erstellt zwei druckaufträge. jeder druckauftrag bekommt beide kunen zugeordnet, aber mit richtiger faxnummer. (was aber auch falsch ist, ziel wäre ja --> ein druckauftrag, ein kunde, eine faxnummer!)

grüße

chris

Re: Übergabe an Tobit

27. Oktober 2011 14:32

Warum rennst du eigentlich über Contact?

Mit der Tabelle kann es dir passieren, das du an einen Debitor mehrere Faxe sendest, weil ein Debitor mehrere Kontakte haben kann. Besser weil einfacher wäre hier wohl debitor
Lass dir doch mal die Request-Form anzeigen, und schau dir an, was du wirklich gefiltert hast.


Wenn du das über Contact machen willst, musst du folgenden Report benutzen

Code:
Contact
   Sales header (contact.No.-> Sales Header.Sell-to Contact No.)
       Sales Line   ( die üblichen Schlüssel)



Gruß, fiddi

Re: Übergabe an Tobit

27. Oktober 2011 15:05

ne,

das hat bei uns seine eigene Logik! der report ist so vorgefertigt und ich möchte den nur anpassen damit der faxversand funktioniert. warum weiß ich auch nicht, war vor meiner zeit... :-) aber damit muss ich jetzt leben. sonst muss ich den gesamten report neu aufbauen.

wenn ich mir die requestform anzeigen lasse ist das boolean feld auf "true" vorgefiltert, was die kontakte kennzeichnen soll, die überhaupt eine auflistung erhalten.

Re: Übergabe an Tobit

27. Oktober 2011 15:08

wenn ich mir die requestform anzeigen lasse ist das boolean feld auf "true" vorgefiltert, was die kontakte kennzeichnen soll, die überhaupt eine auflistung erhalten.


Das ist schon falsch. Der Report darf nur für exakt einen Kontakt aufgerufen werden. Aber aufpassen, dass er dir nicht für jeden Kontakt ein FAX baut, auch wenn der nichts bestellt hat.

Gruß, fiddi

Re: Übergabe an Tobit

27. Oktober 2011 15:17

eben,
daher habe ich ja folgenden aufruf in der codeunit geschrieben:

Code:
contact.SETFILTER(contact."Auflistung",'%1',TRUE);
IF contact.FIND('-') THEN REPEAT
  MESSAGE('%1',contact);
  REPORT.RUNMODAL(50170,FALSE,FALSE,contact);
UNTIL contact.NEXT = 0;


ich glaube ich weiß was passiert! habe den oberen code gerade man nur mit setfilter, findfirst und runmodal angewendet. ohne die schleife. also er sollte nur einen contakt an den report übergeben. es kommt eine seite raus, mit beiden kontakten! und dafür ist die filterung mit den boolean verantwortlich! sprich: es wird überhaupt darkeine kundennummer an den report übergeben!

die codeunit findet anhand des quellcodes 2 entsprechende kontakte! gibt aufgrund des runmodal/contact die filterrung "auflistung" an den report weiter. der report filtert dann noch mal die gefundenen kontakte, findet 2 und druckt diese aus. dann macht die codeunit das für den zweiten gefunden kontakt, der report findet wieder zwei, und druckt diese aus.

ich muss jetzt also dem report noch irgendwie die kundennummer übergeben. nur wie?

Re: Übergabe an Tobit

27. Oktober 2011 15:32

du Musst Contact auf eine Contact."No." filtern, sonst macht der Report alle die zum Filter passen. Deine Requestform muss auch eine Filter auf Contact."No." anzeigen.

Gruß, Fiddi

Re: Übergabe an Tobit

27. Oktober 2011 15:36

ich glaube ich stehe gerae voll auf dem schlauch!
sprich ist müsste in der codeunit noch einen setfilter einbauen. aber wenn ich diesen nicht fest auf eine kundennummer setzen kann, wie mache ich den setfilter dann!

Bitte verzeiht, aber ich bin absolut kein programmierer und muss das hier nur machen, weil ich mal irgendwo was aufgeschnappt habe :-)

Re: Übergabe an Tobit

27. Oktober 2011 16:03

chri0211 hat geschrieben: sprich: es wird überhaupt darkeine kundennummer an den report übergeben!
Doch, es wird die Filterung der Contact-Variablen übergeben. Du musst in der Schleife noch die Variable kopieren und mit SETRECFILTER, auf genau einen Datensatz abfiltern. Beispiel siehe mein obiges Posting.

chri0211 hat geschrieben:Im Report gibt es keine Schleife, kein garnix!
Und hier ist auch dein Denkfehler dazu. Jedes DataItem in einem Report wird ja automatisch als Schleife durchlaufen. Und zwar alle Datensätze, die sich im Dataset befinden.

Re: Übergabe an Tobit

27. Oktober 2011 17:05

hey,

sieht so aus als ob es klappen würde :-)

mensch, vielen vleien lieben dank! ich teste es morgen noch mal und sage dann endgültig bescheit!

schönen Abend

Chris

Re: Übergabe an Tobit

28. Oktober 2011 08:52

Hallöchen!

Also, ich habe es noch mal versucht und es klappt einwandfrei! Echt super!!! Vielen Dank noch mal an alle die geholfen haben! Wirklich klasse!!!

BTW: wie bestimmt man in Navision ein Jahr automatisch?

Ziel soll sein, dass abhängig vom heutigen Tag ein Datumsbereich automatisch weggefiltert wird. Dazu ist es aber müßig das Jahr fest zu hinterlegen.
Mag gar keinen Quellcode haben. Lieber einen Tipp und ich kann es dann mal selbst versuchen :-)

Lieben dank und einen schönen Freitag!

Chris

Re: Übergabe an Tobit

28. Oktober 2011 09:01

Dann schau dir calcdate an.

Re: Übergabe an Tobit

28. Oktober 2011 09:25

hm,

angesehen! da weiß ich nicht so recht ob es mir hilft.

ziel ist im bezug auf den erstellten report die listen datumsabhängig für alle quartale des jahres zu erstellen. ich stelle mir nun also eine folgende abfrage vor:

Code:
if (today > 3103JJ) and < (3004JJ) then begin  //dies, weil die Listen definitiv im Monat nach dem Quartal gedruckt werden.
  StartDate := 0101JJ;
  EndDate := 3103JJ;
end;

if (today > 30.06) and < (3107JJ) then begin 
  StartDate := 0104JJ;
  EndDate := 3006JJ;
end;



Und so weiter für die nächsten Quartale. Nun sehe ich für mich das Problem, dass ich zwar mit CALCDATE Daten ausgehend von einem Datum ein anderes berechnen kann.
Aber: von einem Datumsbereich finde ich das etwas schwierig.

Weiß jemand einen Ansatz?
Chris