Verwendung von FOR ALL ENTRIES als exclude

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

Verwendung von FOR ALL ENTRIES als exclude

Beitrag von jubo515 (ForumUser / 2 / 0 / 0 ) »
Hallo,
ich bin auf der Suche nach ein Syntax mit der ich in der Select - Anweisung die Einträge einer Tabelle ausschliessen kann.
Anbei mal das Coding wie ich es mir vorstelle:

REPORT zz_test_01.



TYPES: BEGIN OF ty_data,
mblnr TYPE mblnr,
mjahr TYPE mjahr,
zeile TYPE mblpo,
END OF ty_data,
tty_data TYPE TABLE OF ty_data.


TABLES: zz_not,
mkpf,
mseg.


DATA: gs_not TYPE zz_not,
gt_not TYPE TABLE OF zz_not.

DATA: ls_data TYPE ty_data,
lt_data TYPE tty_data.

" Selektion der Daten für das Ergebnis
SELECT-OPTIONS: s_mblnrm FOR mkpf-mblnr,
s_mjahrm FOR mkpf-mjahr.

SELECTION-SCREEN SKIP.
" Selektion der Daten für den Ausschluss
SELECT-OPTIONS: s_mblnrn FOR zmc_inv_fs_not-mblnr,
s_mjahrn FOR zmc_inv_fs_not-mjahr.

START-OF-SELECTION.

SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_not
FROM zz_not
WHERE mblnr IN s_mblnrn
AND mjahr IN s_mjahrn.


SELECT mseg~mblnr
mseg~mjahr
mseg~zeile
INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM mkpf AS mkpf
JOIN mseg AS mseg
ON mkpf~mblnr = mseg~mblnr
AND mkpf~mjahr = mseg~mjahr

FOR ALL ENTRIES IN gt_not
WHERE ( mkpf~mblnr IN s_mblnrm AND mkpf~mjahr IN s_mjahrm )
AND NOT ( mseg~mblnr EQ gt_not-mblnr
AND mseg~mjahr NE gt_not-mjahr
AND mseg~zeile NE gt_not-zeile ) .

WRITE: / 'SY-SUBRC:', sy-subrc.

LOOP AT lt_data INTO ls_data.
WRITE: / ls_data-mblnr, '|', ls_data-mjahr, '|', ls_data-zeile.
ENDLOOP.

Ausgangsdaten:
mseg-belnr:
1
2
3
4
5
6
7
8
9
Ausschlustabelle:
3
4
5
Ergebnis gewollt:
1
2
6
7
8
9
Hat jemand eine Idee wie man das in den select bekommt.
Bin für jede Hilfe dankbar.
VG
Juri

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


Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Hi!

Du könntest zumindest für ein einzelnes Feld ein IN <range> (mit Exlcude-Einträgen) oder NOT IN <range> (mit Include-Einträgen) verwenden.
Wenn du aber mehrer Felder deiner Ausschlusstabelle gleichzeitig und zusammenhängend abfragen möchtest, wird es kompliziert:
Unter 7.40 könntest du dank der neuen Syntax mit ausschließenden JOINs oder SUBQUERY arbeiten.
Alternativ würden dir die CDS unter Eclipse das volle Potenzial der SQL-Syntax bereitstellen, um dieses Problem zu lösen.

Wenn du noch in einem älteren Release unterwegs bist, wirst du wohl in den sauren Apfel beisen müssen:
Zuerst alles selektieren und dann im Programm ausfiltern.

Generell sei aber noch der Hinweis gegeben, dass im Datenbankumfeld Ausschlüsse nicht empfohlen werden, da immer alle EInträge ermittelt werden müssen (Full Table Scan)
Bei großen Tabellen kann das sehr rasch inperformant werden, wenn man nur einige wenige Einträge weglassen möchte.

lg ADT
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.18
Basis: 7.50

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
a-dead-trousers hat geschrieben:Zuerst alles selektieren und dann im Programm ausfiltern.
Wobei sich mir bei dem gezeigten Coding die Frage stellt wieso man den Umweg über FOR ALL ENTRIES macht, das ganze kann man mit einem SELECT und SubSELECT auch ohne lösen:

Code: Alles auswählen.

SELECT mseg~mblnr
       mseg~mjahr
       mseg~zeile
 INTO CORRESPONDING FIELDS OF TABLE lt_data
 FROM mkpf AS mkpf
 JOIN mseg AS mseg
 ON mkpf~mblnr = mseg~mblnr
 AND mkpf~mjahr = mseg~mjahr
 WHERE ( mkpf~mblnr IN s_mblnrm AND mkpf~mjahr IN s_mjahrm )
 AND NOT EXSIST ( SELECT * 
                  FROM zz_not 
                  WHERE zz_not~mblnr EQ mseg~mblnr
                    AND zz_not~mjahr EQ mseg~mjahr
                    AND zz_not~zeile EQ mseg~zeile ) .
Gruß Hendrik

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von jubo515 (ForumUser / 2 / 0 / 0 ) »
Hallo Hendrik,
vielen Dank für Deinen Lösungsansatz. Der auch funktioniert. Aber es ist leider nicht die Lösung der Aufgabe.
Wie Du richtig geschrieben hast, gibt es einen kleinen Umweg über die interne Tabelle.
Das Coding, welches ich angebracht habe, ist eine Vereinfachung. Die interne Tabelle lt_not wird etwas komplexer aufgebaut und kommt dann auch erst zum tragen.
Deshalb auch dieser kleine Umweg.
Es funktioniert bestimmt auch mit einem Select - Endselect, wo dazwischen die Tabellen gelesen werden und die Einträge entsprechend aussortiert werden.
Aber die Frage ist, wie kann ich die Einträge aus einer internen Tabelle bei einem select ausklammern. Es muss auch kein for all entries sein. ;-)
Für Rückfragen stehe ich gerne zur Verfügung.
Viele Grüße
Juri

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
a-dead-trousers hat geschrieben:Hi!

Du könntest zumindest für ein einzelnes Feld ein IN <range> (mit Exlcude-Einträgen) oder NOT IN <range> (mit Include-Einträgen) verwenden.
Wenn du aber mehrer Felder deiner Ausschlusstabelle gleichzeitig und zusammenhängend abfragen möchtest, wird es kompliziert:
Unter 7.40 könntest du dank der neuen Syntax mit ausschließenden JOINs oder SUBQUERY arbeiten.
Alternativ würden dir die CDS unter Eclipse das volle Potenzial der SQL-Syntax bereitstellen, um dieses Problem zu lösen.

Wenn du noch in einem älteren Release unterwegs bist, wirst du wohl in den sauren Apfel beisen müssen:
Zuerst alles selektieren und dann im Programm ausfiltern.

Generell sei aber noch der Hinweis gegeben, dass im Datenbankumfeld Ausschlüsse nicht empfohlen werden, da immer alle EInträge ermittelt werden müssen (Full Table Scan)
Bei großen Tabellen kann das sehr rasch inperformant werden, wenn man nur einige wenige Einträge weglassen möchte.

lg ADT
Hinweis : Subqueries gehen schon ewig in SAP ;-)
"Code lügt nicht ^^"

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
jubo515 hat geschrieben:Hallo,
ich bin auf der Suche nach ein Syntax mit der ich in der Select - Anweisung die Einträge einer Tabelle ausschliessen kann.
Anbei mal das Coding wie ich es mir vorstelle:

REPORT zz_test_01.



TYPES: BEGIN OF ty_data,
mblnr TYPE mblnr,
mjahr TYPE mjahr,
zeile TYPE mblpo,
END OF ty_data,
tty_data TYPE TABLE OF ty_data.


TABLES: zz_not,
mkpf,
mseg.


DATA: gs_not TYPE zz_not,
gt_not TYPE TABLE OF zz_not.

DATA: ls_data TYPE ty_data,
lt_data TYPE tty_data.

" Selektion der Daten für das Ergebnis
SELECT-OPTIONS: s_mblnrm FOR mkpf-mblnr,
s_mjahrm FOR mkpf-mjahr.

SELECTION-SCREEN SKIP.
" Selektion der Daten für den Ausschluss
SELECT-OPTIONS: s_mblnrn FOR zmc_inv_fs_not-mblnr,
s_mjahrn FOR zmc_inv_fs_not-mjahr.

START-OF-SELECTION.

SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_not
FROM zz_not
WHERE mblnr IN s_mblnrn
AND mjahr IN s_mjahrn.


SELECT mseg~mblnr
mseg~mjahr
mseg~zeile
INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM mkpf AS mkpf
JOIN mseg AS mseg
ON mkpf~mblnr = mseg~mblnr
AND mkpf~mjahr = mseg~mjahr

FOR ALL ENTRIES IN gt_not
WHERE ( mkpf~mblnr IN s_mblnrm AND mkpf~mjahr IN s_mjahrm )
AND NOT ( mseg~mblnr EQ gt_not-mblnr
AND mseg~mjahr NE gt_not-mjahr
AND mseg~zeile NE gt_not-zeile ) .

WRITE: / 'SY-SUBRC:', sy-subrc.

LOOP AT lt_data INTO ls_data.
WRITE: / ls_data-mblnr, '|', ls_data-mjahr, '|', ls_data-zeile.
ENDLOOP.

Ausgangsdaten:
mseg-belnr:
1
2
3
4
5
6
7
8
9
Ausschlustabelle:
3
4
5
Ergebnis gewollt:
1
2
6
7
8
9
Hat jemand eine Idee wie man das in den select bekommt.
Bin für jede Hilfe dankbar.
VG
Juri

Mal ein paar Anmerkungen zum Code :

Deine TABLES Anweisung wird so wie Du selektierst nicht benötigt.
Arbeite mit Feldsymbolen statt mit Arbeitsbereichen, das benötigt nur 20% der Performance

Eine Variante (nicht die allerbeste) wäre ein LEFT OUTER JOIN, wenn deine interne Zieltabelle ein Feld aus ZZ_NOT enthält. Dann geht danach einfach ein DELETE WHERE ..
Ansonsten ein SUBQUERY z.b.

Um das NE zu vermeiden geht auch die ZZ_NOT Tabelle gegen die Ranges zu prüfen und die Ranges so zu ändern, das beim Select auf MSEG nur die gewollten Werte selektiert werden.
"Code lügt nicht ^^"

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von gtoXX (Specialist / 213 / 44 / 36 ) »
a-dead-trousers hat geschrieben:Hi!

Generell sei aber noch der Hinweis gegeben, dass im Datenbankumfeld Ausschlüsse nicht empfohlen werden, da immer alle EInträge ermittelt werden müssen (Full Table Scan)
Bei großen Tabellen kann das sehr rasch inperformant werden, wenn man nur einige wenige Einträge weglassen möchte.

lg ADT

Zum den Teil : Hängt das nicht vom Optimizier ab ? Eine schlaue Datenbank würde doch zumindest "IN" abrufen und dann im internen Prozess "NE" entfernen, was im Speicher geschieht. Somit gäbe es keinen Full Table Scan.
"Code lügt nicht ^^"

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
gtoXX hat geschrieben:
a-dead-trousers hat geschrieben:Unter 7.40 könntest du dank der neuen Syntax mit ausschließenden JOINs oder SUBQUERY arbeiten.
Hinweis : Subqueries gehen schon ewig in SAP ;-)
Ja, stimmt. Ich hab da zwei Aussagen in einem Satz vermischt. Eigentlich meinte ich, dass die Syntax in 7.40 erweitert wurde. Besagte ausschließenden Joins und die Subqueries haben auch einige Verbesserungen erhalten.
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.18
Basis: 7.50

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
gtoXX hat geschrieben:
a-dead-trousers hat geschrieben:Generell sei aber noch der Hinweis gegeben, dass im Datenbankumfeld Ausschlüsse nicht empfohlen werden, da immer alle EInträge ermittelt werden müssen (Full Table Scan)
Bei großen Tabellen kann das sehr rasch inperformant werden, wenn man nur einige wenige Einträge weglassen möchte.
Zum den Teil : Hängt das nicht vom Optimizier ab ? Eine schlaue Datenbank würde doch zumindest "IN" abrufen und dann im internen Prozess "NE" entfernen, was im Speicher geschieht. Somit gäbe es keinen Full Table Scan.
Ja, schon. Aber wenn man in seinem Programm bereits darauf achtet, dass man keine unnötig komplizierten Abfragen zusammenbaut muss sich der Optimizier nicht damit rumplagen. Unter SAP Hana schaut das ganze zwar wieder etwas anders aus, aber ich glaube selbst da ist es möglich "inperformante" Abfragen zu generieren.
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.18
Basis: 7.50

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von black_adept (Top Expert / 4089 / 127 / 940 ) »
gtoXX hat geschrieben: Mal ein paar Anmerkungen zum Code :

[...]
Arbeite mit Feldsymbolen statt mit Arbeitsbereichen, das benötigt nur 20% der Performance
[...]
2 Frage zu diesem Kommentar.
1.) Woher kommt die Information, dass Feldymbole 80% Geschwindigkeitsvorteil gegenüber einem Loop haben. Wir hatten hier doch letztens einen anderen Beitrag hier im Forum wo ewx fast genau das gemessen hat aber da kam nichts derart drastisches raus http://www.abapforum.com/forum/viewtopi ... =1&t=21900
2.) Die Zeitersparnis, die Feldsymbole ggü. Workareas in einem normalen Progamm haben dürfte sich aus meiner Erfahrung deutlich unterhalb von 1 Promille befinden. Und ja - Feldsymboles sind eleganter, schneller, etc und man sollte die verwenden wo möglich - aber die Begründung der Laufzeit halte ich definitiv für falsch. Und es gibt durchaus Situationen, wo ich mich gegen Feldsymbole entscheide, obwohl das eher die Norm ist.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Verwendung von FOR ALL ENTRIES als exclude

Beitrag von sapyard (ForumUser / 31 / 5 / 2 ) »
You can create a RANGE Table and Exlude them while doing the SELECT. Check the code below.

TYPES: BEGIN OF ty_data,
mblnr TYPE mblnr,
mjahr TYPE mjahr,
zeile TYPE mblpo,
END OF ty_data,
tty_data TYPE TABLE OF ty_data.


TABLES: zz_not,
mkpf,
mseg.


DATA: gs_not TYPE zz_not,
gt_not TYPE TABLE OF zz_not.

DATA: ls_data TYPE ty_data,
lt_data TYPE tty_data.

" Selektion der Daten für das Ergebnis
SELECT-OPTIONS: s_mblnrm FOR mkpf-mblnr,
s_mjahrm FOR mkpf-mjahr.

SELECTION-SCREEN SKIP.
" Selektion der Daten für den Ausschluss
SELECT-OPTIONS: s_mblnrn FOR zmc_inv_fs_not-mblnr,
s_mjahrn FOR zmc_inv_fs_not-mjahr.

START-OF-SELECTION.

SELECT * INTO CORRESPONDING FIELDS OF TABLE gt_not
FROM zz_not
WHERE mblnr IN s_mblnrn
AND mjahr IN s_mjahrn.

RANGES: RT_NOT_MBLNR FOR ZZ_NOT-MBLNR,
RS_NOT_MBLNR LIKE LINE OF RT_NOT_MBLNR.

RANGES: RT_NOT_MBLNR FOR ZZ_NOT-MBLNR,
RS_NOT_MBLNR LIKE LINE OF RT_NOT_MBLNR.

RANGES: RT_NOT_MJAHR FOR ZZ_NOT-MJAHR,
RS_NOT_MJAHR LIKE LINE OF RT_NOT_MJAHR.

RANGES: RT_NOT_ZEILE FOR ZZ_NOT-ZEILE,
RS_NOT_ZEILE LIKE LINE OF RT_NOT_ZEILE.

RS_NOT_mblnr-SIGN = RT_NOT_MJAHR-SIGN = RS_NOT_ZEILE-SIGN = 'EQ'. " Equal To
RS_NOT_mblnr-OPTION = RT_NOT_MJAHR-OPTION = RS_NOT_ZEILE-OPTION = 'E'. " EXCLUDE
LOOP AT GT_NOT INTO LS_NOT.

RS_NOT_MBLNR-LOW = LS_NOT-MBLNR.
APPEND RS_NOT_MBLNR TO RT_NOT_MBLNR.

RS_NOT_MJAHR-LOW = LS_NOT-MJAHR.
APPEND RS_NOT_MJAHR TO RT_NOT_MJAHR.

RS_NOT_ZEILE-LOW = LS_NOT-ZEILE.
APPEND RS_NOT_ZEILE TO RT_NOT_ZEILE.

ENDLOOP.



SELECT mseg~mblnr
mseg~mjahr
mseg~zeile
INTO CORRESPONDING FIELDS OF TABLE lt_data
FROM mkpf AS mkpf
JOIN mseg AS mseg
ON mkpf~mblnr = mseg~mblnr
AND mkpf~mjahr = mseg~mjahr
WHERE ( mkpf~mblnr IN s_mblnrm AND mkpf~mjahr IN s_mjahrm )
AND ( mseg~mblnr IN Rt_not_MBLNR[]
AND mseg~mjahr IN Rt_not_MJAHR[]
AND mseg~zeile IN Rt_not_zeile[] ) .


WRITE: / 'SY-SUBRC:', sy-subrc.

LOOP AT lt_data INTO ls_data.
WRITE: / ls_data-mblnr, '|', ls_data-mjahr, '|', ls_data-zeile.
ENDLOOP.
Thanking you.

With Regards,
Raju.
----------------------
Raju Shrestha
www.sapyard.com
----------------------

Seite 1 von 1

Vergleichbare Themen

1
Antw.
1489
Views
FOR ALL ENTRIES IN
von melisy » 02.04.2009 12:11 • Verfasst in ABAP® für Anfänger
6
Antw.
4095
Views
FOR ALL ENTRIES IN
von Bajdu » 21.08.2006 14:25 • Verfasst in ABAP® für Anfänger
4
Antw.
6223
Views
HANA und for all entries
von ST22 » 14.06.2016 11:19 • Verfasst in SAP HANA für Anfänger
1
Antw.
2405
Views
Select mit all entries !!!!!
von Apabtalker » 01.04.2010 12:55 • Verfasst in ABAP® für Anfänger
1
Antw.
1973
Views
For all entries bei Stringtabelle
von Azreal » 03.12.2008 11:04 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 25 Minuten von Lukas Sanders 2 / 783
Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 21 / 2612

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.

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 25 Minuten von Lukas Sanders 2 / 783
Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 21 / 2612

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2399
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 8984