PDA

Vollständige Version anzeigen : Mal wieder: Summen im Bericht


Mattes
24.10.2001, 13:51
Hallo Leute,

ich brauch mal Eure Hilfe. Für folgendes, bestimmt alltägliche Problem finde ich keinen Ansatz.

In einem Rechnungsprogramm werden Menge, Nettobetrag und MwST-Satz gespeichert.

Im Bericht wird pro Datensatz der Gesamttnettopreis aus dem Produkt von Nettobetrag und Menge errechnet.

Nun möchte ich zwei Summen berechnen. Eine Summe für alle Datensätze mit 7% Mwst, eine zweite Summe für alle Datensätze mit 16% Mwst.

Wie kann ich sage: Hau den Betrag auf die Summe drauf, aber nur wenn...

Jochum Rainer
24.10.2001, 13:56
Hallo Mattes!
Indem du beim Formatieren im Detailbereich die MWST überprüftst und in zwei Variablen wegschreibst. Diese Variablen kannst du dann im Berichtsfuß an ungebunde Textfelder übergeben und anzeigen lassen.

Gruesse
Rainer Jochum

Mattes
24.10.2001, 14:24
Hallo Rainer,

starte gerade erst in VBA, habs mal so probiert:

Private Sub Detailbereich_Format(Cancel As Integer, FormatCount As Integer)

Dim Summe7 As Integer
Dim Summe16 As Integer


If Me.mwst = 7 Then Summe7 = Summe7 + (Me.Einzelpreis * Me.Menge) Else Summe16 = Summe16 + (Me.Einzelpreis * Me.Menge)

Me.Text94 = Summe7
Me.Text95 = Summe16

End Sub

....klappt irgendwie nicht.

Kannst Du mir mal weiterhelfen? Ich will's ja lernen.

Andi_D
24.10.2001, 15:19
Deine Methode erfasst immer nur den ersten Datensatz in deinem Formular.

Wenn Du die Netto-Summe für jeden Artikel nicht direkt im Recordset zusammenzählst, mußt Du das später über RecordsetClone machen (schneller und eleganter ist es natürlich über DAO!):

Me.RecordsetClone.MoveFirst

Do Until Me.RecordsetClone.EOF = True
Me.Bookmark = Me.RecordsetClone.Bookmark
If Me.Mwst = 7 Then
Me.Text94 = Me.Text94 + (Me.Einzelpreis * Me.Menge)
Else
Me.Text95 = Me.Text95 + (Me.Einzelpreis * Me.Menge)
End If

Me.RecordsetClone.MoveNext
Loop

P.S.

Wenn Du mit Währungen arbeitest, nicht den Datentyp Integer verwenden. Dieser läßt nämlich nur gerade Zahlen zu. Wenn Du mal den Preis 3,50 DM hast, rundet Integer kommentarlos auf 4 auf !)

Gruz Andi...

Mattes
24.10.2001, 15:28
Hallo Andi,

Danke für Deine Hilfe. Hab den Code wie folgt geändert, jetzt kommt ne Fehlermeldung, von wegen Methode nicht bekannt.

Dim Summe7 As Integer
Dim Summe16 As Integer


Summe7 = 0
Summe16 = 0

Me.RecordsetClone.MoveFirst

Do Until Me.RecordsetClone.EOF = True
Me.Bookmark = Me.RecordsetClone.Bookmark
If Me.mwst = 7 Then
Me.Text94 = Me.Text94 + (Me.Einzelpreis * Me.Menge)
Else
Me.Text95 = Me.Text95 + (Me.Einzelpreis * Me.Menge)
End If

Me.RecordsetClone.MoveNext
Loop

End Sub

Welchen Datentyp nehme ich am Besten für Währung?

Jochum Rainer
24.10.2001, 15:30
Hallo Mattes!

Vom Prinzip her stimmt es schon, was du da machst.
Dein Beispiel arbeitet alle DS ab!!
Werden deine DS im Detailbereich angezeigt?
Das müssen sie für diese Vorgehensweise.
Im Detailbereich wird nacheinander jeder DS "durchlaufen".
Dabei musst du dein MWST Feld überprüfen.
Die beiden Variablen muessen global definiert werden,da du ansonsten im Berichtsfuss keinen Zugriff darauf hast.

Die Zuweisung der Variablen an die ungebunden Textfelder darf natürlich erst im Berichtsfuss erfolgen.

Falls es ganz klemmt kann ich dir mal ein Beispielbericht schicken!

Gruesse
Rainer Jochum

Mattes
24.10.2001, 15:39
Hallo Rainer,

au ja, Beispiel wäre toll. VBA ist neu für mich. In Formularen klappt's mittlerweile ganz gut, in Berichten benutz ich VBA heute zum ersten mal. Irgendwie klemmt's da bei Me.RecordsetClone.Move First.

Im Detailbereich werden alle Datensätze korrekt angezeigt.

Andi_D
24.10.2001, 15:41
Der Code ist natürlich für das Formular gedacht. Im Bericht funzt das ganze nicht. Wenn Du alles direkt im Bericht zusammenzählen willst, ist folgende Methode besser:

zähle den Gesamt-Nettopreis (Einzelpreis * Menge) noch im Datensatz zusammen und schreibe alles in ein neues Tabellenfeld

z.B. direkt im Formular bei Eingabe der Menge:
Me.GesamtNetto = Me.Einzelpreis * Me.Menge
Me.Summe7 = Me.Summe7 * 1.07
Me.Summe16 = Me.Summe16 * 1.16

Dann kannst Du im Bericht die Summe direkt
über die Formularfelder angeben...

P.S.

Datentyp Double für Kommazahlen benutzen...

Gruz Andi...

Mattes
24.10.2001, 15:50
Hallo Andi,

genau so hab ich es per Anfügeabfrage gemacht. Der Benutzer gibt Artikel, Einzelpreis und Menge, sowie den Mwst-Satz ein. Beim Schliessen wird die Abfrage ausgeführt, und berechnet Datum, Kundennummer, brutto7, brutto16, gesamtnetto.

Hat alles super funktioniert.

Bis:....

Eine Rechnung, wenn ich Sie schon abspeichere, soll auch geändert werden können! Wenn ich die entsprechenden DS jetzt aufrufe, und z.B. die Menge ändere, wird die Summe etc. nicht neu berechnet!

Außerdem hab ich gelesen, man soll nie berechnete Werte abspeichern, da man sie ja jederzeit an jedem Ort aus den vorhandenen Daten neu berechnen kann!

Daher meine Idee, die Summen erst im Bericht zu berechnen.

Jochum Rainer
24.10.2001, 15:57
Hallo Mattes!

Den lezten Vorschlag von Andi_D kannst du auch benuzten. Wobei die Werte aber nicht in Tabellenfelder sondern in ungebunde Textfelder geschrieben werden muessen.
Und bei seinen Beispiel wird nur ein DS weggeschreiben und nicht mehrere.
Richtig z.B. so:
Me.GesamtNetto = Me.GesamtNetto+(Me.Einzelpreis * Me.Menge)

Der bringt dir das gleiche Resultat.
Du summierst dann anstatt im Detailbereich des Berichts im Formular bei der Eingabe.
Das Ergebnis kann dann im Berichtsfuss zugewiesen werden.

Falls du an der Berichtslösung trotzdem interessiert bist, schick ich dir ein hübsches Beispiel zu.

Meiner Meinung gehören diese Berechnungen in einen Bericht!

Gruesse
Rainer Jochum

Mattes
24.10.2001, 16:04
Hi Rainer,

bitte sei so nett und Mail mir mal ein Beispiel. Ich seh vor lauter Bäumen den Wald nicht mehr.

Die Logik ist eigentlich klar, aber im Moment klappt Me.RecordsetClone.MoveFirst schon nicht.

Ich denke ich muß evtl. die DAO Libary einbinden?

Keine Ahnung!

Mattes
25.10.2001, 07:32
@alle:

Vielen Dank für Eure Hilfe

@Rainer:

Du hast was gut bei mir! Der Bericht funzt hervorragend. Bei mir hakts dann immer noch an Kleinigkeiten.

Vielen Vielen Dank!