Anfängerfrage zum Druck einer Rechnung

Hallo,
ich habe mir eine 30 Tage Testversion geholt und bin nach ein paar Tagen testen auch schon relativ weit gekommen. An einem Problem komme ich aber nun einfach nicht weiter. Es handelt sich um ein Rechnungsprogramm und das Problem besteht beim Drucken.
Einzelne Rechnungen drucken klappt einwandfrei, wenn ich vor dem Druck folgendes ausführe:
ORDER BY([Positionen]lfd;>)
BREAK LEVEL(0)
ACCUMULATE([Positionen]Gesamtpreis)
ACCUMULATE([Positionen]GesamtAT)
OUTPUT FORM([Rechnung];“Ausgabe”)
PRINT SELECTION([Rechnung])

Im Umbruch habe ich noch folgendes eingefügt:
If (In break)
vGesamt:=Subtotal([Positionen]Gesamtpreis)
vSummeAT:=Subtotal([Positionen]GesamtAT)
vSummeAL:=Subtotal([Positionen]GesamtAL)
vZahlbar:=Current date+7
End if

(GesamtAT und GesamtAL sind separate Beträge für Altteile und Auslagen)

Nun möchte ich aber aus einer Liste, die sämtliche Rechnungen enthält, einige markieren und dann drucken. Ich habe einen Button “Drucken” eingefügt mit oben genannten Methode und noch USE SET(“UserSet”) davor gesetzt.
Wenn ich nun z.B. 2 Rechnungen auswähle und drucke, wird die Summe am Ende der Rechnung nur bei der zweiten Rechnung angezeigt. Bei der Ersten erscheint die ganze Umbruchzeile garnicht, die zweite Rechnung ist korrekt.

Setze ich BREAK LEVEL auf (1), wird die erste Rechnung korrekt gedruckt, bei der Zweiten erscheint die Umbruchzeile aber doppelt.

Ich vermute nun, ich habe als Anfänger reichlich dummes Zeug programmiert.
Oder ist es einigermaßen ok und wo liegt der Fehler?

Danke schonmal für jeden Tipp!
Peter Malke

Vermutlich hilft PRINT RECORD anstelle PRINT SELECTION und die Rechnungen nacheinander Drucken

OUTPUT FORM([Rechnung];“Ausgabe”)
All records([Rechnung])
ORDER BY([Rechnung]NR_oderso;>) 

While (Not(End selection([Rechnung])))  
 
 ORDER BY([Positionen]lfd;>)
 BREAK LEVEL(0)
 ACCUMULATE([Positionen]Gesamtpreis)
 ACCUMULATE([Positionen]GesamtAT)
 PRINT RECORD([Rechnung])
 // ggf noch : PAGE BREAK

  NEXT RECORD([Rechnung])
End while

Viele Grüße
Bernd

Danke, funktionierte leider auch nicht.
Ich habe es nun erstmal dabei belassen, Rechnungen einzeln auszudrucken. Die geht nun immerhin aus der Liste aller Rechnungen heraus mit folgender Objektmethode:
USE SET(“UserSet”)
vDruckAnzahl:=Records in selection([Rechnung])
If (vDruckAnzahl>1)
ALERT(“Mehrfachauswahl ist nicht möglich!”+Char(13)+“Bitte Rechnungen einzeln drucken!”)
Else
OUTPUT FORM([Rechnung];“Ausgabe”)
ORDER BY([Positionen]lfd;>)
BREAK LEVEL(0)
ACCUMULATE([Positionen]Gesamtpreis)
ACCUMULATE([Positionen]GesamtAT)
PRINT SELECTION([Rechnung])
End if
If (vDruckAnzahl=0
ALERT(“Keine Auswahl getroffen!”)
End if

Hallo Herr Malke,

freut mich, dass Sie es mit 4D einmal Versuchen :slight_smile:

Schauen Sie sich einmal den Befehl OPEN PRINTING JOB an, mit diesem lassen sich einzelne Druckaufträge bündeln.

So geht der Druck dann am Ende als ein Ganzes an den Drucker, wird aber dennoch einzeln berechnet.

Mit CLOSE PRINTING JOB wird dass ganze Packet dann an den Drucker gesendet.

https://doc.4d.com/4Dv18/4D/18/OPEN-PRINTING-JOB.301-4505816.de.html

Ich hoffe das hilft hier erst einmal weiter.

Gruß,

Christan Görgen

Danke, ich schaue mir das einmal an.
Ich habe da noch zwei weitere Fragen. Hoffe es ist ok, wenn ich die hier noch anhänge und keine extra Frage eröffne.

  1. Auf den gedruckten Seiten füge ich mit vSeite:=printing page die Seitenzahl an. Funktioniert auch tadellos. Ist es eventuell auch möglich z.B. Seite 1/3 (Seite 1 von 3) anzeigen zu lassen? Die Anzahl der Seiten steht ja bei Druckbeginn noch nicht fest (oder?), aber läßt es sich dennoch realisieren?
  2. Gibt es eine Funktion den Spalteninhalt im Ausgabeformular durch Klick auf den Spaltentitel zu sortieren. Z.Zt. habe ich mir eine unsichtbare Schaltfläche auf den Spaltentitel gelegt, mit einer Methode zum sortieren. Hiermit kann ich aber nur in eine Richtung sortieren.
  1. Sie haben recht, die Anzahl der zu druckenden Seiten liegt nicht vor, bevor Sie alles gedruckt haben. Mit 4D Write Pro würde das einfach gehen.

  2. Nehmen Sie zur Anzeige eine Listbox in einem Detailformular. Das ist der moderne Weg. Da sortieren Sie einfach über Klick auf den Spaltenheader.

Danke für die schnelle Antwort!

Ich wollte nun die Listbox einsetzen. Sieht sehr vielversprechend aus. Ich habe allerdings das Problem, dass sich die Zeilen nicht auswählen lassen. Auch der vertikale Scrollbalken reagiert nicht.
Wenn ich in der Anwendung das Formular öffne, ist die Listbox blau umrahmt. Klicke ich auf eine Zeile, ist der blaue Rahmen weg und ich kann keine Zeile markieren.
In der Eigenschaftenliste ist bei Auswahlmenge “$ListboxSet” eingetragen und bei Auswahlmodus “Mehrfach”. Bei Doppelklick auf Zeile ist “Nichts” ausgewählt, dennoch komme ich mit einem Doppelklick auf die Zeile in das Eingabeformular, allerdings immer zum Inhalt der ersten Zeile, egal auf welche Zeile ich doppelklicke.

Listbox muss in einem Eingabeformular oder in einem Projektformular sein.
(sage ich nur mal extra um unnötige Missverständnisse auszuschliessen)
(also das LB Form-Objekt gehört nicht in ein Ausgabeformular)
Hat man ein größeres Code-Standard-Gerüst selbst drumrum gebaut (in-Out-Form Handling/Manager)
welches Out- und In-Forms nutzt, dann kann man das nicht so einfach auf Listbox umstellen.
Der Umbau auf Listbox erfordert ein klein wenig mehr Aufwand
da er eben nicht mehr auf der alten Basis-Logic-Konstrukt In-/Out-Form aufbaut.
(auch wenn es mit der neuen Listbox dann wesentlich einfacher ist und weniger Code braucht)
Insbesondere meine ich die Out-Form welche dann so nicht mehr existiert.

Ah, ok. Ja, hier liegt mein Fehler! Habe es nun als Test mal in ein Eingabeformular gelegt und dort klappt es.
Danke für die Info.