DB aus interner Tabelle ohne Kopfzeile löschen

Getting started ... Alles für einen gelungenen Start.
7 Beiträge • Seite 1 von 1
7 Beiträge Seite 1 von 1

DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von kibani (ForumUser / 2 / 0 / 0 ) »
Hallo,
vllt kann mir einer helfen, ich komme nicht weiter.
Ich habe eine interne Tabelle die auf einen anderen DB Eintrag referenziert. Diesen DB Eintrag möchte ich löschen.

hier mein Code:

Code: Alles auswählen.

CREATE DATA lt_table TYPE TABLE OF (lv_tablename).
    ASSIGN lt_table->* TO <lt_table>.
*
select * from (lv_tablename) into table<lt_table>
     where _timestamp = lv_timestamp.


delete from DB where guid in <lt_table>-guid1.
da kriege ich den Fehler, dass lt_table keine Tabelle mit Kopfzeile ist.
Wie kann ich den Code schreiben damit es funktioniert ?
PS: DB und lt_table haben nicht die sele Struktur, sowie lt_table mehrere GUID Felder vom TYP Guid besitzt.

Vielen Dank für eure Hilfe


Re: DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von DeathAndPain (Top Expert / 1492 / 165 / 336 ) »
Da fehlen Informationen.
  • Wie sind lt_table und das Feldsymbol <lt_table> genau typisiert?
  • Bei welchem Befehl kommt der von Dir genannte Fehler?
Vermutlich ist der Knackpunkt aber der von Dir verwendete IN-Operator. Der erwartet eine RANGES-Tabelle.

Im Grunde bräuchtest Du ein FOR ALL ENTRIES IN der Form

Code: Alles auswählen.

delete from DB for all entries in <lt_table> where guid = <lt_table>-guid1.
Das funktioniert aber nicht, weil es FOR ALL ENTRIES IN nur bei SELECT gibt.

Der Weg wird sein, eine passende RANGES-Tabelle aufzubauen:

Code: Alles auswählen.

DATA lt_range_table TYPE RANGE OF typ_von_guid1.

lt_range_table = VALUE #( FOR <zeile> IN <lt_table> ( sign = 'I' option = 'EQ' low = <zeile>-guid1 ) ).

DELETE FROM DB WHERE guid in lt_range_table.

FREE lt_range_table.

Re: DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von a-dead-trousers (Top Expert / 3593 / 124 / 934 ) »
hi.

Da die interne Tabelle als auch die DB-Tabelle denselben Typ haben geht das Löshen ganz einfach:

Code: Alles auswählen.

delete (lv_tablename) from table <lt_table>.
<lt_table> muss dabei vom Typ STANDARD TABLE sein.
ABAP kann hier intern den Tabellenschlüssel der Datenbanktabelle auflösen und die entsprechenden Informationen aus der internen Tabelle zuordnen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von DeathAndPain (Top Expert / 1492 / 165 / 336 ) »
a-dead-trousers hat geschrieben:Da die interne Tabelle als auch die DB-Tabelle denselben Typ haben
Tatsächlich hat er geschrieben:
kibani hat geschrieben:PS: DB und lt_table haben nicht die sele Struktur

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
a-dead-trousers


Re: DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von a-dead-trousers (Top Expert / 3593 / 124 / 934 ) »
DeathAndPain hat geschrieben:
06.03.2020 12:14
a-dead-trousers hat geschrieben:Da die interne Tabelle als auch die DB-Tabelle denselben Typ haben
Tatsächlich hat er geschrieben:
kibani hat geschrieben:PS: DB und lt_table haben nicht die sele Struktur
Stimmt. Ich hab leider nur den ersten Teil des Codings mit LV_TABLENAME gelesen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von a-dead-trousers (Top Expert / 3593 / 124 / 934 ) »
Was sonst noch ginge, wäre:

Code: Alles auswählen.

data: lt_table TYPE TABLE OF dbtab.

select guid1 as guid from (lv_tablename) into corresponding fields of table lt_table
where _timestamp = lv_timestamp.

delete dbtab from table lt_table.
bzw. wenn beide DB-Tabellen dynamisch sein sollen:

Code: Alles auswählen.

CREATE DATA lt_table TYPE TABLE OF (lv_dbname).
ASSIGN lt_table->* TO <lt_table>.

select guid1 as guid from (lv_tablename) into corresponding fields of table <lt_table>
where _timestamp = lv_timestamp.

delete (lv_dbname) from table <lt_table>.
"guid" muss aber der Primary-Key von dbtab bzw. (lv_dbname) sein. Wovon ich bei einer GUID einfach mal ausgehe. Sonst macht das ganze Konstrukt IMHO keinen Sinn, weil wenn eine GUID in dbtab bzw. (lv_dbname) mehrfach vorkommt, würde man mehr als die zuvor in (lv_tablename) gefundenen Zeilen löschen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: DB aus interner Tabelle ohne Kopfzeile löschen

Beitrag von DeathAndPain (Top Expert / 1492 / 165 / 336 ) »
In Deinem Vorschlag steckt die implizite - und durchaus plausible - Annahme, dass er die ganze Tabelle lt_table nur benötigt, um seine Löschung durchzuführen. In diesem Falle wäre sein SELECT * natürlich schon aus Performancegründen verwerflich. Ich finde es dann aber auch nicht gut, die interne Tabelle mit lauter Leerspalten zu führen, so wie Du es in Deinem Ansatz tust. Zum einen verschwendet es Speicher, zum anderen muss man auch erst mal nachdenken, wie Dein Ansatz funktioniert.

Unter der Voraussetzung, dass Deine o.g. Annahme richtig ist, würde mir eine Kombination aus Deiner und meiner Lösung besser gefallen: lt_table als STANDARD TABLE OF db-guid WITH EMPTY KEY deklarieren, per SELECT guid INTO TABLE lt_table einlesen und daraus dann per VALUE-FOR-Konstrukt eine RANGES-Tabelle aufbauen und mit dieser löschen.

Das wäre speichersparend, performant und zugleich gut verständlich.

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
a-dead-trousers


Seite 1 von 1

Aktuelle Forenbeiträge

Rahmen anpassen SAP-Script
vor einer Stunde von a-dead-trousers 8 / 157
BAPI_HU_PI_READ liefert veraltete Daten
vor 3 Stunden von RaCDigger gelöst 3 / 120
SD-Konditionen auslesen
Gestern von Geggo74 gelöst 4 / 418

Vergleichbare Themen

Interner Tabelle ohne Kopfzeile aus anderer Werte zuweisen
von kaim77 » 29.05.2014 12:29
Löschen aus interner Tabelle
von Beginner014 » 21.11.2014 09:26
daten aus interner tabelle lòschen
von slim » 12.06.2007 14:54
Sätze aus interner Tabelle löschen
von woddstock99 » 31.01.2019 18:22
Performance beim Löschen in interner Tabelle mit Ranges
von ernst » 12.01.2006 17:50