Access-o-Mania

Access-Forum => Access Programmierung => Thema gestartet von: BikeArno am März 15, 2021, 10:00:30

Titel: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am März 15, 2021, 10:00:30
Hallo,

ich habe eine, hoffentlich einfache, Frage: Ich erstelle einen Access-Bericht. Dort gibt es u.a. das Feld "Ausgaben in Euro". Ich benötige im Bericht die durchschnittlichen Ausgaben über alle Datensätze. Diese möchte ich im Detailbereich des Berichtes über ein Textfeld ausgeben.

Ich scheitere :'(. Mein Vorgehen war:

- Ich habe ein Textfeld eingefügt
- Im Seuerelementeninhalt habe ich eingegeben: =Mittelwert([AusgabenEuro])
- Ergebnis: #Fehler

Für mich erschien das logisch... Was habe ich also falsch gemacht und wie macht man es (möglichst einfach) korrekt?

Gruß
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am März 15, 2021, 10:15:12
Hallo,
im Detailbereich kann man nicht aggregieren. Das Feld würde ja für jeden Datensatz wiederholt werden. Auch in einem Seitenkopf/fuß geht das nicht.
Das geht nur im Berichtskopf/fuß oder in einem Gruppenkopf/fuß.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am März 15, 2021, 11:02:23
Zitat von: MzKlMu am März 15, 2021, 10:15:12Das geht nur im Berichtskopf/fuß oder in einem Gruppenkopf/fuß.

Danke. Im Berichtsfuß kommt leider die gleiche Fehlermeldung. Ist der Code
=Mittelwert([AusgabenEuro])korrekt?

Kann man den Datenbereich mittels Code theoretisch auch durch eine Where-Klausel begrenzen? Also z.B. bilde den Mittelwert, wenn AusgabenEuro nicht Null? 
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am März 15, 2021, 11:25:13
Hallo,
Zitatwenn AusgabenEuro nicht Null?
das macht die Mittelwertfunktion automatisch.
Ist das Feld "AusgabenEuro" ein berechnetes Feld ?
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: andyfau am März 15, 2021, 12:00:27
Hallo Klaus,
Zitat von: MzKlMu am März 15, 2021, 11:25:13das macht die Mittelwertfunktion automatisch.
Gehe ich nicht recht in der Annahme, dass es nicht egal ist wenn ich Nullwerte (Zahl 0) mit einfliessen lasse:
Mittelwert = Summe(Werte)/Anzahl(Werte). Wenn da bei Anzahl(Werte) Nuller dabei sind ist das doch nicht egal.
Oder gibtes, umgekehrt gefragt, eine Mittelwert-Funktion die die Nullersaetze mit zaehlt?
Du meinst wahrscheinlich den Feldinhalt NULL ,der ja nicht gleich Zahl 0 ist, Dann stimmt das natuerlich.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am März 15, 2021, 12:16:25
Hallo,
wenn von Null im Zusammenhang mit Datenfeldern die Rede ist, dann meine ich nicht die Zahl.
Wenn die Zahl 0 im Feld ist, so muss diese natürlich in die Mittelwertbildung einfließen, denn es ist ja ein Wert. Es sei denn, ich will das explicit nicht haben, dann muss die Zahl 0 per Where ... ausgeschlossen werden.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am März 15, 2021, 15:22:06
ZitatIst das Feld "AusgabenEuro" ein berechnetes Feld ?

Sowohl als auch. Habe es sowohl mit einem berechneten als auch einem unberechnetem Feld probiert: #Fehler.
Zur Verdeutlichung lade ich einmal einen Beispieldatensatz mit Bericht hoch.

Desweiteren möchte ich den Mittelwert im Beispiel eigentlich an eine Bedingung knüpfen und z.B. nur dann berechnen, wenn Kriterium A im Datensatz = "Ja". Die übliche Where-Klausel kann man hier aber scheinbar nicht nutzen...
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: DF6GL am März 15, 2021, 16:35:25
Hallo,

im anderen Thread habe ich darauf hingewiesen, dass der Datentyp des Tabellenfeldes "Stunden" in "LONG" zu ändern ist...

Weiterhin sinnvoll ist:  "KriteriumA" und "KriteriumB" in Datentyp "JA/NEIN" zu konvertieren.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am März 15, 2021, 16:38:35
Hallo,
das kann doch nicht gehen, auf dem Bericht gibt es kein Feld mit dem Namen Stunden. Wie willst Du da einen Mittelwert bilden ?

Du musst hier eine Aggregatfunktion einsetzen:
=DomMittelwert("Stunden";"qry_Datensatz";"KriteriumA = 'Ja'")
Und natürlich den Datentyp ändern, wie willst Du mit kurzem Text rechnen ?
Es geht zwar, weil Access da tolerant ist, aber trotzdem.

Warum nimmst Du für die Kriterien nicht Ja/Nein Felder statt Text ?
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am März 16, 2021, 13:11:32
Stimmt, ich habe die Datentypen geändert. War mein Fehler...

Danke Klaus, die DomMittelwertfunktion hilft; sogar im Detailbereich des Berichtes.

Nachtrag zum Kriterium:

Bisher habe ich das SQL-Kriterium auch genutzt, um bestimmte Datensätze für Berechnungen zu wählen. Diese habe ich über ein LIKE-Kriterium definiert
Where ID Like "ID.01.*"
Fiktives Beispiel = Mittelwerte aus allen Datensätzen mit ID.01.*** und Kriterium = "Ja". Dieser Code erzeugt einen Fehler:

=DomMittelwert("Stunden";"qry_Datensatz";"KriteriumA='Ja'" Und ID LIKE "'ID.01*'")
Auch folgender Code funktioniert bei mir nicht, bei dem ich nur Datensätze in den Mittelwert aufnehmen möchte, wenn die Stundenzahl größer Null ist:

=DomMittelwert("Stunden";"qry_Datensatz";"KriteriumA='Ja'" Und "Stunden >0")
Sieht jemand den Fehler? Danke nochmal.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am März 18, 2021, 14:01:48
Hallo,

hat niemand eine Idee oder ist mein Vorhaben unmöglich?

Ich muss einen Mittelwert mittels Aggregatfunktion berechnen, wenn 2 Kriterien erfüllt sind. Ist eine Mittelwertberechnung mit 2 Kriterien nicht möglich? Ich habe recherchiert, aber trotzdem keine Lösung gefunden. Mein Vorgehen war (beispielhafter Code, siehe Anhang) so:

=DomMittelwert("Stunden";"qry_Datensatz";"KriteriumA='Ja'" Und "Ausgaben>0")
Ich erhalte #Fehler.

Gruß
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am März 18, 2021, 14:18:20
Hallo,
der 2. Ausdruck:
=DomMittelwert("Stunden";"qry_Datensatz";"KriteriumA='Ja' And Ausgaben > 0")Access ist in manchen Teilen nicht ganz vollständig eingedeutscht. In einem Ausdruck müssen die englischen Befehlsworte verwendet werden.
Zu dem ersten Ausdruck:
Was ist denn ID.01 ?
Welcher Datentyp ist denn die ID ?
Erkläre das mal genauer.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am März 19, 2021, 11:15:29
Hallo Klaus,

dein Code funktioniert, das hätte ich nicht hinbekommen, obwohl es so simpel scheint! Tausend Dank!

Gruß
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 13, 2021, 17:10:03
Ich muss mich hier nochmal melden, da ich an einer weiteren Mittelwertberechnung scheitere. Der Unterschied hier ist, dass ich den Wertebereich (Ausreiser) eingrenzen möchte. Und zwar möchte ich im Beispiel nur Werte berücksichtigen, die unter dem Wert von 5.000 liegen. Ich erhalte dabei jedoch eine Fehlermeldung. Folgenden Code nutze ich:

=Runden(DomMittelwert("Betrag";"qry_Datensatz";"Betrag < 5000 AND KriteriumA='true' AND KriteriumB like 'DS*'");2)
Wenn ich beim Kriterium <5000 hingegen schreibe '<5000' erscheint zwar keine Fehlermeldung, der Mittelwert wird jedoch dann ohne dieses Kriterium zu berücksichtigen berechnet.

Hat jemand eine Idee, was ich falsch mache?
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 13, 2021, 17:15:50
Hallo,
ZitatIch erhalte dabei jedoch eine Fehlermeldung.
Und die lautet ?

PS:
Bitte die Fehlermeldungen immer vollständig zitieren.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 13, 2021, 17:31:24
Zitat von: MzKlMu am April 13, 2021, 17:15:50Bitte die Fehlermeldungen immer vollständig zitieren.

Die Fehlermeldung lautet #Fehler.

Ich wollte oben noch die Frage ergänzen, wie man den Code so ergänzen kann, dass Werte für eine Mittelwertsberechnung nur dann hinzugezogen werden, wenn diese in einem Wertebereich (also z.B. zwischen 1.000 und 5.000) liegen. Mit einem AND kann das ja nicht funktionieren...
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 13, 2021, 18:04:03
Hallo,
natürlich geht das mit And.
=DomMittelwert("Betrag";"qry_Datensatz";"Betrag >=1000 And Betrag <=5000 AND KriteriumA= True AND KriteriumB like 'DS*'")Wenn True aus einem Ja/Nein Feld kommt, so entspricht True der Zahl -1, dann müssen die Hochkomma entfallen.
Runden habe ich mir jetzt gespart.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 14, 2021, 08:59:28
Hallo Klaus,

es bleibt bei meiner Fehlermeldung (#Fehler), wenn ich den Code anwende, ohne die Zahlen für das Kriterium in Hochkomma zu setzen:
 
=DomMittelwert("Betrag";"qry_Datensatz";"Betrag >=1000 And Betrag <=5000 AND KriteriumA= True AND KriteriumB like 'DS*'")
Der Fehler bleibt auch, wenn ich  nur ein Kriterium anwende (also z.B. <=5000).

Setze ich hingegen eine Zahl (<='5000') in Hochkomma, kommt kein #Fehler, aber es wird nicht das korrekte Ergebnis berechnet (Mittelwert wird größer, obwohl ich den Wertebereich eingegrenzt habe). Setze ich beide Zahlen des Wertebereichs in Hochkomma, erscheint wieder ein #Fehler. Ratlos.

Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 14, 2021, 09:50:36
Hallo,
zeige bitte mal die Abfrage (SQL).
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 14, 2021, 16:43:09
Zitat von: MzKlMu am April 14, 2021, 09:50:36zeige bitte mal die Abfrage (SQL).

So:

=Runden(DomMittelwert("Betrag";"qry_Datensatz";"Betrag >=300 AND Betrag<=3000 AND KriteriumA='ok' AND KriteriumB like 'DS*'");2)
Der Wert "true" ist inzwischen durch "ok" ersetzt, deshalb in Hochkomma.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 14, 2021, 16:50:09
Hallo,
nein, das ist doch kein SQL einer Abfrage.
Ich meine den SQL Text der Abfrage qry_Datensatz.

Wo kommt denn das Ok her, wird das als Text genau so eingetragen ?
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 14, 2021, 17:16:34
Die Datengrundlage kommt ursprünglich aus einer Union-Abfrage. Diese wird dann nochmals mit einer anderen Abfrage per Select kombiniert. Das Feld "Betrag" wird dabei aber nicht verändert. Ich befürchte aber, dass der "Betrag", also die "Zahlen", vom Datenzuliefererer als Text formatiert sind. Kann man diese in der o.g. Abfrage als Zahl umwandeln um zu schauen, ob das eine Lösung bringt? (Merkwürdig aber, dass eine (wenn auch fehlerhafte) MW-Berechnung stattfindet, wenn die "Zahlen" in Hochkomma stehen; aber nur mit einem Kriterium.)

Das OK über die o.g Abfrage als Text "Ok" vergeben.

 
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 14, 2021, 17:31:28
Hallo,
warum zeigst Du nicht diese Abfrage ?

Der Betrag ist vermutlich Text, das muss als Zahl umgewandelt werden.
ZitatMerkwürdig aber, dass eine (wenn auch fehlerhafte) MW-Berechnung stattfindet,
Access ist da tolerant bei Berechnungen, aber ein Vergleich mit <= bzw. >= funktioniert bei Text nicht.
Da wäre z.B. "60" gößer als "500".

Versuche es mal so:
=Runden(DomMittelwert("Betrag";"qry_Datensatz";"ZCurrency(Betrag) >=300 AND ZCurrency(Betrag) <=3000 AND KriteriumA='ok' AND KriteriumB like 'DS*'");2)
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 15, 2021, 09:52:17
Zitat von: MzKlMu am April 14, 2021, 17:31:28Versuche es mal so:
=Runden(DomMittelwert("Betrag";"qry_Datensatz";"ZCurrency(Betrag) >=300 AND ZCurrency(Betrag) <=3000 AND KriteriumA='ok' AND KriteriumB like 'DS*'");2)

Klingt plausibel. Ich habe den Code genauso versucht, erhalte jedoch wieder #Fehler (auch, wenn ich nur ein Werte-Kriterium nehme).
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 15, 2021, 11:03:47
Hallo,
ich "bettele" jetzt zum letzten Mal um den SQL Text der Abfrage (qry_Datensatz).
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 15, 2021, 12:00:20
Zitat von: MzKlMu am April 15, 2021, 11:03:47ich "bettele" jetzt zum letzten Mal um den SQL Text der Abfrage (qry_Datensatz).

Der Code sieht wie folgt aus, wobei mir hinsichtlich der betreoffenen Felder nichts besonders auffällt bzw. dieser Code mehrere Seiten lang wäre. Ich habe den hier gekürzt. Es geht um die Felder Betrag1 bis Betrag3:

SELECT qry_Datensatz.ID, tbl_Land.Bundesland, qry_Kurse.[Name], qry_Kurse.Bundesland, IIf([StatusV]="Begonnen","Begonnen",[StatusA]) AS Status, qry_Datensatz.Beginn, qry_Datensatz.Ende, qry_Datensatz.Vertrag, qry_Datensatz.ID, qry_Datensatz.Geburtstag, qry_Datensatz.Geschlecht, qry_Datensatz.Betrag1, qry_Datensatz.Betrag2, qry_Datensatz.Betrag3, IIf(Val(Nz([GeburtsdatumTN],0))=0,0,DateDiff("yyyy",[GeburtsdatumTN],Date())+(Format(Date(),"mmdd")<Format([GeburtsdatumTN],"mmdd"))) AS AntragAlter
FROM (qry_Datensatz LEFT JOIN qry_Kurse ON qry_Datensatz.ID = qry_Kurse.[Träger-ID]) LEFT JOIN tbl_Land ON qry_Datensatz.ID = tbl_Land.TID;
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 15, 2021, 12:46:20
Hallo,
der gezeigte Code ist nicht der Code der Abfrage "qry_Datensatz".

Das ist ziemlich verwirrend.
In dem Mittelwertausdruck steht "Betrag", laut Deiner Aussage gibt es aber Betrag1, Betrag2 und Betrag3, aber im Ausdruck ist davon nichts zu sehen.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 15, 2021, 13:43:50
Zitat von: MzKlMu am April 15, 2021, 12:46:20Das ist ziemlich verwirrend.
In dem Mittelwertausdruck steht "Betrag", laut Deiner Aussage gibt es aber Betrag1, Betrag2 und Betrag3, aber im Ausdruck ist davon nichts zu sehen.

Entschuldigung für die Verwirrung: Ich hatte oben den Code oben gekürzt, um die Fehlersuche zu vereinfachen. Feld "Betrag" kommt mehrfach vor, ist aber identisch formatiert. Wenn es bei Betrag1 richtig berechnet wird, geht es auch bei den anderen Feldern.

Ich habe inzwischen folgendes probiert: In der Abfrage qry_Datensatz habe ich bei "Betrag1" die Zahlen (die als Text formatiert sind) mittels ZCurrency im Euro-Werte umgewandelt. Dannach erneut den Code für den Mittelwert genutzt.

Der Mittelwert wird nun für die Kriterien "KriteriumB und "DS*" korrekt berechnet:

=Runden(DomMittelwert("Betrag";"qry_Datensatz";"KriteriumA='ok' AND KriteriumB like 'DS*'");2)
Sobald jedoch als weiteres Kriterium der Wertebereich 300 bis 3000 ins Spiel kommt, ernte ich wieder diese #Fehler-Meldung.

=Runden(DomMittelwert("Betrag";"qry_Datensatz";"Betrag >=300 AND Betrag<=3000 AND KriteriumA='ok' AND KriteriumB like 'DS*'");2)
Also schein die MW-Berechnung mit den Eurowerten schon grundsätzlich zu funktionieren, nur mit der Eingrenzung des Wertebereichs scheint es ein Problem zu geben. Aber welches?
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: MzKlMu am April 15, 2021, 19:48:19
Hallo,
der SQL Text der Abfrage fehlt immer noch. Der in #25 gezeigte SQL Text ist nicht die Abfrage.

Die Abfrage (qry_Datensatz) selbst solltest Du bitte mal zeigen.
Gibt es in dieser Abfrage das Feld "Betrag" (also ohne eine Zahl hinten).
Du sprichst von Betrag1 und im Ausdruck steht nur Betrag, was ist denn nun richtig? Daher hätte ich ja gern mal die Abfrage gesehen, aber die scheint streng geheim zu sein.
Titel: Re: Einfachen Mittelwert in einem Bericht anzeigen
Beitrag von: BikeArno am April 16, 2021, 08:52:50
Zitat von: MzKlMu am April 15, 2021, 19:48:19Gibt es in dieser Abfrage das Feld "Betrag" (also ohne eine Zahl hinten).

Danke für die Geduld. Ist nicht geheim, aber ich schäme mich etwas für die Qualität und der SQL-Code ist unmenschlich lang. Sowohl in der Abfrage (qry_Datensatz) als auch im Diagramm-Code steht der Feldname korrekt (also "Betrag1" usw.). Habe alles abgeglichen.

Vielleicht reden wir aneinander vorbei: Das Feld "Betrag1" generiert sich bei mir wie folgt:
1) Es gibt in eine Tabelle mit den ursprünglichen Feldern "Betrag1" usw.; hier sind Zahlen als TExt formatiert. 
2) Dann gibt es eine Unionabfrage, in der mehrere Tabellen vereint werden (auch das Feld "Betrag1".
3) Es gibt die im #25 gepostete Abfrage. Möchtest du zusätzlich die Union-Abfrage 2) sehen?

In 1-3 ist das Feld unverändert als "Betrag1" gelabelt und es findet auch keine Berechnung und dergleichen statt. Die Werte werden quasi "durchgereicht".

Am Ende steht halt eine Abfrage mit den Werten die ich für die MW-Berechnung eingrenzen möchte und eigtenlich müsste das doch unabhängig von der vorherigen Abfragen gehen? Oder worauf sollte ich da vielleicht noch achten?

Fazit: Die MW-Berechnung funktioniert ja auch, nur nicht die Eingrenzung des Wertebereichs. Der Wurm muss doch dann hier drin sein?
Nachtrag: Ich habe nun testweise die Werte ("Betrag1") in der Ursprungstabelle von Text in Zahlen umformatiert. Auch so funktioniert die Werteeingrenzung mittels o.g. Code nicht. Gleiches Ergebnis, wenn ich die Berechnung direkt mittels der Werte in der Ursprungstabelle vornehme (die Abfragen also umgehe).