none
Berechnete Felder RRS feed

  • Frage

  • Hallo Experten,

    ich arbeite gerade in einem Projekt für das Erstellen einer Betriebsdatenerfassung mit. Dort sollen Zeiten der Mitarbeiter, Fertigungsaufträge sowie Taktzeiten der Maschinen erfasst werden. Meine bisherigen Erfahrungen haben mich gelehrt, keine Berechneten Felder in den Tabellen zu verwenden. Bei den berechneten Feldern geht es nicht darum aus einer Zeile z. B. Preis * Menge = Kosten zu berechnen sondern Informationen als Summe aus anderen Tabelle wegzuschreiben.

    Konkretes Beispiel:

    Tabelle Fertigungungsauftrag beinhaltet alle Informationen zum Fertigungsauftrag (SOLL-Start, SOLL-Ende, SOLL-Menge,...).

    Tabelle Rückmeldung beinhaltet alles an Informationen welche durch die Mitarbeiter zurückgemeldet werden (IST-Start, IST-Ende, Gut-Menge, Ausschuss,...)

    Nun steht die Überlegung im Raum, über einen Trigger, ein Feld Gut-Menge im Fertigungsauftrag zu hinterlegen und dieses beim Ändern von Rückmeldungen zu aktualisieren.

    Da ich über einen Sub-Select die Informationen sowieso gruppieren und summieren kann, würde ich diese Informationen nicht explizit wegschreiben wollen, aber als Argument der Kollegen wird gesagt, dass beim Reporting man dadurch viel Leistungsfähiger ist.

    Bei dem Feld "Gut-Menge" wird es sicherlich nicht bleiben, folgen wird dann noch die Auftragsdauer, Rüstzeiten, Produktionszeiten, etc.. Also alles Informationen die man aus anderen Tabellen lesen kann.

    Was sagt ihr dazu?

    Montag, 18. August 2014 10:31

Antworten

  • Wenn Du nicht mehrere tausend Fertigungsaufträge pro Tag hast, oder einzelne Fertigungsaufträge mit tausenden von Rückmeldungen, solltest Du auch ohne Zwischenberechnungen immer zügig zum Ergebnis kommen.

    Falls Du allerdings sehr viele Daten hast, würde ich die Berechnungen zum Zwecke des Reportings lieber über einen asynchronen Job laufen lassen, der z. B. alle 30 Minuten die Werte (in separaten Reportingtabellen) aktualisiert.

    Nur, wenn Du absolut aktuelle Zahlen benötigst, bist Du auf die Trigger angewiesen. Hier kannst Du Dir natürlich entsprechende Sperren handeln, wenn viele User im System unterwegs sind und gleichzeitig mit den Aufträgen arbeiten.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    • Als Antwort markiert David Stania Montag, 18. August 2014 13:25
    Montag, 18. August 2014 11:06

Alle Antworten

  • Wenn Du nicht mehrere tausend Fertigungsaufträge pro Tag hast, oder einzelne Fertigungsaufträge mit tausenden von Rückmeldungen, solltest Du auch ohne Zwischenberechnungen immer zügig zum Ergebnis kommen.

    Falls Du allerdings sehr viele Daten hast, würde ich die Berechnungen zum Zwecke des Reportings lieber über einen asynchronen Job laufen lassen, der z. B. alle 30 Minuten die Werte (in separaten Reportingtabellen) aktualisiert.

    Nur, wenn Du absolut aktuelle Zahlen benötigst, bist Du auf die Trigger angewiesen. Hier kannst Du Dir natürlich entsprechende Sperren handeln, wenn viele User im System unterwegs sind und gleichzeitig mit den Aufträgen arbeiten.

    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    • Als Antwort markiert David Stania Montag, 18. August 2014 13:25
    Montag, 18. August 2014 11:06
  • Hallo Christoph,

    danke für deine Antwort.

    Wir rechnen mit etwa 200 Fertigungsaufträgen pro Tag, 20 Rückmeldungen pro Fertigungsauftrag und 10.000 Maschinentakte pro Fertigungsauftrag wobei sich der Maschinentakt auf ca. 5 Abfragepunkte bezieht und man zur Errechnung der Summe nur einen heranziehen würde.

    Montag, 18. August 2014 12:21
  • Bei der Menge würde ich zur asynchronen Bereitstellung der kumulierten Werte tendieren. Sonst habt ihr ja auch 10.000 mal den Trigger pro Fertigungsauftrag ausgelöst, oder?
     Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP - http://www.insidesql.org/blogs/cmu

    Montag, 18. August 2014 12:25
  • Bis jetzt haben wir noch nichts gemacht. Aufträge werden durch MA zurückgemeldet und die Menge manuell in die Rückmeldung eingegeben. Ich möchte jedoch einen Auftrags-Fortschritt sehen und will dafür für jedes Fertiggerät einen Datensatz speichern.

    Die Idee mit den Reporting-Tabelle halte ich für die schlüssigere und für mich die praktikabelste Lösung.

    Danke!

    Montag, 18. August 2014 12:41
  • Hallo nochmal,

    bezüglich der vielen Daten habe ich mir überlegt diese in eine zweite Datenbank zu schreiben. Besteht die Möglichkeit mit SQL Server Express 2012 einen Trigger zu erstellen, der eine zweite (parallele) Datenbank aktualisiert?

    Beste Grüße

    Freitag, 26. September 2014 09:29
  • Hallo,

    sicher, Du kannst andere Tabellen in anderen Datenbanken (oder Server-Instanzen) über drei (oder vierteilige) Bezeichner ansprechen, also z. B. AndereDatenbank.dbo.Tabelle. Beachte dass über mehre Datenbanken die datenbankübergreifende Besitzkette wichtig wird.

    Gruß Elmar

    Freitag, 26. September 2014 10:20
    Beantworter