Ablaufsystem

  • C#

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von faxe1008.

    Ablaufsystem

    Hallo,

    ich habe eine MySQL-Tabelle erstellt welche ein paar persönliche Daten enthält. Nach Einfügen auf dem Server bekommen die Daten einen Timestamp. Mein Ziel ist es eine Reihe hinzuzufügen welche angibt, wie viele Tage noch verbleiben, bis der Eintrag gelöscht ist. Beispiel im Anhang.


    Im Endeffekt soll die Reihe nach 7 Tagen gelöscht werden. Der Eintrag "Expire in" soll täglich um 1 abnehmen.

    Vielen Dank schon mal im Voraus
    Bilder
    • Screenshot_3.png

      4,71 kB, 354×79, 117 mal angesehen
    Kleine Frage in die Runde: Wäre ea nicht deutlich einfacher das Datum des Ablaufs zu speichern und mit diesem zu arbeiten?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Ich habe noch nicht viel versucht...Ich dachte z.b, dass mir jmd mit einem Cron Job aushelfen kann oder es ein einfaches Skript gibt, welches ausgeführt werden kann. Außerdem möchte ich den Timestamp haben, an dem der Eintrag erstellt wurde. Im Grunde reicht es, wenn täglich der Wert Expire In sich um 1 reduziert und sich der Eintrag bei 0 löscht
    Ja, schon klar was du willst. Soll ich dir das Script kurz schreiben? Oder bist du an echter Hilfe interessiert?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Auch wenn es selbsterklärend ist, weiß ich nicht, wie ich die Query so anpasse, sodass die Spalte 'Expire In' täglich um 1 abnimmt. Ich möchte, dass dieses Event zentral abläuft und ich verschiedene Einträge habe wie zb. 'Expire In'=50 oder 'Expire In' = 10...Ich möchte nicht jedesmal eine verschiedene Query eintippen
    Wenn du diesen Code anschaust:

    Quellcode

    1. CREATE EVENT delete_event
    2. ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY
    3. ON COMPLETION PRESERVE
    4. DO BEGIN
    5. DELETE messages WHERE date < DATE_SUB(NOW(), INTERVAL 7 DAY);
    6. END;


    Fällt dir vielleicht auf, dass in Zeile zwei der Zeitpunkt an dem das Event getriggert werden soll gesetzt wird. Eine kurze Suche nach "mysql on schedule documentation" bringt einen hierhin: dev.mysql.com/doc/refman/5.7/en/create-event.html

    Dann hat man zwei Möglichkeiten:
    1. Den Artikel lesen und tatsächlich Wissen draus ziehen
    2. Die Seite nach "ON SCHEDULE" durchsuchen und schauen welcher Codesnippet am ehesten Sinn ergibt.

    So oder so kommt man zu folgender Syntax:

    Quellcode

    1. CREATE EVENT delete_event
    2. ON SCHEDULE EVERY 7 DAY
    3. ON COMPLETION PRESERVE
    4. DO BEGIN
    5. DELETE messages WHERE date < DATE_SUB(NOW(), INTERVAL 7 DAY);
    6. END;

    Das Event wird jede Woche einmal gefeuert und löscht alle Einträge die älter sind als ne Woche.

    8-) faxe1008 8-)

    Niklas9401 schrieb:

    Spalte 'Expire In' täglich um 1 abnimmt



    Wie du vielleicht überlesen hast, ist deine Idee mit dem Expire nicht schlecht, aber es geht um einiges einfacher.

    Wenn du den Benutzer updatest bzw. anlegst bekommt dieser einen Timestamp.

    Deine Idee: jeden Tag einen Wert runter zu zählen, bis dieser 0 ist. Hat was zur Folge? - richtig, du musst jeden Tag ein Update auf deine Tabelle schießen und das für jeden Benutzer.

    Viel einfacher ist es, dein Interval nicht durch irgendeine Spalte zu setzen, sondern mit in deinem Query.

    Du magst vermutlich jeden Tag überprüfen, ob das PW abgelaufen ist, und wenn ja, ein neues Vergeben.
    Dazu ist das SQL-Event glaube ich nicht geeignet, da du das aus deinem C#-Code ändern wirst.
    Also machst du eigentlich nur jeden Tag aus deiner Anwendung ein Select auf die User bei denen Date < DATE_SUB(NOW(), INTERVAL <X> DAY);

    Dadurch hast du folgenden Sachverhalt:
    Benutzer anlegen -> mit timestamp versehen
    täglich SELECT id FROM usertable WHERE Date < DATE_SUB(NOW(), INTERVAL <X> DAY);, ohne dass du direkt wissen musst, ob der Datensatz nun in diese Bedingung mit hineinfällt oder nicht. Wenn nicht musst du hier auch kein Update schieben.
    Für jeden Datensatz in deinem Select kannst du dann das PW ändern lassen.
    Dadurch bekommt der User einen neuen Timestamp und ist erst wieder in <X> Tagen 'fällig'.



    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:

    Niklas9401 schrieb:

    Länge unterscheiden...


    bitte genauer erklären.

    Eine Tabelle hat eine feste Struktur, sprich die Werte in den jeweiligen Zellen sind immer in einem gewissen Range.
    Und das du unterschiedlich viele Einträge in der Tabelle hast ist auch so gewollt :D


    Niklas9401 schrieb:

    Für mich scheint es das klügste zu sein, alle Einträge täglich zu reduzieren


    ist es nicht.



    ----
    erzähl mal was du genau vorhast, in welchem Kontext deine Anforderung umgesetzt werden soll.
    Und hast du die Vorteile - den Sinn - hinter dem Vergleich mit dem Datum im Gegensatz zum Expire-Counter verstanden?

    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup:
    Im Endeffekt wird dem Benutzer ein Kontingent an Benutzungszeit zugesprochen...Dieser soll aber variieren können...Wenn Benutzter A nur noch 3 Tage hat steht der Counter bei Expire auf 3...Der Eintrag wird in 3 tagen gelöscht, sodass der Benutzer sich nicht mehr einloggen kann. Im Endeffekt will ich also kein Event erstellen, welches hervorruft, dass jeder Account nach 7 Tagen nach Erstellungsdatum gelöscht wird.
    So macht das ganze Vorhaben doch schonmal mehr Sinn.

    Also: Expire zählt runter und wenn 0 dann -> Benutzungszeit abgelaufen.
    Nachteil immernoch: tägliches Update

    (mMn) besser:
    Rechne beim Anlegen des Benutzers schon aus, wann seine Benutzungszeit abgelaufen ist. -> Dann hast du Kontrolle darüber, welcher Benutzer sich einloggen darf und bis wann.
    Denn wenn bspw. mal ein Update schief geht und dein Expire wird nicht dekrementiert, kann er sich länger einloggen als gedacht oder ähnliches.

    LG Acr0most
    Wenn das Leben wirklich nur aus Nullen und Einsen besteht, dann laufen sicherlich genügen Nullen frei herum. :D
    Signature-Move 8o
    kein Problem mit privaten Konversationen zu Thema XY :thumbup: