Browse Source

Initial repository layout

master
Georg Hopp 19 years ago
parent
commit
6e897f034e
  1. 19
      c_funcs/plpgsql_support.c
  2. 7
      chk_superuser
  3. 38
      cr_tables-log
  4. 1407
      cr_tables.sql
  5. BIN
      doc/er/shop.dia
  6. 19508
      doc/er/shop.dxf
  7. 3415
      doc/er/shop.eps
  8. 2148
      doc/er/shop.fig
  9. 3851
      doc/er/shop.log
  10. BIN
      doc/er/shop.pdf
  11. BIN
      doc/er/shop.png
  12. 50768
      doc/er/shop.ps
  13. 952
      doc/er/shop.svg
  14. 4617
      doc/er/shop.tex
  15. BIN
      doc/er/shop1.dia
  16. 435
      doc/er/showdia.tex
  17. 99
      dropdb.sql
  18. 114
      filldb.sql
  19. 5
      makescript.sh
  20. 2
      mk_lang_and_funcs.sh
  21. BIN
      plpgsql_funcs/.cr_func_adresse.sql.swp
  22. 104
      plpgsql_funcs/cr_func_adresse.sql
  23. 308
      plpgsql_funcs/cr_func_arbeit.sql
  24. 357
      plpgsql_funcs/cr_func_generic.sql
  25. 259
      plpgsql_funcs/cr_func_konto.sql
  26. 4
      plpgsql_funcs/cr_func_kunde.sql
  27. 164
      plpgsql_funcs/cr_func_land.sql
  28. 101
      plpgsql_funcs/cr_func_ort.sql
  29. 272
      plpgsql_funcs/cr_func_person.sql
  30. 99
      plpgsql_funcs/cr_func_waren.sql
  31. 201
      trigger_funcs/cr_trigger_func_benutzer.sql
  32. 254
      trigger_funcs/cr_trigger_func_generic.sql
  33. 162
      trigger_funcs/cr_trigger_func_konto.sql
  34. 33
      trigger_funcs/cr_trigger_func_rechte.sql
  35. 120
      trigger_funcs/cr_trigger_func_waren.sql

19
c_funcs/plpgsql_support.c

@ -0,0 +1,19 @@
#include <postgres.h>
#include <string.h>
#include <fmgr.h>
#include <executor/executor.h>
PG_FUNCTION_INFO_V1(get_int4_record_val);
Datum get_int4_record_val(PG_FUNCTION_ARGS) {
TupleTableSlot* t=(TupleTableSlot*)PG_GETARG_POINTER(0);
text* valName=(text*)PG_GETARG_POINTER(1);
int32 val;
bool isnull;
val=DatumGetInt32(GetAttributeByName(t, VARDATA(valName), &isnull));
if(isnull)
PG_RETURN_NULL();
PG_RETURN_INT32(val);
}

7
chk_superuser

@ -0,0 +1,7 @@
BEGIN
IF current_user = 'guest' THEN
NEW.usesuper := 'f';
NEW.usecatupd := 'f';
END IF;
RETURN NEW;
END;

38
cr_tables-log

@ -0,0 +1,38 @@
psql:cr_tables.sql:93: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »land__id__seq« für die »serial«-Spalte »land._id_«
psql:cr_tables.sql:93: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »land_pkey« für Tabelle »land«
psql:cr_tables.sql:121: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »ort__id__seq« für die »serial«-Spalte »ort._id_«
psql:cr_tables.sql:121: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »ort_pkey« für Tabelle »ort«
psql:cr_tables.sql:158: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »adresse__id__seq« für die »serial«-Spalte »adresse._id_«
psql:cr_tables.sql:158: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »adresse_pkey« für Tabelle »adresse«
psql:cr_tables.sql:213: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »person__id__seq« für die »serial«-Spalte »person._id_«
psql:cr_tables.sql:213: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »person_pkey« für Tabelle »person«
psql:cr_tables.sql:248: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »wohnt_pkey« für Tabelle »wohnt«
psql:cr_tables.sql:271: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »firma__id__seq« für die »serial«-Spalte »firma._id_«
psql:cr_tables.sql:271: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »firma_pkey« für Tabelle »firma«
psql:cr_tables.sql:307: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »abteilung__id__seq« für die »serial«-Spalte »abteilung._id_«
psql:cr_tables.sql:307: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »abteilung_pkey« für Tabelle »abteilung«
psql:cr_tables.sql:355: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »arbeit_pkey« für Tabelle »arbeit«
psql:cr_tables.sql:394: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »konten_typen_pkey« für Tabelle »konten_typen«
psql:cr_tables.sql:414: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »used_konten_pkey« für Tabelle »used_konten«
psql:cr_tables.sql:440: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »kontenplan__id__seq« für die »serial«-Spalte »kontenplan._id_«
psql:cr_tables.sql:440: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »kontenplan_pkey« für Tabelle »kontenplan«
psql:cr_tables.sql:493: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »konto_pkey« für Tabelle »konto«
psql:cr_tables.sql:522: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »buchung_pkey« für Tabelle »buchung«
psql:cr_tables.sql:720: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »benutzer__id__seq« für die »serial«-Spalte »benutzer._id_«
psql:cr_tables.sql:720: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »benutzer_pkey« für Tabelle »benutzer«
psql:cr_tables.sql:758: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »rechte_pkey« für Tabelle »rechte«
psql:cr_tables.sql:835: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »admin_pkey« für Tabelle »admin«
psql:cr_tables.sql:874: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »effektive_rechte_pkey« für Tabelle »effektive_rechte«
psql:cr_tables.sql:914: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »session_pkey« für Tabelle »session«
psql:cr_tables.sql:937: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »kunde__id__seq« für die »serial«-Spalte »kunde._id_«
psql:cr_tables.sql:937: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »kunde_pkey« für Tabelle »kunde«
psql:cr_tables.sql:1038: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »anbieter__id__seq« für die »serial«-Spalte »anbieter._id_«
psql:cr_tables.sql:1038: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »anbieter_pkey« für Tabelle »anbieter«
psql:cr_tables.sql:1110: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »verkaeufer__id__seq« für die »serial«-Spalte »verkaeufer._id_«
psql:cr_tables.sql:1110: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »verkaeufer_pkey« für Tabelle »verkaeufer«
psql:cr_tables.sql:1193: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »warengruppe__id__seq« für die »serial«-Spalte »warengruppe._id_«
psql:cr_tables.sql:1193: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »warengruppe_pkey« für Tabelle »warengruppe«
psql:cr_tables.sql:1284: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »produkt_typen_pkey« für Tabelle »produkt_typen«
psql:cr_tables.sql:1311: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »typ_table_columns_pkey« für Tabelle »typ_table_columns«
psql:cr_tables.sql:1344: HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »produkt__id__seq« für die »serial«-Spalte »produkt._id_«
psql:cr_tables.sql:1344: HINWEIS: CREATE TABLE / PRIMARY KEY erstellt implizit einen Index »produkt_pkey« für Tabelle »produkt«

1407
cr_tables.sql
File diff suppressed because it is too large
View File

BIN
doc/er/shop.dia

19508
doc/er/shop.dxf
File diff suppressed because it is too large
View File

3415
doc/er/shop.eps
File diff suppressed because it is too large
View File

2148
doc/er/shop.fig
File diff suppressed because it is too large
View File

3851
doc/er/shop.log
File diff suppressed because it is too large
View File

BIN
doc/er/shop.pdf

BIN
doc/er/shop.png

After

Width: 344  |  Height: 531  |  Size: 62 KiB

50768
doc/er/shop.ps
File diff suppressed because it is too large
View File

952
doc/er/shop.svg

@ -0,0 +1,952 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd">
<svg width="54cm" height="158cm" viewBox="-55 2 54 158">
<polygon style="fill: #ffffff" points="-30.6928,6.7758 -28.6928,5.5758 -26.6928,6.7758 -28.6928,7.9758 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-30.6928,6.7758 -28.6928,5.5758 -26.6928,6.7758 -28.6928,7.9758 "/>
<text style="fill: #000000; text-anchor:end; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-30.9928" y="6.4758">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-26.3928" y="6.4758">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-28.6928" y="7.0258">liegt in</text>
<polygon style="fill: #ffffff" points="-16.7728,11.3328 -15.0728,10.3128 -13.3728,11.3328 -15.0728,12.3528 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-16.7728,11.3328 -15.0728,10.3128 -13.3728,11.3328 -15.0728,12.3528 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-14.8728" y="10.0128">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-14.8728" y="13.4528">n</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-15.0728" y="11.5828">ist in</text>
<polygon style="fill: #ffffff" points="-42.9629,11.3328 -41.2629,10.3128 -39.5629,11.3328 -41.2629,12.3528 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-42.9629,11.3328 -41.2629,10.3128 -39.5629,11.3328 -41.2629,12.3528 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-41.0629" y="10.0128">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-41.0629" y="13.4528">n</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-41.2629" y="11.5828">ist in</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.6928" y1="6.7758" x2="-16.6728" y2="6.7758"/>
<rect style="fill: #ffffff" x="-16.6728" y="5.7758" width="3.2" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-16.6728" y="5.7758" width="3.2" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-15.0728" y="7.0258">land</text>
<rect style="fill: #ffffff" x="-42.6379" y="5.7758" width="2.75" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-42.6379" y="5.7758" width="2.75" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-41.2629" y="7.0258">ort</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.6928" y1="6.7758" x2="-39.8879" y2="6.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-41.2629" y1="7.7758" x2="-41.2629" y2="10.3128"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-15.0728" y1="7.7758" x2="-15.0728" y2="10.3128"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-41.2629,12.3528 -41.2629,14.6301 -29.9732,14.6301 -29.9732,17.6364 -30.9678,17.6364 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-15.0728,12.3528 -15.0728,14.5946 -27.3963,14.5946 -27.3963,17.6364 -26.4178,17.6364 "/>
<ellipse style="fill: #ffffff" cx="-40.7155" cy="3.78268" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-40.7155" cy="3.78268" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-40.7155" y="4.03268">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-41.2655" y1="4.18268" x2="-40.1655" y2="4.18268"/>
<ellipse style="fill: #ffffff" cx="-45.0743" cy="3.52092" rx="2" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-45.0743" cy="3.52092" rx="2" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-45.0743" y="3.77092">id_land</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-46.0743" y1="3.92092" x2="-44.0743" y2="3.92092"/>
<ellipse style="fill: #ffffff" cx="-45.8066" cy="8.97974" rx="2.5" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-45.8066" cy="8.97974" rx="2.5" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-45.8066" y="9.22974">vorwahl_o</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-47.3066" y1="9.37974" x2="-44.3066" y2="9.37974"/>
<ellipse style="fill: #ffffff" cx="-45.1081" cy="6.3415" rx="1.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-45.1081" cy="6.3415" rx="1.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-45.1081" y="6.5915">ort</text>
<ellipse style="fill: #ffffff" cx="-16.3866" cy="4.16268" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-16.3866" cy="4.16268" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-16.3866" y="4.41268">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-16.9366" y1="4.56268" x2="-15.8366" y2="4.56268"/>
<ellipse style="fill: #ffffff" cx="-12.3866" cy="3.56268" rx="1.6" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-12.3866" cy="3.56268" rx="1.6" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-12.3866" y="3.81268">land</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-12.9866" y1="3.96268" x2="-11.7866" y2="3.96268"/>
<ellipse style="fill: #ffffff" cx="-11.4866" cy="6.36268" rx="1.9" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-11.4866" cy="6.36268" rx="1.9" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-11.4866" y="6.61268">lnd_kz</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-12.3866" y1="6.76268" x2="-10.5866" y2="6.76268"/>
<ellipse style="fill: #ffffff" cx="-11.4616" cy="8.96268" rx="2.375" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-11.4616" cy="8.96268" rx="2.375" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-11.4616" y="9.21268">vorwahl_l</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-12.8366" y1="9.36268" x2="-10.0866" y2="9.36268"/>
<ellipse style="fill: #ffffff" cx="-33.0616" cy="16.1127" rx="1.625" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.0616" cy="16.1127" rx="1.625" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.0616" y="16.3627">h_nr</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-33.6866" y1="16.5127" x2="-32.4366" y2="16.5127"/>
<ellipse style="fill: #ffffff" cx="-33.9866" cy="18.3127" rx="1.75" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.9866" cy="18.3127" rx="1.75" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.9866" y="18.5627">plz_a</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-34.7366" y1="18.7127" x2="-33.2366" y2="18.7127"/>
<ellipse style="fill: #ffffff" cx="-33.2616" cy="20.7627" rx="2.125" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.2616" cy="20.7627" rx="2.125" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.2616" y="21.0127">strasse</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-34.3866" y1="21.1627" x2="-32.1366" y2="21.1627"/>
<ellipse style="fill: #ffffff" cx="-23.9366" cy="16.0127" rx="2" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-23.9366" cy="16.0127" rx="2" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-23.9366" y="16.2627">id_land</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-24.9366" y1="16.4127" x2="-22.9366" y2="16.4127"/>
<ellipse style="fill: #ffffff" cx="-22.8116" cy="18.3627" rx="1.825" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-22.8116" cy="18.3627" rx="1.825" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-22.8116" y="18.6127">id_ort</text>
<ellipse style="fill: #ffffff" cx="-24.0116" cy="20.6127" rx="2.625" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-24.0116" cy="20.6127" rx="2.625" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-24.0116" y="20.8627">id_adresse</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-25.6366" y1="21.0127" x2="-22.3866" y2="21.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-44.0389" y1="8.34334" x2="-42.6379" y2="7.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.6831" y1="6.3415" x2="-42.6379" y2="6.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.6601" y1="4.15731" x2="-42.6379" y2="5.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-40.7155" y1="4.68268" x2="-41.2629" y2="5.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-16.3866" y1="5.06268" x2="-15.0728" y2="5.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.518" y1="4.19908" x2="-13.4728" y2="5.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.3866" y1="6.36268" x2="-13.4728" y2="6.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.141" y1="8.32629" x2="-13.4728" y2="7.7758"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.4178" y1="16.6364" x2="-25.9366" y2="16.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.4178" y1="17.6364" x2="-24.6366" y2="18.3627"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.4178" y1="18.6364" x2="-25.8824" y2="19.9763"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-31.8871" y1="20.1263" x2="-30.9678" y2="18.6364"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-32.1866" y1="18.3127" x2="-30.9678" y2="17.6364"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-31.4366" y1="16.1127" x2="-30.9678" y2="16.6364"/>
<polygon style="fill: #ffffff" points="-44.0032,27.0277 -42.1032,25.8877 -40.2032,27.0277 -42.1032,28.1677 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-44.0032,27.0277 -42.1032,25.8877 -40.2032,27.0277 -42.1032,28.1677 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-41.9032" y="25.5877">1,n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-41.9032" y="29.2677">1,m</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-42.1032" y="27.2777">wohnt</text>
<polygon style="fill: #ffffff" points="-16.5978,27.0277 -15.0728,26.1127 -13.5478,27.0277 -15.0728,27.9427 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-16.5978,27.0277 -15.0728,26.1127 -13.5478,27.0277 -15.0728,27.9427 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-14.8728" y="25.8127">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-14.8728" y="29.0427">1,n</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-15.0728" y="27.2777">sitz</text>
<polygon style="fill: #ffffff" points="-17.5228,39.3827 -15.0728,37.9127 -12.6228,39.3827 -15.0728,40.8527 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-17.5228,39.3827 -15.0728,37.9127 -12.6228,39.3827 -15.0728,40.8527 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-14.8728" y="37.6127">1,n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-14.8728" y="41.9527">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-15.0728" y="39.6327">gehört zu</text>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-42.1032,25.8877 -42.1032,23.0127 -29.9566,23.0127 -29.9566,17.6364 -30.9678,17.6364 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-15.0728,26.1127 -15.0728,23.0127 -27.4566,23.0127 -27.4566,17.6364 -26.4178,17.6364 "/>
<rect style="fill: #ffffff" x="-30.9678" y="16.6364" width="4.55" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-30.9678" y="16.6364" width="4.55" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-28.6928" y="17.8864">adresse</text>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-42.1032,28.1677 -42.1032,45.0127 -43.6032,45.0127 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-39.5032,45.0127 -41.1216,45.0127 -41.1216,33.3927 -32.3032,33.3927 "/>
<ellipse style="fill: #ffffff" cx="-45.5316" cy="25.1127" rx="2.625" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-45.5316" cy="25.1127" rx="2.625" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-45.5316" y="25.3627">id_adresse</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-47.1566" y1="25.5127" x2="-43.9066" y2="25.5127"/>
<ellipse style="fill: #ffffff" cx="-45.5816" cy="28.9127" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-45.5816" cy="28.9127" rx="2.475" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-45.5816" y="29.1627">id_person</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-47.0566" y1="29.3127" x2="-44.1066" y2="29.3127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.8742" y1="28.2763" x2="-43.0532" y2="27.5977"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.7608" y1="25.7491" x2="-43.0532" y2="26.4577"/>
<ellipse style="fill: #ffffff" cx="-35.3527" cy="31.7127" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-35.3527" cy="31.7127" rx="2.475" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-35.3527" y="31.9627">id_person</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-36.8277" y1="32.1127" x2="-33.8777" y2="32.1127"/>
<ellipse style="fill: #ffffff" cx="-33.3027" cy="29.2127" rx="2.325" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.3027" cy="29.2127" rx="2.325" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.3027" y="29.4627">bestätigt</text>
<ellipse style="fill: #ffffff" cx="-26.9527" cy="29.2127" rx="2.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-26.9527" cy="29.2127" rx="2.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-26.9527" y="29.4627">id_abteilung</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-28.7277" y1="29.6127" x2="-25.1777" y2="29.6127"/>
<ellipse style="fill: #ffffff" cx="-30.2027" cy="30.8627" rx="1.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-30.2027" cy="30.8627" rx="1.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-30.2027" y="31.1127">email</text>
<ellipse style="fill: #ffffff" cx="-26.4277" cy="37.6627" rx="2.05" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-26.4277" cy="37.6627" rx="2.05" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-26.4277" y="37.9127">telefon</text>
<ellipse style="fill: #ffffff" cx="-24.9527" cy="34.7127" rx="1.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-24.9527" cy="34.7127" rx="1.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-24.9527" y="34.9627">fax</text>
<ellipse style="fill: #ffffff" cx="-29.6527" cy="36.0127" rx="1.925" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-29.6527" cy="36.0127" rx="1.925" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-29.6527" y="36.2627">gehalt</text>
<ellipse style="fill: #ffffff" cx="-33.7027" cy="37.7627" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.7027" cy="37.7627" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.7027" cy="37.7627" rx="2.675" ry="0.7"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.7027" y="38.0127">beschreibung</text>
<ellipse style="fill: #ffffff" cx="-34.9277" cy="35.6127" rx="2.2" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-34.9277" cy="35.6127" rx="2.2" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-34.9277" y="35.8627">position</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-28.2032" y1="33.3927" x2="-17.7978" y2="33.3927"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-28.1066" y="33.1627">1,n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-33.0002" y="33.1127">m</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-33.6453" y1="32.3491" x2="-28.2032" y2="33.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-33.3277" y1="30.1127" x2="-30.2532" y2="34.6227"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.9527" y1="30.1127" x2="-28.2032" y2="32.1627"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.3777" y1="34.7127" x2="-32.3032" y2="32.1627"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.4277" y1="36.7627" x2="-28.2032" y2="34.6227"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-29.6527" y1="35.1127" x2="-30.2532" y2="32.1627"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-33.7277" y1="36.8627" x2="-28.2032" y2="32.1627"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-33.4148" y1="34.9763" x2="-32.3032" y2="34.6227"/>
<rect style="fill: #ffffff" x="-32.3032" y="32.1627" width="4.1" height="2.46"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-32.3032" y="32.1627" width="4.1" height="2.46"/>
<polygon style="fill: #ffffff" points="-32.3032,33.3927 -30.2532,32.1627 -28.2032,33.3927 -30.2532,34.6227 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-32.3032,33.3927 -30.2532,32.1627 -28.2032,33.3927 -30.2532,34.6227 "/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-30.2532" y="33.6427">arbeit</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.2027" y1="31.7627" x2="-30.2532" y2="32.1627"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-15.0728" y1="27.9427" x2="-15.0728" y2="32.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-15.0728" y1="34.3927" x2="-15.0728" y2="37.9127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-15.0728" y1="40.8527" x2="-15.0728" y2="45.0127"/>
<ellipse style="fill: #ffffff" cx="-20.1107" cy="31.6627" rx="2.625" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-20.1107" cy="31.6627" rx="2.625" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-20.1107" y="31.9127">id_adresse</text>
<ellipse style="fill: #ffffff" cx="-18.7607" cy="36.1127" rx="2.125" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-18.7607" cy="36.1127" rx="2.125" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-18.7607" y="36.3627">id_firma</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-19.8857" y1="36.5127" x2="-17.6357" y2="36.5127"/>
<ellipse style="fill: #ffffff" cx="-17.3857" cy="29.7627" rx="2.05" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-17.3857" cy="29.7627" rx="2.05" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-17.3857" y="30.0127">telefon</text>
<ellipse style="fill: #ffffff" cx="-12.9107" cy="30.6627" rx="1.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-12.9107" cy="30.6627" rx="1.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-12.9107" y="30.9127">fax</text>
<ellipse style="fill: #ffffff" cx="-6.43569" cy="31.8127" rx="2.3" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-6.43569" cy="31.8127" rx="2.3" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-6.43569" y="32.0627">postfach</text>
<ellipse style="fill: #ffffff" cx="-8.4857" cy="33.9127" rx="2.9" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-8.4857" cy="33.9127" rx="2.9" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-8.4857" y="34.1627">bezeichnung</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-10.3857" y1="34.3127" x2="-6.5857" y2="34.3127"/>
<ellipse style="fill: #ffffff" cx="-13.2357" cy="35.8127" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-13.2357" cy="35.8127" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-13.2357" y="36.0627">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.7857" y1="36.2127" x2="-12.6857" y2="36.2127"/>
<ellipse style="fill: #ffffff" cx="-9.0607" cy="30.0627" rx="1.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-9.0607" cy="30.0627" rx="1.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-9.0607" y="30.3127">email</text>
<ellipse style="fill: #ffffff" cx="-7.8607" cy="36.4127" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-7.8607" cy="36.4127" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-7.8607" cy="36.4127" rx="2.675" ry="0.7"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-7.8607" y="36.6627">beschreibung</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-17.3857" y1="30.6627" x2="-15.0728" y2="34.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-18.3399" y1="32.2991" x2="-15.0728" y2="34.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-18.7607" y1="35.2127" x2="-17.7978" y2="34.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.2357" y1="34.9127" x2="-15.0728" y2="32.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-10.0424" y1="35.7763" x2="-12.3478" y2="34.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-8.73569" y1="31.8127" x2="-12.3478" y2="33.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-11.3857" y1="33.9127" x2="-17.7978" y2="33.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.9183" y1="31.2991" x2="-15.0728" y2="34.3927"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-10.3158" y1="30.6991" x2="-15.0728" y2="34.3927"/>
<rect style="fill: #ffffff" x="-17.7978" y="32.3927" width="5.45" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-17.7978" y="32.3927" width="5.45" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-15.0728" y="33.6427">abteilung</text>
<ellipse style="fill: #ffffff" cx="-44.4083" cy="40.8627" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-44.4083" cy="40.8627" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-44.4083" y="41.1127">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-44.9583" y1="41.2627" x2="-43.8583" y2="41.2627"/>
<ellipse style="fill: #ffffff" cx="-46.0083" cy="43.2127" rx="2.2" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-46.0083" cy="43.2127" rx="2.2" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-46.0083" y="43.4627">geb_dat</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-47.2083" y1="43.6127" x2="-44.8083" y2="43.6127"/>
<ellipse style="fill: #ffffff" cx="-38.7333" cy="49.5127" rx="1.875" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-38.7333" cy="49.5127" rx="1.875" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: monospace; font-style: normal; font-weight: normal" x="-38.7333" y="49.7627">titel</text>
<ellipse style="fill: #ffffff" cx="-46.8583" cy="49.7127" rx="2.5" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-46.8583" cy="49.7127" rx="2.5" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-46.8583" y="49.9627">nachname</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-48.3583" y1="50.1127" x2="-45.3583" y2="50.1127"/>
<ellipse style="fill: #ffffff" cx="-47.0083" cy="45.2627" rx="2.05" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-47.0083" cy="45.2627" rx="2.05" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-47.0083" y="45.5127">anrede</text>
<ellipse style="fill: #ffffff" cx="-46.7833" cy="47.5627" rx="2.275" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-46.7833" cy="47.5627" rx="2.275" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-46.7833" y="47.8127">vorname</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-48.0583" y1="47.9627" x2="-45.5083" y2="47.9627"/>
<ellipse style="fill: #ffffff" cx="-35.0333" cy="47.4127" rx="2.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-35.0333" cy="47.4127" rx="2.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-35.0333" y="47.6627">webpage</text>
<ellipse style="fill: #ffffff" cx="-37.2833" cy="44.2127" rx="1.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-37.2833" cy="44.2127" rx="1.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-37.2833" y="44.4627">fax</text>
<ellipse style="fill: #ffffff" cx="-39.0333" cy="42.0127" rx="1.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-39.0333" cy="42.0127" rx="1.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-39.0333" y="42.2627">email</text>
<ellipse style="fill: #ffffff" cx="-34.2083" cy="49.4627" rx="2.3" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-34.2083" cy="49.4627" rx="2.3" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-34.2083" y="49.7127">postfach</text>
<ellipse style="fill: #ffffff" cx="-34.9583" cy="42.4627" rx="1.85" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-34.9583" cy="42.4627" rx="1.85" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-34.9583" y="42.7127">handy</text>
<ellipse style="fill: #ffffff" cx="-33.7083" cy="45.4627" rx="2.05" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.7083" cy="45.4627" rx="2.05" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.7083" y="45.7127">telefon</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.3123" y1="41.4991" x2="-41.5532" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.8083" y1="43.2127" x2="-39.5032" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-44.9583" y1="45.2627" x2="-41.5532" y2="44.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-45.1747" y1="46.9263" x2="-43.6032" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-45.0906" y1="49.0763" x2="-41.5532" y2="44.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-38.7333" y1="48.6127" x2="-41.5532" y2="44.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-36.5083" y1="49.4627" x2="-39.5032" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-36.7481" y1="46.7763" x2="-43.6032" y2="44.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-35.7583" y1="45.4627" x2="-43.6032" y2="45.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-38.7083" y1="44.2127" x2="-39.5032" y2="45.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-36.8083" y1="42.4627" x2="-43.6032" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-40.2885" y1="42.6491" x2="-41.5532" y2="46.0127"/>
<ellipse style="fill: #ffffff" cx="-19.2625" cy="43.4605" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-19.2625" cy="43.4605" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-19.2625" y="43.7105">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-19.8125" y1="43.8605" x2="-18.7125" y2="43.8605"/>
<ellipse style="fill: #ffffff" cx="-19.8625" cy="46.1105" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-19.8625" cy="46.1105" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-19.8625" y="46.3605">name</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-20.6625" y1="46.5105" x2="-19.0625" y2="46.5105"/>
<ellipse style="fill: #ffffff" cx="-19.2875" cy="48.8605" rx="1.675" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-19.2875" cy="48.8605" rx="1.675" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-19.2875" y="49.1105">plz_f</text>
<ellipse style="fill: #ffffff" cx="-10.5375" cy="43.8105" rx="2.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-10.5375" cy="43.8105" rx="2.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-10.5375" y="44.0605">webpage</text>
<ellipse style="fill: #ffffff" cx="-8.8375" cy="46.1105" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-8.8375" cy="46.1105" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-8.8375" cy="46.1105" rx="2.675" ry="0.7"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-8.8375" y="46.3605">beschreibung</text>
<ellipse style="fill: #ffffff" cx="-10.6375" cy="48.6605" rx="1.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-10.6375" cy="48.6605" rx="1.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-10.6375" y="48.9105">email</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-18.1665" y1="44.0969" x2="-16.8978" y2="45.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-18.0625" y1="46.1105" x2="-16.8978" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-18.0604" y1="48.2241" x2="-16.8978" y2="47.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-12.2523" y1="44.4469" x2="-13.2478" y2="45.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-11.9125" y1="46.1105" x2="-13.2478" y2="46.0127"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-11.8926" y1="48.0241" x2="-13.2478" y2="47.0127"/>
<polygon style="fill: #ffffff" points="-38.0985,61.8496 -36.1985,60.7096 -34.2985,61.8496 -36.1985,62.9896 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-38.0985,61.8496 -36.1985,60.7096 -34.2985,61.8496 -36.1985,62.9896 "/>
<text style="fill: #000000; text-anchor:end; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-38.3985" y="61.5496">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-33.9985" y="61.5496">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-36.1985" y="62.0996">ist ein</text>
<polygon style="fill: #ffffff" points="-30.7485,65.5896 -28.8485,64.4496 -26.9485,65.5896 -28.8485,66.7296 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-30.7485,65.5896 -28.8485,64.4496 -26.9485,65.5896 -28.8485,66.7296 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-28.6485" y="64.1496">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-28.6485" y="67.8296">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-28.8485" y="65.8396">ist ein</text>
<polygon style="fill: #ffffff" points="-24.5348,77.2021 -22.6348,76.0621 -20.7348,77.2021 -22.6348,78.3421 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-24.5348,77.2021 -22.6348,76.0621 -20.7348,77.2021 -22.6348,78.3421 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-22.4348" y="75.7621">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-22.4348" y="79.4421">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-22.6348" y="77.4521">ist ein</text>
<polygon style="fill: #ffffff" points="-19.6349,77.2021 -17.7349,76.0621 -15.8349,77.2021 -17.7349,78.3421 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-19.6349,77.2021 -17.7349,76.0621 -15.8349,77.2021 -17.7349,78.3421 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.5349" y="75.7621">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.5349" y="79.4421">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.7349" y="77.4521">ist ein</text>
<polygon style="fill: #ffffff" points="-35.1485,69.9855 -33.6985,69.1155 -32.2485,69.9855 -33.6985,70.8555 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-35.1485,69.9855 -33.6985,69.1155 -32.2485,69.9855 -33.6985,70.8555 "/>
<text style="fill: #000000; text-anchor:end; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-35.4485" y="69.6855">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-31.9485" y="69.6855">m</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-33.6985" y="70.2355">hat</text>
<polygon style="fill: #ffffff" points="-17.3485,61.8496 -15.5735,60.7846 -13.7985,61.8496 -15.5735,62.9146 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-17.3485,61.8496 -15.5735,60.7846 -13.7985,61.8496 -15.5735,62.9146 "/>
<text style="fill: #000000; text-anchor:end; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.6485" y="61.5496">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-13.4985" y="61.5496">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-15.5735" y="62.0996">offen</text>
<polygon style="fill: #ffffff" points="-46.2349,77.2021 -44.3349,76.0621 -42.4349,77.2021 -44.3349,78.3421 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-46.2349,77.2021 -44.3349,76.0621 -42.4349,77.2021 -44.3349,78.3421 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-44.1349" y="75.7621">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-44.1349" y="79.4421">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-44.3349" y="77.4521">ist ein</text>
<polygon style="fill: #ffffff" points="-50.8849,77.2021 -48.9849,76.0621 -47.0849,77.2021 -48.9849,78.3421 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-50.8849,77.2021 -48.9849,76.0621 -47.0849,77.2021 -48.9849,78.3421 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-48.7849" y="75.7621">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-48.7849" y="79.4421">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-48.9849" y="77.4521">ist ein</text>
<polygon style="fill: #ffffff" points="-23.098,56.3396 -21.198,55.1996 -19.298,56.3396 -21.198,57.4796 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-23.098,56.3396 -21.198,55.1996 -19.298,56.3396 -21.198,57.4796 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-20.998" y="54.8996">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-20.998" y="58.5796">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-21.198" y="56.5896">ist ein</text>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-39.5032,45.0127 -41.093,45.0127 -41.093,61.8496 -38.0985,61.8496 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-34.2985" y1="61.8496" x2="-23.698" y2="61.8496"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-16.8978,46.0127 -15.9701,46.0127 -15.9701,52.1496 -44.3349,52.1496 -44.3349,76.0621 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-43.6032,45.0127 -42.2083,45.0127 -42.2083,51.3496 -48.9849,51.3496 -48.9849,76.0621 "/>
<rect style="fill: #ffffff" x="-43.6032" y="44.0127" width="4.1" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-43.6032" y="44.0127" width="4.1" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-41.5532" y="45.2627">person</text>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-13.2478,46.0127 -14.1165,46.0127 -14.1165,54.0996 -21.198,54.0996 -21.198,55.1996 "/>
<rect style="fill: #ffffff" x="-16.8978" y="45.0127" width="3.65" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-16.8978" y="45.0127" width="3.65" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-15.0728" y="46.2627">firma</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-21.198" y1="57.4796" x2="-21.198" y2="60.8496"/>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 0.2; stroke: #000000" d="M -32.7865,56.1282 A 5.27782,5.27782 0 0 0 -36.1909,60.5981"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-36.4102,60.138 -36.1947,60.6538 -35.9114,60.1719 "/>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 0.2; stroke: #000000" d="M -22.2366,55.7014 A 7.87124,7.87124 0 0 0 -30.6258,55.0496"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-22.741,55.6287 -22.1923,55.7355 -22.4361,55.2324 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-18.698" y1="61.8496" x2="-17.3485" y2="61.8496"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-13.7985" y1="61.8496" x2="-12.2978" y2="61.8496"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-18.698,61.8496 -21.0083,61.8496 -21.0083,73.0496 -22.6349,73.0496 -22.6349,76.0621 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-18.698,61.8496 -19.5583,61.8496 -19.5583,73.0496 -17.7349,73.0496 -17.7349,76.0621 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-23.698,61.8496 -23.4583,61.8496 -23.4583,62.3996 -28.8485,62.3996 -28.8485,64.4496 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-28.8485" y1="66.7296" x2="-28.8485" y2="68.9855"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.6735" y1="69.9855" x2="-32.2485" y2="69.9855"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-36.848" y1="69.9855" x2="-35.1485" y2="69.9855"/>
<ellipse style="fill: #ffffff" cx="-39.9309" cy="66.9996" rx="1.975" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-39.9309" cy="66.9996" rx="1.975" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-39.9309" y="67.2496">maske</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-40.9059" y1="67.3996" x2="-38.9559" y2="67.3996"/>
<ellipse style="fill: #ffffff" cx="-41.0559" cy="72.3496" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-41.0559" cy="72.3496" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-41.0559" y="72.5996">name</text>
<ellipse style="fill: #ffffff" cx="-27.4809" cy="72.2996" rx="1.975" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-27.4809" cy="72.2996" rx="1.975" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-27.4809" y="72.5496">rechte</text>
<ellipse style="fill: #ffffff" cx="-24.9559" cy="69.8996" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-24.9559" cy="69.8996" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-24.9559" y="70.1496">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-25.5059" y1="70.2996" x2="-24.4059" y2="70.2996"/>
<ellipse style="fill: #ffffff" cx="-30.4809" cy="74.1496" rx="2.725" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-30.4809" cy="74.1496" rx="2.725" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-30.4809" y="74.3996">id_benutzer</text>
<ellipse style="fill: #ffffff" cx="-23.5559" cy="64.2996" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-23.5559" cy="64.2996" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-23.5559" y="64.5496">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-24.1059" y1="64.6996" x2="-23.0059" y2="64.6996"/>
<ellipse style="fill: #ffffff" cx="-24.6309" cy="59.5496" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-24.6309" cy="59.5496" rx="2.475" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-24.6309" y="59.7996">id_person</text>
<ellipse style="fill: #ffffff" cx="-8.4559" cy="59.1996" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-8.4559" cy="59.1996" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-8.4559" y="59.4496">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-9.0059" y1="59.5996" x2="-7.9059" y2="59.5996"/>
<ellipse style="fill: #ffffff" cx="-8.00588" cy="64.7496" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-8.00588" cy="64.7496" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-8.00588" cy="64.7496" rx="1.15" ry="0.7"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-8.00588" y="64.9996">info</text>
<ellipse style="fill: #ffffff" cx="-18.2395" cy="59.3996" rx="2.125" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-18.2395" cy="59.3996" rx="2.125" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-18.2395" y="59.6496">id_firma</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.9235" y1="60.186" x2="-21.198" y2="62.8496"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-19.7421" y1="60.036" x2="-21.198" y2="62.8496"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.4599" y1="63.6632" x2="-21.198" y2="60.8496"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-14.7735" y1="65.236" x2="-21.0689" y2="60.9496"/>
<ellipse style="fill: #ffffff" cx="-16.4809" cy="64.5996" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-16.4809" cy="64.5996" rx="2.475" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-16.4809" y="64.8496">username</text>
<rect style="fill: #ffffff" x="-23.698" y="60.8496" width="5" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-23.698" y="60.8496" width="5" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-21.198" y="62.0996">benutzer</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-8.00588" y1="63.8496" x2="-10.0228" y2="60.8496"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-8.45588" y1="60.0996" x2="-10.0228" y2="62.8496"/>
<rect style="fill: #ffffff" x="-12.2978" y="60.8496" width="4.55" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-12.2978" y="60.8496" width="4.55" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-10.0228" y="62.0996">session</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-26.5059" y1="69.8996" x2="-27.0235" y2="69.9855"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-27.4809" y1="71.3996" x2="-28.8485" y2="68.9855"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.9559" y1="67.8996" x2="-39.0678" y2="69.0496"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.7831" y1="71.7132" x2="-38.898" y2="70.9855"/>
<rect style="fill: #ffffff" x="-40.948" y="68.9855" width="4.1" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-40.948" y="68.9855" width="4.1" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-38.898" y="70.2355">rechte</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.4559" y1="73.2496" x2="-28.8485" y2="68.9855"/>
<rect style="fill: #ffffff" x="-30.6735" y="68.9855" width="3.65" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-30.6735" y="68.9855" width="3.65" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-28.8485" y="70.2355">admin</text>
<polygon style="fill: #ffffff" points="-36.9743,64.4496 -33.6593,64.4496 -33.0279,64.741 -33.0279,65.9067 -36.9743,65.9067 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-36.9743,64.4496 -33.6593,64.4496 -33.0279,64.741 -33.0279,65.9067 -36.9743,65.9067 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-33.6593" y1="64.4496" x2="-33.6593" y2="64.741"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-33.6593" y1="64.741" x2="-33.0279" y2="64.741"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-36.5797" y="65.3282">Bitmaske</text>
<polygon style="fill: #ffffff" points="-13.9251,73.4996 -2.99762,73.4996 -0.9162,74.781 -0.9162,79.9067 -13.9251,79.9067 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-13.9251,73.4996 -2.99762,73.4996 -0.9162,74.781 -0.9162,79.9067 -13.9251,79.9067 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-2.99762" y1="73.4996" x2="-2.99762" y2="74.781"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-2.99762" y1="74.781" x2="-0.9162" y2="74.781"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="74.4032">WEB-Shop System ERM</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="75.1032">Seite 1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="75.8032"></text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="76.5032">Autor: Georg Steffers</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="77.2032">E-Mail: georg@steffers.org</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="77.9032"></text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="78.6032">Copyright (C)2004 Georg Steffers</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.6242" y="79.3032">erzeugt mit DIA V0.93</text>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 1 0.4 0.2 0.4; stroke: #000000" d="M -36.9743,65.1782 A 1.52254,1.52254 0 0 0 -38.5532,66.254"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-38.7027,65.7668 -38.5651,66.3086 -38.2142,65.8734 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1 0.4 0.2 0.4; stroke: #000000" x1="-51.0412" y1="53.4396" x2="-5.04126" y2="53.4396"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1 0.4 0.2 0.4; stroke: #000000" x1="-51.0412" y1="22.5396" x2="-5.04126" y2="22.5396"/>
<polygon style="fill: #ffffff" points="-6.05014,19.7539 -1.73768,19.7539 -0.916258,20.0553 -0.916258,21.261 -6.05014,21.261 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-6.05014,19.7539 -1.73768,19.7539 -0.916258,20.0553 -0.916258,21.261 -6.05014,21.261 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.73768" y1="19.7539" x2="-1.73768" y2="20.0553"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.73768" y1="20.0553" x2="-0.916258" y2="20.0553"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.4832" y="20.6575">Adressdaten</text>
<polygon style="fill: #ffffff" points="-6.80014,50.2539 -1.85768,50.2539 -0.916258,50.6953 -0.916258,52.461 -6.80014,52.461 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-6.80014,50.2539 -1.85768,50.2539 -0.916258,50.6953 -0.916258,52.461 -6.80014,52.461 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.85768" y1="50.2539" x2="-1.85768" y2="50.6953"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.85768" y1="50.6953" x2="-0.916258" y2="50.6953"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.8582" y="51.1575">Personen- und</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.8582" y="51.8575">Firmendaten</text>
<polygon style="fill: #ffffff" points="-5.67514,70.0039 -1.67768,70.0039 -0.916258,70.4453 -0.916258,72.211 -5.67514,72.211 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-5.67514,70.0039 -1.67768,70.0039 -0.916258,70.4453 -0.916258,72.211 -5.67514,72.211 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.67768" y1="70.0039" x2="-1.67768" y2="70.4453"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.67768" y1="70.4453" x2="-0.916258" y2="70.4453"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.2957" y="70.9075">Benutzer-</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.2957" y="71.6075">verwaltung</text>
<polygon style="fill: #ffffff" points="-50.8849,84.1989 -48.9849,83.0589 -47.0849,84.1989 -48.9849,85.3389 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-50.8849,84.1989 -48.9849,83.0589 -47.0849,84.1989 -48.9849,85.3389 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-48.7849" y="82.7589">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-48.7849" y="86.4389">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-48.9849" y="84.4489">ist ein</text>
<polygon style="fill: #ffffff" points="-46.2349,84.1989 -44.3349,83.0589 -42.4349,84.1989 -44.3349,85.3389 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-46.2349,84.1989 -44.3349,83.0589 -42.4349,84.1989 -44.3349,85.3389 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-44.1349" y="82.7589">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-44.1349" y="86.4389">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-44.3349" y="84.4489">ist ein</text>
<polygon style="fill: #ffffff" points="-24.5348,84.1989 -22.6348,83.0589 -20.7348,84.1989 -22.6348,85.3389 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-24.5348,84.1989 -22.6348,83.0589 -20.7348,84.1989 -22.6348,85.3389 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-22.4348" y="82.7589">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-22.4348" y="86.4389">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-22.6348" y="84.4489">ist ein</text>
<polygon style="fill: #ffffff" points="-19.6349,84.1989 -17.7349,83.0589 -15.8349,84.1989 -17.7349,85.3389 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-19.6349,84.1989 -17.7349,83.0589 -15.8349,84.1989 -17.7349,85.3389 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.5349" y="82.7589">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.5349" y="86.4389">0,1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-17.7349" y="84.4489">ist ein</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1; stroke: #000000" x1="-48.9849" y1="78.3421" x2="-48.9849" y2="83.0589"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1; stroke: #000000" x1="-44.3349" y1="78.3421" x2="-44.3349" y2="83.0589"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1; stroke: #000000" x1="-22.6349" y1="78.3421" x2="-22.6349" y2="83.0589"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1; stroke: #000000" x1="-17.7349" y1="78.3421" x2="-17.7349" y2="83.0589"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-48.9849,85.3389 -48.9849,87.059 -47.1912,87.059 -47.1912,90.009 -49.763,90.009 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-44.3349,85.3389 -44.3349,87.059 -46.2912,87.059 -46.2912,90.009 -44.313,90.009 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-22.6349,85.3389 -22.6349,90.009 -25.2912,90.009 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-17.7349,85.3389 -17.7349,90.009 -14.3462,90.009 "/>
<polygon style="fill: #ffffff" points="-49.438,95.449 -47.038,94.009 -44.638,95.449 -47.038,96.889 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-49.438,95.449 -47.038,94.009 -44.638,95.449 -47.038,96.889 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-46.838" y="93.709">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-46.838" y="97.989">2</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-47.038" y="95.699">deb/kred</text>
<polygon style="fill: #ffffff" points="-30.1912,95.429 -27.7912,93.989 -25.3912,95.429 -27.7912,96.869 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-30.1912,95.429 -27.7912,93.989 -25.3912,95.429 -27.7912,96.869 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-27.5912" y="93.689">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-27.5912" y="97.969">2</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-27.7912" y="95.679">deb/kred</text>
<polygon style="fill: #ffffff" points="-14.9212,95.379 -12.5212,93.939 -10.1212,95.379 -12.5212,96.819 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-14.9212,95.379 -12.5212,93.939 -10.1212,95.379 -12.5212,96.819 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.3212" y="93.639">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.3212" y="97.919">2</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.5212" y="95.629">deb/kred</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-47.038" y1="91.009" x2="-47.038" y2="94.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-27.7912" y1="91.009" x2="-27.7912" y2="93.989"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-12.5212" y1="91.009" x2="-12.5212" y2="93.939"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-27.7912,96.869 -27.7912,99.0186 -24.9912,99.0186 -24.9912,107.007 -26.8243,107.007 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-12.5212,96.819 -12.5212,99.0186 -24.0912,99.0186 -24.0912,107.007 -23.1743,107.007 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-47.038,96.889 -47.038,101.005 -25.9412,101.005 -25.9412,107.007 -26.8243,107.007 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-31.9056" y="106.718">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-39.0868" y="106.718">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-35.0992" y="109.599">n</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-32.1267" y1="107.007" x2="-26.8243" y2="107.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.638" y1="107.007" x2="-38.4767" y2="107.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-35.3017" y1="108.912" x2="-35.3017" y2="113.962"/>
<polygon style="fill: #ffffff" points="-49.463,111.417 -47.038,109.962 -44.613,111.417 -47.038,112.872 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-49.463,111.417 -47.038,109.962 -44.613,111.417 -47.038,112.872 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-46.838" y="109.662">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-46.838" y="113.972">n</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-47.038" y="111.667">nr_zu_typ</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-47.038" y1="108.007" x2="-47.038" y2="109.962"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-47.038,112.872 -47.038,114.962 -38.2517,114.962 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-14.8317,107.007 -12.5961,107.007 -12.5961,104.642 -18.0117,104.642 -18.0117,106.462 -24.9993,106.462 -24.9993,106.007 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-14.8317,107.007 -12.5461,107.007 -12.5461,109.372 -18.0117,109.372 -18.0117,107.125 -24.9993,107.125 -24.9993,108.007 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.3475" y="105.275">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.3475" y="108.931">n</text>
<ellipse style="fill: #ffffff" cx="-43.4993" cy="92.5364" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-43.4993" cy="92.5364" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-43.4993" y="92.7864">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-44.0493" y1="92.9364" x2="-42.9493" y2="92.9364"/>
<ellipse style="fill: #ffffff" cx="-49.9743" cy="92.7864" rx="1.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-49.9743" cy="92.7864" rx="1.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-49.9743" y="93.0364">vk_nr</text>
<ellipse style="fill: #ffffff" cx="-41.2243" cy="88.0864" rx="2.675" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-41.2243" cy="88.0864" rx="2.675" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-41.2243" y="88.3364">kred_konto</text>
<ellipse style="fill: #ffffff" cx="-40.8243" cy="90.3364" rx="2.575" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-40.8243" cy="90.3364" rx="2.575" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-40.8243" y="90.5864">deb_konto</text>
<ellipse style="fill: #ffffff" cx="-52.1743" cy="88.0364" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-52.1743" cy="88.0364" rx="2.475" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-52.1743" y="88.2864">id_person</text>
<ellipse style="fill: #ffffff" cx="-52.4743" cy="90.5364" rx="2.125" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-52.4743" cy="90.5364" rx="2.125" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-52.4743" y="90.7864">id_firma</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-50.4242" y1="88.6728" x2="-44.313" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-50.3493" y1="90.5364" x2="-47.038" y2="89.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-48.7192" y1="92.15" x2="-47.038" y2="89.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-44.5953" y1="91.9" x2="-47.038" y2="89.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.3993" y1="90.3364" x2="-49.763" y2="90.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.8993" y1="88.0864" x2="-47.038" y2="91.009"/>
<rect style="fill: #ffffff" x="-49.763" y="89.009" width="5.45" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-49.763" y="89.009" width="5.45" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-47.038" y="90.259">verkäufer</text>
<ellipse style="fill: #ffffff" cx="-28.5406" cy="85.6364" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-28.5406" cy="85.6364" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-28.5406" y="85.8864">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-29.0906" y1="86.0364" x2="-27.9906" y2="86.0364"/>
<ellipse style="fill: #ffffff" cx="-32.8656" cy="92.4864" rx="2.725" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-32.8656" cy="92.4864" rx="2.725" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-32.8656" y="92.7364">id_benutzer</text>
<ellipse style="fill: #ffffff" cx="-33.6156" cy="89.9364" rx="2.675" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-33.6156" cy="89.9364" rx="2.675" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.6156" y="90.1864">kred_konto</text>
<ellipse style="fill: #ffffff" cx="-32.8656" cy="87.1864" rx="2.575" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-32.8656" cy="87.1864" rx="2.575" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-32.8656" y="87.4364">deb_konto</text>
<ellipse style="fill: #ffffff" cx="-25.2906" cy="87.2364" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-25.2906" cy="87.2364" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-25.2906" y="87.4864">an_nr</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-28.5406" y1="86.5364" x2="-27.7912" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-25.2906" y1="88.1364" x2="-27.7912" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-31.0448" y1="87.8228" x2="-27.7912" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.9406" y1="89.9364" x2="-30.2912" y2="90.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.9387" y1="91.85" x2="-27.7912" y2="89.009"/>
<rect style="fill: #ffffff" x="-30.2912" y="89.009" width="5" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-30.2912" y="89.009" width="5" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-27.7912" y="90.259">anbieter</text>
<ellipse style="fill: #ffffff" cx="-11.6707" cy="85.2164" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-11.6707" cy="85.2164" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-11.6707" y="85.4664">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-12.2207" y1="85.6164" x2="-11.1207" y2="85.6164"/>
<ellipse style="fill: #ffffff" cx="-7.8957" cy="92.3664" rx="2.725" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-7.8957" cy="92.3664" rx="2.725" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-7.8957" y="92.6164">id_benutzer</text>
<ellipse style="fill: #ffffff" cx="-6.94566" cy="89.8664" rx="2.675" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-6.94566" cy="89.8664" rx="2.675" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-6.94566" y="90.1164">kred_konto</text>
<ellipse style="fill: #ffffff" cx="-8.0457" cy="87.3164" rx="2.575" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-8.0457" cy="87.3164" rx="2.575" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-8.0457" y="87.5664">deb_konto</text>
<ellipse style="fill: #ffffff" cx="-14.5207" cy="87.2664" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-14.5207" cy="87.2664" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-14.5207" y="87.5164">kd_nr</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-14.5207" y1="88.1664" x2="-12.5212" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-11.6707" y1="86.1164" x2="-12.5212" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-9.86646" y1="87.9528" x2="-14.3462" y2="91.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-9.62066" y1="89.8664" x2="-10.6962" y2="90.009"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-10.6207" y1="92.3664" x2="-12.5212" y2="89.009"/>
<rect style="fill: #ffffff" x="-14.3462" y="89.009" width="3.65" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-14.3462" y="89.009" width="3.65" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-12.5212" y="90.259">kunde</text>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1 0.4 0.2 0.4; stroke: #000000" points="-51.1259,81.8793 -37.0124,81.8793 -37.0124,100.016 -5.24268,100.016 "/>
<polygon style="fill: #ffffff" points="-5.67514,96.7449 -1.67768,96.7449 -0.916258,97.1863 -0.916258,98.952 -5.67514,98.952 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-5.67514,96.7449 -1.67768,96.7449 -0.916258,97.1863 -0.916258,98.952 -5.67514,98.952 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.67768" y1="96.7449" x2="-1.67768" y2="97.1863"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.67768" y1="97.1863" x2="-0.916258" y2="97.1863"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.2957" y="97.6485">Benutzer-</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.2957" y="98.3485">verwaltung</text>
<ellipse style="fill: #ffffff" cx="-29.6782" cy="111.715" rx="2.275" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-29.6782" cy="111.715" rx="2.275" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-29.6782" y="111.965">b_kto_nr</text>
<ellipse style="fill: #ffffff" cx="-21.0532" cy="114.115" rx="2.15" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-21.0532" cy="114.115" rx="2.15" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-21.0532" y="114.365">b_name</text>
<ellipse style="fill: #ffffff" cx="-29.1032" cy="108.915" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-29.1032" cy="108.915" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-29.1032" y="109.165">name</text>
<ellipse style="fill: #ffffff" cx="-21.4282" cy="105.015" rx="1.425" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-21.4282" cy="105.015" rx="1.425" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-21.4282" y="105.265">blz</text>
<ellipse style="fill: #ffffff" cx="-20.5532" cy="109.115" rx="2.05" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-20.5532" cy="109.115" rx="2.05" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-20.5532" y="109.365">summe</text>
<ellipse style="fill: #ffffff" cx="-29.2282" cy="105.215" rx="1.925" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-29.2282" cy="105.215" rx="1.925" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-29.2282" y="105.465">kto_nr</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-30.1532" y1="105.615" x2="-28.3032" y2="105.615"/>
<ellipse style="fill: #ffffff" cx="-20.1032" cy="111.665" rx="2.45" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-20.1032" cy="111.665" rx="2.45" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-20.1032" y="111.915">konto_typ</text>
<ellipse style="fill: #ffffff" cx="-20.6282" cy="102.765" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-20.6282" cy="102.765" rx="2.475" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-20.6282" y="103.015">saldo_soll</text>
<ellipse style="fill: #ffffff" cx="-29.9282" cy="102.865" rx="2.875" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-29.9282" cy="102.865" rx="2.875" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-29.9282" y="103.115">saldo_haben</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-27.8953" y1="103.501" x2="-24.9993" y2="108.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-27.867" y1="105.851" x2="-23.1743" y2="108.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-27.8304" y1="108.278" x2="-24.9993" y2="106.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-28.0695" y1="111.078" x2="-24.9993" y2="106.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.5735" y1="113.478" x2="-24.9993" y2="106.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.3783" y1="103.401" x2="-24.9993" y2="108.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-21.8356" y1="111.028" x2="-24.9993" y2="106.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.0028" y1="108.478" x2="-24.9993" y2="106.007"/>
<ellipse style="fill: #ffffff" cx="-36.4333" cy="102.715" rx="2.3" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-36.4333" cy="102.715" rx="2.3" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-36.4333" y="102.965">konto_nr</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-37.7333" y1="103.115" x2="-35.1333" y2="103.115"/>
<ellipse style="fill: #ffffff" cx="-41.0083" cy="105.415" rx="1.725" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-41.0083" cy="105.415" rx="1.725" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-41.0083" y="105.665">used</text>
<ellipse style="fill: #ffffff" cx="-41.7833" cy="103.115" rx="2.45" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-41.7833" cy="103.115" rx="2.45" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-41.7833" y="103.365">konto_typ</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.2833" y1="105.415" x2="-32.1267" y2="108.912"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.3333" y1="103.115" x2="-32.1267" y2="108.912"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-36.4333" y1="103.615" x2="-32.1267" y2="108.912"/>
<rect style="fill: #ffffff" x="-38.4767" y="105.102" width="6.35" height="3.81"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-38.4767" y="105.102" width="6.35" height="3.81"/>
<polygon style="fill: #ffffff" points="-38.4767,107.007 -35.3017,105.102 -32.1267,107.007 -35.3017,108.912 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-38.4767,107.007 -35.3017,105.102 -32.1267,107.007 -35.3017,108.912 "/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-35.3017" y="107.257">used_konten</text>
<ellipse style="fill: #ffffff" cx="-9.9032" cy="101.865" rx="3" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-9.9032" cy="101.865" rx="3" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-9.9032" y="102.115">buchungstext</text>
<ellipse style="fill: #ffffff" cx="-7.2032" cy="106.415" rx="2.15" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-7.2032" cy="106.415" rx="2.15" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-7.2032" y="106.665">kto_soll</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-8.3532" y1="106.815" x2="-6.0532" y2="106.815"/>
<ellipse style="fill: #ffffff" cx="-11.3032" cy="110.665" rx="1.85" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-11.3032" cy="110.665" rx="1.85" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-11.3032" y="110.915">be_nr</text>
<ellipse style="fill: #ffffff" cx="-7.0032" cy="111.815" rx="1.9" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-7.0032" cy="111.815" rx="1.9" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-7.0032" y="112.065">berag</text>
<ellipse style="fill: #ffffff" cx="-7.1032" cy="104.215" rx="2.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-7.1032" cy="104.215" rx="2.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-7.1032" y="104.465">kto_haben</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-8.6532" y1="104.615" x2="-5.5532" y2="104.615"/>
<ellipse style="fill: #ffffff" cx="-6.8782" cy="108.815" rx="2.175" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-6.8782" cy="108.815" rx="2.175" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-6.8782" y="109.065">bu_date</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-9.9032" y1="102.765" x2="-12.5567" y2="108.372"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-8.90632" y1="104.851" x2="-12.5567" y2="108.372"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-9.3532" y1="106.415" x2="-14.8317" y2="107.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-9.0532" y1="108.815" x2="-12.5567" y2="105.642"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-8.3467" y1="111.178" x2="-12.5567" y2="105.642"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-11.3032" y1="109.765" x2="-12.5567" y2="105.642"/>
<rect style="fill: #ffffff" x="-14.8317" y="105.642" width="4.55" height="2.73"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-14.8317" y="105.642" width="4.55" height="2.73"/>
<polygon style="fill: #ffffff" points="-14.8317,107.007 -12.5567,105.642 -10.2817,107.007 -12.5567,108.372 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-14.8317,107.007 -12.5567,105.642 -10.2817,107.007 -12.5567,108.372 "/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-12.5567" y="107.257">buchung</text>
<ellipse style="fill: #ffffff" cx="-51.3053" cy="104.365" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-51.3053" cy="104.365" rx="3.075" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-51.3053" y="104.615">beschreibung</text>
<ellipse style="fill: #ffffff" cx="-52.8303" cy="106.765" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-52.8303" cy="106.765" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-52.8303" y="107.015">name</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-53.6303" y1="107.165" x2="-52.0303" y2="107.165"/>
<ellipse style="fill: #ffffff" cx="-52.1303" cy="109.465" rx="2.45" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-52.1303" cy="109.465" rx="2.45" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-52.1303" y="109.715">konto_typ</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-53.5803" y1="109.865" x2="-50.6803" y2="109.865"/>
<ellipse style="fill: #ffffff" cx="-37.1803" cy="117.765" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-37.1803" cy="117.765" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-37.1803" y="118.015">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-37.7303" y1="118.165" x2="-36.6303" y2="118.165"/>
<ellipse style="fill: #ffffff" cx="-30.8553" cy="117.165" rx="1.975" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-30.8553" cy="117.165" rx="1.975" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-30.8553" y="117.415">nr_von</text>
<ellipse style="fill: #ffffff" cx="-29.1803" cy="114.965" rx="2.45" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-29.1803" cy="114.965" rx="2.45" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-29.1803" y="115.215">konto_typ</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-30.6303" y1="115.365" x2="-27.7303" y2="115.365"/>
<ellipse style="fill: #ffffff" cx="-33.6803" cy="118.665" rx="1.9" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-33.6803" cy="118.665" rx="1.9" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-33.6803" y="118.915">nr_bis</text>
<ellipse style="fill: #ffffff" cx="-40.5803" cy="116.715" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-40.5803" cy="116.715" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-40.5803" y="116.965">name</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-41.3803" y1="117.115" x2="-39.7803" y2="117.115"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-49.131" y1="105.001" x2="-47.038" y2="108.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-51.0303" y1="106.765" x2="-43.638" y2="107.007"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-50.3979" y1="108.828" x2="-47.038" y2="106.007"/>
<rect style="fill: #ffffff" x="-50.438" y="106.007" width="6.8" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-50.438" y="106.007" width="6.8" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-47.038" y="107.257">konten_typen</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.3075" y1="116.078" x2="-35.3017" y2="113.962"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-37.1803" y1="116.865" x2="-35.3017" y2="113.962"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-33.6803" y1="117.765" x2="-35.3017" y2="113.962"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-32.2519" y1="116.528" x2="-35.3017" y2="113.962"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-31.6303" y1="114.965" x2="-38.2517" y2="115.962"/>
<rect style="fill: #ffffff" x="-38.2517" y="113.962" width="5.9" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-38.2517" y="113.962" width="5.9" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-35.3017" y="115.212">kontenplan</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-24.9993" y1="108.007" x2="-24.9993" y2="121.975"/>
<polygon style="fill: #ffffff" points="-44.963,126.94 -43.438,126.025 -41.913,126.94 -43.438,127.855 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-44.963,126.94 -43.438,126.025 -41.913,126.94 -43.438,127.855 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-43.238" y="125.725">1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-43.238" y="128.955">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-43.438" y="127.19">aus</text>
<polygon style="fill: #ffffff" points="-44.788,133.835 -43.438,133.025 -42.088,133.835 -43.438,134.645 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-44.788,133.835 -43.438,133.025 -42.088,133.835 -43.438,134.645 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-43.238" y="132.725">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-43.238" y="135.745">m</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-43.438" y="134.085">ist</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.438" y1="124.385" x2="-43.438" y2="126.025"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.438" y1="127.855" x2="-43.438" y2="129.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.438" y1="131.46" x2="-43.438" y2="133.025"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.438" y1="134.645" x2="-43.438" y2="138.825"/>
<polygon style="fill: #ffffff" points="-37.906,130.46 -35.906,129.26 -33.906,130.46 -35.906,131.66 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-37.906,130.46 -35.906,129.26 -33.906,130.46 -35.906,131.66 "/>
<text style="fill: #000000; text-anchor:end; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-38.206" y="130.16">n</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-33.606" y="130.16">m</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-35.906" y="130.71">enthält</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.813" y1="130.46" x2="-37.906" y2="130.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-33.906" y1="130.46" x2="-28.3993" y2="130.46"/>
<polygon style="fill: #ffffff" points="-27.3493,123.385 -24.9993,121.975 -22.6493,123.385 -24.9993,124.795 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-27.3493,123.385 -24.9993,121.975 -22.6493,123.385 -24.9993,124.795 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-24.7993" y="121.675">2</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-24.7993" y="125.895">n</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-24.9993" y="123.635">aufw/ertr</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-24.9993" y1="124.795" x2="-24.9993" y2="129.46"/>
<polygon style="fill: #ffffff" points="-14.5317,130.46 -12.5567,129.275 -10.5817,130.46 -12.5567,131.645 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-14.5317,130.46 -12.5567,129.275 -10.5817,130.46 -12.5567,131.645 "/>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.3567" y="128.975">0,1</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.3567" y="132.745">1</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: sans; font-style: normal; font-weight: normal" x="-12.5567" y="130.71">parent</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 1 0.4 0.2 0.4; stroke: #000000" x1="-51.1153" y1="120.405" x2="-5.11531" y2="120.405"/>
<polygon style="fill: #ffffff" points="-14.0621,153.955 -3.13462,153.955 -1.0532,155.236 -1.0532,160.362 -14.0621,160.362 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-14.0621,153.955 -3.13462,153.955 -1.0532,155.236 -1.0532,160.362 -14.0621,160.362 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-3.13462" y1="153.955" x2="-3.13462" y2="155.236"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-3.13462" y1="155.236" x2="-1.0532" y2="155.236"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="154.859">WEB-Shop System ERM</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="155.559">Seite 2</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="156.259"></text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="156.959">Autor: Georg Steffers</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="157.659">E-Mail: georg@steffers.org</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="158.359"></text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="159.059">Copyright (C)2004 Georg Steffers</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-12.7612" y="159.759">erzeugt mit DIA V0.93</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.4358" y1="105.651" x2="-26.8243" y2="108.007"/>
<rect style="fill: #ffffff" x="-26.8243" y="106.007" width="3.65" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-26.8243" y="106.007" width="3.65" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-24.9993" y="107.257">konto</text>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-24.9993,129.46 -24.9993,130.075 -16.4038,130.075 -16.4038,128.025 -12.5567,128.025 -12.5567,129.275 "/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-24.9993,131.46 -24.9993,130.65 -16.4279,130.65 -16.4279,133.025 -12.5567,133.025 -12.5567,131.645 "/>
<polygon style="fill: #ffffff" points="-3.83776,117 -1.4153,117 -0.953878,117.441 -0.953878,119.207 -3.83776,119.207 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-3.83776,117 -1.4153,117 -0.953878,117.441 -0.953878,119.207 -3.83776,119.207 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.4153" y1="117" x2="-1.4153" y2="117.441"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.4153" y1="117.441" x2="-0.953878" y2="117.441"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-2.39582" y="117.904">FiBu</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-2.39582" y="118.604">Daten</text>
<polygon style="fill: #ffffff" points="-6.82463,136.825 -1.88217,136.825 -0.940748,137.266 -0.940748,139.032 -6.82463,139.032 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" points="-6.82463,136.825 -1.88217,136.825 -0.940748,137.266 -0.940748,139.032 -6.82463,139.032 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.88217" y1="136.825" x2="-1.88217" y2="137.266"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-1.88217" y1="137.266" x2="-0.940748" y2="137.266"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.88269" y="137.729">Warengruppen/</text>
<text style="fill: #000000; text-anchor:middle; font-size: 0.7; font-family: courier new; font-style: italic; font-weight: normal" x="-3.88269" y="138.429">Produktdaten</text>
<ellipse style="fill: #ffffff" cx="-32.0611" cy="135.4" rx="3.125" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-32.0611" cy="135.4" rx="3.125" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-32.0611" y="135.65">produkt_typen</text>
<ellipse style="fill: #ffffff" cx="-28.4861" cy="126.2" rx="2.7" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-28.4861" cy="126.2" rx="2.7" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-28.4861" y="126.45">aufw_konto</text>
<ellipse style="fill: #ffffff" cx="-21.3861" cy="126.2" rx="2.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-21.3861" cy="126.2" rx="2.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-21.3861" y="126.45">ertr_konto</text>
<ellipse style="fill: #ffffff" cx="-20.5361" cy="128.35" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-20.5361" cy="128.35" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-20.5361" y="128.6">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-21.0861" y1="128.75" x2="-19.9861" y2="128.75"/>
<ellipse style="fill: #ffffff" cx="-27.3861" cy="137.05" rx="2.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-27.3861" cy="137.05" rx="2.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-27.3861" y="137.3">kurzbesch</text>
<ellipse style="fill: #ffffff" cx="-17.0611" cy="134.4" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-17.0611" cy="134.4" rx="3.075" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-17.0611" y="134.65">beschreibung</text>
<ellipse style="fill: #ffffff" cx="-31.0111" cy="128.6" rx="2.225" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-31.0111" cy="128.6" rx="2.225" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-31.0111" y="128.85">steuerkl</text>
<ellipse style="fill: #ffffff" cx="-30.8861" cy="132.85" rx="2.25" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-30.8861" cy="132.85" rx="2.25" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-30.8861" y="133.1">pic_path</text>
<ellipse style="fill: #ffffff" cx="-25.6111" cy="133.75" rx="1.675" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-25.6111" cy="133.75" rx="1.675" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-25.6111" y="134">tiefe</text>
<ellipse style="fill: #ffffff" cx="-23.0111" cy="135.55" rx="2.375" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-23.0111" cy="135.55" rx="2.375" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-23.0111" y="135.8">is_parent</text>
<ellipse style="fill: #ffffff" cx="-21.5361" cy="133" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-21.5361" cy="133" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-21.5361" y="133.25">name</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" x1="-22.3361" y1="133.4" x2="-20.7361" y2="133.4"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-29.4378" y1="129.236" x2="-24.9993" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-28.4861" y1="127.1" x2="-24.9993" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-23.1893" y1="126.836" x2="-24.9993" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-21.6321" y1="128.986" x2="-24.9993" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-29.2951" y1="132.213" x2="-28.3993" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-29.8514" y1="134.763" x2="-24.9993" y2="129.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-25.6111" y1="132.85" x2="-24.9993" y2="129.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-23.0111" y1="134.65" x2="-24.9993" y2="129.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-22.8089" y1="132.363" x2="-24.9993" y2="129.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-17.0611" y1="133.5" x2="-21.5993" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-29.1893" y1="136.413" x2="-24.9993" y2="129.46"/>
<rect style="fill: #ffffff" x="-28.3993" y="129.46" width="6.8" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-28.3993" y="129.46" width="6.8" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-24.9993" y="130.71">warengruppen</text>
<ellipse style="fill: #ffffff" cx="-37.4743" cy="122.75" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-37.4743" cy="122.75" rx="2.475" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-37.4743" cy="122.75" rx="2.075" ry="0.7"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-37.4743" y="123">zusatzinfo</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.9493" y1="122.75" x2="-46.163" y2="123.385"/>
<rect style="fill: #ffffff" x="-46.163" y="122.385" width="5.45" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-46.163" y="122.385" width="5.45" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-45.913" y="122.635" width="4.95" height="1.5"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-43.438" y="123.635">typ_table</text>
<ellipse style="fill: #ffffff" cx="-48.622" cy="128" rx="2.35" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-48.622" cy="128" rx="2.35" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-48.622" y="128.25">typ_table</text>
<ellipse style="fill: #ffffff" cx="-50.772" cy="130.55" rx="2.75" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-50.772" cy="130.55" rx="2.75" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-50.772" y="130.8">produkt_typ</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-52.522" y1="130.95" x2="-49.022" y2="130.95"/>
<ellipse style="fill: #ffffff" cx="-48.822" cy="133.05" rx="2.9" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-48.822" cy="133.05" rx="2.9" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-48.822" y="133.3">bezeichnung</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-46.9603" y1="128.636" x2="-43.438" y2="131.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-48.022" y1="130.55" x2="-47.063" y2="130.46"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-46.7713" y1="132.413" x2="-43.438" y2="129.46"/>
<rect style="fill: #ffffff" x="-47.063" y="129.46" width="7.25" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-47.063" y="129.46" width="7.25" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-43.438" y="130.71">produkt_typen</text>
<ellipse style="fill: #ffffff" cx="-46.4128" cy="137.025" rx="1.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-46.4128" cy="137.025" rx="1.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-46.4128" y="137.275">_id_</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-46.9628" y1="137.425" x2="-45.8628" y2="137.425"/>
<ellipse style="fill: #ffffff" cx="-45.6128" cy="143.175" rx="1.8" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-45.6128" cy="143.175" rx="1.8" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-45.6128" y="143.425">name</text>
<ellipse style="fill: #ffffff" cx="-49.7128" cy="141.375" rx="2.55" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-49.7128" cy="141.375" rx="2.55" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-49.7128" y="141.625">kurzbesch</text>
<ellipse style="fill: #ffffff" cx="-37.8628" cy="139.325" rx="2.35" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-37.8628" cy="139.325" rx="2.35" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-37.8628" y="139.575">small_pic</text>
<ellipse style="fill: #ffffff" cx="-37.7378" cy="141.625" rx="2.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-37.7378" cy="141.625" rx="2.075" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-37.7378" y="141.875">big_pic</text>
<ellipse style="fill: #ffffff" cx="-49.7878" cy="138.975" rx="3.075" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-49.7878" cy="138.975" rx="3.075" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-49.7878" y="139.225">beschreibung</text>
<ellipse style="fill: #ffffff" cx="-39.1878" cy="137.125" rx="3.125" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke-dasharray: 0.3; stroke: #000000" cx="-39.1878" cy="137.125" rx="3.125" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-39.1878" y="137.375">produkt_typen</text>
<ellipse style="fill: #ffffff" cx="-43.4378" cy="145.725" rx="1.775" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-43.4378" cy="145.725" rx="1.775" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-43.4378" y="145.975">preis</text>
<ellipse style="fill: #ffffff" cx="-41.1378" cy="143.275" rx="1.825" ry="0.9"/>
<ellipse style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" cx="-41.1378" cy="143.275" rx="1.825" ry="0.9"/>
<text style="fill: #000000; text-anchor:middle; font-size: 0.8; font-family: serif; font-style: normal; font-weight: normal" x="-41.1378" y="143.525">stück</text>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-45.3167" y1="137.661" x2="-43.438" y2="140.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-46.7128" y1="138.975" x2="-41.163" y2="139.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-47.1628" y1="141.375" x2="-43.438" y2="138.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-45.6128" y1="142.275" x2="-43.438" y2="138.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-43.4378" y1="144.825" x2="-43.438" y2="138.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-41.1378" y1="142.375" x2="-43.438" y2="138.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-39.8128" y1="141.625" x2="-43.438" y2="138.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-40.2128" y1="139.325" x2="-45.713" y2="139.825"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x1="-41.3975" y1="137.761" x2="-43.438" y2="140.825"/>
<rect style="fill: #ffffff" x="-45.713" y="138.825" width="4.55" height="2"/>
<rect style="fill: none; fill-opacity:0; stroke-width: 0.1; stroke: #000000" x="-45.713" y="138.825" width="4.55" height="2"/>
<text style="fill: #000000; text-anchor:middle; font-size: 1; font-family: monospace; font-style: normal; font-weight: normal" x="-43.438" y="140.075">produkt</text>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 0.2; stroke: #000000" d="M -43.3332,77.8712 A 2.14502,2.14502 0 0 0 -39.4436,77.4298"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-42.9061,78.1493 -43.359,77.8217 -43.3493,78.3806 "/>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 0.2; stroke: #000000" d="M -39.4436,77.4298 A 5.10522,5.10522 0 0 0 -47.9666,76.5435"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-47.8936,76.0391 -48.0007,76.5878 -47.4975,76.3443 "/>
<polygon style="fill: #ffffff" points="-41.6043,77.4298 -37.9743,77.4298 -37.2829,77.8612 -37.2829,79.5869 -41.6043,79.5869 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-41.6043,77.4298 -37.9743,77.4298 -37.2829,77.8612 -37.2829,79.5869 -41.6043,79.5869 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-37.9743" y1="77.4298" x2="-37.9743" y2="77.8612"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-37.9743" y1="77.8612" x2="-37.2829" y2="77.8612"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-41.1722" y="78.3084">entweder,</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-41.1722" y="79.0084">oder</text>
<polygon style="fill: #ffffff" points="-32.7865,55.0496 -29.1565,55.0496 -28.4651,55.481 -28.4651,57.2067 -32.7865,57.2067 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-32.7865,55.0496 -29.1565,55.0496 -28.4651,55.481 -28.4651,57.2067 -32.7865,57.2067 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-29.1565" y1="55.0496" x2="-29.1565" y2="55.481"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-29.1565" y1="55.481" x2="-28.4651" y2="55.481"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-32.3544" y="55.9282">entweder,</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-32.3544" y="56.6282">oder</text>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 0.2; stroke: #000000" d="M -43.3271,84.8646 A 2.14448,2.14448 0 0 0 -39.4736,84.1798"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-42.8834,85.1153 -43.356,84.8167 -43.3113,85.374 "/>
<path style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke-dasharray: 0.2; stroke: #000000" d="M -39.4736,84.1798 A 5.06065,5.06065 0 0 0 -47.9696,83.5381"/>
<polyline style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-47.9134,83.0316 -48.0022,83.5835 -47.5074,83.3234 "/>
<polygon style="fill: #ffffff" points="-41.6343,84.1798 -38.0043,84.1798 -37.3129,84.6112 -37.3129,86.3369 -41.6343,86.3369 "/>
<polygon style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" points="-41.6343,84.1798 -38.0043,84.1798 -37.3129,84.6112 -37.3129,86.3369 -41.6343,86.3369 "/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-38.0043" y1="84.1798" x2="-38.0043" y2="84.6112"/>
<line style="fill: none; fill-opacity:0; stroke-width: 0.05; stroke: #000000" x1="-38.0043" y1="84.6112" x2="-37.3129" y2="84.6112"/>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-41.2022" y="85.0584">entweder,</text>
<text style="fill: #000000; text-anchor:start; font-size: 0.7; font-family: courier new; font-style: normal; font-weight: normal" x="-41.2022" y="85.7584">oder</text>
</svg>

4617
doc/er/shop.tex
File diff suppressed because it is too large
View File

BIN
doc/er/shop1.dia

435
doc/er/showdia.tex

@ -0,0 +1,435 @@
\documentclass[a4paper,12pt]{article}
\usepackage{german,color}
\usepackage[latin1]{inputenc}
\pagestyle{empty}
%\evensidemargin 0cm
%\oddsidemargin 0cm
\textheight 25.5cm
\textwidth 15.9cm
\voffset -2cm
\hoffset -2cm
\renewcommand\floatpagefraction{.9}
\renewcommand\topfraction{.9}
\renewcommand\bottomfraction{.9}
\renewcommand\textfraction{.1}
\setcounter{totalnumber}{50}
\setcounter{topnumber}{50}
\setcounter{bottomnumber}{50}
\begin{document}
% \appendix
\begin{center}
\section*{\Large {\sf\bfseries Lebenslauf}\\ \large{\sf Georg Steffers\\}}
\end{center}
%\hspace{3cm}
%\vspace{-1.5cm}
\small
\newlength{\lwidth}
\newlength{\schulw}
\newlength{\datew}
\newlength{\ortw}
\newlength{\abschlussw}
\settowidth{\schulw}{Hans-B"ockler-Schule}
%\settowidth{\schulw}{Privatbrauerei Rolinck}
\settowidth{\ortw}{Rothenburg/}
\settowidth{\datew}{00.00.0000 - 00.00.0000}
%\settowidth{\abschlussw}{Grundschulabschlu"s}
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Pers"onliche Daten}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\vspace{5pt}
\hbox{
\begin{minipage}[t][][c]{.35\linewidth}
Steffers Georg\\
Warendorfer Str. 75\\
48145 M"unster
\end{minipage}
% linewidth: \number\linewidth\\
% textwidth: \number\textwidth\\
\begin{minipage}[t][][t]{.60\linewidth}
\settowidth{\lwidth}{Staatsangeh"origkeit: }
\begin{tabular}[t]{p{\lwidth}l}
Geburtsdatum:&15. Dezember 1973\\
Geburtsort:&48607 Ochtrup\\
Familienstand:&ledig\\
% Konfession:&rk\\
Staatsangehörigkeit:&deutsch\\
F"uhrerschein:&Klasse 3,1a
\end{tabular}
\end{minipage}}
%Eltern&&Michael Mustermann, Psychiater\\
%&&Michaela Mustermann, geb. Musterfrau, Musterberuf\\
\vspace{5pt}
\end{minipage}}}
\vfill
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Schulbildung}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\setlength{\abschlussw}{\linewidth}
\addtolength{\abschlussw}{-\schulw}
\addtolength{\abschlussw}{-\ortw}
\addtolength{\abschlussw}{-\datew}
\addtolength{\abschlussw}{-8\tabcolsep}
\vspace{5pt}
\begin{tabular}[t]
{p{\schulw}p{\ortw}p{\datew}p{\abschlussw}}
Mariengrundschule&Ochtrup&
01.08.1980 - 27.06.1984&
Grundschulabschlu"s\\
Gymnasium&Ochtrup&
01.08.1984 - 30.11.1985&\\
Hauptschule&Ochtrup&
01.12.1985 - 01.06.1990&
Fachoberschulreife\\
Hans-B"ockler-Schule&M"unster&
01.08.1990 - 30.06.1993&
Fachhochschulreife
\end{tabular}
\vspace{5pt}
\end{minipage}}}
\vfill
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Ausbildung/Studium}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\setlength{\abschlussw}{\linewidth}
\addtolength{\abschlussw}{-\schulw}
\addtolength{\abschlussw}{-\ortw}
\addtolength{\abschlussw}{-\datew}
\addtolength{\abschlussw}{-8\tabcolsep}
\vspace{5pt}
\begin{tabular}[t]
{p{\schulw}p{\ortw}p{\datew}p{\abschlussw}}
BIB&Bergisch Gladbach&
04.10.1995 - 30.09.1997&
Stattl. gepr. Informatik\-assistent Softwaretechnologie\\
Fernuniversit"at&Hagen&
seit 01.10.2002&
\end{tabular}
\vspace{5pt}
\end{minipage}}}
\vfill
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Wehr-/Zivildienst}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\setlength{\abschlussw}{\linewidth}
\addtolength{\abschlussw}{-\schulw}
\addtolength{\abschlussw}{-\ortw}
\addtolength{\abschlussw}{-\datew}
\addtolength{\abschlussw}{-8\tabcolsep}
\vspace{5pt}
\begin{tabular}[t]
{p{\schulw}p{\ortw}p{\datew}p{\abschlussw}}
Heeresflieger&Rothenburg/ W"umme&
01.07.1993 - 15.12.1993&Wehrdienst\\
Pius Hospital&Ochtrup&
16.12.1993 - 30.09.1994&Zivildienst
\end{tabular}
\vspace{5pt}
\end{minipage}}}
\vfill
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Arbeitsverh"altnisse}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\setlength{\abschlussw}{\linewidth}
\addtolength{\abschlussw}{-\schulw}
\addtolength{\abschlussw}{-\ortw}
\addtolength{\abschlussw}{-\datew}
\addtolength{\abschlussw}{-8\tabcolsep}
\vspace{5pt}
\begin{tabular}[t]
{p{\schulw}p{\ortw}p{\datew}p{\abschlussw}}
IKK LV-WL&M"unster&
06.04.1998 - 30.11.1998&
Spezielle Datenbankabfragen
die die eingesetzte Software
nicht leisten konnte.\\
Privatbrauerei Rolinck&Steinfurt&
01.12.1998 - 30.04.1999&
Systemoperating\\
WWU - Institut f"ur Geophysik&M"unster&
25.05.1999 - 31.05.2000&
Systemadministration\\
Deltacity.NET&Emsdetten&
01.06.2000 - 30.11.2001&
E-Commerce und Webanwendungen entwickelt.\\
Gamigo AG&Rheine&
01.12.2001 - 30.04.2002&
Webanwendungen entwickelt.\\
WWU - ZIV&M"unster&
seit Mitte 2003&
Portieren einer \mbox{AutoCAD} Application von AIX
(\mbox{AutoCAD V12}) auf Windows (erst \mbox{AutoCAD V14}
dann \mbox{AutoCAD 2004}).
\end{tabular}
\vspace{5pt}
\end{minipage}}}
%\vfill
%\begin{flushright}bitte wenden\end{flushright}
\newpage
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Kenntnisse}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\vspace{5pt}
\vbox{
\begin{minipage}[t][\height][c]{.5\linewidth}\begin{center}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Betriebssysteme}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{minipage}[t][][c]{.44\linewidth}
Linux
\end{minipage}
\begin{minipage}[t][][c]{.44\linewidth}
\begin{tabular}[t]{lr}
Installation&1\\
Administration&2\\
Scriptsprachen&1
\end{tabular}
\end{minipage}}}
\vspace{2pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{minipage}[t][][c]{.44\linewidth}
Windows (NT/2000/XP/98)
\end{minipage}
\begin{minipage}[t][][c]{.44\linewidth}
\begin{tabular}[t]{lr}
Installation&2\\
Administration&3\\
Anwenden&3
\end{tabular}
\end{minipage}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf APIs/Libs}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
XWin-API&3\\
Win32-API&4\\
GTK&3\\
BSD Socket Layer&3\\
JDBC/ODBC&3\\
Servlets/JSP&4\\
OpenGL&(vermutlich) 3\\
Linux System&3
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Software}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
Dia&2\\
Vim&1\\
\LaTeX&2\\
OpenOffice&3\\
Gimp&3\\
Blender&3\\
AutoCAD&3\\
Photoshop&3
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Softwareengineering}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
Pflichten-/Lastenheft erstellen&3\\
OOA&3\\
ERM&3\\
UML&3
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Hardware}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
PC-Hardware einbauen&2\\
kleine bis mittlere LANs&2\\
St"orungssuche&3
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\end{center}
\end{minipage}
\begin{minipage}[t][\height][c]{.5\linewidth}\begin{center}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Programmiersprachen}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
C&1\\
C++&1\\
Java&3\\
Pascal&2\\
Basic&3\\
Cobol&4\\
Lisp/Scheme&3\\
TCL&4\\
Perl&3\\
PHP&2\\
JavaScript&3\\
HTML&2\\
SQL&2
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Datenbanken}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\parbox[t][][c]{.88\linewidth}
{Allgemein gute Kenntnisse in SQL, daher leichter
Einstieg in jedes SQL-Datenbanksystem.\\
Ich hatte bisher Kontakt mit folgenden
Datenbanksystemen:}}}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
PostgreSQL&1\\
MySQL&1\\
Adabas&3\\
Informix&3\\
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Dienste einrichten/konfigurieren}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
SMTP (Postfix)&3\\
HTTP (Apache)&3\\
FTP (ProFtp)&3\\
DNS (BIND pre 8)&3\\
NTP&3\\
NFS (Linux Kernel NFS)&3\\
NIS&3\\
SSH (OpenSSH)&3
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\vspace{5pt}
\vbox{\frame{\makebox[.96\linewidth][c]{
\begin{minipage}[t][15pt][c]{.94\linewidth}
{\small\sf Fremdsprachen}
\end{minipage}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}[t]{.94\linewidth}
\vspace{5pt}
\vbox{\makebox[.96\linewidth][c]
{\begin{tabular*}{.88\linewidth}[t]
{@{\extracolsep\fill}lr}
Englisch&2
\end{tabular*}}}
\vspace{5pt}
\end{minipage}}}}
\end{center}
\end{minipage}}
\vspace{5pt}
Bei den Noten handelt es sich um meine Selbsteinsch"atzung. Ausreichend
bedeutet dabei, das ich mich mit der Thematik besch"aftigt habe und
erfolgreich erste Versuche darin gemacht habe. Mangelhafte und
ungen"ugende F"ahigkeiten sind f"ur mich keine F"ahigkeiten und tauchen
darum nicht auf. Wo (vermutlich) vorsteht habe ich nur theoretische
und noch keine praktische Erfahrung.
Es ist denkbar, das hier nicht alle F"ahigkeiten stehen. Bitte fragen
Sie bei Interesse nach.\\
\vspace{5pt}
{\tiny 1 sehr gut, 2 gut, 3 befriedigend, %
4 ausreichend, 5 mangelhaft, 6 ungen"ugend}
\vspace{5pt}
\end{minipage}}}
\vfill
\frame{\makebox[.96\linewidth][c]{\colorbox[gray]{.8}
{\begin{minipage}{.948\linewidth}
{\small\sf\bfseries Interessen}
\end{minipage}}}}
\frame{\makebox[.96\linewidth][c]
{\begin{minipage}{.94\linewidth}
\vspace{5pt}
Kino, Musik, Open Source, Schwimmen, Sonne genie"sen,
Mein Linux administrieren
\vspace{5pt}
\end{minipage}}}
\end{document}

99
dropdb.sql

@ -0,0 +1,99 @@
begin;
-- Table und Funktionen um Länder zu verwalten --
-- [
drop sequence "land_id_land_seq";
drop index "land_ukey1";
drop index "land_ukey2";
drop index "land_ukey3";
drop function "chk_land" (text,varchar(3),varchar(4));
drop function "ins_land" (text,varchar(3),varchar(4));
drop function "get_id_land_by_land" (text);
drop function "get_id_land_by_lnd_kz" (varchar(3));
drop function "get_id_land_by_vorwahl_l" (varchar(4));
drop table "land";
-- Ende Länder --
-- Table und Funktionen um Orte zu verwalten --
-- [
drop sequence "ort_id_ort_seq";
drop index "ort_ukey1";
drop function "chk_ort" (text,varchar(10),int4);
drop function "ins_ort" (text,varchar(10),int4);
drop function "ins_ort" (text,varchar(10),text,varchar(3),varchar(4));
drop function "get_id_ort_by_ukey1" (varchar(10),int4);
drop table "ort";
-- ]
-- ende Orte --
-- Table und Funktionen um Adressen zu verwalten --
-- [
drop sequence "adresse_id_adresse_seq";
drop index "adresse_ukey1";
drop function "chk_adresse" (text,varchar(5),varchar(10),int4,int4);
drop function "ins_adresse" (text,varchar(5),varchar(10),int4,int4);
drop function "ins_adresse" (text,varchar(5),varchar(10),text,
varchar(5),text,varchar(3),varchar(4));
drop function "get_adresse_by_ukey1" (text,varchar(5),varchar(10));
drop table "adresse";
-- ]
-- ende Adressen --
-- Tabellen und alles für Personendaten
-- [
drop sequence "person_id_person_seq";
drop index "person_ukey1";
drop function "chk_person" (varchar(10),text,text,text,text,
varchar(10),varchar(10),varchar(10),varchar(50),
varchar(50),varchar(100));
drop function "ins_person" (varchar(10),text,text,text,text,
varchar(10),varchar(10),varchar(10),varchar(50),
varchar(50),varchar(100));
drop function "ins_person" (varchar(10),text,text,text,text,
varchar(10),varchar(10),varchar(10),varchar(50),
varchar(50),varchar(100),int4,int4,text,
text,money);
drop function "get_id_person_by_ukey1" (text, text, text);
drop table "person";
drop table "wohnt";
-- ]
-- ende Personendaten --
-- Arbeitsplatz --
-- [
drop sequence "firma_id_firma_seq";
drop sequence "abteilung_id_abteilung_seq";
drop index "firma_ukey1";
drop index "abteilung_ukey1";
drop function "chk_arbeit" (text, text, money, int4, int4);
drop function "ins_arbeit" (text, text, money, int4, int4);
drop function "chk_firma" (text, text, varchar(10));
drop function "ins_firma" (text, text, varchar(10));
drop function "chk_abteilung" (text, text, int4, int4);
drop function "ins_abteilung" (text, text, int4, int4);
drop function "ins_abteilung" (text, text, text, text, varchar(10), int4);
drop table "firma";
drop table "abteilung";
drop table "arbeit";
-- ]
-- ende Arbeitsplatz --
drop view "adresse_v";
drop view "person_v";
commit;

114
filldb.sql

@ -0,0 +1,114 @@
-- der große ich mach alles auf einmale Aufruf :-)
-- das hat den anchteil, das beim loggen evtl. Daten verloren gehen, ich
-- vermute das haengt damit zusammen das jede Funktion eine in sich
-- abgeschlossene Transaktion darstellt und somit evt. durch andere Funktionen
-- bereitgestellte Daten nicht sieht.
select firma.ins_arbeit('Chef', 'Buchführung, Systemadministration, Programmierung', 900.00,
person.ins_person('Herr', 'Staatl. gepr. Informatikassistent',
'Steffers', 'Georg', '1973-12-15', NULL,
'8993135', NULL, '01713258578',
'georg@steffers.org', 'www.steffers.org',
adresse.ins_adresse('Warendorfer Straße', '75', '48155',
adresse.ins_ort('Münster', '0251',
adresse.ins_land('Deutschland', 'DE', '+49')),
adresse.id_land_by_lnd_kz('DE'))),
firma.id_abteilung_firma(
firma.ins_firma('Steffers Web- und Systemprogrammierung',
'meine kleine Firma', NULL,
adresse.id_adresse('Warendorfer Straße', '75', '48155',
adresse.id_land_by_lnd_kz('DE')))));
select firma.ins_arbeit('Chef2', 'Kundenaquise, Webdesign, Programmierung', 900.00,
person.ins_person('Herr', NULL,
'Engbers', 'Marcus', '1973-01-18', NULL,
'977077', NULL, '01708309739',
'chef@hwmann.de', 'www.steffers.org',
adresse.ins_adresse('Bahnhofstraße', '58', '48607',
adresse.ins_ort('Ochtrup', '02553',
adresse.ins_land('Deutschland', 'DE', '+49')),
adresse.id_land_by_lnd_kz('DE'))),
firma.id_abteilung_firma(
firma.ins_firma('Steffers Web- und Systemprogrammierung',
'meine kleine Firma', NULL,
adresse.id_adresse('Tannenhofallee', '21', '48155',
adresse.id_land_by_lnd_kz('DE')))));
--select ins_firma('Steffers Web- und Systemprogrammierung',
-- 'meine kleine Firma', NULL,
-- ins_adresse('Tannenhofallee', '21', '48155',
-- ins_ort('Münster', '0251',
-- ins_land('Deutschland', 'DE', '+49')),
-- id_land_by_lnd_kz('DE')));
--select ins_person('Herr', 'Staatl. gepr. Informatikassistent', 'Steffers',
-- 'Georg', '1973-12-15', NULL, '8993135', NULL, '01713258578',
-- 'georg@steffers.org', 'www.steffers.org',
-- ins_adresse('Tannenhofallee', '21', '48155',
-- ins_ort('Münster', '0251',
-- ins_land('Deutschland', 'DE', '+49')),
-- id_land_by_lnd_kz('DE')));
--select ins_arbeit('Chef', 'der Mann der alles alleine macht', 900.00,
-- id_person('Steffers', 'Georg', '1973-12-15'),
-- id_abteilung_firma(
-- id_firma('Steffers Web- und Systemprogrammierung',
-- NULL)));
select person.ins_person('Frau', NULL, 'Vespermann', 'Tina', '1978-07-09',
NULL, '949780', NULL, '01711535514',
'Tante_Tina@t-online.de', NULL,
adresse.ins_adresse('Walkemühlenweg', '8', '37574',
adresse.ins_ort('Einbeck', '05561',
adresse.id_land_by_lnd_kz('DE')),
adresse.id_land_by_lnd_kz('DE')));
select person.ins_person('Frau', NULL, 'Steffers', 'Mechtild', '1951-04-09',
NULL, '98266', '98266', NULL, NULL, NULL,
adresse.ins_adresse('Krummer Weg', '31', '48607',
adresse.ins_ort('Ochtrup', '02553',
adresse.id_land_by_lnd_kz('DE')),
adresse.id_land_by_lnd_kz('DE')));
select person.ins_person('Herr', NULL, 'Steffers', 'Wilhelm', '1943-09-09',
NULL, '98266', '98266', NULL, NULL, NULL,
adresse.id_adresse('Krummer Weg', '31', '48607',
adresse.id_land_by_lnd_kz('DE')));
select person.person_adresse(
person.id_person('Steffers', 'Georg', '1973-12-15'),
adresse.id_adresse('Krummer Weg', '31', '48607',
adresse.id_land_by_lnd_kz('DE')));
select person.ins_person('Frau', 'Dipl. Geophysikerin', 'Hofmann', 'Daniela',
'1974-01-27', NULL, '419665', NULL, '01758910013',
'danhof@uni-bremen.de', NULL,
adresse.ins_adresse('Am Staugraben', '7', '28865',
adresse.ins_ort('Lilienthal', '04298',
adresse.id_land_by_lnd_kz('DE')),
adresse.id_land_by_lnd_kz('DE')));
select person.ins_person('Herr', 'Dipl. Informatiker', 'Fellmann', 'Ralf',
'1974-01-01', NULL, '6744505', NULL, '01775474207',
'felle@web.de', NULL,
adresse.ins_adresse('Wolbecker Str.', '52', '48155',
adresse.id_ort('0251',
adresse.id_land_by_lnd_kz('DE')),
adresse.id_land_by_lnd_kz('DE')));
select person.ins_person('Frau', NULL, 'Voß', 'Anna', '1985-08-03', NULL,
'78523', NULL, '01786916935', 'gab58@web.de',
'www.gab58.de.vu',
adresse.ins_adresse('Weezer Str.', '64', '47623',
adresse.ins_ort('Kevelaer', '02832',
adresse.id_land_by_lnd_kz('DE')),
adresse.id_land_by_lnd_kz('DE')));
select person.ins_person('Frau', NULL, 'Bendyk', 'Catharina', '1980-11-10',
NULL, '970289', NULL, '01722374138',
'lost-star@gmx.de',
'www.cyboworld3.de/pages/deswahnsinnsbraut',
adresse.ins_adresse('Witte Sand', '8', '48653',
adresse.ins_ort('Coesfeld', '02541',
adresse.id_land_by_lnd_kz('DE')),
adresse.id_land_by_lnd_kz('DE')));

5
makescript.sh

@ -0,0 +1,5 @@
dropdb shop
createdb -E LATIN1 shop
su -c "/home/georg/projects/shopsystem/mk_lang_and_funcs.sh" - postgres
psql -f cr_tables.sql shop

2
mk_lang_and_funcs.sh

@ -0,0 +1,2 @@
createlang plpgsql shop
# psql -c "create function get_int4_record_val(record, text) returns int4 as '/home/georg/projects/shopsystem/plpgsql_support' language C;" shop

BIN
plpgsql_funcs/.cr_func_adresse.sql.swp

104
plpgsql_funcs/cr_func_adresse.sql

@ -0,0 +1,104 @@
-- Funktionen um Adressen zu verwalten --
-- [
create function "chk_adresse" (text,varchar(5),varchar(10),int4,int4)
returns int4 as '
/*
* chk_adresse(strasse, h_nr, plz_a, id_ort, id_land)
*
* ueberpruefen ob die Adresse schon in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits eine
* Adresse mit dem einer, aber nicht alle der Parameter
* übereinstimmen
* 0: Adresse existiert noch nicht in der DB
* >0: Adresse existiert bereits, gibt id_adresse zurück.
*/
DECLARE
ida adresse.adresse%ROWTYPE;
BEGIN
IF $1 IS NULL OR $1 = '''' OR
$2 IS NULL OR $2 = '''' OR
$3 IS NULL OR $3 = '''' THEN
RETURN -1;
END IF;
select INTO ida * from adresse.adresse where
strasse = $1 and plz_a = $3 and
id_land = $5;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF ida.h_nr <> $2 OR ida.id_ort <> $4 THEN
RETURN -2;
END IF;
END IF;
RETURN ida._id_;
END;
' language 'plpgsql';
create function "ins_adresse" (text,varchar(5),varchar(10),int4,int4)
returns int4 as '
/*
* ins_adresse(strasse, h_nr, plz_a, id_ort, id_land)
*
* fügt eine Adresse in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
*
* returns: 0: wenn die Adresse nicht eingefuegt werden kann
* >0: wenn die Adresse eingefuegt werden konnte oder bereits
* existierte, gibt id_adresse zurück.
*/
DECLARE
id_adresse adresse.adresse._id_%TYPE;
BEGIN
select INTO id_adresse adresse.chk_adresse($1, $2, $3, $4, $5);
IF id_adresse = -1 THEN
RETURN 0;
ELSE
IF id_adresse = 0 THEN
insert into adresse.adresse (strasse,h_nr,plz_a,
id_ort,id_land)
values ($1, $2, $3, $4, $5);
select INTO id_adresse adresse.chk_adresse($1,$2,$3,$4,$5);
END IF;
END IF;
RETURN id_adresse;
END;
' language 'plpgsql';
create function "id_adresse" (text,varchar(5),varchar(10),int4)
returns int4 as '
/*
* id_adresse(strasse, h_nr, plz_a, id_land)
*
* Ermittelt die id (id_adresse) einer in der DB enthaltenen Adresse
* anhand des Primaerschluessels (vorwahl_o, id_land)
*
* returns: 0: wenn das Land nicht eingefuegt werden kann
* >0: wenn das Land gefunden wurde, gibt id_land zurück.
*/
DECLARE
ida adresse.adresse._id_%TYPE;
BEGIN
select INTO ida _id_ from adresse.adresse where
strasse = $1 and h_nr = $2 and plz_a = $3 and id_land = $4;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN ida;
END IF;
END;
' language 'plpgsql';
-- ]
-- Ende Adressen --

308
plpgsql_funcs/cr_func_arbeit.sql

@ -0,0 +1,308 @@
-- Funktionen um Arbeitsplaetze zu verwalten --
-- [
create function "chk_arbeit" (text,text,numeric(10,2),int4,int4)
returns int4 as '
/*
* chk_arbeit(position, beschreibung, gehalt, id_person, id_abteilung)
*
* ueberpruefen ob eine passender Stelle in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits eine
* Adresse mit dem einer, aber nicht alle der Parameter
* übereinstimmen
* 0: Adresse existiert noch nicht in der DB
* >0: Adresse existiert bereits, gibt id_adresse zurück.
*/
DECLARE
ida firma.arbeit%ROWTYPE;
BEGIN
IF $4 IS NULL OR $4 < 1 OR
$5 IS NULL OR $5 < 1 OR
$1 IS NULL OR $1 = '''' THEN
RETURN -1;
END IF;
select INTO ida * from firma.arbeit where
id_person = $4 and id_abteilung = $5;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF ida.position <> $1 OR ida.beschreibung <> $2 OR
ida.gehalt <> $3 THEN
RETURN -2;
END IF;
END IF;
RETURN 1;
END;
' language 'plpgsql';
create function "ins_arbeit" (text,text,numeric(10,2),int4,int4)
returns int4 as '
/*
* ins_arbeit(position, beschreibung, gehalt, id_person, id_abteilung)
*
* fügt eine Stelle in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
*
* returns: 0: wenn die Adresse nicht eingefuegt werden kann
* >0: wenn die Adresse eingefuegt werden konnte oder bereits
* existierte, gibt id_adresse zurück.
*/
DECLARE
chk int4;
BEGIN
select INTO chk firma.chk_arbeit($1, $2, $3, $4, $5);
IF chk = 0 THEN
insert into firma.arbeit (position, beschreibung, gehalt,
id_person, id_abteilung)
values ($1, $2, $3, $4, $5);
RETURN 1;
END IF;
RETURN 0;
END;
' language 'plpgsql';
create function "chk_firma" (text, text, varchar(10))
returns int4 as '
/*
* chk_firma(name, beschreibung, plz_f)
*
* ueberpruefen ob die Firma schon in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits ein
* Land mit dem einer, aber nicht alle der Parameter
* übereinstimmen
* 0: Land existiert noch nicht in der DB
* >0: Land existiert bereits, gibt id_land zurück.
*/
DECLARE
idf firma.firma%ROWTYPE;
BEGIN
IF $1 IS NULL OR $1 = '''' THEN
return -1;
END IF;
IF $3 IS NOT NULL THEN
select INTO idf * from firma.firma where
name = $1 and plz_f = $3;
ELSE
select INTO idf * from firma.firma where
name = $1;
END IF;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF idf.beschreibung <> $2 THEN
RETURN -2;
END IF;
END IF;
RETURN idf._id_;
END;
' language 'plpgsql';
create function "ins_firma" (text, text, varchar(10), int4)
returns int4 as '
/*
* ins_firma(name, beschreibung, plz_f, id_adresse)
*
* fügt eine Firma in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
* Ausserdem wir die globale Abteilung zu der Firma angelegt, siehe
* cr_tables.sql
*
* returns: 0: wenn die Firma nicht eingefuegt werden kann
* >0: wenn die Firma eingefuegt werden konnte oder bereits
* existierte, gibt id_firma zurück.
*/
DECLARE
idf firma.firma._id_%TYPE;
BEGIN
select INTO idf firma.chk_firma($1, $2, $3);
IF idf < 0 THEN
RETURN 0;
ELSE
IF idf = 0 THEN
insert into firma.firma (name, beschreibung, plz_f)
values ($1, $2, $3);
select INTO idf firma.chk_firma($1, $2, $3);
PERFORM firma.ins_abteilung(''_FIRMA_'', $2, idf, $4);
END IF;
END IF;
RETURN idf;
END;
' language 'plpgsql';
create function "id_abteilung" (text, int4)
returns int4 as '
/*
* id_abteilung(bezeichnung, id_firma);
* gibt die id_abteilung einer bestimmten Abteilung einer
* bestimmten Firma aus.
*
* returns: 0: wenn keine passnede Abteilung existiert
* >0: die Abteilung (id_abteilung)
*/
DECLARE
ida firma.abteilung._id_%TYPE;
BEGIN
select INTO ida _id_ from firma.abteilung where
id_firma = $2 and bezeichnung = $1;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN ida;
END IF;
END;
' language 'plpgsql';
create function "id_firma" (text,varchar(10))
returns int4 as '
/*
* id_firma(name, plz_f);
* gibt die id_abteilung der zentralen Abteilung einer Firma aus
* siehe dazu auch cr_tables.sql
*
* returns: 0: wenn keine passende Firma existiert
* >0: die Firma (id_firma)
*/
DECLARE
idf firma.firma._id_%TYPE;
BEGIN
IF $2 IS NOT NULL THEN
select INTO idf _id_ from firma.firma where
name = $1 and plz_f = $2;
ELSE
select INTO idf _id_ from firma.firma where
name = $1;
END IF;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN idf;
END IF;
END;
' language 'plpgsql';
create function "id_abteilung_firma" (int4)
returns int4 as '
/*
* id_abteilung_firma(id_firma);
* gibt die id_abteilung der zentralen Abteilung einer Firma aus
* siehe dazu auch cr_tables.sql
*
* returns: 0: wenn keine Firma zu dieser id_firma existiert
* >0: die Abteilung zu der Firma (id_abteilung)
*/
DECLARE
ida firma.abteilung._id_%TYPE;
BEGIN
select INTO ida _id_ from firma.abteilung where
id_firma = $1 and bezeichnung = ''_FIRMA_'';
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN ida;
END IF;
END;
' language 'plpgsql';
create function "chk_abteilung" (text, text, int4, int4)
returns int4 as '
/*
* chk_abteilung(bezeichnung, beschreibung, id_firma, id_adresse)
*
* ueberpruefen ob die Abteilung schon in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits ein
* Land mit dem einer, aber nicht alle der Parameter
* übereinstimmen
* 0: Land existiert noch nicht in der DB
* >0: Land existiert bereits, gibt id_land zurück.
*/
DECLARE
ida firma.abteilung%ROWTYPE;
BEGIN
IF $1 IS NULL OR $1 = '''' OR
$3 IS NULL OR $3 < 1 THEN
RETURN -1;
END IF;
select INTO ida * from firma.abteilung where
bezeichnung = $1 and id_firma = $3;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF ida.beschreibung <> $2 OR
ida.id_adresse <> $4 THEN
RETURN -2;
END IF;
END IF;
RETURN ida._id_;
END;
' language 'plpgsql';
create function "ins_abteilung" (text, text, int4, int4)
returns int4 as '
/*
* ins_abteilung(bezeichnung, beschreibung, id_firma, id_adresse)
*
* fügt eine Abteilung in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
*
* returns: 0: wenn die Abteilung nicht eingefuegt werden kann
* >0: wenn die Abteilung eingefuegt werden konnte oder bereits
* existierte, gibt id_firma zurück.
*/
DECLARE
ida firma.abteilung._id_%TYPE;
BEGIN
select INTO ida firma.chk_abteilung($1, $2, $3, $4);
IF ida = -1 THEN
RETURN 0;
ELSE
IF ida = 0 THEN
insert into firma.abteilung (bezeichnung, beschreibung,
id_firma, id_adresse)
values ($1, $2, $3, $4);
select INTO ida firma.chk_abteilung($1, $2, $3, $4);
END IF;
END IF;
RETURN ida;
END;
' language 'plpgsql';
-- ]
-- Ende Arbeitsplatz --

357
plpgsql_funcs/cr_func_generic.sql

@ -0,0 +1,357 @@
-- allgemeine Funktionen --
-- [
create function start_logging(text, text)
returns int4 as '
/*
* start_logging(table-name, operation) (INSERT, UPDATE, DELETE)
*
* Startet das logging zu einer bestimmten table.
*
* returns: 1 - logging eingeschaltet
* 0 - logging war schon eingeschaltet
*/
DECLARE
table_schema text;
table_schema_oid int4;
trig_name_before text;
trig_name_after text;
all_actions _text := ''{\"INSERT\", \"UPDATE\", \"DELETE\"}'';
actions _text;
range int4;
query text;
BEGIN
IF $2 <> ''INSERT'' AND
$2 <> ''UPDATE'' AND
$2 <> ''DELETE'' AND
$2 <> ''CHANGE'' AND
$2 <> ''ALL'' THEN
RETURN -1;
END IF;
select into table_schema_oid relnamespace
from pg_catalog.pg_class where relname=$1;
select into table_schema nspname from pg_catalog.pg_namespace where
oid=table_schema_oid;
IF $2 = ''ALL'' THEN
range := 3;
actions := all_actions;
ELSE
IF $2 = ''CHANGE'' THEN
range := 2;
actions := ''{'';
FOR i IN 1..2 LOOP
actions := actions || quote_ident(all_actions[i]);
IF i<2 THEN
actions := actions || '','';
ELSE
actions := actions || ''}'';
END IF;
END LOOP;
ELSE
range := 1;
actions := ''{'' || quote_ident($2) || ''}'';
END IF;
END IF;
FOR i IN 1..range LOOP
trig_name_before := ''log_before_'' || lower(actions[i]) ||
''_'' || $1;
trig_name_after := ''log_after_'' || lower(actions[i]) ||
''_'' || $1;
PERFORM * from pg_catalog.pg_trigger where
tgname=trig_name_before;
IF NOT FOUND THEN
query := ''CREATE TRIGGER '' || trig_name_before ||
'' BEFORE '' || actions[i] || '' ON '' ||
table_schema || ''.'' || $1 ||
'' FOR EACH ROW EXECUTE PROCEDURE '' ||
''trigger_func.set_history();'';
EXECUTE query;
query := ''CREATE TRIGGER '' || trig_name_after ||
'' AFTER '' || actions[i] || '' ON '' ||
table_schema || ''.'' || $1 ||
'' FOR EACH ROW EXECUTE PROCEDURE '' ||
''trigger_func.set_history();'';
EXECUTE query;
ELSE
RAISE EXCEPTION ''specified trigger not found'';
END IF;
END LOOP;
RETURN 1;
END;
' language 'plpgsql';
create function stop_logging(text, text)
returns int4 as '
/*
* stop_logging(table-name, operation) (INSERT, UPDATE, DELETE)
*
* Stoppt das logging zu einer bestimmten table.
*
* returns: 1 - logging eingeschaltet
* 0 - logging war schon eingeschaltet
*/
DECLARE
table_schema text;
table_schema_oid int4;
trig_name_before text;
trig_name_after text;
all_actions _text := ''{\"INSERT\", \"UPDATE\", \"DELETE\"}'';
actions _text;
range int4;
query text;
BEGIN
IF $2 <> ''INSERT'' AND
$2 <> ''UPDATE'' AND
$2 <> ''DELETE'' AND
$2 <> ''CHANGE'' AND
$2 <> ''ALL'' THEN
RETURN -1;
END IF;
select into table_schema_oid relnamespace
from pg_catalog.pg_class where relname=$1;
select into table_schema nspname from pg_catalog.pg_namespace where
oid=table_schema_oid;
IF $2 = ''ALL'' THEN
range := 3;
actions := all_actions;
ELSE
IF $2 = ''CHANGE'' THEN
range := 2;
actions := ''{'';
FOR i IN 1..2 LOOP
actions := actions || quote_ident(all_actions[i]);
IF i<2 THEN
actions := actions || '','';
ELSE
actions := actions || ''}'';
END IF;
END LOOP;
ELSE
range := 1;
actions := ''{'' || quote_ident($2) || ''}'';
END IF;
END IF;
FOR i IN 1..range LOOP
trig_name_before := ''log_before_'' || lower(actions[i]) ||
''_'' || $1;
trig_name_after := ''log_after_'' || lower(actions[i]) ||
''_'' || $1;
PERFORM * from pg_catalog.pg_trigger where
tgname=trig_name_before;
IF FOUND THEN
query := ''DROP TRIGGER '' || trig_name_before ||
'' ON '' || table_schema || ''.'' || $1 || '';'';
EXECUTE query;
query := ''DROP TRIGGER '' || trig_name_after ||
'' ON '' || table_schema || ''.'' || $1 || '';'';
EXECUTE query;
ELSE
RAISE EXCEPTION ''specified trigger not found'';
END IF;
END LOOP;
RETURN 1;
END;
' language 'plpgsql';
create function bit2text(bit varying)
returns text as '
DECLARE
len int4;
i int4;
conv int4;
ret text := '''';
BEGIN
len := bit_length($1);
FOR i IN 0..len-1 LOOP
conv := ($1<<i)::BIT(1)::int4;
ret := ret || conv;
END LOOP;
RETURN ret;
END;
' language 'plpgsql';
create function bit_set_len(bit varying, int4)
returns bit varying as '
/*
* bitlen(zu aenderneder Bitstring, len)
*
* Postres hat die dumme regelung, das wenn man die laenge eines
* Bitstrings umcastet immer rechts weggeschnitten oder ergaenzt
* wird. Erwarten tut man allerdings normalerweise das diese dinge
* links passieren, damit der Wert der Bitfolge nicht veraendert, bzw.
* die Positionen der bisherigen Bits nicht veraendert werden.
* genau das macht diese Funktion.
*
* returns: Den veraenderten Bitstring
*/
DECLARE
old_len int4;
sel text;
dummy RECORD;
BEGIN
old_len := bit_length($1);
IF old_len < $2 THEN
sel := ''select B'' || quote_literal(bit2text($1)) ||
''::BIT('' || $2 || '')>>'' || $2-old_len ||
'' as new_val'';
FOR dummy IN EXECUTE sel LOOP
END LOOP;
ELSE
IF old_len > $2 THEN
sel := ''select (B'' || quote_literal(bit2text($1)) ||
''<<'' || old_len-$2 || '')::BIT('' || $2 ||
'') as new_val'';
FOR dummy IN EXECUTE sel LOOP
END LOOP;
ELSE
RETURN $1;
END IF;
END IF;
RETURN dummy.new_val;
END;
' language 'plpgsql';
create function mask_len(text, text, text)
returns int4 as '
DECLARE
len int4 := 0;
result RECORD;
query text;
i int4 := 0;
BEGIN
query := ''select bit_length('' || $2 || '') '' ||
''as len from '' || $1;
FOR result IN EXECUTE query LOOP
IF i = 0 THEN
len := result.len;
i := 1;
END IF;
IF $3 = ''min'' THEN
IF result.len < len THEN
len := result.len;
END IF;
END IF;
IF $3 = ''max'' THEN
IF result.len > len THEN
len := result.len;
END IF;
END IF;
IF $3 IS NULL OR $3 = ''first'' THEN
EXIT;
END IF;
END LOOP;
IF NOT FOUND THEN
len := 0;
END IF;
RETURN len;
END;
' language 'plpgsql';
create function corrected_mask(text, text, bit varying)
returns bit varying as '
DECLARE
len int4;
new bit varying;
BEGIN
select INTO len public.mask_len($1, $2, NULL);
IF len < bit_length($3) THEN
RETURN $3;
ELSE
RETURN bit_set_len($3, len);
END IF;
END;
' language 'plpgsql';
create function get_db_comment(text)
returns text as '
DECLARE
co text;
dboid pg_catalog.pg_stat_database.datid%TYPE;
BEGIN
select into dboid OID from pg_catalog.pg_database where
datname=$1;
select into co description from pg_catalog.pg_description where
objoid=dboid;
return co;
END;
' language 'plpgsql';
create function get_schema_comment(text)
returns text as '
DECLARE
co text;
schemaoid pg_catalog.pg_class.relnamespace%TYPE;
BEGIN
select into schemaoid OID from pg_catalog.pg_namespace where
nspname=$1;
select into co description from pg_catalog.pg_description where
objoid=schemaoid;
return co;
END;
' language 'plpgsql';
create function get_constraint_comment(text)
returns text as '
DECLARE
co text;
conoid pg_catalog.pg_stat_database.datid%TYPE;
BEGIN
select into conoid OID from pg_catalog.pg_constraint where
conname=$1;
select into co description from pg_catalog.pg_description where
objoid=conoid;
return co;
END;
' language 'plpgsql';
-- CREATE FUNCTION jdbc_clean(text) RETURNS text AS'
-- /*
-- * Brauchte ich aufgrund eines Bugs im jdbc Treiber, der LATIN1 nicht
-- * korrekt in UNICODE umwandelte.
-- * Jetzt ist dies Funktion obsolet.
-- *
-- */
-- DECLARE
-- ret text;
-- BEGIN
-- SELECT INTO ret replace($1, ''\\\\344'', ''ä'');
-- SELECT INTO ret replace(ret, ''\\\\366'', ''ö'');
-- SELECT INTO ret replace(ret, ''\\\\374'', ''ü'');
-- SELECT INTO ret replace(ret, ''\\\\337'', ''\ß'');
-- SELECT INTO ret replace(ret, ''\\\\304'', ''Ä'');
-- SELECT INTO ret replace(ret, ''\\\\326'', ''Ö'');
-- SELECT INTO ret replace(ret, ''\\\\334'', ''Ü'');
--
-- RETURN ret;
-- END;
--' LANGUAGE 'plpgsql'
-- ]
-- allgemeine Funktionen --

259
plpgsql_funcs/cr_func_konto.sql

@ -0,0 +1,259 @@
-- allgemeine Funktionen zu Konten --
-- [
create function konto_typ_min_len()
returns int4 as '
DECLARE
len int4;
BEGIN
select INTO len bit_length(mask) from fibu.konten_typen;
IF NOT FOUND THEN
len := 0;
END IF;
RETURN len;
END;
' language 'plpgsql';
create function konto_typ(text, int4)
returns bit varying as '
/*
* konto_typ(name, output_len)
*
* ermittelt den konto_typ zu einem entsprechenden namen.
*
* dies existierem hauptsaechlich zur besseren lesbar machung von
* querys bezueglich konten, folgende query ist verstaendlicher,
* wenn auch etwas laenger:
* select * from konto where
* konto_typ=konto_typ(''AKTIVA'');
* als:
* select * from konto where
* konto_typ=1;
* bei der ersten query sieht man intuitiv das nach allen aktiva-konten
* gesucht wird, waerend das aus der zweiten nur hervorgeht wenn man
* alle Kontentypen im Kopf hat.
*
* returns: NULL: falls der name nicht in konten_typen existiert
* >0: der konten_typ zu dem namen
*/
DECLARE
row fibu.konten_typen%ROWTYPE;
min_len int4 := fibu.konto_typ_min_len();
sel text;
BEGIN
IF $2 < min_len THEN
RAISE EXCEPTION ''len is to short'';
END IF;
sel := ''select mask::BIT('' || $2 || '')>>'' ||
$2-min_len ||
'' from fibu.konten_typen where name='' ||
quote_literal($1);
FOR row IN EXECUTE sel LOOP
END LOOP;
IF NOT FOUND THEN
RETURN NULL;
ELSE
RETURN row.mask;
END IF;
END;
' language 'plpgsql';
create function "inc_konto_ref_count" (int4)
returns int4 as '
/*
* inc_konto_ref_count(kto_nr)
*
* erhoet das Feld used in used_konten um 1, damit wird signalisiert,
* das einmal mehr auf dieses Konto referenziert wird.
*
* returns: -1: Konto passt nicht in aktuellen kontenplan
* 0: Konto noch nicht in Konten, daher kein increment
* >0: Anzahl der Referenzen nach der erhoehung.
*/
DECLARE
ref_count fibu.used_konten.used%TYPE;
konto fibu.konto%ROWTYPE;
BEGIN
select INTO ref_count used from fibu.used_konten where kto_nr=$1;
IF NOT FOUND THEN
return -1;
END IF;
select INTO konto * from fibu.konto where kto_nr=$1;
IF NOT FOUND THEN
return 0;
END IF;
ref_count := ref_count + 1;
update fibu.used_konten set used=ref_count where kto_nr=$1;
RETURN ref_count;
END;
' language 'plpgsql';
create function "dec_konto_ref_count" (int4)
returns int4 as '
/*
* dec_konto_ref_count(kto_nr)
*
* verringert das Feld used in used_konten um 1, damit wird
* signalisiert, das einmal mehr auf dieses Konto referenziert wird.
* Es existiert ein trigger, der Konto loescht, wenn keine Referenz
* mehr darauf besteht, das koennte zu problemen fuehren, da Konten
* fuer die Buchfuehrung auch erhalten bleiben muessen, wenn die
* Kunden keinerlei Umsatz mehr produzieren, allerdings sollten dann
* auch die Kundeninformationen bestehen bleiben wodurch auch die
* Referenz bleibt.
*
* returns: -1: Konto passt nicht in aktuellen kontenplan
* 0: entweder wurde used gerade auf 0 gesetzt, oder es
* war bereits 0.
* >0: Anzahl der Referenzen nach der verringerung.
*/
DECLARE
ref_count fibu.used_konten.used%TYPE;
konto fibu.konto%ROWTYPE;
BEGIN
select INTO ref_count used from fibu.used_konten where kto_nr=$1;
IF NOT FOUND THEN
RETURN -1;
END IF;
IF ref_count = 0 THEN
RETURN 0;
ELSE
ref_count := ref_count - 1;
update fibu.used_konten set used=ref_count where kto_nr=$1;
END IF;
RETURN ref_count;
END;
' language 'plpgsql';
create function "chk_konto" (int4,text,bit varying,varchar(8),text, text)
returns int4 as '
/*
* chk_konto(kto_nr, name, konto_typ, blz, b_kto_nr, b_name)
*
* ueberpruefen ob das Konto schon in der DB gespeichert ist und
* ob es in dem sinne gueltig ist, das in den existierenden
* kontenplan passt.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits ein
* Konto mit dem der Schluessel, aber nicht alle der
* Parameter übereinstimmen
* -3: Inkonsistenz, Konto passt nicht in den Kontenplan
* 0: Konto existiert noch nicht in der DB
* >0: Konto existiert bereits, gibt id_person zurück.
*/
DECLARE
idk fibu.konto%ROWTYPE;
kot fibu.konto.konto_typ%TYPE;
BEGIN
IF $1 IS NULL OR $1 < 0 THEN
RETURN -1;
END IF;
select INTO kot konto_typ from fibu.used_konten where kto_nr = $1;
IF NOT FOUND OR kot != $3 THEN
RETURN -3;
END IF;
select INTO idk * from fibu.konto where
kto_nr = $1;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF idk.name <> $2 OR idk.konto_typ <> $3 OR
idk.blz <> $4 OR idk.b_kto_nr <> $5 OR
idk.b_name <> $5 THEN
RETURN -2;
END IF;
END IF;
RETURN idk.kto_nr;
END;
' language 'plpgsql';
create function ins_konto(int4,text,bit varying,varchar(8),text,text)
returns int4 as '
/*
* ins_konto(kto_nr, name, konto_typ, blz, b_kto_nr, b_name)
*
* fügt eine Konto in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
* Es muss nur konto_typ angegeben werden, alle anderen Werte koennen
* NULL sein.
* Ist kto_nr NULL, dann ermittelt die Funktion einen freie Kontonummer
* aus dem zu konto_typ gehoerenden Nummernbereich. Dann wird das Konto
* angelegt.
* Ist sie nicht NULL so wird geprueft ob die zu dem konto_typ gehoert,
* wenn das so ist, dann wird chk_konto aufgerufen um zu pruefen
* ob das Konto bereits existiert, ist das nicht der Fall dann wird
* es angelegt, wenn ein Konto existiert, das nicht zu den gemachten
* Angeben passt, dann wird eine Fehlermeldung zurueckgegeben.
* ACHTUNG: Hier wird natuerlich noch nicht inc_ref_count_erhoeht,
* da noch keine referenz auf das konto existiert.
* Das heißt, wenn ein naechster update auf used_konten
* nicht den ref_count (used) auf mindestens eins setzt
* wird das Konto wieder unmittelbar geloescht.
*
* returns: 0: wenn die Person nicht eingefuegt werden kann
* >0: wenn die Person eingefuegt werden konnte oder bereits
* existierte, gibt id_person zurück.
*/
DECLARE
ktn fibu.konto.kto_nr%TYPE;
row fibu.used_konten%ROWTYPE;
BEGIN
IF $1 IS NOT NULL THEN
select INTO ktn fibu.chk_konto($1,$2,$3,$4,$5,$6);
IF ktn < 0 THEN
RETURN 0;
END IF;
ELSE
ktn := 0;
PERFORM * from fibu.konten_typen where mask=$3;
IF NOT FOUND THEN
RETURN 0;
END IF;
END IF;
IF ktn = 0 THEN
IF $1 IS NULL THEN
select INTO row * from fibu.used_konten where
konto_typ=$3 and used=0;
IF NOT FOUND THEN
RETURN 0;
ELSE
ktn := row.kto_nr;
END IF;
ELSE
ktn := $1;
END IF;
insert into fibu.konto
(kto_nr,name,konto_typ,blz,b_kto_nr,b_name) values
(ktn,$2,$3,$4,$5,$6);
END IF;
RETURN ktn;
END;
' language 'plpgsql';
-- ]
-- Ende allgemeine Funktionen --

4
plpgsql_funcs/cr_func_kunde.sql

@ -0,0 +1,4 @@
-- allgemeine Funktionen zu Kunden --
-- [
-- ]
-- Ende allgemeine funktionen zu Kunden --

164
plpgsql_funcs/cr_func_land.sql

@ -0,0 +1,164 @@
-- Funktionen um Laender zu verwalten --
-- [
create function "chk_land" (text,varchar(3),varchar(4))
returns int4 as '
/*
* chk_land(land, lnd_kz, vorwahl_l)
*
* ueberpruefen ob das Land schon in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits ein
* Land mit dem einer, aber nicht alle der Parameter
* uebereinstimmen
* 0: Land existiert noch nicht in der DB
* >0: Land existiert bereits, gibt id_land zurueck.
*/
DECLARE
idl adresse.land%ROWTYPE;
BEGIN
IF $1 IS NULL OR $1 = '''' OR
$2 IS NULL OR $2 = '''' OR
$3 IS NULL OR $3 = '''' THEN
RETURN -1;
END IF;
/*
* Jeder der Teile is unique, existiert also einer der Teile
* schon aber mit anderen Partnern dann is ein Fehler aufgetreten.
*/
select INTO idl * from adresse.land where
land = $1 or
lnd_kz = $2 or
vorwahl_l = $3;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF idl.land <> $1 OR idl.lnd_kz <> $2 OR
idl.vorwahl_l <> $3 THEN
RETURN -2;
END IF;
END IF;
RETURN idl._id_;
END;
' language 'plpgsql';
create function "ins_land" (text,varchar(3),varchar(4))
returns int4 as '
/*
* ins_land(land, lnd_kz, vorwahl_l)
*
* fuegt ein Land in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
*
* returns: 0: wenn das Land nicht eingefuegt werden kann
* >0: wenn das Land eingefuegt werden konnte oder bereits
* existierte, gibt id_land zurueck.
*/
DECLARE
id_land adresse.land._id_%TYPE;
BEGIN
/*
* Daten ueberpruefen (siehe chk_land)
*/
select INTO id_land adresse.chk_land($1, $2, $3);
IF id_land < 0 THEN
RETURN 0;
ELSE
IF id_land = 0 THEN
insert into adresse.land (land, lnd_kz, vorwahl_l)
values ($1, $2, $3);
select INTO id_land adresse.chk_land($1, $2, $3);
END IF;
END IF;
RETURN id_land;
END;
' language 'plpgsql';
create function "id_land_by_land" (text)
returns int4 as '
/*
* get_id_land_by_land(land)
*
* Ermittelt die id (id_land) eines in der DB enthaltenen Landes
* anhand seiner Bezeuchnung (land.land)
*
* returns: 0: wenn das Land nicht eingefuegt werden kann
* >0: wenn das Land gefunden wurde, gibt id_land zurueck.
*/
DECLARE
idl adresse.land._id_%TYPE;
BEGIN
select INTO idl _id_ from adresse.land where
land = $1;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN idl;
END IF;
END;
' language 'plpgsql';
create function "id_land_by_lnd_kz" (varchar(3))
returns int4 as '
/*
* get_id_land_by_lnd_kz(lnd_kz)
*
* Ermittelt die id (id_land) eines in der DB enthaltenen Landes
* anhand des internationalen Kennzeichens (land.lnd_kz)
*
* returns: 0: wenn das Land nicht eingefuegt werden kann
* >0: wenn das Land gefunden wurde, gibt id_land zurueck.
*/
DECLARE
idl adresse.land._id_%TYPE;
BEGIN
select INTO idl _id_ from adresse.land where
lnd_kz = $1;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN idl;
END IF;
END;
' language 'plpgsql';
create function "id_land_by_vorwahl_l" (varchar(4))
returns int4 as '
/*
* get_id_land_by_vorwahl_l(vorwahl_l)
*
* Ermittelt die id (id_land) eines in der DB enthaltenen Landes
* anhand die internationalen Laendervorwahl (land.land_kz)
*
* returns: 0: wenn das Land nicht eingefuegt werden kann
* >0: wenn das Land gefunden wurde, gibt id_land zurueck.
*/
DECLARE
idl adresse.land._id_%TYPE;
BEGIN
select INTO idl _id_ from adresse.land where
vorwahl_l = $1;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN idl;
END IF;
END;
' language 'plpgsql';
-- ]
-- Ende Laender --

101
plpgsql_funcs/cr_func_ort.sql

@ -0,0 +1,101 @@
-- Funktionen um Orte zu verwalten --
-- [
create function "chk_ort" (text,varchar(10),int4)
returns int4 as '
/*
* chk_ort(ort, vorwahl_o, id_land)
*
* ueberpruefen ob der Ort schon in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits ein
* Ort mit dem einer, aber nicht alle der Parameter
* übereinstimmen
* 0: Ort existiert noch nicht in der DB
* >0: Ort existiert bereits, gibt id_ort zurück.
*/
DECLARE
ido adresse.ort%ROWTYPE;
BEGIN
IF $2 IS NULL OR $2 = '''' OR
$3 IS NULL OR $3 < 1 THEN
RETURN -1;
END IF;
--
-- OK, also zu jeder Kombination (vorwahl_o und id_land) kann
-- es nur einen Ort geben.
--
select INTO ido * from adresse.ort where
vorwahl_o = $2 and
id_land = $3;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF ido.ort <> $1 THEN
RETURN -1;
END IF;
END IF;
RETURN ido._id_;
END;
' language 'plpgsql';
create function "ins_ort" (text,varchar(10),int4)
returns int4 as '
/*
* ins_land(ort, vorwahl_o, id_land)
*
* fügt einen Ort in die DB ein sofern es nicht schon existiert,
* Inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
*
* returns: 0: wenn der Ort nicht eingefuegt werden kann
* >0: wenn der Ort eingefuegt werden konnte oder bereits
* existierte, gibt id_ort zurück.
*/
DECLARE
id_ort adresse.ort._id_%TYPE;
BEGIN
select INTO id_ort adresse.chk_ort($1, $2, $3);
IF id_ort = -1 THEN
RETURN 0;
ELSE
IF id_ort = 0 THEN
insert into adresse.ort (ort, vorwahl_o, id_land)
values ($1, $2, $3);
select INTO id_ort adresse.chk_ort($1, $2, $3);
END IF;
END IF;
RETURN id_ort;
END;
' language 'plpgsql';
create function "id_ort" (varchar(10),int4)
returns int4 as '
/*
* get_id_ort_by_ukey1(vorwahl_o, id_land)
*
* Ermittelt die id (id_ort) eines in der DB enthaltenen Orts
* anhand des Primaerschluessels (vorwahl_o, id_land)
*
* returns: 0: wenn das Land nicht eingefuegt werden kann
* >0: wenn das Land gefunden wurde, gibt id_land zurück.
*/
DECLARE
ido adresse.ort._id_%TYPE;
BEGIN
select INTO ido adresse.chk_ort(NULL, $1, $2);
RETURN ido;
END;
' language 'plpgsql';
-- ]
-- Ende Orte --

272
plpgsql_funcs/cr_func_person.sql

@ -0,0 +1,272 @@
-- Funktionen um Personen zu verwalten --
-- [
create function "chk_person" (varchar(10),text,text,text,text,
varchar(10),varchar(10),varchar(10),varchar(50),
varchar(50), varchar(100))
returns int4 as '
/*
* chk_person(anrede, titel, nachname, vorname, geb_dat,
* postfach, telefon, fax, handy,
* email, webpage)
*
* ueberpruefen ob die Person schon in der DB gespeichert ist.
*
* returns: -1: falsche Parameter
* -2: Inkonsistenz endeckt. Es existiert bereits eine
* Person mit dem einer, aber nicht alle der Parameter
* übereinstimmen
* 0: Person existiert noch nicht in der DB
* >0: Person existiert bereits, gibt id_person zurück.
*/
DECLARE
idp person.person%ROWTYPE;
BEGIN
IF $3 IS NULL OR $3 = '''' OR
$4 IS NULL OR $4 = '''' OR
$5 IS NULL OR $5 = '''' THEN
RETURN -1;
END IF;
select INTO idp * from person.person where
nachname = $3 and vorname = $4 and
geb_dat = $5::date;
IF NOT FOUND THEN
RETURN 0;
ELSE
IF idp.anrede <> $1 OR idp.titel <> $2 OR
idp.postfach <> $6 OR idp.telefon <> $7 OR
idp.fax <> $8 OR idp.handy <> $9 OR
idp.email <> $10 OR idp.webpage <> $11 THEN
RETURN -2;
END IF;
END IF;
RETURN idp._id_;
END;
' language 'plpgsql';
create function "ins_person" (varchar(10),text,text,text,text,
varchar(10),varchar(10),varchar(10),varchar(50),
varchar(50),varchar(100))
returns int4 as '
/*
* ins_person(anrede, titel, nachname, vorname, geb_dat,
* postfach, telefon, fax, handy,
* email, webpage)
*
* fügt eine Person in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
*
* returns: 0: wenn die Person nicht eingefuegt werden kann
* >0: wenn die Person eingefuegt werden konnte oder bereits
* existierte, gibt id_person zurück.
*/
DECLARE
idp person.person._id_%TYPE;
BEGIN
select INTO idp person.chk_person($1,$2,$3,$4,$5,$6,$7,$8,$9,
$10,$11);
IF idp < 0 THEN
RETURN 0;
ELSE
IF idp = 0 THEN
insert into person.person (anrede,titel,nachname,vorname,
geb_dat,postfach,telefon,fax,
handy,email,webpage)
values ($1,$2,$3,$4,$5::date,$6,$7,$8,$9,$10,$11);
select INTO idp person.chk_person($1,$2,$3,$4,$5,$6,
$7,$8,$9,$10,$11);
END IF;
END IF;
RETURN idp;
END;
' language 'plpgsql';
create function "ins_person" (varchar(10),text,text,text,text,
varchar(10),varchar(10),varchar(10),varchar(50),
varchar(50),varchar(100),int4)
returns int4 as '
/*
* ins_person(anrede, titel, nachname, vorname, geb_dat,
* postfach, telefon, fax, handy,
* email, webpage, id_adresse, id_abteilung)
*
* fügt eine Person in die DB ein sofern es nicht schon existiert,
* inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
* sind.
* Außerdem werden schon zuordnugen zu einer Adresse und einem Arbeits
* platz gemacht.
*
* returns: 0: wenn die Person nicht eingefuegt werden kann
* >0: wenn die Person eingefuegt werden konnte oder bereits
* existierte, gibt id_person zurück.
*/
DECLARE
idp person.person._id_%TYPE;
BEGIN
select INTO idp person.ins_person($1,$2,$3,$4,$5,$6,$7,$8,$9,
$10,$11);
IF idp = 0 THEN
RETURN 0;
ELSE
PERFORM person.person_adresse(idp, $12);
/*
* Die Zuordnung zu arbeit erfordert weiter Informationen,
* wie Gehalt, Position u.a. darum ist eine Zuordnung hier
* warscheinlich nicht seht sinnvoll. Trotzdem lasse ich das
* hier nochmal auskommentiert stehen, vielleicht braucht man
* es ja doch...
*/
--select INTO tmp create_rel_person_abteilung(idp, $13);--
END IF;
RETURN idp;
END;
' language 'plpgsql';
create function "person_adresse" (int4, int4)
returns int4 as '
/*
* person_adresse(id_person, id_adresse)
*
* ordnet eine Person einer Adresse zu, dies passiert ueber einen
* Eintrag in der Relation wohnt. Es wird sichergestellt das keine
* inkonstistenzen auftreten (keine doppelten Zuordnungen)
*
* returns: -1: Wenn die Eingabedaten fehlerhaft waren.
* 0: Wenn die Zuordnung nicht gemacht werden konnte.
* 1: Wenn die Zuordnung gemacht wurde.
*/
BEGIN
IF $1 IS NULL OR $1 < 1 OR
$2 IS NULL OR $2 < 1 THEN
RETURN -1;
END IF;
PERFORM * from person.person where _id_ = $1;
IF NOT FOUND THEN
RETURN 0;
END IF;
PERFORM * from adresse.adresse where _id_ = $2;
IF NOT FOUND THEN
RETURN 0;
END IF;
PERFORM * from person.wohnt where
id_person = $1 and id_adresse = $2;
IF NOT FOUND THEN
insert into person.wohnt (id_person, id_adresse)
values ($1, $2);
IF NOT FOUND THEN
RETURN 0;
END IF;
END IF;
RETURN 1;
END;
' language 'plpgsql';
-- Da kann ich keinen view draus machen, da ich einen Parameter brauche.
create function "person_wohnt" (int4)
returns SETOF wohnt as '
/*
* person_wohnt(id_person)
*
* ordnet eine Person einer Adresse zu, dies passiert ueber einen
* Eintrag in der Relation wohnt. Es wird sichergestellt das keine
* inkonstistenzen auftreten (keine doppelten Zuordnungen)
* Wird fuer id_adresse NULL oder ein Wert < 1 eingegeben, so sucht
* die Funktion nach den Ein
*
* Das ist im prinziep das selbe wie
* select * from wohnt where id_person=??
* ich lass es trotzdem zu anschauungszwecken drin.
*
* returns: -1 (in erstem Element): Wenn die Eingabedaten fehlerhaft
* waren.
* 0 (im ersten Element): Die Person existiert nicht
* >0 (in allen Elementen): Jede Adresse (id_adresse) an der
* die Person wohnt.
* <EMPTY SET>: Keine Adresse gefunden.
*/
DECLARE
idw_curs refcursor;
idw person.wohnt%ROWTYPE;
BEGIN
IF $1 IS NULL OR $1 < 1 THEN
idw.id_person := -1;
idw.id_adresse := -1;
RETURN NEXT idw;
RETURN;
END IF;
PERFORM * from person.person where id_person = $1;
IF NOT FOUND THEN
idw.id_person := 0;
idw.id_adresse := 0;
RETURN NEXT idw;
RETURN;
END IF;
/*
* Moeglichkeit 1
*
* OPEN idw_curs FOR select * from person.wohnt where id_person = $1;
*
* FETCH idw_curs INTO idw;
* WHILE FOUND LOOP
* RETURN NEXT idw;
* FETCH idw_curs INTO idw;
* END LOOP;
*/
/*
* Moeglichkeit 2
*/
FOR idw IN select * from person.wohnt where id_person = $1 LOOP
RETURN NEXT idw;
END LOOP;
RETURN;
END;
' language 'plpgsql';
create function "id_person" (text, text, text)
returns int4 as '
/*
* get_id_person_by_ukey1(nachname, vorname, geb_dat)
*
* Ermittelt die id (id_person) einer in der DB enthaltenen Person
* anhand des Primaerschluessels (nachname, vorname, geb_dat)
*
* returns: 0: wenn die Person nicht eingefuegt werden kann
* >0: wenn die Person gefunden wurde, gibt id_person zurück.
*/
DECLARE
idp person.person._id_%TYPE;
BEGIN
select INTO idp _id_ from person.person where
nachname = $1 and vorname = $2 and geb_dat = $3::date;
IF NOT FOUND THEN
RETURN 0;
ELSE
RETURN idp;
END IF;
END;
' language 'plpgsql';
-- ]
-- Ende Personendaten --

99
plpgsql_funcs/cr_func_waren.sql

@ -0,0 +1,99 @@
-- allgemeine Funktionen zu Waren/Warengruppen --
-- [
create function produkt_typ_len()
returns int4 as '
DECLARE
len int4;
BEGIN
select INTO len bit_length(produkt_typ) from waren.produkt_typen;
IF NOT FOUND THEN
len := 0;
END IF;
RETURN len;
END;
' language 'plpgsql';
create function produkt_typ(text, int4)
returns bit varying as '
/*
* produkt_typ(name, len)
*
* ermittelt den produkt_typ zu einem entsprechenden namen.
*
* returns: NULL: falls der name nicht in konten_typen existiert
* >0: der konten_typ zu dem namen
*/
DECLARE
row waren.produkt_typen%ROWTYPE;
min_len int4 := waren.produkt_typ_len();
sel text;
BEGIN
IF $2 < min_len THEN
RAISE EXCEPTION ''len is to short'';
END IF;
sel := ''select produkt_typ::BIT('' || $2 || '')>>'' ||
$2-min_len ||
'' from waren.produkt_typen where bezeichnung='' ||
quote_literal($1);
FOR row IN EXECUTE sel LOOP
END LOOP;
IF NOT FOUND THEN
RETURN NULL;
ELSE
RETURN row.konto_typ;
END IF;
END;
' language 'plpgsql';
create function get_warengruppe(text)
returns warengruppe as '
DECLARE
row waren.warengruppe%ROWTYPE;
BEGIN
select INTO row * from waren.warengruppe where name=$1;
IF NOT FOUND THEN
RETURN NULL;
ELSE
RETURN row;
END IF;
END;
' language 'plpgsql';
create function get_warengruppe(int4)
returns warengruppe as '
DECLARE
row waren.warengruppe%ROWTYPE;
BEGIN
select INTO row * from waren.warengruppe where _id_=$1;
IF NOT FOUND THEN
RETURN NULL;
ELSE
RETURN row;
END IF;
END;
' language 'plpgsql';
create function warengruppe_id(text)
returns int4 as '
DECLARE
row waren.warengruppe%ROWTYPE;
BEGIN
select INTO row * from waren.warengruppe where name=$1;
IF NOT FOUND THEN
RETURN NULL;
ELSE
RETURN row._id_;
END IF;
END;
' language 'plpgsql';
-- ]
-- Ende allgemeine Funktionen zu Waren/Warengruppen --

201
trigger_funcs/cr_trigger_func_benutzer.sql

@ -0,0 +1,201 @@
-- Trigger Funktionen zu Kunden --
-- [
create function on_insert_create_konten()
returns TRIGGER as '
DECLARE
err_msg text;
BEGIN
IF TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
/*
* Die funktion ins_konto uebernimmt schon alle checks bzgl.
* Des Nummernbereichs, etc. fuer uns.
*/
NEW.konto1 := fibu.ins_konto(NEW.konto1, TG_ARGV[0],
fibu.konto_typ(TG_ARGV[0]),
NULL, NULL, NULL);
IF NEW.konto1 = 0 THEN
err_msg := TG_NAME || '': cannot create debitor_kto'';
RAISE EXCEPTION ''%'', err_msg;
ELSE
PERFORM fibu.inc_konto_ref_count(NEW.konto1);
END IF;
NEW.konto2 := fibu.ins_konto(NEW.konto2, TG_ARGV[1],
fibu.konto_typ(TG_ARGV[1]),
NULL, NULL, NULL);
IF NEW.konto2 = 0 THEN
err_msg := TG_NAME || '': cannot create kreditor_kto'';
RAISE EXCEPTION ''%'', err_msg;
ELSE
PERFORM fibu.inc_konto_ref_count(NEW.konto2);
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
create function on_update_update_konten()
returns TRIGGER as '
DECLARE
err_msg text;
range fibu.kontenplan%ROWTYPE;
BEGIN
IF TG_OP <> ''UPDATE'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
IF NEW.konto1 <> OLD.konto1 THEN
NEW.konto1 := fibu.ins_konto(NEW.konto1,TG_ARGV[0],
fibu.konto_typ(TG_ARGV[0]),
NULL, NULL, NULL);
IF NEW.konto1 = 0 THEN
err_msg := TG_NAME || '': cannot create debitor_kto'';
RAISE EXCEPTION ''%'', err_msg;
ELSE
PERFORM fibu.inc_konto_ref_count(NEW.konto1);
PERFORM fibu.dec_konto_ref_count(OLD.konto1);
END IF;
END IF;
IF NEW.konto2 <> OLD.konto2 THEN
NEW.konto2 := fibu.ins_konto(NEW.konto2,TG_ARGV[1],
fibu.konto_typ(TG_ARGV[1]),
NULL, NULL, NULL);
IF NEW.konto2 = 0 THEN
err_msg := TG_NAME || '': cannot create kreditor_kto'';
RAISE EXCEPTION ''%'', err_msg;
ELSE
PERFORM fibu.inc_konto_ref_count(NEW.konto2);
PERFORM fibu.dec_konto_ref_count(OLD.konto2);
END IF;
END IF;
RETURN NEW;
END;
' LANGUAGE 'plpgsql';
create function on_delete_dec_konto_ref_count()
returns TRIGGER as '
BEGIN
PERFORM fibu.dec_konto_ref_count(OLD.konto1);
PERFORM fibu.dec_konto_ref_count(OLD.konto2);
RETURN OLD;
END;
' language 'plpgsql';
CREATE FUNCTION on_change_one_null()
RETURNS TRIGGER AS '
DECLARE
err_msg text;
BEGIN
IF TG_OP = ''INSERT'' THEN
IF (NEW.id_person IS NULL AND NEW.id_firma IS NULL) OR
(NEW.id_person IS NOT NULL AND NEW.id_firma IS NOT NULL) THEN
err_msg := TG_NAME || '': both or none are NULL'';
RAISE EXCEPTION ''%'', err_msg;
ELSE
RETURN NEW;
END IF;
END IF;
/*
* Bei einem update gibt es mehrere Moeglichkeiten:
* 1. weder id_person noch id_firma werden veraendert:
* Dann passiert in dieser Funktion gar nichts.
* 2. entweder id_person oder id_firma wird veraendert:
* - id_person oder id_firma werden gesetzt und das
* jeweils andere Feld wird auf NULL gesetzt.
* - sind nach dem update beide NULL wird das update nicht
* ausgefueht und eine Fehlermeldung ausgegeben.
* 3. beide werden verandert:
* - wird fuer beide Felder ein neuer Wert angegeben, so
* geht diese Funktion davon aus das das bisher NULL
* enthaltende Feld gesetzt werden soll (diese Situation
* sollte allerdings moeglichst immer vom Frontend abgefangen
* werden, ein Kunde kann nur entweder eine Person oder eine
* Firma sein, nicht beides.
*/
IF TG_OP = ''UPDATE'' THEN
IF OLD.id_person IS NOT NULL AND
NEW.id_firma IS NOT NULL THEN
NEW.id_person := NULL;
END IF;
IF OLD.id_firma IS NOT NULL AND
NEW.id_person IS NOT NULL THEN
NEW.id_firma := NULL;
END IF;
IF NEW.id_person IS NULL AND NEW.id_FIRMA IS NULL THEN
RAISE EXCEPTION ''change_kunde_trigger: both are NULL'';
END IF;
RETURN NEW;
END IF;
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END;
' LANGUAGE 'plpgsql';
CREATE FUNCTION on_change_one_null2()
RETURNS TRIGGER AS '
DECLARE
err_msg text;
BEGIN
IF TG_OP = ''INSERT'' THEN
IF (NEW.id_person IS NULL AND
NEW.id_firma IS NULL AND
NEW.id_benutzer IS NULL) OR
(NEW.id_person IS NOT NULL AND
NEW.id_benutzer IS NOT NULL) OR
(NEW.id_firma IS NOT NULL AND
NEW.id_benutzer IS NOT NULL) OR
(NEW.id_firma IS NOT NULL AND
NEW.id_person IS NOT NULL) THEN
err_msg := TG_NAME || '': all or none are NULL'';
RAISE EXCEPTION ''%'', err_msg;
ELSE
RETURN NEW;
END IF;
END IF;
IF TG_OP = ''UPDATE'' THEN
IF OLD.id_person IS NOT NULL AND
(NEW.id_firma IS NOT NULL OR
NEW.id_benutzer IS NOT NULL) THEN
NEW.id_person := NULL;
END IF;
IF OLD.id_firma IS NOT NULL AND
(NEW.id_person IS NOT NULL OR
NEW id_benutzer IS NOT NULL) THEN
NEW.id_firma := NULL;
END IF;
IF OLD.id_benutzer IS NOT NULL AND
(NEW.id_person IS NOT NULL OR
NEW.id_firma IS NOT NULL) THEN
NEW.id_benutzer := NULL;
END IF;
IF NEW.id_person IS NULL AND
NEW.id_firma IS NULL AND
NEW.id_benutzer IS NULL THEN
RAISE EXCEPTION ''change_kunde_trigger: all are NULL'';
END IF;
RETURN NEW;
END IF;
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END;
' LANGUAGE 'plpgsql';
-- ]
-- Ende Triggerfunktionen zu Kunden --

254
trigger_funcs/cr_trigger_func_generic.sql

@ -0,0 +1,254 @@
-- allgemeine Trigger-Funtionen
-- [
create function set_history()
returns TRIGGER as '
DECLARE
usern text;
table_natts int4;
table_col_curs refcursor;
table_schema text;
table_schema_oid int4;
row_oid int4;
oid_bit int4;
oid_varbit int4;
col_name text;
col_names text := ''{'';
col_typ int4;
col_typ_name text;
col_types text := ''{'';
col_val text;
col_vals text := ''{'';
dummy_text RECORD;
dummy_bit RECORD;
query text;
BEGIN
usern := user;
select into table_natts relnatts from pg_catalog.pg_class where
relname=TG_RELNAME;
select into oid_bit oid from pg_catalog.pg_type where
typname=''bit'';
select into oid_varbit oid from pg_catalog.pg_type where
typname=''varbit'';
select into table_schema_oid relnamespace
from pg_catalog.pg_class where relname=TG_RELNAME;
select into table_schema nspname from pg_catalog.pg_namespace where
oid=table_schema_oid;
OPEN table_col_curs FOR select attname,atttypid from
pg_catalog.pg_attribute where attrelid=TG_RELID;
FOR i IN 1..7 LOOP
FETCH table_col_curs INTO col_name,col_typ;
END LOOP;
FOR i IN 1..table_natts LOOP
FETCH table_col_curs INTO col_name,col_typ;
col_names := col_names || quote_literal(col_name);
select into col_typ_name typname from pg_catalog.pg_type where
oid=col_typ;
col_types := col_types || quote_literal(col_typ_name);
IF col_typ = oid_bit OR
col_typ = oid_varbit THEN
query := ''select '' || col_name || '' as val from '' ||
table_schema || ''.'' || TG_RELNAME ||
'' where oid='';
ELSE
query := ''select '' || col_name || ''::text as val '' ||
''from '' || table_schema || ''.'' ||
TG_RELNAME || '' where oid='';
END IF;
IF TG_OP = ''INSERT'' OR
TG_OP = ''UPDATE'' THEN
query := query || NEW.oid;
row_oid := NEW.oid;
ELSE
query := query || OLD.oid;
row_oid := OLD.oid;
END IF;
IF col_typ = oid_bit OR
col_typ = oid_varbit THEN
FOR dummy_bit IN EXECUTE query LOOP
IF dummy_bit.val IS NOT NULL THEN
col_vals := col_vals ||
quote_literal(public.bit2text(dummy_bit.val));
END IF;
END LOOP;
ELSE
FOR dummy_text IN EXECUTE query LOOP
IF dummy_text.val IS NOT NULL THEN
col_vals := col_vals ||
quote_literal(dummy_text.val::text);
END IF;
END LOOP;
END IF;
IF i <> table_natts THEN
col_names := col_names || '','';
col_types := col_types || '','';
col_vals := col_vals || '','';
ELSE
col_names := col_names || ''}'';
col_types := col_types || ''}'';
col_vals := col_vals || ''}'';
END IF;
END LOOP;
-- IF query IS NOT NULL THEN
-- insert into public.history (username,time,tab,row_oid,at_time,
-- operation,col_names,col_types,
-- col_vals)
-- values (quote_literal(usern),
-- quote_literal(''now''),
-- quote_literal(TG_RELNAME),
-- quote_literal(row_oid),
-- quote_literal(TG_WHEN),
-- quote_literal(TG_OP),
-- quote_literal(col_names),
-- quote_literal(col_types),
-- quote_literal(col_vals));
-- END IF;
query := ''insert into public.history (username,time,tab,'' ||
''row_oid,at_time,operation,col_names,col_types,'' ||
''col_vals) values ('' ||
quote_literal(usern) || '','' ||
quote_literal(''now'') || '','' ||
quote_literal(TG_RELNAME) || '','' ||
quote_literal(row_oid) || '','' ||
quote_literal(TG_WHEN) || '','' ||
quote_literal(TG_OP) || '','' ||
quote_literal(col_names) || '','' ||
quote_literal(col_types) || '','' ||
quote_literal(col_vals) || '')'';
IF query IS NOT NULL THEN
EXECUTE query;
ELSE
RAISE NOTICE ''Found null query:'';
RAISE NOTICE ''query: %'', query;
RAISE NOTICE ''user: %'', usern;
RAISE NOTICE ''TG_RELNAME: %'', TG_RELNAME;
RAISE NOTICE ''row_oid: %'', row_oid;
RAISE NOTICE ''TG_WHEN: %'', TG_WHEN;
RAISE NOTICE ''TG_OP: %'', TG_OP;
RAISE NOTICE ''col_names: %'', col_names;
RAISE NOTICE ''col_vals: %'', col_vals;
RAISE NOTICE ''col_types: %'', col_types;
END IF;
IF TG_OP = ''INSERT'' OR
TG_OP = ''UPDATE'' THEN
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END;
' language 'plpgsql';
create function create_valid_mask_before()
returns TRIGGER as '
/*
Aufgrund vin beschraenkungen in plpgsql muessen alle Bitmasken
mask heissen....zumindest in den Tabellen fuer die diese Triggerfunc
arbeiten soll....das gilt ebenso fuer jeden weiteren universellen
Trigger, sie koennen immer nur funktionieren wenn die Spalten
name wohldefiniert sind.
*/
DECLARE
err_msg text;
new_len int4;
old_len int4;
dummy RECORD;
sel text;
BEGIN
IF TG_OP <> ''UPDATE'' AND TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
new_len := bit_length(NEW.mask);
IF TG_OP = ''UPDATE'' THEN
old_len := bit_length(OLD.mask);
ELSE
sel := ''select public.mask_len('' ||
quote_literal(TG_ARGV[0]) || '', '' ||
quote_literal(''mask'') || '',NULL) as len'';
FOR dummy IN EXECUTE sel LOOP
EXIT;
END LOOP;
IF NOT FOUND THEN
old_len := 0;
ELSE
old_len := dummy.len;
END IF;
END IF;
IF new_len < old_len THEN
NEW.mask := bit_set_len(NEW.mask, old_len);
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function create_valid_mask_after()
returns TRIGGER as '
/*
Aufgrund von beschraenkungen in plpgsql muessen alle Bitmasken
mask heissen....zumindest in den Tabellen fuer die diese Triggerfunc
arbeiten soll....das gilt ebenso fuer jeden weiteren universellen
Trigger, sie koennen immer nur funktionieren wenn die Spalten
name wohldefiniert sind.
*/
DECLARE
err_msg text;
new_len int4;
old_len int4;
dummy RECORD;
sel text;
BEGIN
IF TG_OP <> ''UPDATE'' AND TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
new_len := bit_length(NEW.mask);
IF TG_OP = ''UPDATE'' THEN
old_len := bit_length(OLD.mask);
ELSE
sel := ''select public.mask_len('' ||
quote_literal(TG_ARGV[0]) || '', '' ||
quote_literal(''mask'') || '',NULL) as len'';
FOR dummy IN EXECUTE sel LOOP
EXIT;
END LOOP;
IF NOT FOUND THEN
old_len := 0;
ELSE
old_len := dummy.len;
END IF;
END IF;
sel := ''select mask from '' || TG_ARGV[0] ||
'' where bit_length(mask)<>'' || new_len;
FOR dummy IN EXECUTE sel LOOP
EXECUTE ''update '' || TG_ARGV[0] || '' set mask='' ||
''mask::BIT('' || new_len || '')>>'' ||
new_len-old_len || '' where mask=B'' ||
quote_literal(public.bit2text(dummy.mask));
EXIT;
END LOOP;
RETURN NEW;
END;
' language 'plpgsql';
-- ]
-- Ende allgemeine Triggerfunktionen

162
trigger_funcs/cr_trigger_func_konto.sql

@ -0,0 +1,162 @@
-- Trigger Funktionen zu Konten --
-- [
create function on_ref_count_null_del_konto()
returns TRIGGER as '
DECLARE
err_msg text;
konto fibu.konto%ROWTYPE;
BEGIN
IF TG_OP <> ''UPDATE'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
IF NEW.used = 0 THEN
select INTO konto * from fibu.konto where kto_nr=NEW.kto_nr;
IF FOUND THEN
delete from fibu.konto where kto_nr=NEW.kto_nr;
END IF;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function on_change_kontenplan_check_ranges()
returns TRIGGER as '
DECLARE
kontenplan_row fibu.kontenplan%ROWTYPE;
err_msg text;
BEGIN
IF TG_OP = ''INSERT'' THEN
FOR kontenplan_row IN select * from fibu.kontenplan LOOP
IF (NEW.nr_von >= kontenplan_row.nr_von AND
NEW.nr_von <= kontenplan_row.nr_bis) OR
(NEW.nr_bis >= kontenplan_row.nr_von AND
NEW.nr_bis <= kontenplan_row.nr_bis) OR
(NEW.nr_von < kontenplan_row.nr_von AND
NEW.nr_bis > kontenplan_row.nr_bis) THEN
RAISE EXCEPTION ''range violation'';
END IF;
END LOOP;
RETURN NEW;
END IF;
IF TG_OP = ''UPDATE'' THEN
FOR kontenplan_row IN
select * from fibu.kontenplan where _id_<>NEW._id_
LOOP
IF (NEW.nr_von >= kontenplan_row.nr_von AND
NEW.nr_von <= kontenplan_row.nr_bis) OR
(NEW.nr_bis >= kontenplan_row.nr_von AND
NEW.nr_bis <= kontenplan_row.nr_bis) OR
(NEW.nr_von < kontenplan_row.nr_von AND
NEW.nr_bis > kontenplan_row.nr_bis) THEN
RAISE EXCEPTION ''range violation'';
END IF;
END LOOP;
RETURN NEW;
END IF;
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END;
' language 'plpgsql';
create function on_insert_kontenplan_create_used_konten()
returns TRIGGER as '
DECLARE
err_msg text;
i fibu.kontenplan.nr_von%TYPE;
BEGIN
IF TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
FOR i IN NEW.nr_von..NEW.nr_bis LOOP
insert into fibu.used_konten (kto_nr, used, konto_typ)
values (i, 0, NEW.konto_typ);
END LOOP;
RETURN NEW;
END;
' language 'plpgsql';
create function on_update_kontenplan_upd_used_konten()
returns TRIGGER as '
DECLARE
err_msg text;
von fibu.kontenplan.nr_von%TYPE;
bis fibu.kontenplan.nr_bis%TYPE;
displacement fibu.kontenplan.nr_von%TYPE;
count fibu.kontenplan.nr_von%TYPE;
i fibu.kontenplan.nr_von%TYPE;
BEGIN
IF TG_OP <> ''UPDATE'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
displacement := NEW.nr_von - OLD.nr_von;
IF (NEW.nr_bis - NEW.nr_von) < (OLD.nr_bis - OLD.nr_von) THEN
count := NEW.nr_bis - NEW.nr_von;
von := OLD.nr_von;
bis := von + count;
FOR i IN von..bis LOOP
update fibu.used_konten set kto_nr=i + displacement,
konto_typ=NEW.konto_typ where kto_nr=i;
END LOOP;
von := bis + 1;
bis := OLD.nr_bis;
FOR i IN von..bis LOOP
delete from fibu.used_konten where kto_nr=i;
END LOOP;
ELSE
von := OLD.nr_von;
bis := OLD.nr_bis;
FOR i IN von..bis LOOP
update fibu.used_konten set kto_nr=i + displacement,
konto_typ=NEW.konto_typ where kto_nr=i;
END LOOP;
von := bis + 1;
bis := NEW.nr_bis;
FOR i IN von..bis LOOP
insert into fibu.used_konten (kto_nr, used, konto_typ)
values (i, 0, NEW.konto_typ);
END LOOP;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function on_delete_kontenplan_del_used_konten()
returns TRIGGER as '
DECLARE
err_msg text;
i fibu.kontenplan.nr_von%TYPE;
BEGIN
IF TG_OP <> ''DELETE'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
FOR i IN OLD.nr_von..OLD.nr_bis LOOP
delete from fibu.used_konten where kto_nr=i;
END LOOP;
RETURN OLD;
END;
' language 'plpgsql';
-- ]
-- Ende Trigger --

33
trigger_funcs/cr_trigger_func_rechte.sql

@ -0,0 +1,33 @@
-- Trigger Funktionen zu Rechten --
-- [
create function create_valid_rechte_mask()
returns TRIGGER as '
DECLARE
err_msg text;
new_len int4;
old_len int4;
dummy RECORD;
sel text;
BEGIN
IF TG_OP <> ''UPDATE'' AND TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
new_len := bit_length(NEW.maske);
old_len := fibu.konto_typ_min_len();
IF new_len < old_len THEN
NEW.maske := bit_set_len(NEW.maske, old_len);
END IF;
IF old_len < new_len THEN
EXECUTE ''update fibu.konten_typen set konto_typ=konto_typ'' ||
''::BIT('' || new_len || '')>>'' || new_len-old_len;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
-- create function on_ref_count_null_del_konto()

120
trigger_funcs/cr_trigger_func_waren.sql

@ -0,0 +1,120 @@
-- Triggerfunktionen zu Waren/Warengruppen --
-- [
create function create_valid_produkt_typ_mask()
returns TRIGGER as '
DECLARE
mask bit varying;
freepos int4 := 0;
err_msg text;
new_len int4;
old_len int4;
BEGIN
IF TG_OP <> ''UPDATE'' AND TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
new_len := bit_length(NEW.produkt_typ);
IF TG_OP = ''UPDATE'' THEN
new_len := bit_length(OLD.konto_typ);
ELSE
old_len := fibu.konto_typ_min_len();
END IF;
IF new_len < old_len THEN
NEW.konto_typ := NEW.konto_typ::BIT(old_len)>>old_len-new_len;
END IF;
IF old_len < new_len THEN
EXECUTE ''update fibu.konten_typen set konto_typ=konto_typ'' ||
''::BIT('' || new_len || '')>>'' || new_len-old_len;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function set_tiefe()
returns TRIGGER as '
DECLARE
BEGIN
IF NEW.parent IS NOT NULL THEN
select INTO NEW.tiefe tiefe+1 from
waren.get_warengruppe(NEW.parent);
update waren.warengruppe set is_parent=''true'' where
_id_=NEW.parent;
ELSE
NEW.tiefe := 0;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function on_update_delete_check_is_parent()
returns TRIGGER as '
DECLARE
i int4;
BEGIN
select INTO i count(*) from waren.warengruppe where
parent=OLD.parent;
IF i > 0 THEN
update waren.warengruppe set is_parent=''true'' where
_id_=OLD.parent;
ELSE
update waren.warengruppe set is_parent=''false'' where
_id_=OLD.parent;
END IF;
RETURN OLD;
END;
' language 'plpgsql';
create function on_update_check_tiefe()
returns TRIGGER as '
DECLARE
row waren.warengruppe%ROWTYPE;
parent_count int4;
BEGIN
IF NEW.parent IS NULL THEN
NEW.tiefe := 0;
ELSE
IF OLD.parent IS NULL OR
OLD.parent <> NEW.parent THEN
select INTO NEW.tiefe tiefe+1 from
waren.get_warengruppe(NEW.parent);
END IF;
END IF;
IF NEW.tiefe <> OLD.tiefe THEN
FOR row IN select * from waren.warengruppe where
parent=NEW._id_
LOOP
update waren.warengruppe set tiefe=NEW.tiefe+1 where
_id_=row._id_;
END LOOP;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function on_delete_new_parent()
returns TRIGGER as '
DECLARE
row waren.warengruppe%ROWTYPE;
BEGIN
FOR row IN select * from waren.warengruppe where
parent=OLD._id_
LOOP
update waren.warengruppe set parent=OLD.parent where
_id_=row._id_;
END LOOP;
RETURN OLD;
END;
' language 'plpgsql';
-- ]
-- Ende Triggerfunktionen zu Waren/Warengruppen --
Loading…
Cancel
Save