Sätze aus interner Tabelle löschen

Getting started ... Alles für einen gelungenen Start.
18 Beiträge • Seite 1 von 2 (current) Nächste
18 Beiträge Seite 1 von 2 (current) Nächste

Sätze aus interner Tabelle löschen

Beitrag von woddstock99 (ForumUser / 16 / 0 / 0 ) »
Hallo zusammen,

bin aktuell am verzweifeln .
Ich habe 2 interne Tabellen

Tabelle 2 ist so definiert .
----------------------------------------------
TYPES: BEGIN OF t_belegnummer,
belegnummer type belnr
END OF t_belegnummer.
DATA: internetabelle2 TYPE STANDARD TABLE OF t_belegnummer INITIAL SIZE 0.
-------------------------------------------------
Hat also ein Feld.

Die erste Tabelle habe ich mit diversen Werten gefüllt .

Nun fülle ich die Zweite wo die Belegnummer ein bestimmtes Kriterium erfüllt

SELECT distinct MBLNR AS belegnummer
FROM tabelle1 as TT
WHERE FEld1 = 'ZHJ'
and D_VALID_FRM <= @SY-DATUM
and D_VALID_to >= @SY-DATUM
into table @Tabelle2.

Dies macht er auch schön .

Nun will ich eigentlich per SQL die Sätze aus der ersten internen Tabelle löschen

DELETE internetabelle1 where MBLNR in ( Select belegnummer from internetabelle2).-> Das geht leider nicht 

Weisst jemand wie das funktioniert ??
VG

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


Re: Sätze aus interner Tabelle löschen

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Hi,
du kannst kein SQL auf interne Tabellen anwenden.

Was du machen kannst:

if internetabelle1 is not initial.

SELECT distinct MBLNR AS belegnummer
FROM tabelle1 as TT
for all entries in @internetabelle1
WHERE FEld1 = 'ZHJ'
and D_VALID_FRM <= @SY-DATUM
and D_VALID_to >= @SY-DATUM
and mblnr <> @internetabelle1-mblnr
into table @Tabelle2.

endif.

oder

ein Range über itab2 aufbauen mit MBLNR und dann DELETE itab1 WHERE mblnr NOT IN r_mblnr.

Re: Sätze aus interner Tabelle löschen

Beitrag von woddstock99 (ForumUser / 16 / 0 / 0 ) »
Danke für deine Antwort,


Aber gibts da nichts wie die INterne Tabelle 1 anhand von einem Wert der in Tabelle 2 enthalten ist löschen kann?


ungefähr in der Art

Loop at interne tabelle 1

if Wert von feldA = ( in internertabelle2 enhalten) dann lösche den satz aus der internen tabelle 1 .

Re: Sätze aus interner Tabelle löschen

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Doch, kannst du genau so machen. Nur statt in Pseudo Code einfach ausschreiben.
Wobei ich es nicht gerne mache, die Tabelle, über die ich grade loope, zu verändern.

Re: Sätze aus interner Tabelle löschen

Beitrag von woddstock99 (ForumUser / 16 / 0 / 0 ) »
wie macht man es denn sonst ??

kannst du mir evtl die zeile codieren ?

if Wert von feldA = ( in internertabelle2 enhalten) dann lösche den satz aus der internen tabelle 1 .

sprich welchen befehl muss ich verwenden für (if Wert von feldA = ( in internertabelle2 enhalten) )

Re: Sätze aus interner Tabelle löschen

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Also ich finde es unproblematisch, den Wert der internen Tabelle, über die man gerade loopt, zu verändern. Das ist normales ABAP und völlig legitim. Löscht man allerdings Zeilen, dann sollte danach direkt ENDLOOP oder ein CONTINUE kommen, denn logischerweise kann man mit einer Tabellenzeile nichts mehr veranstalten, nachdem man sie gelöscht hat.

@woddstock99: Es wäre nett, wenn Du sagen würdest, welches Basis-Release ihr im Einsatz habt (Menü System -> Status, dann Klick auf die Lupe), denn ab 7.40 gibt es bedeutend schönere Syntaxen, gerade für den Fall, wegen dem Du hier fragst, aber ich will Dir nichts vorschlagen, was dann bei Dir nicht funktioniert.

In alter Syntax würde sich Dein Problem so lösen lassen:

Code: Alles auswählen.

FIELD-SYMBOLS <tabelle1> LIKE LINE OF tabelle1.

LOOP AT tabelle1 ASSIGNING <tabelle1>.
  READ TABLE tabelle2 WITH KEY belegnummer = <tabelle1>-mblnr TRANSPORTING NO FIELDS.
  CHECK SY-SUBRC = 0.
  DELETE tabelle1.
ENDLOOP.
Optimalerweise würdest Du tabelle2 nicht als STANDARD TABLE, sondern als SORTED TABLE definieren, da der READ TABLE dann bedeutend performanter ist.

Auch würde ich darüber nachdenken, ob es Sinn macht, tabelle2 als Struktur mit nur einem einzigen Strukturfeld zu definieren. Warum sparst Du Dir nicht den TYPE und definierst sie einfach als:

Code: Alles auswählen.

DATA internetabelle2 TYPE SORTED TABLE OF belegnummer.

Re: Sätze aus interner Tabelle löschen

Beitrag von woddstock99 (ForumUser / 16 / 0 / 0 ) »
danke für deine Antwort .

SAP BASIS hat das Release 752.

ich werden den Code von Dir gleich mal ausprobieren .
Wäre aber dennoch an der neuen Schreibweise auch interessiert .
Vielen Dank für eure Hilfe.
VG

Re: Sätze aus interner Tabelle löschen

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Bei dem Release würde ich es wie folgt schreiben (dann kann ich aber nicht mehr den CODE-Tag des Forums hier nehmen, weil der mit der neuen Syntax nicht klarkommt. Daher leider auch keine Einrückung im LOOP.

LOOP AT tabelle1 ASSIGNING FIELD-SYMBOL(<tabelle1>). " spart den separaten FIELD-SYMBOLS-Befehl
CHECK LINE_EXISTS( tabelle2[ belegnummer = <tabelle1>-mblnr ] ).
DELETE tabelle1.
ENDLOOP.

Re: Sätze aus interner Tabelle löschen

Beitrag von tm987456 (ForumUser / 72 / 42 / 15 ) »
Oder ohne Check...

LOOP AT tabelle1 ASSIGNING FIELD-SYMBOL(<tabelle1>).
IF LINE_EXISTS( tabelle2[ belegnummer = <tabelle1>-mblnr ] ).
DELETE tabelle1.
ENDIF.
ENDLOOP.

Re: Sätze aus interner Tabelle löschen

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Als schlechtere Alternative geht das auch, ja. Ein IF direkt vor dem ENDLOOP ist halt umständlicher als ein CHECK. Ich weiß, es gibt Apologeten, die betonen, man solle niemals CHECK verwenden, weil dann angeblich alle nicht mehr wissen, was passiert, aber ich halte das für Unsinn. Bei Situationen wie diesen ist offensichtlich, was der CHECK macht. Da wird ABAP-Programmierern an anderer Stelle wesentlich mehr Abstrahierungsfähigkeit abverlangt, etwa im Bereich von OO.

Re: Sätze aus interner Tabelle löschen

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
DeathAndPain hat geschrieben:Also ich finde es unproblematisch, den Wert der internen Tabelle, über die man gerade loopt, zu verändern. Das ist normales ABAP und völlig legitim.
Absolut. Schön finde ich es trotzdem nicht. Grade wegen der Punkte, die du danach aufführst - in dem Schleifendurchlauf noch was zu machen.

Man könnte auch so lustige Sachen machen, wie die Tabelle in einer DO-Schleife durchlaufen und die Einträge von hinten überprüfen und über den index löschen.
Nur weil es geht, muss es nicht schöner sein... :D

Re: Sätze aus interner Tabelle löschen

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
Schön finde ich es trotzdem nicht. Grade wegen der Punkte, die du danach aufführst - in dem Schleifendurchlauf noch was zu machen.
Na, das darf man halt nicht tun. Der nächste Befehl, der danach (abgesehen von Leerbefehlen wie ENDIF) als nächstes kommen muss, ist ENDLOOP, CONTINUE, EXIT oder RETURN. Dann ist das sauber. (Wobei sich bei "EXIT" schon wieder die Geister scheiden . :D )

Re: Sätze aus interner Tabelle löschen

Beitrag von woddstock99 (ForumUser / 16 / 0 / 0 ) »
danke . das funktioniert :)


Jetzt wollte ich die Codezeilen in eine KlassenMethode verschieben

und eine INTerne Tabelle die ich als Ergebnis zurück bekommen möchte .





CALL METHOD me->xxx
EXPORTING
iv_zzz = p_yxc

IMPORTING
it_internetabelle1 = iT_internetabelle2.

Egal wie ich jetzt aber in der Klasse die IT_internetabelle 1 und 2 definiere , es kommt immer eine Fehlermeldung ist nicht typkompatibel zum formalen parameter


hab beide mal so deklariert

TYPES: BEGIN OF t_belegnummer,
belegnummer type belnr
END OF t_belegnummer.
DATA: internetabelle2 TYPE STANDARD TABLE OF t_belegnummer INITIAL SIZE 0.

TYPES: BEGIN OF t_belegnummer,
belegnummer type belnr
END OF t_belegnummer.
DATA: internetabelle1 TYPE STANDARD TABLE OF t_belegnummer INITIAL SIZE 0. -> fehlermeldung ist nicht typkompatibel zum formalen parameter


dann auch mit eigenen Tabellentypen probiert .

internetabelle1 type zxxx_belegnummer_t.

internetabelle2 type zxxx_belegnummer_t. -> fehlermeldung ist nicht typkompatibel zum formalen parameter


was mache ich da noch falsch :( ??

Re: Sätze aus interner Tabelle löschen

Beitrag von nickname8 (Specialist / 134 / 17 / 19 ) »
Wenn du einen Returning-Parameter haben willst, musst du dieses als Tabellentyp definieren inkl. Key.

Hier mal für eine grobe Idee:

Code: Alles auswählen.

INITIALIZATION.

  SELECTION-SCREEN BEGIN OF BLOCK 0.
  PARAMETERS p_xyz TYPE xzy.
  SELECTION-SCREEN END OF BLOCK 0.

  TYPES: tt_mblnr TYPE TABLE OF mblnr WITH DEFAULT KEY.

*----------------------------------------------------------------------*
*       CLASS lcl DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl DEFINITION.
  PUBLIC SECTION.
*    TYPES:

*    DATA:

    METHODS:
      get_data
        IMPORTING iv_zzz TYPE xzy
        RETURNING value(r_data) TYPE tt_mblnr.

  PRIVATE SECTION.

ENDCLASS.                    "lcl DEFINITION

*----------------------------------------------------------------------*
*       CLASS lcl IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl IMPLEMENTATION.
  METHOD get_data.
    DATA:
      lt_mblnr   TYPE tt_mblnr.

    r_data = lt_mblnr.
  ENDMETHOD.                    "get_data
ENDCLASS.                    "lcl IMPLEMENTATION

START-OF-SELECTION.

  DATA: lo        TYPE REF TO lcl,
        lt_mblnr  TYPE tt_mblnr.

  CREATE OBJECT lo.

  lt_mblnr = lo->get_data( iv_zzz = p_xyz ).

Re: Sätze aus interner Tabelle löschen

Beitrag von DeathAndPain (Top Expert / 1939 / 257 / 412 ) »
@woddstock99: Das wird sicherlich nur eine Kleinigkeit sein, die wir aber nicht finden können, da Du uns nur Codefragmente lieferst anstatt des kompletten Codes (mit DEFINITION und IMPLEMENTATION-Teil). Das fängt schon bei der Frage an, ob wir hier von einer DDIC-Klasse reden, die in der SE24 definiert ist, oder von einer lokalen Klasse, die Du in Deinem Programm definierst.

Und übrigens, explizit CALL METHOD zu schreiben hat die SAP für veraltet erklärt (außer wenn der Name der Methode dynamisch angegeben werden soll).

Vergleichbare Themen

14
Antw.
10401
Views
Löschen aus interner Tabelle
von Beginner014 » 21.11.2014 09:26 • Verfasst in ABAP® für Anfänger
1
Antw.
2639
Views
daten aus interner tabelle lòschen
von slim » 12.06.2007 14:54 • Verfasst in ABAP® Core
6
Antw.
2164
Views
DB aus interner Tabelle ohne Kopfzeile löschen
von kibani » 05.03.2020 09:15 • Verfasst in ABAP® für Anfänger
7
Antw.
4535
Views
Performance beim Löschen in interner Tabelle mit Ranges
von ernst » 12.01.2006 17:50 • Verfasst in ABAP® Core
4
Antw.
2644
Views
gelöschte Kondi-Sätze von der DB löschen
von pheun » 03.05.2005 12:57 • Verfasst in Sales and Distribution

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.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 555
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2183
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8778