Bachelorarbeit - Wirtschaftsinformatik

Werbung:
Ein Projekt wird angelegt: Projektnummer wird vergeben, Kunde eingetragen, Systeme verknüpft...
Wenn nun alles festgelegt wurde, dann möchte der Controller den Stand dieses Projektes einfrieren und unter einer Version speichern. Projekt "X" soll also die Version "2" bekommen.
Wenn das passiert muss deine Anwendung oder deine Datenbank dafür sorgen, das der Eintrag dupliziert wird und der alte festgeschrieben, ganz einfach :)
 
Jo nur wie mache ich das am geschicktesten?!
Ich habe jetzt noch einmal diskutiert, welche Funktionalitäten benötigt werden.

1. Neue "Zusammenstellung" eines Projektes unter einer neuen Version erstellen. Zuvor soll der aktuelle Stand dupliziert werden.
2. Aktuelle Werte "einfrieren". Es soll zu einem späteren Zeitpunkt möglich sein, z.B. die damaligen Preise zu sehen, obwohl sie sich inzwischen geändert haben können.
3. Einen eingefrohrenen Stand wiederherstellen.

Umsetzung:

Allgemein denke ich, dass ich gespeicherte Prozeduren brauche um diese Funktionen zu realisieren.

Zum 1. Punkt habe ich diesen Beitrag gefunden. Ich denke genau so brauche ich es auch. LightSwitch muss einen Parameter übergeben in dem steht, welcher Datensatz (der aktuelle) betroffen ist. Danach wird die Projekttabelle und alle Verbindungstabellen, welche die Tabelle Projekte betreffen, über diesen Parameter angesprochen.
Du hast aber in diesem Zusammenhang weiterhin über Trigger geredet, daher bin ich mir nicht sicher was nun wirklich der richtige Ansatz ist.

Beim 2. Punkt hab ich mir überlegt, dass es vom Prinzip her nur nötig ist, dass Datum zu sichern. Es werden ja eh schon alle Änderungen mitgeloggt. Wenn man dann den alten Stand sehen möchte, dann soll einfach der Wert, der zu diesem Zeitpunkt aktuell war, genommen werden.
 
Es gibt sicher einige Wege das zu realisieren. Im wesentlichen musst du deinen Schreibschutz der Daten an ein Rechtekonzept binden weil du sonst nicht zwischen Projektleiter und Anwender unterscheiden kannst. Ob du dann mit einem Parameter in LightSwitch arbeitest oder eine Spalte in der DB hast die sagt, "schreibgeschützt" ist eigentlich egal. Es muss gar nicht in der Datenbank dupliziert werden, kann aber auch per SQL Script, Prozedur oder Trigger (auf die Spalte schreibgeschützt) gehen. Da ich LightSwitch nicht kenne kann ich nur über die SQL Möglichkeiten nachdenken. Eine Prozedur muss ausgelöst werden, ein Trigger löse ich über den Eintrag in eine Spalte aus.
 
So, nu bin ich wieder am DB-Thema dran.

Ich habe mich mal für nen Trigger entschieden.
Bisher habe ich ihn so eingestellt, dass er den Datensatz kopieren soll, wenn der Benutzer die Version verändert. Klappt sogar! :D

Nun sind aber auch die Zuordnungstabellen betroffen.

Mal eine Tabellenübersicht:

Tabelle Projekte
P_ID (Autowert PKEY)​
P_NR (Interne Projektnummer)​
P_V (Projektversion)​
+weitere unsichtige Spalten​

Tabelle ZProjekteBauteile (z.B.)
Z_PB_ID (Autowert PKEY)​
P_ID (FKEY aus der Tabelle Projekte)​
B_ID (FKEY aus der Tabelle Bauteile)​
ANZAHL (Anzahl der Bauteile, die in dem Projekt vorhanden sind)​

Bisheriger Trigger:
Code:
USE [CODB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_Projekte_Version]
  ON  [dbo].[Projekte]
  AFTER UPDATE
AS
BEGIN
    SET NOCOUNT ON;
    IF UPDATE (P_V)
            Insert Into dbo.Projekte (P_NR, P_V, ...)
            (SELECT P_NR, P_V, ... FROM deleted)
END

Jetzt möchte ich die Zuordnungstabelle erweitern.
Mache ich das am besten im selben Trigger oder kann ich am Ende dieses Triggers den nächsten aufrufen?

Die Zuordnungstabelle muss nun wie folgt erweitert werden:

Alle Datensätze kopieren
WHERE deleted.P_ID = dbo.ZProjekteBauteile.P_ID
jedoch soll beim kopieren deleted.P_ID = inserted.P_ID gesetzt werden.

Probiere gerade so einiges aus, aber irgendwie möchte es mir nicht gelingen. :p
 
Am besten im selben, einen weiteren kannst du nur aufrufen in dem du in eine andere Tabelle schreibst oder eine andere Aktion (INSERT, DELETE) durchführst. Wenn mehrere Trigger das selbe tun müssen (z.B. weil Änderungen in 2 Tabellen eine Aktualisierung auslösen) kannst du auch mit Funktionen arbeiten und diese aus dem Trigger aufrufen. Hat den Vorteil das Code nicht doppelt vorkommt und man nicht an vielen Stellen gefixt werden muss.
 
Okay, ich arbeite also im selben Trigger.

Ich habe noch immer ein Problem damit, die neue ID zu bekommen, die durch das auslösen des Triggers entstanden ist.
Der Alte Datensetz wird kopiert und mit einer neuen ID versehen. Wie komm ich an diese ID?

Gibts nen Befehl oder ne Tabelle die ähnlich Funktioniert wie deleted oder inserted, welche jedoch den letzten Datensatz anzeigt, der in eine Tabelle geschrieben wurde?
 
Nein, du musst die ID erst erzeugen und in eine Variable schreiben, diese kannst du dann inserten und weiter verwenden. Anders ginge es nur mit einem weiteren Trigger der auf den Insert reagiert und die ID ausließt und wieder irgendwo anders hin schreibt, aber da kann dein aktueller Trigger nicht drauf zugreifen.
 
Okay, ich bin nicht ganz sicher, ob du es dir so vorgestellt hast, aber es scheint zu funktionieren:

Code:
USE [CODB]
GO
    SET ANSI_NULLS ON
GO
    SET QUOTED_IDENTIFIER ON
GO
    ALTER TRIGGER [dbo].[tr_Projekte_Version]
    ON  [dbo].[Projekte]
      AFTER UPDATE
    AS
DECLARE @newID INT
BEGIN
    SET NOCOUNT ON;
    IF UPDATE (PRO_V)
        Insert Into dbo.Projekte (
            PRO_PCIS,
            PRO_NAME,
            PRO_SOP,
            KUN_ID,
            PRO_BM,
            PRO_T_LFM,
            PRO_T_FWM,
            PRO_T_FVE,
            PRO_T_CADS,
            PRO_T_EL,
            PRO_T_IE,
            PRO_T_LOG,
            PRO_T_CTL,
            PRO_T_EK,
            PRO_T_QA,
            PRO_T_CO,
            PRO_V)
        (SELECT
            PRO_PCIS,
            PRO_NAME,
            PRO_SOP,
            KUN_ID,
            PRO_BM,
            PRO_T_LFM,
            PRO_T_FWM,
            PRO_T_FVE,
            PRO_T_CADS,
            PRO_T_EL,
            PRO_T_IE,
            PRO_T_LOG,
            PRO_T_CTL,
            PRO_T_EK,
            PRO_T_QA,
            PRO_T_CO,
            PRO_V
        FROM
            deleted)
            SET @newID = (SELECT
            pro.PRO_ID
            FROM
                dbo.Projekte as pro,
                deleted as del
            WHERE
                pro.PRO_V = del.PRO_V AND
                pro.PRO_PCIS = del.PRO_PCIS)
        Insert Into dbo.ZProjekteBauteile (
            PRO_ID,
            BT_ID,
            Z_PB_ANZAHL)
        (SELECT
            @newID,
            ori.BT_ID,
            ori.Z_PB_ANZAHL
        FROM
            dbo.ZProjekteBauteile as ori,
            deleted as del,
            inserted as new
        WHERE
            del.PRO_ID = ori.PRO_ID)
END
 
Werbung:
Ich hab mal wieder ein kleines Problemchen :D

Ich habe eine Tabelle, in welcher festgehalten wird, zu welchem Zeitpunkt ein Freeze eines Projektes benötigt wird.
In dieser Tabelle gibt es:

SP_ID (PKEY)
PRO_PCIS + PRO_V (Projekt Nummer und Version mit denen ein Projekt identifiziert werden kann)
PRO_S_DATE (Datum zu dem der Freeze stattfinden soll)
PRO_S_COM (Comment zum Freeze)

Die Projekt-Audit-Tabelle enthält unter anderem:
PRO_PCIS + PRO_V
AUDIT_DATE
Weitere Eigenschaften

Ich möchte nun per Abfrage jede SP_ID nur einmal sehen. Also jedem Freeze soll ein Datensatz aus der Audit-Tabelle zugeordnet werden. PRO_PCIS und _V sollen als Filter dienen, danach soll der Datensatz ausgewählt werden, wo das AUDIT_DATE <= PRO_S_DATE ist. Aber nur einer!

Möglich müsste es sein, wenn ich beim "FROM dbo.SaveProjekt.PRO_S_DATE >= dbo.Projekte_shadow.AuditDate" noch ein MAX oder so einbauen könnte und dann nach SP_ID gruppiere.

Hat jemand nen Tipp? =)

Edit: Hat sich erledigt, habs lösen können.
 
Zurück
Oben