Beitragssystem für Vereinsdatenbank

Ja das hatte ich mir ja auch schon gedacht. Hab jetzt auf GROUP_CONCAT zurückgegriffen. Das ist dafür da um mehrere Spalten in EINEM String auszugeben. Also genau das was ich will. Nur jetzt Hab ich ein Problem, dass in der Ausgabe irgendwelche Nullen auftauchen:
Code:
Name  |      Januar      |      Februar     
-------+------------------+------------------
Hans  | 0, 07.01. 10 EUR | 08.02 10 EUR, 0
Karl  | 19.01. 10 EUR, 0 | 0, 10.02. 10 EUR
Und die Nullen sind auch genau so "willkürlich" wie ich es versucht habt anzudeuten. Mal sind sie vorn und mal hinten. Deshalb kann ich mir er nicht erklären wo sie hingehören.
Aber ich komme der Sache näher und dafür danke ich dir schon einmal :)

Normal durch die Aggregation, je nachdem wie oft ein Wert in der gruppierten Spalte vorkommt. In meiner Lösung erzeuge ich zuerst ein ARRAY, welches ich dann zu einem STRING wandle. Die array_to_string() - Funktion blendet leere Werte im Array aus.

Code:
test=*# select
test-#   m.name,
test-#
test-#     array_agg(
test(#       case when extract(month from fuer) = 1 then am::text || ' ' || to_char(fuer,'TMMonth') || ' ' || betrag::text || ' EUR' else null end
test(#     )
test-#    as januar,
test-#   array_to_string(
test(#     array_agg(
test(#       case when extract(month from fuer) = 2 then am::text || ' ' || to_char(fuer,'TMMonth') || ' ' || betrag::text || ' EUR' else null end
test(#     ),', '
test(#   ) as februar
test-# from
test-#   mitglieder m
test-#   left join (
test(#     select * from zahlungen where fuer < '2014-01-01'::date
test(#   ) z on (m.id=z.mitglied_id)
test-# group by m.name;
 name  |                        januar                         |          februar
-------+-------------------------------------------------------+---------------------------
 hans  | {"2013-01-15 Januar 10 EUR"}                          |
 ich   | {NULL}                                                |
 peter | {"2013-01-10 Januar 5 EUR","2013-02-15 Januar 5 EUR"} |
 uwe   | {"2013-02-15 Januar 10 EUR",NULL}                     | 2013-02-20 Februar 10 EUR
(4 rows)

Beim uwe ist da auch ein NULL-Wert im Array, wenn ich nur das Array ausgebe.
 
Werbung:
Normal durch die Aggregation, je nachdem wie oft ein Wert in der gruppierten Spalte vorkommt. In meiner Lösung erzeuge ich zuerst ein ARRAY, welches ich dann zu einem STRING wandle. Die array_to_string() - Funktion blendet leere Werte im Array aus.
Ok das machen ja meine Funktionen anscheinend nicht. Habe aber leider auch keine andere gefunden. Jemand eine Idee ?
Außerdem überlege ich auch grad wie ich nun für jeden einzelnen Monate den Betrag und das Bezahl_Datum einzeln ausgeben lassen kann und nicht als String wie jetzt. Hab dafür aber auch noch nichts gefunden.
Ich hoffe ich habs verständlich rübergebracht. Durch eine While-Schleife lasse ich das im Moment so anzeigen:
$Mitglied[Monat]
jetzt würde ich es aber gern so machen:
$Mitglied[Monat][bezahlt_am]
und
$Mitglied[Monat][Betrag]
kann ich das auch direkt in der Abfrage machen ?
 
Ich hab doch eine ganze Menge gezeigt, was ist denn jetzt noch das Problem?
Das ist ja richtig und dafür danke ich dir auch vielmals. Ohne deine Hilfe wäre ich bis hierhin gar nicht gekommen.
Aber mein Problem sind leider immer noch diese Nullen und dann würde ich wie gesagt auch gern die Datensätze einzeln ansprechen und nicht zusammenfassen.

LG Chris
 
Mit MySQL, was Du ja verwendest, kenn ich mich nicht so gut aus, um da eine Lösung zu finden.
Deswegen hoffe ich ja, dass den Post vielleicht noch jemand sieht, der sich damit etwas besser auskennt.

Das versteh jetzt grad nicht.
Na im Moment bekomm ich einen kompletten String, mit den Informationen die ich haben will, zurück. Ich möchte jetzt aber für den Monat Januar einmal das Datum an dem bezahlt wurde und den bezahlt Betrag in je einer Spalte haben. Und das dann quasi für jeden Monat.
 
Das Problem mit den Nullen habe ich jetzt gelöst.
Bleibt aber noch die andere Frage wie ich die Ausgabe einzeln und nicht im String machen kann. Denn ich möchte wenn z.B. jemand weniger bzw. mehr bezahlt als er soll, das dieser Eintrag dann rot markiert wird. Dafür muss ich den bezahlten Betrag ja vergleichen.
Jemand eine Idee ?
 
Das Problem mit den Nullen habe ich jetzt gelöst.
Bleibt aber noch die andere Frage wie ich die Ausgabe einzeln und nicht im String machen kann. Denn ich möchte wenn z.B. jemand weniger bzw. mehr bezahlt als er soll, das dieser Eintrag dann rot markiert wird. Dafür muss ich den bezahlten Betrag ja vergleichen.
Jemand eine Idee ?

Du speicherst, wieviel jeder zu bezahlen hat, Entweder direkt in der Mitgliedertabelle, oder sogar in einer extra Tabelle, falls sich die Beiträge ändern können. Dann gleich mit gültigkeitsangaben, in PG könnte man das so machen:

Code:
test=# create table stammdat (id int primary key, name text);
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "stammdat_pkey" for table "stammdat"
CREATE TABLE
test=*# create table beitragsdaten (m_id int references stammdat, gueltig daterange, betrag int, exclude using gist (m_id with =, gueltig with &&));
NOTICE:  CREATE TABLE / EXCLUDE will create implicit index "beitragsdaten_m_id_gueltig_excl" for table "beitragsdaten"
CREATE TABLE
test=*#

Mal vereinfacht. Bei Zahlungseingang prüfst Du, ob der gezahlte Betrag korrekt ist, z.B. via TRIGGER. Das kannst dann z.B. auch mit in der Zahlungstabelle speichern.
 
Also die zu bezahlenden Beträge sind bereits in der Mitgliedstabelle gespeichert.
Aber ich möchte ja nicht nur bei Zahlungseingang prüfen ob die beiden Beträge übereinstimmen. Deswegen denke ich wäre es am einfachsten wenn ich die Sachen einzeln ausgeben lasse.
Habe mir das so vorgestellt:
Code:
mitglied |                    januar                    |          februar
----------+---------------------------------------------+---------------------------
          |       bezahlt_am       |       Betrag       |            ...
----------+------------------------+--------------------+---------------------------
hans      |       2013-01-15       |      10 EUR        |            ...
peter     |       2013-01-10       |      10 EUR        |            ...
uwe       |       2013-01-20       |      10 EUR        |            ...
gibts dafür eine extra Funktion oder muss ich meinen Code nur etwas verändern ? Wenn ja wie ?
Code:
SELECT m.Name,m.Vorname,m.ID,m.gekuendigt,m.Eintrittsdatum,m.kuend_dat, GROUP_CONCAT(DISTINCT CASE WHEN EXTRACT(
MONTH FROM bezahlt_fuer ) =1
THEN CONCAT ( DATE_FORMAT(bezahlt_am, '%d.%m'),'<br />', Betrag, ' EUR') ELSE NULL END) AS Jan,
GROUP_CONCAT(DISTINCT CASE WHEN EXTRACT(
MONTH FROM bezahlt_fuer ) =2
THEN CONCAT (DATE_FORMAT(bezahlt_am, '%d.%m'),'<br />', Betrag, ' EUR')
ELSE NULL
END ) AS Feb
FROM Mitglieder m
LEFT JOIN (SELECT * FROM Beitraege WHERE DATE_FORMAT(bezahlt_fuer,'%Y')='2013') z
ON m.ID = z.Mitglied
GROUP BY m.ID
ORDER BY m.Name
 
Werbung:
Also die zu bezahlenden Beträge sind bereits in der Mitgliedstabelle gespeichert.
Aber ich möchte ja nicht nur bei Zahlungseingang prüfen ob die beiden Beträge übereinstimmen. Deswegen denke ich wäre es am einfachsten wenn ich die Sachen einzeln ausgeben lasse.


Deinen MySQL-Code nazupassen fehlt mir das Wissen. Als Schnellschuß in PG, um die Zahlungen zu prüfen:

Code:
test=*# select * from beitragsdaten ;
 m_id |         gueltig         | betrag
------+-------------------------+--------
    1 | [2013-01-01,2013-05-01) |     10
    1 | [2013-06-01,2013-10-01) |     15
(2 rows)

test=*# select * from zahlungen ;
 m_id |   datum    | betrag
------+------------+--------
    1 | 2013-02-01 |     10
    1 | 2013-07-01 |     50
    1 | 2013-08-01 |      5
(3 rows)

test=*# select *, betrag - (select betrag from beitragsdaten where m_id=m_id and beitragsdaten.gueltig @> datum ) as differenz from zahlungen ;
 m_id |   datum    | betrag | differenz
------+------------+--------+-----------
    1 | 2013-02-01 |     10 |         0
    1 | 2013-07-01 |     50 |        35
    1 | 2013-08-01 |      5 |       -10
(3 rows)

Er prüft also jede Zahlung, ob diese mit der hinterlegten Beitragshöhe für den Zeitraum da auch korrekt ist. Das kann man natürlich auch wieder in die Form für je Monat eine Spalte bringen, aber das habe ich ja schon gezeigt, wie das geht und mein PostgreSQL-Code hilft Dir ja nicht wirklich.
 
Zurück
Oben