Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: OEACC am Oktober 25, 2010, 12:46:42

Titel: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: OEACC am Oktober 25, 2010, 12:46:42
Hallo,

ich habe eine Buchungssatztabelle, in der u.a. in jedem Satz Datum, Kundennr, Kassennr und Betrag stehen. Jeder Kunde ist fest einer Kassennr verbunden. Ein Kunde kann n Sätze in einem Monat haben.

Ich möchte jeweils für einen zu selektierenden Monat eine Übersicht haben, in der ein Summensatz steht , der die Summe Kunde innerhalb einer Kassennr steht.

Das Ziel ist : Mit einem Serienbrief möchte ich je einen Brief pro Kunde erzeugen, der an die entsprechende Kasse geht.
_________________________________________________________________________________________________________

Meine Versuche mit Datumsparameter auf die Abfrage gehen fehl, da der Serienbrief dann Fehler wegen Parameter ausweist.
Lasse ich die Parameter weg und gebe den Abrechnungsmonat im Serienbrief vor, dann funktioniert alles, bis auf das Problem, dass ich pro Kunde nicht einen Brief mit der Summe des Monats erhalte, sondern jeweils einen Brief mit den Einzelsummen.

Als Alternative könnte ich mir auch vorstellen, einen Bericht zu erhalten, bei dem ich den Monat und die Kasse selektieren kann. Wie ich es auch mit den Abfragen/Berichten versuche, komme ich nicht weiter.

Da ich als ehrenamtlicher für meien Verein (leider kein Geld) das Problem lösen möchte, wäre ich sehr dankbar für Hilfe.



Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: database am Oktober 25, 2010, 13:32:20
Grüß dich,

du kannst deine Buchungssatz-Tabelle mit folgender SQL dazu abfragen.


SELECT tblBuchungen.Kundennr, tblBuchungen.Kassennr, Sum(tblBuchungen.[Betrag]) AS Monatssumme, Month([Datum]) AS Monat
FROM tblBuchungen
GROUP BY tblBuchungen.Kundennr, tblBuchungen.Kassennr, Month([Datum])
HAVING Month([Datum])=[Monat eingeben];


...liefert die Ergebnisse für das angegebene Monat - zeigt die Kundennr, die Kassennr, die Monatssumme und das betroffene Monat
(Das Monat ist hier als Zahl einzugeben)

Besser wäre es, diese Auswahl in einem Formular zu treffen und die Abfrage entsprechend der getroffenen Wahl zu aktualisieren um das leidige Parameterfeld nicht bedienen zu müssen.
Ausserdem würde ich es so gestalten, dass für die Serienbrieferstellung die Ermittelten Daten immer in eine Tabelle geschrieben werden, an die der Serienbrief fest gebunden werden KANN.
Der Tabelleninhalt wird dann bevor eine neue Briefserie zu erstellen ist (bzw. die Abfrage aus dem Formular heraus veranlasst wird) gelöscht und mit den aktuellen Abfrageergebnissen befüllt.

BTW ist das gelieferte Ergebnis in der Form natürlich für einen Serienbrief nicht 1:1 zu verwenden, da ja ausser der Kundennummer keinerlei Informationen zu den  Empfängern der Briefe ausgelesen wurden.
Diese (Namen und/oder Adressen) wären dann halt in geeigneter Form in die Abfrage einzubinden - gibts da mehr Infos zu einer Kassa oder nur deren Nummer ...?
Wobei mir dann auffällt, dass diese Buchungsatz-Tabelle die Kundennr enthält - ist das der Primärschlüssel in der Kundentabelle?
Wenn das nicht so ist, dann sollte nicht die Kundennummer in der Buchungstabelle stehen sondern eben der Primärschlüssel aus der Kundentabelle!

HTH

Peter
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: OEACC am Oktober 25, 2010, 19:16:17
Hallo Peter,

so ganz habe ich nicht verstanden. Muss ich ein Formular erstellen, in dem ich Monat und Kasse eingebe und dann läuft das SQL Statement ?

Und wie stelle ich die Daten aus der Buchungssatzdatei plus der ermittelten Summen in eine neue Tabelle ?

Bzgl. Deiner Frage nach weiteren Datenfeldern sind in der Abfrage bis auf Summen bereits alle Datenfelder für den Serienbrief enthalten. Die Kassentabelle und Kundentabelle sind in der Buchungssatztabelle durch Primärschlüsseln verknüpft und die zugehörigen Felder wurden mitgenommen. Di DB isz zu gross, sonst hätte ich sie angehängt.

Lieben Gruss Erich
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: database am Oktober 25, 2010, 21:23:55
Hallo,

ZitatBzgl. Deiner Frage nach weiteren Datenfeldern
OK, das ging aus deiner Anfrage leider in der Form nicht hervor, daher habe ich nachgefragt.

Bzgl. Formular zur Auswahl - war ein Vorschlag, den du nicht sofort umsetzen musst aber vielleicht für später mal im Hinterkopf behalten solltest.
Die SQL der Abfrage in meinem Posting liefert nach Eingabe des Monats (1,2,3, ...12) die von dir gewünschten zusammengefassten Summen.
Die hier fehlenden Felder aus den verknüpften Tabellen und die entsprechenden INNER JOINS auf diese Tabellen sind natürlich noch richtig einzubinden.

Zur Kontrolle der Ergebnisse kannst du eine neue Abfrage anlegen und ersteinmal keine Tabellen dazu angeben.
KOPIERE dann die SQL aus meiner Antwort in den Abfrageentwurf (SQL-Ansicht), passe eventuell die Feldnamen noch an wenn das notwendig ist und fürhre sie mal aus.

Du wirst nach der Eingabe des gewünschten Auswertungsmonats gefragt.

Die Eingabe einer Kassennummer ist nicht erforderlich, da die Kunden nach deiner Aussage fix an eine Kasse gebunden sind und das Abfrageergebnis
daher unabhägig von Kassennummern die Summen für die Kunden bilden kann.
Wenn du dennoch nach Kassennummern auch selektieren willst ist das einfach nach dem Muster der Monate einzubinden - ins Kriterienfeld unter der Kassennummer [Kassen-Nr. eingeben:] hinschreiben, dann wirst du auch nach der Kassennummer gefragt.

Du KANNST jetzt nach deinen Wünschen die Tabellen (Kundentabelle, Kassentabelle) in den Abfragenentwurf einbinden um ein vollständiges Ergebnis zu erhalten.

Um das Abfrageergebnis in eine neue Tabelle zu bekommen damit du diese dem Serienbrief als Datenherkunft zuweisen kannst, wäre die SQL folgendermaßen zu ändern:

SELECT tblBuchungen.Kundennr, tblBuchungen.Kassennr, Sum(tblBuchungen.[Betrag]) AS Monatssumme, Month([Datum]) AS Monat INTO NeueTabelle
FROM tblBuchungen
GROUP BY tblBuchungen.Kundennr, tblBuchungen.Kassennr, Month([Datum])
HAVING Month([Datum])=[Monat eingeben];

Wenn du diese Abfrage ausführst wird ein neue Tabelle mit dem nach INTO stehenden Tabellennamen erstellt und das Abfrageergebnis in diese Tabelle transferiert.
Diese NeueTabelle muss dann jedesmal VOR dem Ausführen der Abfrage gelöscht werden sonst motzt Access weil es die zu erstellende Tabelle ja schon gibt.
Der Vorgang lässt sich natürlich auch automatisieren und über das von mir angesprochene Formular ansteuern.

Versuche jetzt aber erstmal die Abfrage zu vervollständigen und kontrolliere die Richtigkeit der Ergebnisse nach.

Wenn das passt melde dich wieder und poste die SQL der komplettierten Abfrage.
Ich werde dir dann ein kleines Beispiel erstellen wo du dann das Formular als Muster zur Verfügung hast und alles benötigte von dort herauskopieren kannst.

Grüße

Peter



Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: OEACC am Oktober 26, 2010, 11:15:21
Hallo Peter,

zunächst vielen Dank - ich werde die Schritte versuchen und melde mich dann wieder.

Gruß Erich
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: OEACC am Oktober 27, 2010, 13:01:03
Hallo Peter,
habe versucht, Deinen Tipp umzusetzen, aber vergessen zu sagen, dass Feld Kassennr nicht in Buchungssatzdatei ist. Habe als Erklärung die Tabellen und Beziehungen als Dateianhang zum besseren Verständnis beigefügt.

Dein SQL Statement bringt trotz Eingabe Monat nicht die Summensätze aus dem entsprechenden Monat, sondern Summensätze aus allen Monaten.

SELECT Leistung.LEGANR, Sum(Leistung.LEKKSU) AS Monatssumme, Month([Datum]) AS Monat
FROM Leistung
GROUP BY Leistung.LEGANR, Month([Datum]), Gast.GAKNR
HAVING (((Month([Datum]))=[Monat eingeben]));

Gruss Erich



[Anhang gelöscht durch Administrator]
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: database am Oktober 29, 2010, 14:39:13
Hallo,

sorry für die späte Antwort...

Wie soll das funktionieren, wenn du ein Gruppierungsfeld in der Abfrage hast, dessen Herkunftstabelle NICHT Bestandteil der Abfrage ist?

Das glaube ich so nicht ...
ZitatDein SQL Statement bringt trotz Eingabe Monat nicht die Summensätze aus dem entsprechenden Monat, sondern Summensätze aus allen Monaten
...da würde ich eher sagen, die von DIR geänderte SQL bringt ein falsches Ergebnis - und das ist ein großer Unterschied.

Somit würde ich dir vorschlagen das Feld 'Gast.GAKNR' mal ganz aus der Abfrage zu nehmen und dann noch mal nachschauen ob die Summen stimmen.

Du kannst auch deine DB mit den Testdatensätzen komprimieren / reparieren, dann zippen und hier hochladen.

Greets
Peter
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: OEACC am Oktober 29, 2010, 16:18:10
Hallo,

habe durch viel Testen eine neue Abfrage mit Bericht gemacht. Jetzt funktioniert alles, die Daten sind alle richtig und der dazugehörige S-Brief macht auch alles richtig. Im Serienbrief muss man nur den Monat selektieren, dann läuft es. Gezipte DB ist immer noch 768 gross, System lässt Übertragung nur bis 200 zu. Habe SQL der Abfrage kopiert . . .

SELECT DISTINCTROW Gast.GANR, Gast.GANA, Gast.GAVN, Gast.GAMNR, Gast.GAKNR, Kasse.KKNR, Kasse.KKNA, Kasse.KKPLZ, Kasse.KKORT, Kasse.KKSTR, Kasse.KKANR, Kasse.KKMW, Kasse.KKAPN, Kasse.KKAPV, Format$([Leistung].[LEDAT],'mmmm yyyy') AS [LEDAT nach Monaten], Sum(Gast.GAMNR) AS [Summe von GAMNR], Sum(Leistung.LEKKSU) AS [Summe von LEKKSU]
FROM Kasse INNER JOIN (Gast INNER JOIN (DIC INNER JOIN Leistung ON DIC.DCNR=Leistung.LEDCNR) ON Gast.GANR=Leistung.LEGANR) ON Kasse.KKNR=Gast.GAKNR
WHERE (((Leistung.LEKKSU)>0))
GROUP BY Gast.GANR, Gast.GANA, Gast.GAVN, Gast.GAMNR, Gast.GAKNR, Kasse.KKNR, Kasse.KKNA, Kasse.KKPLZ, Kasse.KKORT, Kasse.KKSTR, Kasse.KKANR, Kasse.KKMW, Kasse.KKAPN, Kasse.KKAPV, Format$([Leistung].[LEDAT],'mmmm yyyy'), Year([Leistung].[LEDAT])*12+DatePart('m',[Leistung].[LEDAT])-1;

Gruss Erich
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: database am Oktober 29, 2010, 18:57:00
Hallo Erich,

naja, die entspricht nun bis auf die Erweiterungen um die verknüpften Tabellen genau dem Muster meines Vorschlags - der übrigens mit meinen Testdaten hervorragen funktioniert hatte bevor ich ihn hier gepostet habe.  ;)
Durch das Einbinden des Gruppierungsfeldes aus der nicht beteiligten Tabelle hat sich die Anzahl Datensätze im Abfrageergebnis mit der Anzahl der Datensätze in der Tabelle Gast multipliziert
weil die Abfrage einen CROSS JOIN auf diese Tabelle gezaubert hat - sie war ja über Schlüsselfelder nicht in Beziehung gesetzt.
Dass dabei die Summen dieses kartesischen Produkts nicht mit deienen Erwartungen übereinstimmen wundert mich gar kein bisschen.

Aber egal - es freut mich, dass du's nun so hast, wie du es wolltest.

Grüße
Peter
Titel: Re: Abfrage Summen pro Monat und Pro Kasse
Beitrag von: OEACC am Oktober 30, 2010, 16:04:08
ich danke für die Hilfe - vielleicht habe ich später nochmal eine Frage ...
Gruss Erich