# FIAE Abschlussprüfung 2021 Sommer [Prüfung als PDF](https://ccs.jade-hs.de/index.php/f/233956039) (nur intern) :::info Lizenz - Prüfungen sind urheberrechtlich geschützt - Lösungsvorschlag RM CC0 ::: :::spoiler Inhaltsverzeichnis [toc] ::: ## GA1 1. Handlungsschritt ```plantuml left to right direction skinparam packageStyle rectangle actor "Mitglied" as m actor "Admin" as a actor "Gast" as g package Webanwendung { usecase "persönliche\nDaten verwalten" as UC1 usecase "Dienstleistung\nbuchen" as UC2 usecase "Terminvorschläge\nabrufen" as UC3 usecase "Dienstleistungs\narten verwalten" as UC4 usecase "als Mitglied registrieren" as UC5 usecase "Login" as UCL } a -|> m UCL .u-> UC4 : extends UCL .u-> UC1 : extends UCL .u-> UC2 : extends UC2 .> UC3 : include m --> UC1 m --> UC2 m --> UC3 a --> UC4 g --> UC3 g --> UC5 ``` ## GA1 2. Handlungsschritt In Klammern (1) das Vorgehen beim durchdenken und hinschreiben (von RM) - [Vorgehen in Teilschritten](https://hackmd.io/@OERit/rJzdQ5A_R#/) - [HackMD-Note](https://hackmd.io/drw4t8CeQFyMfD0o1QhlUQ?both#/6/1) dazu ```javascript= erstelle_liste(stundensatz: doulbe) { schreibe_kopf(); // (1) Schreibt den Kopf der Tabelle akt_Satz = holeSatz(); // (3a) 1. Datensatz holen m_id_alt = lese_m_id(akt_Satz); nr = 1; // siehe (4b) // init Summen (in Aufgae explizit nicht verlangt) summe_s = 0; summe_m = 0; summe_g = 0; while (akt_Satz !== "") { // (3b) Datensatz prüfen // (siehe 4a) Daten für den aktuellen Datensatz holen m_id = lese_m_id(akt_Satz); l_id = lese_l_id(akt_Satz); anz_std = lese_anz_std(akt_Satz); if (m_id !== m_id_alt) { // (5) Wenn neues Mitglied // Summe Mitglied ausgeben und zurücksetzen schreibe_summe(summe_m); summe_m = 0; nr = 1; // nr = 1 anfangen siehe (4b) } // Summe für Datensatz, für Mitglied und gesamt berechnen summe_s = anz_std * stundensatz; // siehe (4c) summe_m = summe_m + summe_s; summe_g = summe_g + summe_s; // siehe (2) // (4) Datensatz ausgeben schreibe_daten(nr, m_id, l_id, anz_Std, stundensatz, summe_s); // TODO: (4a) Daten holen (4b) Nummer zählen (4c) Summe akt. Datensatz akt_Satz = hole_Satz(); // (3c) nächsten Datensatz holen nr++ } schreibe_gsumme(summe_g); // (2) Schreibe die Gesamtsumme zum Ende } ``` ## GA1 3. Handlungsschritt ## GA1 4. Handlungsschritt ```plantuml left to right direction hide circle skinparam linetype ortho entity Mitglied { Mitglied_id (PK) -- Vorname Nachname Strasse Hausnummer Ort PLZ Telefonnummer EMail } entity MitgliedZahlung { Mitglied_id (PK) -- Summe_einnahmen Summe_ausgaben } entity MitgliedLeistung { MitgliedLeistung_id (PK) -- Beginn Ende Mitglied_geber_id (FK) Mitglied_nehmer_id (FK) Leistung_id (FK) } entity Leistung { Leistung_id (PK) -- Beschreibung LeistungArt_id (FK) Ausruestung_id (FK) } entity LeistungArt { LeistungArt_id (PK) -- Bezeichnung } entity Ausruestung { Ausruestung_id (PK) -- Bezeichnung } ' Beziehungen Mitglied "1" -- "1" MitgliedZahlung Mitglied "1" -- "n" MitgliedLeistung Leistung "1" -- "n" MitgliedLeistung LeistungArt "1" -- "n" Leistung Ausruestung "0..1" -- "n" Leistung ``` ## GA1 5. Handlungsschritt > Benutze die Datenbank um die Aufgaben zu testen! ```plantuml left to right direction hide circle skinparam linetype ortho entity LeistungArt { idleistungArt (PK) -- artBezeichnung } entity Mitglied { idmitglied (PK) -- gebDat fuehrungsZeugnis } entity Angebot { idangebot (PK) -- beschreibung wochentag vonZeit bisZeit mitgliedid (FK) leistungArtid (FK) } entity Bewertung { idbewertung (PK) -- bewertungText bewertungZahl leistungArtid (FK) mitgliedid (FK) } ' Beziehungen ' Mitglied "1" -u- "n" Bewertung Mitglied "1" -- "n" Angebot LeistungArt "1" -- "n" Bewertung LeistungArt "1" -- "n" Angebot ``` :::spoiler SQL-Daten zum Üben mit eigener Datenbank ```sql= SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS `uni-hamburg`.`angebot`; DROP TABLE IF EXISTS `uni-hamburg`.`bewertung`; DROP TABLE IF EXISTS `uni-hamburg`.`leistungart`; DROP TABLE IF EXISTS `uni-hamburg`.`mitglied`; DROP TABLE IF EXISTS `uni-hamburg`.`mitgliedarchiv`; CREATE TABLE `angebot` ( `idAngebot` int NOT NULL, `Beschreibung` varchar(255) NOT NULL, `WochenTag` varchar(255) NOT NULL, `vonZeit` char(6) NOT NULL, `bisZeit` char(6) NOT NULL, `mitgliedid` int NOT NULL, `leistungArtid` int NOT NULL, PRIMARY KEY (`idAngebot`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE `bewertung` ( `idBewertung` int NOT NULL, `bewertungText` varchar(255) NOT NULL, `bewertungZahl` double DEFAULT NULL, `leistungArtid` int NOT NULL, `mitgliedid` int DEFAULT NULL, PRIMARY KEY (`idBewertung`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE `leistungart` ( `idLeistungArt` int NOT NULL, `artBezeichnung` varchar(255) NOT NULL, PRIMARY KEY (`idLeistungArt`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE `mitglied` ( `idmitglied` int NOT NULL, `GebDatum` datetime(6) NOT NULL, `vorname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, `mitgliedName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL, `Fuehrungszeugnis` varchar(255) NOT NULL, PRIMARY KEY (`idmitglied`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; CREATE TABLE `mitgliedarchiv` ( `idArchiv` int NOT NULL, `GebDatum` datetime(6) NOT NULL, `vorname` varchar(255) NOT NULL, `mitgliedName` varchar(255) NOT NULL, `Fuehrungszeugnis` varchar(255) NOT NULL, PRIMARY KEY (`idArchiv`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; BEGIN; LOCK TABLES `uni-hamburg`.`angebot` WRITE; DELETE FROM `uni-hamburg`.`angebot`; INSERT INTO `uni-hamburg`.`angebot` (`idAngebot`,`Beschreibung`,`WochenTag`,`vonZeit`,`bisZeit`,`mitgliedid`,`leistungArtid`) VALUES (201, '*****', 'Donnerstag', '14:00', '16:00', 4, 101), (202, '*****', 'Donnerstag', '14:00', '16:00', 4, 102), (203, '*****', 'Donnerstag', '14:00', '16:00', 2, 103), (204, '*****', 'Donnerstag', '18:00', '20:00', 3, 101), (205, '*****', 'Freitag', '18:00', '20:00', 2, 101), (206, '*****', 'Donnerstag', '18:00', '20:00', 25, 103), (207, '*****', 'Dienstag', '14:00', '20:00', 2, 105), (208, '*****', 'Montag', '14:00', '15:00', 3, 104); UNLOCK TABLES; COMMIT; BEGIN; LOCK TABLES `uni-hamburg`.`bewertung` WRITE; DELETE FROM `uni-hamburg`.`bewertung`; INSERT INTO `uni-hamburg`.`bewertung` (`idBewertung`,`bewertungText`,`bewertungZahl`,`leistungArtid`,`mitgliedid`) VALUES (301, '****', 2.2, 103, 3), (302, '****', 2, 103, 3), (303, '****', 2.9000000953674316, 103, 2), (304, '****', 3.0999999046325684, 103, 2), (305, '****', 4.400000095367432, 103, 25), (306, '****', 4.599999904632568, 103, 25), (307, '****', 2.5, 102, 1), (308, '****', 4.900000095367432, 101, 2), (309, '****', 6.800000190734863, 104, 1); UNLOCK TABLES; COMMIT; BEGIN; LOCK TABLES `uni-hamburg`.`leistungart` WRITE; DELETE FROM `uni-hamburg`.`leistungart`; INSERT INTO `uni-hamburg`.`leistungart` (`idLeistungArt`,`artBezeichnung`) VALUES (101, 'Gartenarbeit'), (102, 'Hausarbeit'), (103, 'Kinderbetreuung'), (104, 'Tierbetreuung'), (105, 'DateSkill'); UNLOCK TABLES; COMMIT; BEGIN; LOCK TABLES `uni-hamburg`.`mitglied` WRITE; DELETE FROM `uni-hamburg`.`mitglied`; INSERT INTO `uni-hamburg`.`mitglied` (`idmitglied`,`GebDatum`,`vorname`,`mitgliedName`,`Fuehrungszeugnis`) VALUES (1, '1998-07-17 00:00:00.000000', 'Aeds', 'Muell', 'bdgZeugnis'), (2, '1996-09-19 00:00:00.000000', 'Beds', 'Maier', 'bdtZeugnis'), (3, '1995-03-15 00:00:00.000000', 'Ceds', 'Mueller', 'bdpZeugnis'), (4, '1999-08-12 00:00:00.000000', 'Eeds', 'Hauser', 'bdiZeugnis'), (25, '1998-01-11 00:00:00.000000', 'Aeds', 'Spielmann', 'bdkZeugnis'); UNLOCK TABLES; COMMIT; BEGIN; LOCK TABLES `uni-hamburg`.`mitgliedarchiv` WRITE; DELETE FROM `uni-hamburg`.`mitgliedarchiv`; UNLOCK TABLES; COMMIT; ``` ::: a) ```sql= SELECT * FROM mitglied WHERE GebDatum =( SELECT max( GebDatum ) FROM mitglied ); ``` Alternative HB ```sql= SELECT * FROM mitglied ORDER BY GebDatum DESC LIMIT 1; ``` b) ```sql= SELECT m.idmitglied, m.mitgliedName, avg( b.bewertungZahl ) as Durchschnitt FROM mitglied AS m, bewertung AS b, leistungart AS l WHERE m.idmitglied = b.mitgliedid AND l.idLeistungArt = b.leistungArtid AND l.artBezeichnung = 'Kinderbetreuung' GROUP BY m.idmitglied ORDER BY b.bewertungszahl ASC ``` Alternative HB mit Joins ```sql= SELECT m.idmitglied, m.mitgliedName, avg( b.bewertungZahl ) as Durchschnitt FROM mitglied AS m JOIN bewertung AS b ON m.idmitglied = b.mitgliedid JOIN leistungart AS l ON b.leistungArtid = l.leistungid WHERE m.idmitglied = b.mitgliedid AND l.idLeistungArt = b.leistungArtid AND l.artBezeichnung = 'Kinderbetreuung' GROUP BY m.idmitglied ORDER BY b.bewertungszahl ASC ``` c) - Vorgegebene Tabelle bestimmt die angezeigten Spalten ```sql= SELECT m.idmitglied, m.mitgliedName, artBezeichnung, WochenTag, vonZeit, bisZeit FROM mitglied AS m, leistungart AS l, angebot AS a WHERE m.idmitglied = a.mitgliedid AND l.idLeistungArt = a.leistungArtid AND WochenTag = 'Donnerstag' AND vonZeit = '14:00' AND bisZeit = '16:00'; ``` d) Noch zu prüfen! ```sql= //schritt1 CREATE TABLE MitgliedArchiv ( idArchiv int PRIMARY KEY, GebDatum DATETime(6) not null, vorname varchar(255) not null, mitgliedName varchar(255) not null, Fuehrungszeugnis VARCHAR(255) not null ) //schritt2 INSERT INTO MitgliedArchiv VALUES (SELECT * FROM mitglied a WHERE a.idmitglied NOT IN ( SELECT b.mitgliedid FROM angebot b ) ) //schritt3 DELETE FROM mitglied WHERE idmitglied in ( SELECT b.idArchiv FROM mitgliedarchiv b ) ``` --- ## GA2 1. Handlungsschritt Ratendarlehen - Alle Werte in EUR | Schulden <br>Jahresanfang | Zins <br>(7 % p.a.) | Tilgung <br>Jahrsende | Kreditrate | Restschuld | | ----------------: | ----------------: | ----------------: | ----------------: | ----------------: | | 210.000 | 1.4700 | 70.000 | 84.700 | 140.000 | | 140.000 | 9800 | 70.000 | 79.800 | 70.000 | | 70.000 | 4900 | 70.000 | 74.900 | 0 | | 0 | **Summe: 29.400** | | | | ## GA2 2. Handlungsschritt a) Lösungsschritte: 1. Umrechnung der Blattabmessungen in Zoll • 1 inch = 2,54 cm • A4-Seite: 29,7 cm × 21 cm ⇒ in Zoll: – Breite: 29,7 cm / 2,54 cm/inch ≈ 11,69 inch – Höhe: 21 cm / 2,54 cm/inch ≈ 8,27 inch 2. Berechnung der Pixel pro Seite • Scan-Auflösung: 300 dpi × 300 dpi • Breite in Pixeln: 11,69 inch × 300 dpi ≈ 3507,0 Pixel • Höhe in Pixeln: 8,27 inch × 300 dpi ≈ 2481,0 Pixel • Gesamtpixel pro Seite: 3507,0 × 2481,0 ≈ 8 706 000 Pixel 3. Unkomprimierte Dateigröße pro Seite (24 Bit = 3 Byte/Pixel) • 8 706 000 Pixel × 3 Byte/Pixel ≈ 26 118 000 Byte ≈ 26,12 MB 4. Berücksichtigung der Komprimierung auf 40 % (d. h. 0,4) • 26,12 MB × 0,4 ≈ 10,45 MB pro Seite 5. Tagesvolumen • Täglicher Posteingang: 6000 Seiten • 6000 × 10,45 MB ≈ 62 700 MB = 62,7 GB/Tag 6. Jahresvolumen • 220 Arbeitstage pro Jahr • 62,7 GB/Tag × 220 Tage ≈ 13 794 GB ≈ 13 794 000 MB In Byte umgerechnet: 13 794 GB ≈ 13 794 × 10^9 Byte = 1,3794 × 10^13 Byte 7. Umrechnung in Tebibyte (TiB) 1 TiB = 2^40 Byte = 1 099 511 627 776 Byte • 1,3794 × 10^13 Byte ÷ 1,0995 × 10^12 Byte/TiB ≈ 12,55 TiB 8. Aufrunden auf volle TiB • ≈ 13 TiB Antwort: Für den jährlichen Scan-Bedarf werden aufgerundet etwa 13 TiB Speicherplatz benötigt. b) 1. Umrechnung TiB in GiB: 12 TiB = 12 × 1.024 = 12.288 GiB 2. Max. Preis gesamt: 12.288 GiB × 0,30 €/GiB = 3.686,40 EUR 3. Preis pro Festplatte (6 Stück): 3.686,40 EUR / 6 = 614,40 EUR ## GA2 3. Handlungsschritt ## GA2 4. Handlungsschritt ## GA2 5. Handlungsschritt