Sätze aus interner Tabelle löschen


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

Sätze aus interner Tabelle löschen

Beitragvon woddstock99 » 31.01.2019, 18:22

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
woddstock99
ForumUser
 
Beiträge: 16
Registriert: 22.01.2019, 09:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: Sätze aus interner Tabelle löschen

Beitragvon nickname8 » 31.01.2019, 19:40

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.
nickname8
ForumUser
 
Beiträge: 93
Registriert: 18.07.2015, 08:22
Dank erhalten: 12 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon woddstock99 » 31.01.2019, 20:14

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 .
woddstock99
ForumUser
 
Beiträge: 16
Registriert: 22.01.2019, 09:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon nickname8 » 31.01.2019, 20:29

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.
nickname8
ForumUser
 
Beiträge: 93
Registriert: 18.07.2015, 08:22
Dank erhalten: 12 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon woddstock99 » 01.02.2019, 08:56

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) )
woddstock99
ForumUser
 
Beiträge: 16
Registriert: 22.01.2019, 09:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon DeathAndPain » 01.02.2019, 09:13

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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon woddstock99 » 01.02.2019, 09:45

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
woddstock99
ForumUser
 
Beiträge: 16
Registriert: 22.01.2019, 09:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon DeathAndPain » 01.02.2019, 10:02

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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon tm987456 » 01.02.2019, 11:10

Oder ohne Check...

LOOP AT tabelle1 ASSIGNING FIELD-SYMBOL(<tabelle1>).
IF LINE_EXISTS( tabelle2[ belegnummer = <tabelle1>-mblnr ] ).
DELETE tabelle1.
ENDIF.
ENDLOOP.
tm987456
ForumUser
 
Beiträge: 11
Registriert: 05.05.2017, 07:50
Dank erhalten: 5 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon DeathAndPain » 01.02.2019, 11:25

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.
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon nickname8 » 01.02.2019, 11:41

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
nickname8
ForumUser
 
Beiträge: 93
Registriert: 18.07.2015, 08:22
Dank erhalten: 12 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon DeathAndPain » 01.02.2019, 12:18

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 )
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon woddstock99 » 01.02.2019, 12:27

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 :( ??
woddstock99
ForumUser
 
Beiträge: 16
Registriert: 22.01.2019, 09:05
Dank erhalten: 0 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon nickname8 » 01.02.2019, 12:36

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 ).
 
nickname8
ForumUser
 
Beiträge: 93
Registriert: 18.07.2015, 08:22
Dank erhalten: 12 mal
Ich bin: Entwickler/in

Re: Sätze aus interner Tabelle löschen

Beitragvon DeathAndPain » 01.02.2019, 12:58

@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).
DeathAndPain
Expert
 
Beiträge: 934
Registriert: 05.05.2006, 10:14
Dank erhalten: 218 mal
Ich bin: Entwickler/in

Nächste

Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
Adobe Forms - Download - Keine Seiten
vor 11 Stunden von shimsham 2 Antw.
UTF-8 mit Funktionsbaustein
vor 13 Stunden von a-dead-trousers 4 Antw.
gelöst Fehler SAVE NOT ALLOWED bei F4IF_START_VALUE_REQUEST
vor 10 Stunden von AdrianSchm 1 Antw.
SAP Logon bei Aufruf WebGUI
Gestern von msfox 0 Antw.
Formatierung Textdatei aus Query und ABAP
vor 13 Stunden von wreichelt 5 Antw.

  Ähnliche Beiträge beta
gelöst Löschen aus interner Tabelle
21.11.2014, 12:08 von Beginner014 14 Antw.
Anzahl Sätze in DB-Tabelle
22.11.2007, 09:19 von MarkusW 2 Antw.
Types mit interner Tabelle?
20.07.2005, 10:45 von Spaulding 3 Antw.
Select bei interner Tabelle
11.07.2007, 10:19 von khb 6 Antw.
Select mit interner Tabelle
13.11.2013, 15:20 von a-dead-trousers 10 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder