1. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

Beitragssystem für Vereinsdatenbank

Dieses Thema im Forum "Datenmodellierung, Datenbank-Design" wurde erstellt von EFChris, 25 Juli 2013.

  1. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  2. EFChris

    EFChris Benutzer

    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 ?
     
  3. EFChris

    EFChris Benutzer

    Keiner mehr da, der mir helfen kann ? Ich komm im Moment alleine echt nicht weiter.
     
  4. akretschmer

    akretschmer Datenbank-Guru

    Ich hab doch eine ganze Menge gezeigt, was ist denn jetzt noch das Problem?
     
  5. EFChris

    EFChris Benutzer

    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
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Mit MySQL, was Du ja verwendest, kenn ich mich nicht so gut aus, um da eine Lösung zu finden.

    Das versteh jetzt grad nicht.
     
  7. EFChris

    EFChris Benutzer

    Deswegen hoffe ich ja, dass den Post vielleicht noch jemand sieht, der sich damit etwas besser auskennt.

    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.
     
  8. ukulele

    ukulele Datenbank-Guru

    Und wenn ein Beitrag in 2 Teilen überwiesen wurde so wie in dem Beispiel von akretschmer?
     
  9. EFChris

    EFChris Benutzer

    Das passiert nicht. Bei uns wird jeden Monat entweder komplett BAR bezahlt oder die Mitglieder haben einen Dauerauftrag eingerichtet.
     
  10. EFChris

    EFChris Benutzer

    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 ?
     
  11. akretschmer

    akretschmer Datenbank-Guru

    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.
     
  12. EFChris

    EFChris Benutzer

    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
     
  13. akretschmer

    akretschmer Datenbank-Guru


    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.
     
Die Seite wird geladen...
Ähnliche Themen - Beitragssystem Vereinsdatenbank
  1. sneak
    Antworten:
    1
    Aufrufe:
    1.457

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden