openjverein / jverein

Open JVerein - Open Source Vereinsverwaltung
https://openjverein.github.io
GNU General Public License v3.0
43 stars 17 forks source link

Lösungsversuch 1 zu #159 #182

Closed JohannMaierhofer closed 8 months ago

JohannMaierhofer commented 8 months ago

Ich habe einmal versucht das Problem welches in #159 beschrieben ist zu lösen. Da ich aber auch kein SQL Experte bin kann ich nicht sagen ob das jetzt schneller ist. Ich glaube aber schon. Falls es einen Match mit einem Mitglied gibt braucht man jetzt nur genau zwei Datenbank Queries. Mein Vorschlag wäre, ihr schaut euch das mal an und wenn es ok ist könnten wir einen Nightly Build machen. Dann könnte Lukas es einmal ausprobieren. Was ich gemacht habe ist Folgendes:

Sonstige Anmerkungen:

Ich hoffe mal, meine Arbeit hat sich gelohnt. Zumindest ist der Code jetzt besser verständlich.

dippeal commented 8 months ago

Was die queries angeht ist es jetzt deutlich weniger. Dem Match auf Zweck finde ich auch nicht nötig, da man bereits über den Namen und den Betrag eine gute Eingrenzung hat.

JPT77 commented 8 months ago

Kann ich jetzt hier den PR kommentieren oder woanders? Ich habe jetzt nicht wirklich den Überblick und kann auch falsch liegen. Ich will trotzdem mal mein Feedback geben.

Du machst also von vornherein einen join über M, MK und B. SUM(BETRAG) ist eine elegante Lösung!

Allerdings holst du ja garnicht den MK.BETRAG? Womit vergleichst du?

Dann machst du eine Java-schleife über alle MK, weil es mehr Aufwand wäre, erst die M zu holen? Dir ist schon klar, dass du hier potentiell eine Schleife über 10.000 Datensätze machst? und diese müssen ja auch alle per SQL geholt werden. Ich denke, die Software wird das Blockweise holen... hoffentlich... aber mehr als ein Zugriff ist es sicher.

"Nur Ist-Buchung erzeugen" - sollte das nicht heißen: IST Buchung verknüpfen mit: existierendem SOLL / neu erstelltem SOLL finde SOLL / erstelle SOLL

Vielen Dank für dein Engagement!

Jan

JohannMaierhofer commented 8 months ago

Hallo Jan, Der Vergleich passiert im SQL Statement. Ja, die Schleife geht über die Mitgliedskonto aber nur über solche die die Bedingung Überzahler oder Fehlbetrag haben. Aber ja, da müssen wohl alle gelesen werden. Ist dann wohl doch besser nur alle Mitglieder zu holen.

Inzwischen habe ich einen weiteren Vorschlag der wahrscheinlich besser ist. Siehe #184

JohannMaierhofer commented 8 months ago

Ich habe jetzt den Code nochmals auf Grund der Kommentare von Jan angepasst. Danke für die Kommentare. Ich lese jetzt die Mitglieder aus wenn die Differenz auf EGAL steht. Damit geht die Schleife maximal über die Anzahl der Mitglieder. Das macht es doch deutlich schneller in diesem Fall. Im Fall von FEHLBETRAG oder UEBERZAHLUNG lasse ich den alten Request. Da die Datenbank den Check macht ist die Anzahl in der Schleife so groß wie Mitgliedskonten (Soll-Buchungen) existieren die diese Bedingung erfüllen. Ich nehme jetzt einmal an, dass bei FEHLBETRAG die Anzahl nicht viel größer ist als die Anzahl der Mitglieder und nach Zahlungen der Mitglieder und erfolgten Zuordnungen die Anzahl immer kleiner wird.

PS: Den Text in den Laschen habe ich auch nochmals geändert.

JohannMaierhofer commented 8 months ago

Im MitglideskontoQuery wurden Logger Ausgaben gemacht die man nicht wirklich braucht aber auch alles langsamer machen. Ich habe sie auskommentiert.

JohannMaierhofer commented 8 months ago

Ich denke, man muss auch den Mitgliedskonten Dialog und den MitgliedskontenZuordnung Dialog anpassen. Ich habe festgestellt das beim Editieren z.B. des Namens mit jedem Buchstaben das Query ausgelöst wird. Die Anzeige passt sich aber nicht immer an und man muss erst in ein anders Feld klicken. Bei jedem weiteren Klick in ein Feld wird wieder ein Query gemacht obwohl man nichts editiert hat. Da wäre es sicherlich hilfreicher eine Suchen Butten zu haben und ein Query nur anzustoßen wenn man fertig editiert hat. Siehe #185

JohannMaierhofer commented 8 months ago

Lösung #184 ist die Bessere