Tabellen als 'Unterstrukturen'

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
16 Beiträge • Seite 1 von 2 (current) Nächste
16 Beiträge Seite 1 von 2 (current) Nächste

Tabellen als 'Unterstrukturen'

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hallo liebe Abap-Gemeinde.

Ich sitz nun seid einiger Zeit an nem Problem, und find keine Lösung...bitte um Hilfe.
Ich hab folgende Struktur.
Die 'inneren' Strukturen müssen aber Tabellen sein. Also typ_zone, typ_lbl, typ_flux, typ_status, typ_werte.

Code: Alles auswählen.

TYPES: BEGIN OF typ_s_xmltree,                                       
layout(80)  TYPE C, 
BEGIN OF typ_zone,                                        
   zone(80)  TYPE C,
   posX(80)  TYPE C,
   posY(80)  TYPE C,
   width(80)  TYPE C,
   height(80)  TYPE C,
END   OF typ_zone,
BEGIN OF typ_lbl,
   lbl(80)  TYPE C,
   target_obj(80)  TYPE C,
   posX(80)  TYPE C,
   posY(80)  TYPE C,
   font(80)  TYPE C,
END   OF typ_lbl,
BEGIN OF typ_flux,
   flux(80)  TYPE C,
   target_obj(80)  TYPE C,
   source_obj(80)  TYPE C,
   typ(80)  TYPE C,
   color(80)  TYPE C,
END   OF typ_flux,
BEGIN OF typ_status,
   status(80)  TYPE C,
   target_obj(80)  TYPE C,
   BEGIN OF typ_werte,
      wert(80)  TYPE C,
      inhalt(80)  TYPE C,
   END   OF typ_werte,
END   OF typ_status,
END   OF typ_s_xmltree.  
Wie bekomm ich das hin? Es existieren keine DDIC Objekte und sind auch nicht anlegbar, da die Struktur dynamisch erstellt wird. Ich arbeite auf einem 620er System.
Im Endeffekt muss ich am schluss eine Struktur haben die ein Feld (Layout) und 4 Tabellen beinhaltet, wobei die 4te wiederum eine Tabelle noch intus hat.

Falls das geht (was ich hoffe) wie spreche ich dann die Felder der Tabellen an, bzw. wie spreche ich z.b. die 2te Zeile einer tabelle an???

(Wie muss es im Programm geschrieben sein ist mir wichtig...also wie der TYPES Befehl insgesamt aussehen muss)


THX 4 help...ich bin echt ratlos.

Gruß
Markus

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Is wohl doch schwieriger als ich dachte :cry:

Gruß
Markus

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hab ne Lösung...und das komische dabei SAP löst sowas auch noch so, allerdings sagte SAP selbst, dass OCCURS nicht mehr genutzt werden soll. Tja da weiß wohl auch die linke Hand nicht was die rechte macht :roll:

Hier mal ein Teil der gesamtstruktur:

Code: Alles auswählen.

TYPES:
  BEGIN OF typ_s_werte_line,
    wert     TYPE char40,
    inhalt   TYPE char40,
  END   OF typ_s_werte_line.

TYPES: typ_t_werte TYPE typ_s_werte_line OCCURS 0.

TYPES:
  BEGIN OF typ_s_status_line,
    status(80)      TYPE c,
    target_obj(80)  TYPE c,
    t_werte         TYPE typ_t_werte,
  END   OF typ_s_status_line.

Naja...dann eben mit OCCURS

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

wenn Du in einem 6.20er System bist, kannst Du Dich mal mit den Klassen CL_ABAP_STRUCTDESCR und CL_ABAP_TABLEDESCR beschäftigen. Damit kann man mit deren CREATE-Methode dynamische Strukturen und Tabellen anlegen.
Ob das mit den geschachtelten Tabellen funktioniert, habe ich aber selbst noch nicht ausprobiert. Zumintest habe ich DDIC-Tabellen eingelesen und dann mit geänderter Feldreihenfolge eigene Strukturen und Tabellen angelegt.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hallo ereglam,

danke für den Hinweis, aber die Klassen sind für meinen Fall nicht anwendbar. Da ich nur eine int. Struktur, welche dynamisch erstellt wurde, habe. Den Occurs-Zusatz kann ich da noch ranfummeln...aber das ganze hat sich eh erledigt.

Hab am Thema vorbei programmiert :oops:

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

von Prinzip her, ist das sehr wohl relevant, auch wenn Du es für Deine aktuelle Aufgabenstellung nicht mehr brauchst.

Eventuell hatte ich vergessen zu erwähnen, dass der CREATE DATA einen Zusatz TYPE HANDLE kennt, der eine Objektinstanz obiger Klassen erhält. Die jeweilige Klasse beschreibt eine Struktur oder eine Tabelle, wobei diese dynamisch mit der statischen Methode CREATE angelegt werden können.

Code: Alles auswählen.

DATA: 
  lo_structdescr TYPE REF TO cl_abap_structdescr,
  lo_tabledescr  TYPE REF TO cl_abap_tabledescr,
  lt_components  TYPE cl_abap_structdescr=>component_table,
  ls_component   LIKE LINE OF lt_components,
  lds_struct     TYPE REF TO data,
  ldt_table      TYPE REF TO data.

FIELD-SYMBOLS:
  <lt_table> TYPE ANY TABLE.

ls_component-fieldname = 'MATNR'.
ls_component-type        = cl_abap_typedescr=>describe_by_name( p_name = 'MATNR' ).
INSERT ls_component INTO TABLE lt_components.
..."weitere Felder

lo_structdescr = cl_abap_structdescr=>create( p_components = lt_components ).
CREATE DATA lds_struct TYPE HANDLE lo_structdescr.

lo_tabledescr = cl_abap_tabledescr=>create( 
                p_line_type = lo_structdescr 
                p_table_kind = cl_abap_tabledescr=>tablkind_std ).
CREATE DATA ldt_table TYPE HANDLE lo_tabledescr.

ASSIGN ldt_table->* TO <lt_table>.
Zugriff auf die einzelnen Felder erhälst Du (leider) nur über Feldsymbole unter Verwendung des ASSIGN COMPONENT...

PS:
selbst die Feldnamen und Typen könnten dynamisch geliefert werden...
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hallo ereglam,

danke für deine Ausführung. Aber da stellt sich mir die Frage, ob mein Problem gelöst werden würde?

So wie ich das ganze interpretiere, kann ich damit keine Tabellen in einer Struktur anlegen...aber wahrscheinlich lese ichs nur falsch :roll:

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Markus,

die Frage kann ich leider im Augenblick selbst noch nicht beantworten, da aber in der LT_COMPONENTS das Feld TYPE einfach ein x-beliebiges Objekt der CL_ABAP_*DESCR haben möchte, müsste auch CL_ABAP_TABLEDESCR erlaubt sein...
QED

PS:
wenn ich Zeit habe, probiere ich's mal aus...
Zuletzt geändert von ereglam am 19.03.2007 10:28, insgesamt 1-mal geändert.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hallo ereglam,

danke. Ich schreib gerade mal wieder so ein doofes Konzept :roll:

Ich bin gespannt auf ein Ansatz von Dir...aber stress dich da net rein :o

Gruß
Markus

Beitrag von JHM (Top Expert / 1223 / 2 / 204 ) »
MarkusW hat geschrieben: Ich bin gespannt auf ein Ansatz von Dir
Bin zwar nicht Erlgram, aber hatte langeweile. Hier der Ablauf für deine tiefen Tabelle aus deinem ersten Post:

Code: Alles auswählen.

REPORT  z_test_dyn_struct.

TYPE-POOLS: abap.

* Objectrefernezen für Struckturbeschreibung
DATA: lr_strucdescr_typ_s_xmltree TYPE REF TO cl_abap_structdescr,
      lr_strucdescr_typ_zone      TYPE REF TO cl_abap_structdescr,
      lr_strucdescr_typ_lbl       TYPE REF TO cl_abap_structdescr,
      lr_strucdescr_typ_flux      TYPE REF TO cl_abap_structdescr,
      lr_strucdescr_typ_status    TYPE REF TO cl_abap_structdescr,
      lr_strucdescr_typ_werte     TYPE REF TO cl_abap_structdescr.

* Zeiger auf erzeugte Strucktur
DATA: lr_strucdata_typ_s_xmltree TYPE REF TO data.

* Objectreferenzen für Tabellenbeschreibung
DATA: lr_tabledescr_typ_s_xmltree TYPE REF TO cl_abap_tabledescr,
      lr_tabledescr_typ_zone      TYPE REF TO cl_abap_tabledescr,
      lr_tabledescr_typ_lbl       TYPE REF TO cl_abap_tabledescr,
      lr_tabledescr_typ_flux      TYPE REF TO cl_abap_tabledescr,
      lr_tabledescr_typ_status    TYPE REF TO cl_abap_tabledescr,
      lr_tabledescr_typ_werte     TYPE REF TO cl_abap_tabledescr.

* Zeiger auf erzeugete Tabelle
DATA: lr_tabledata_typ_s_xmltree TYPE REF TO data.

DATA: ls_component   TYPE abap_componentdescr,        "Zeile der Strukturbeschreibung
      lt_component   TYPE abap_component_tab.         "Tabelle der Strukturbeschreibung

* Field-Symboles um mit den Daten arbeiten zu können
FIELD-SYMBOLS:  <fs_comp>   TYPE ANY, "Um auf eine Komponente zu zugreifen
                <fs_struct> TYPE ANY, "Um auf die Struktur zu zugreifen
                <fs_table>  TYPE ANY. "Um auf die Tabelle zu zugreifen


START-OF-SELECTION.

*** Struckturen von innen nach aussen aufbauen:
** STEP 1: type_werte
* Tabelle mit Komponenten der Strucktur erstellen
  CLEAR ls_component.
  ls_component-name = 'WERT'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'INHALT'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

* Struckturbeschreibung für type_werte erstellen
  lr_strucdescr_typ_werte ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_wert erstellen
  lr_tabledescr_typ_werte ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_werte ).

** STEP 2: type_status
  REFRESH lt_component.
  CLEAR ls_component.
  ls_component-name = 'STATUS'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TARGET_OBJ'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TYP_WERTE'.
  ls_component-type ?= lr_tabledescr_typ_werte. "Tabellendefinition aus Step1
  APPEND ls_component TO lt_component.

* Struckturbeschreibung für type_status erstellen
  lr_strucdescr_typ_status ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_status erstellen
  lr_tabledescr_typ_status ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_status ).

** STEP 3: type_flux
  REFRESH lt_component.
  CLEAR ls_component.
  ls_component-name = 'FLUX'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TARGET_OBJ'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'SOURCE_OBJ'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TYP'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'COLOR'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

* Struckturbeschreibung für type_flux erstellen
  lr_strucdescr_typ_flux ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_flux erstellen
  lr_tabledescr_typ_flux ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_flux ).

** STEP 4: type_lbl
  REFRESH lt_component.
  CLEAR ls_component.
  ls_component-name = 'LBL'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TARGET_OBJ'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'POSX'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'POSY'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'FONT'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

* Struckturbeschreibung für type_lbl erstellen
  lr_strucdescr_typ_lbl ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_lbl erstellen
  lr_tabledescr_typ_lbl ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_lbl ).

** STEP 5: type_zone
  REFRESH lt_component.
  CLEAR ls_component.
  ls_component-name = 'ZONE'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'POSX'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'POSY'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'WIDTH'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'HEIGHT'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

* Struckturbeschreibung für type_zone erstellen
  lr_strucdescr_typ_zone ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_zone erstellen
  lr_tabledescr_typ_zone ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_zone ).

** STEP 6: typ_s_xmltree
  REFRESH lt_component.
  CLEAR ls_component.
  ls_component-name = 'LAYOUT'.
  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ).
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TYPE_ZONE'.
  ls_component-type ?= lr_tabledescr_typ_zone.
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TYPE_LBL'.
  ls_component-type ?= lr_tabledescr_typ_lbl.
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TYPE_FLUX'.
  ls_component-type ?= lr_tabledescr_typ_flux.
  APPEND ls_component TO lt_component.

  CLEAR ls_component.
  ls_component-name = 'TYPE_STATUS'.
  ls_component-type ?= lr_tabledescr_typ_status.
  APPEND ls_component TO lt_component.

* Struckturbeschreibung für type_s_xmltree erstellen
  lr_strucdescr_typ_s_xmltree ?= cl_abap_structdescr=>create( lt_component ).
* Tabellenbeschreibung für type_s_xmltree erstellen
  lr_tabledescr_typ_s_xmltree ?= cl_abap_tabledescr=>create( lr_strucdescr_typ_s_xmltree ).

** STEP 7: Tabelle erzeugen und ein Feld-Symbole drauf
  CREATE DATA lr_strucdata_typ_s_xmltree TYPE  HANDLE lr_strucdescr_typ_s_xmltree.
  ASSIGN lr_strucdata_typ_s_xmltree->* TO <fs_struct>.
  CREATE DATA lr_tabledata_typ_s_xmltree TYPE HANDLE lr_tabledescr_typ_s_xmltree.
  ASSIGN lr_tabledata_typ_s_xmltree->* TO <fs_table> .
Bin gerade beim füllen/lesen der tiefen Struktur ein bischen am Stocken. Am besten ginge das mit einem rekursiven Aufruf. Wenn ich noch etwas Zeit finde schau ich da später noch nach.
Gruß Hendrik

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hallo Hendrik,

es sollte ja auch net so aussehen, dass nur ereglam einen Ansatz schreiben darf :lol:

Deine Lösung ist interessant, man könnte damit eine dynamische Lösung bestimmt aufbauen. Da du die Werte hart reincodiert hast, würde es für mich keine Ideale Lösung sein.
Ansprechverhalten ist natürlich interessant ;)

Wenn ich mein Konzept fertig bekomme und die anstehende Besprechung nicht allzulange dauert, werd ich mich auch mal etwas an das Thema noch setzen. 1 oder 2 Std werd ich schon irgendwie abzwacken können ;)

Gruß
Markus

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
@Hendrik

ja, so in etwa würde ich es auch angehen. Wenn jetzt noch der CREATE DATA fehlerfrei die Daten erzeugt, ist der Beweis erbracht, dass es funktioniert.

@Markus,

bei einer dynamischen Erzeugung musst Du ja 'nur' Tabellen mit den Feldnamen und Typen je Element liefern und sie entsprechend umsetzen.
Das hatte ich ja im Prinzip mit meinen DB-Tabellen auch gemacht, deren Felder ich intern für bessere Zugriffe umsortiert hatte.

PS:
wenn die strukturinternen Tabellen nur mit einer bestimmten Schlüsselvarainter gelesen werden, dann sollten diese Felder am Anfang der jeweiligen Struktur sitzen und die Tabelle sortiert/hashed mit (eindeutigem) Schlüssel definiert sein.
Dann kann man mit READ TABLE struct-itab FROM wa_itab benutzen, um schnell die entsprechende Zeile zu lesen.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
ereglam,

das 'nur' ist schön gesagt :lol:

Wir werden sehen...hab grad noch was aufs Auge gedrückt bekommen, werd mich also heute nicht wirklich damit beschäftigen können :(

Aber ich bleib an der Sache dran...

Gruß
Markus

Beitrag von MarkusW (Specialist / 406 / 5 / 0 ) »
Hi,

@Hendrik, hoffe du schaust hier drauf ;)

Hab mal dein Code testen wollen, allerdings sind da einige Probleme aufgetreten.

Code: Alles auswählen.

DATA: ls_component   TYPE abap_componentdescr,        "Zeile der Strukturbeschreibung
      lt_component   TYPE abap_component_tab.         "Tabelle der Strukturbeschreibung 
woher ist der Typ? (abap_componentdescr und die _tab)
in den Type-pools 'abap' gibt es nur ein 'abap_compdescr' bzw. 'abap_compdescr_tab'.
Wenn ich das änder, geht der rest aber auch nicht ,weil du anderen Namen benutzt.

zudem gibt es die methode get_c nicht.

Code: Alles auswählen.

  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ). 
bin auf nem 4.7 unicode system.
basis ist 620.

Thx

Gruß
Markus

Beitrag von JHM (Top Expert / 1223 / 2 / 204 ) »
MarkusW hat geschrieben:woher ist der Typ? (abap_componentdescr und die _tab)
in den Type-pools 'abap' gibt es nur ein 'abap_compdescr' bzw. 'abap_compdescr_tab'.
Wenn ich das änder, geht der rest aber auch nicht ,weil du anderen Namen benutzt.
Ist aus dem TypePool ABAP. abap_componentdescr kommt dierekt nach
abap_compdescr.
MarkusW hat geschrieben: zudem gibt es die methode get_c nicht.

Code: Alles auswählen.

  ls_component-type ?= cl_abap_elemdescr=>get_c( 80 ). 
Hm, keine Ahnung ist die Klasse cl_abap_elemdescr vorhanden?
MarkusW hat geschrieben: bin auf nem 4.7 unicode system.
basis ist 620.
Bei mir Basis 6.40. Da scheint es Unterschiede zu geben. Die RTTS sind erst mit Reales 6.10 eingeführt worden. Evtl. wurde da von Reales zu Releas was bei gestrickt.
Gruß Hendrik

Vergleichbare Themen

3
Antw.
5303
Views
8
Antw.
19360
Views
Customizing-Tabellen vs. Anwendungs-Tabellen
von beterman » 02.11.2011 17:53 • Verfasst in SAP - Allgemeines
1
Antw.
3723
Views
SAP CML Tabellen
von nopp » 10.02.2007 18:23 • Verfasst in ABAP® Core
5
Antw.
3386
Views
Tabellen
von Kerstin » 09.05.2006 11:27 • Verfasst in ABAP® Core
1
Antw.
2434
Views
RFC und interne Tabellen
von Mr.Black » 23.01.2007 18:22 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Ermittlung der Arbeitstage (Mosid)
vor 8 Stunden von DeathAndPain 3 / 44164
LSMW-Problem
vor 8 Stunden von DeathAndPain gelöst 6 / 2013
SFP (Adobe Forms) QR-Code wird nicht angezeigt
vor 10 Stunden von Sebastian82 gelöst 4 / 575
ATC Finding in Smartforms
vor einer Woche von sap_enthusiast 2 / 2053

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.