Rolf B: Daten eintragen (Lösungsansatz)

Beitrag lesen

Hallo Jörg,

Fällt irgendwem eine Fehlerquelle ein, die ich unberücksichtigt gelassen habe?

Solange ich nicht verstanden habe, was Du eigentlich genau tust und welche Randbedingungen gelten, kann man das kaum beantworten.

Das ist die Zusatztabelle, von der ich weiter oben sprach.

Naja, das Forum zeigt es "weiter unten" 😉

Die, in der alle monatlich zu berechnenden Vorgänge enthalten sind.

Was habe ich mir darunter vorzustellen? Ich versuche mal, deine Arbeit zu tun und mache ein ausführliches Beispiel. Natürlich kann ich mich dabei völlig verhauen, aber dann haben wir zumindest eine Grundlage auf der wir weiter klären können, was du tust und was Du willst (was ja bekanntlich nicht das Gleiche sein muss 😂).

Aus deinem SELECT sehe ich, dass es da eine ID gibt, eine KundenID, ein Ab-Jahr und einen Ab-Monat. In deinem anderen Beitrag stand noch was von mehreren Flags.

Die Tabelle könnte also eine Zeile enthalten, dass für den Kunden 4711 ab 03/2020 ein Vorgang auszuführen ist. Welcher Art dieser Vorgang ist, dürfte aus weiteren Spalten hervorgehen, die Du nicht gezeigt hast. Mutmaßlich könnte es für einen Kunden auch mehrere monatlich zu berechnenden Vorgänge geben. Aber egal, das ist ein Detail...

Wenn der Kunde 4711 neu ins System kommt und März '20 die erste Rechnung bekommt, müsste in deiner Table also ein Satz für ab_jahr 2020 und ab_monat 3 geschrieben werden. Wenn ich deine Idee richtig verstehe, ist das der Keim für dein Verfahren. Wenn Ende März 2020 der Cron-Job Läuft, findet er den Satz für März '20 und probiert nun Sätze für Jan, Feb und März 2020 zu schreiben (du beginnst ja bei 1 zu zählen). Jan und Feb werden durch deinen IF abgefangen. Im März geht es schief, weil der Satz schon da ist. Und für den April gelingt der Insert.

Nun läuft die WHILE-Schleife in die nächste Runde. Sie findet den April '20 vermutlich nicht, weil der SELECT sein Ergebnis vorher geladen hat. Also ist Ende für diesen Kunden.

Soweit, so gut. Betrachten wir den nächsten Cron-Job, Ende April. Der findet den März 20. Die Schleife läuft los, Jan - nö. Feb - nö. März - dup. April - dup. Mai - Erfolg. Als nächstes findet er den April 20. Und es geht von vorn los. Jan - nö. Feb - nö. März - dup. April - dup. Mai - dup. Das war vergebliche Liebesmühe.

Deswegen meinte Mudgard, du müsstest den jeweils jüngsten schon vorhandenen Satz finden, und ab diesem loslaufen.

Betrachten wir einen anderen Fall. Die Tabelle enthält für Kunde 4711 genau einen Satz mit ab_jahr=2020 und ab_monat=12. Der nächste Cron-Job Ende Dezember startet. $Jahr ist bei Dir nun 2021 und $Monat ist 1.

Du machst den SELECT und findest Kunde 4711, Ab_Monat=12, Ab_Jahr=2020. Deine Schleife läuft los, mit $i=1.

Im ersten Durchlauf wird 1 >= 12 && 2021 >= 2020 geprüft. Das ist FALSE.
Und nun ist die Schleife zu Ende, weil $i <= $Monat nicht mehr erfüllt ist.

Jahresübergreifende Verarbeitung geht also schief.

Bevor wir auf Lösungsmöglichkeiten eingehen, würde ich gern wissen, ob wir nun inhaltlich beieinander sind.

Rolf

--
sumpsi - posui - obstruxi