Fixed not being able to delete veranstaltung after setting it ill
This commit is contained in:
24
script.sql
24
script.sql
@@ -56,10 +56,9 @@ CREATE TABLE IF NOT EXISTS Krank(
|
|||||||
stundeImPlan_tag INTEGER,
|
stundeImPlan_tag INTEGER,
|
||||||
veranstalter INTEGER REFERENCES Veranstalter(ID) ON DELETE SET NULL,
|
veranstalter INTEGER REFERENCES Veranstalter(ID) ON DELETE SET NULL,
|
||||||
krank BOOLEAN DEFAULT FALSE,
|
krank BOOLEAN DEFAULT FALSE,
|
||||||
FOREIGN KEY (stundeImPlan_uhrzeit, stundeImPlan_tag) REFERENCES StundeImPlan(uhrzeit, tag)
|
FOREIGN KEY (stundeImPlan_uhrzeit, stundeImPlan_tag) REFERENCES StundeImPlan(uhrzeit, tag) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
-- Function to delete StundeImPlan when Veranstaltung is deleted
|
|
||||||
CREATE OR REPLACE FUNCTION delete_stundeimplan_for_veranstaltung()
|
CREATE OR REPLACE FUNCTION delete_stundeimplan_for_veranstaltung()
|
||||||
RETURNS TRIGGER AS $$
|
RETURNS TRIGGER AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -94,13 +93,11 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
-- Trigger to call the above function
|
|
||||||
CREATE TRIGGER trg_update_stundeimplan_for_veranstalter
|
CREATE TRIGGER trg_update_stundeimplan_for_veranstalter
|
||||||
AFTER DELETE ON Veranstalter
|
AFTER DELETE ON Veranstalter
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
EXECUTE FUNCTION update_stundeimplan_for_veranstalter();
|
EXECUTE FUNCTION update_stundeimplan_for_veranstalter();
|
||||||
|
|
||||||
-- Function to update arbeitszeit of Veranstalter when assigned to StundeImPlan
|
|
||||||
CREATE OR REPLACE FUNCTION update_arbeitszeit_for_veranstalter()
|
CREATE OR REPLACE FUNCTION update_arbeitszeit_for_veranstalter()
|
||||||
RETURNS TRIGGER AS $$
|
RETURNS TRIGGER AS $$
|
||||||
BEGIN
|
BEGIN
|
||||||
@@ -111,13 +108,11 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
|
||||||
-- Trigger to call the above function
|
|
||||||
CREATE TRIGGER trg_update_arbeitszeit_for_veranstalter
|
CREATE TRIGGER trg_update_arbeitszeit_for_veranstalter
|
||||||
AFTER INSERT ON StundeImPlan
|
AFTER INSERT ON StundeImPlan
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
EXECUTE FUNCTION update_arbeitszeit_for_veranstalter();
|
EXECUTE FUNCTION update_arbeitszeit_for_veranstalter();
|
||||||
|
|
||||||
-- Function to generate the plan
|
|
||||||
CREATE OR REPLACE FUNCTION generate_plan()
|
CREATE OR REPLACE FUNCTION generate_plan()
|
||||||
RETURNS TRIGGER AS $$
|
RETURNS TRIGGER AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
@@ -126,11 +121,8 @@ DECLARE
|
|||||||
available_veranstalter RECORD;
|
available_veranstalter RECORD;
|
||||||
random_day INTEGER;
|
random_day INTEGER;
|
||||||
BEGIN
|
BEGIN
|
||||||
-- Loop through each available time slot
|
|
||||||
FOR u_row IN SELECT * FROM Uhrzeit LOOP
|
FOR u_row IN SELECT * FROM Uhrzeit LOOP
|
||||||
-- Loop through each available Veranstaltung
|
|
||||||
FOR v_row IN SELECT * FROM Veranstaltung WHERE used_in_plan = 0 LOOP
|
FOR v_row IN SELECT * FROM Veranstaltung WHERE used_in_plan = 0 LOOP
|
||||||
-- Find an available Veranstalter with matching ort and not scheduled in the same tag and uhrzeit
|
|
||||||
SELECT * INTO available_veranstalter
|
SELECT * INTO available_veranstalter
|
||||||
FROM Veranstalter v
|
FROM Veranstalter v
|
||||||
WHERE v.arbeitszeit + v_row.dauer <= 18
|
WHERE v.arbeitszeit + v_row.dauer <= 18
|
||||||
@@ -149,32 +141,26 @@ BEGIN
|
|||||||
WHERE prev_sp.uhrzeit = u_row.ID - 1
|
WHERE prev_sp.uhrzeit = u_row.ID - 1
|
||||||
AND prev_sp.tag = random_day
|
AND prev_sp.tag = random_day
|
||||||
AND prev_sp.veranstalter = v.ID
|
AND prev_sp.veranstalter = v.ID
|
||||||
AND prev_va.ort <> v_row.ort -- Ensure different ort for previous hour
|
AND prev_va.ort <> v_row.ort
|
||||||
)
|
)
|
||||||
ORDER BY v.arbeitszeit ASC
|
ORDER BY v.arbeitszeit ASC
|
||||||
LIMIT 1;
|
LIMIT 1;
|
||||||
|
|
||||||
IF FOUND THEN
|
IF FOUND THEN
|
||||||
-- Check if there is already an event scheduled for this tag and uhrzeit combination
|
|
||||||
random_day = random_between_days();
|
random_day = random_between_days();
|
||||||
IF NOT EXISTS (
|
IF NOT EXISTS (
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM StundeImPlan
|
FROM StundeImPlan
|
||||||
WHERE uhrzeit = u_row.ID AND tag = random_day
|
WHERE uhrzeit = u_row.ID AND tag = random_day
|
||||||
) THEN
|
) THEN
|
||||||
-- If an available Veranstalter is found, insert into StundeImPlan
|
|
||||||
INSERT INTO StundeImPlan (uhrzeit, tag, veranstaltung, veranstalter)
|
INSERT INTO StundeImPlan (uhrzeit, tag, veranstaltung, veranstalter)
|
||||||
VALUES (u_row.ID, random_day, v_row.name, available_veranstalter.ID);
|
VALUES (u_row.ID, random_day, v_row.name, available_veranstalter.ID);
|
||||||
|
|
||||||
-- Update the used_in_plan flag and arbeitszeit
|
|
||||||
UPDATE Veranstaltung SET used_in_plan = used_in_plan + 1 WHERE name = v_row.name;
|
UPDATE Veranstaltung SET used_in_plan = used_in_plan + 1 WHERE name = v_row.name;
|
||||||
UPDATE Veranstalter SET arbeitszeit = arbeitszeit + v_row.dauer WHERE ID = available_veranstalter.ID;
|
UPDATE Veranstalter SET arbeitszeit = arbeitszeit + v_row.dauer WHERE ID = available_veranstalter.ID;
|
||||||
|
|
||||||
-- If the duration is 4, also insert for the next time slot
|
|
||||||
IF v_row.dauer = 4 THEN
|
IF v_row.dauer = 4 THEN
|
||||||
-- Ensure the next time slot is within the range
|
|
||||||
IF EXISTS (SELECT 1 FROM Uhrzeit WHERE ID = u_row.ID + 1) THEN
|
IF EXISTS (SELECT 1 FROM Uhrzeit WHERE ID = u_row.ID + 1) THEN
|
||||||
-- Check if the next time slot is free
|
|
||||||
IF NOT EXISTS (
|
IF NOT EXISTS (
|
||||||
SELECT 1
|
SELECT 1
|
||||||
FROM StundeImPlan
|
FROM StundeImPlan
|
||||||
@@ -183,7 +169,6 @@ BEGIN
|
|||||||
INSERT INTO StundeImPlan (uhrzeit, tag, veranstaltung, veranstalter)
|
INSERT INTO StundeImPlan (uhrzeit, tag, veranstaltung, veranstalter)
|
||||||
VALUES (u_row.ID + 1, random_day, v_row.name, available_veranstalter.ID);
|
VALUES (u_row.ID + 1, random_day, v_row.name, available_veranstalter.ID);
|
||||||
|
|
||||||
-- Mark the second part as used in the plan
|
|
||||||
UPDATE Veranstaltung SET used_in_plan = used_in_plan + 1 WHERE name = v_row.name;
|
UPDATE Veranstaltung SET used_in_plan = used_in_plan + 1 WHERE name = v_row.name;
|
||||||
END IF;
|
END IF;
|
||||||
END IF;
|
END IF;
|
||||||
@@ -206,7 +191,6 @@ DECLARE
|
|||||||
new_veranstalter_id INTEGER;
|
new_veranstalter_id INTEGER;
|
||||||
v_name VARCHAR(3);
|
v_name VARCHAR(3);
|
||||||
BEGIN
|
BEGIN
|
||||||
-- Find the name of the Veranstaltung for the same stundeImPlan
|
|
||||||
SELECT veranstaltung.name INTO v_name
|
SELECT veranstaltung.name INTO v_name
|
||||||
FROM Veranstaltung
|
FROM Veranstaltung
|
||||||
WHERE name = (SELECT veranstaltung FROM StundeImPlan WHERE uhrzeit = NEW.stundeImPlan_uhrzeit AND tag = NEW.stundeImPlan_tag);
|
WHERE name = (SELECT veranstaltung FROM StundeImPlan WHERE uhrzeit = NEW.stundeImPlan_uhrzeit AND tag = NEW.stundeImPlan_tag);
|
||||||
@@ -243,18 +227,15 @@ BEGIN
|
|||||||
ORDER BY v.arbeitszeit ASC
|
ORDER BY v.arbeitszeit ASC
|
||||||
LIMIT 1;
|
LIMIT 1;
|
||||||
|
|
||||||
-- Check if a new veranstalter was found
|
|
||||||
IF new_veranstalter_id IS NOT NULL THEN
|
IF new_veranstalter_id IS NOT NULL THEN
|
||||||
UPDATE Veranstalter
|
UPDATE Veranstalter
|
||||||
SET arbeitszeit = arbeitszeit + (SELECT dauer FROM Veranstaltung WHERE name = v_name)
|
SET arbeitszeit = arbeitszeit + (SELECT dauer FROM Veranstaltung WHERE name = v_name)
|
||||||
WHERE ID = new_veranstalter_id;
|
WHERE ID = new_veranstalter_id;
|
||||||
|
|
||||||
-- Update the StundeImPlan with the replacement
|
|
||||||
UPDATE StundeImPlan
|
UPDATE StundeImPlan
|
||||||
SET veranstalter = new_veranstalter_id
|
SET veranstalter = new_veranstalter_id
|
||||||
WHERE uhrzeit = NEW.stundeImPlan_uhrzeit AND tag = NEW.stundeImPlan_tag;
|
WHERE uhrzeit = NEW.stundeImPlan_uhrzeit AND tag = NEW.stundeImPlan_tag;
|
||||||
ELSE
|
ELSE
|
||||||
-- If no suitable veranstalter is found, set veranstalter to NULL
|
|
||||||
UPDATE StundeImPlan
|
UPDATE StundeImPlan
|
||||||
SET veranstalter = NULL
|
SET veranstalter = NULL
|
||||||
WHERE uhrzeit = NEW.stundeImPlan_uhrzeit AND tag = NEW.stundeImPlan_tag;
|
WHERE uhrzeit = NEW.stundeImPlan_uhrzeit AND tag = NEW.stundeImPlan_tag;
|
||||||
@@ -277,7 +258,6 @@ BEGIN
|
|||||||
FOR affected_row IN
|
FOR affected_row IN
|
||||||
SELECT * FROM StundeImPlan WHERE veranstalter = OLD.id
|
SELECT * FROM StundeImPlan WHERE veranstalter = OLD.id
|
||||||
LOOP
|
LOOP
|
||||||
-- Find a new suitable Veranstalter
|
|
||||||
SELECT * INTO new_veranstalter
|
SELECT * INTO new_veranstalter
|
||||||
FROM Veranstalter v
|
FROM Veranstalter v
|
||||||
WHERE v.arbeitszeit + (SELECT dauer FROM Veranstaltung va WHERE va.name = affected_row.veranstaltung) <= 18
|
WHERE v.arbeitszeit + (SELECT dauer FROM Veranstaltung va WHERE va.name = affected_row.veranstaltung) <= 18
|
||||||
|
|||||||
Reference in New Issue
Block a user