# 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