Abfrage auf doppeltes Material

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Hallo Profis.

Bei uns ist es durch ein kleines Problem beim Lager-Verorgungs-Programm zu Fehlern gekommen.

Teilweise bestehen unsere Lagerplätze aus mehreren Quants. Nun ist es zu dem Problem gekommen dass automatisch ein Material auf unterschiedliche Quants verteilt wurde. Dieses Problem wurde ab inzwischen gelöst und richtig gestellt.
Nun liegen aber noch auf älteren Lagerplätzen teilweise falsch verbuchte Materialien. Nun wollte ich fragen ob jemand einen Funktionsbaustein kennt mit dem ich nach den gleichen Materialien auf unterschiedlichen Quants abfragen kann bzw. mir bei der ablauf Logik helfen kann.

Mein geplantes vorgehen wäre so:

1. Selektion auf alle Lagerplätze mit mehr als einem Quant

Code: Alles auswählen.

SELECT * FROM lagp INTO gt_lagp
  WHERE anzqu > '1'.

  SELECT  *  FROM lqua INTO gt_lqua
    WHERE lgpla = gt_lagp-lgpla.

    SELECT * FROM lagp INTO gt_lagp WHERE lgpla = wa_lgpla.
    ENDSELECT.

    WRITE: /  gt_lagp-lgpla,
                gt_lqua-lqnum,
                gt_lqua-matnr,
                gt_lagp-anzqu.
  ENDSELECT.
  ENDSELECT.

2. Nun kommt genau die Abfrage mit der ich nicht wirklich zurecht komme. Wie kann ich nun diese Liste auf 2 Mal die gleichen Materialnummern durchgehen? Oder hab ich da einen Denkfehler.


Herzlichen Dank und LG

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


Re: Abfrage auf doppeltes Material

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo,

mit diesem Code liesst Du die Verteilung der Materialnummern über die einzelnen Lagerquants bei allen Lagerplätzen mit Anzahl Quants > 1.

Code: Alles auswählen.

TYPES: BEGIN OF t_lqua,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  lgpla LIKE lagp-lgpla,
  anzqu LIKE lagp-anzqu,
  lqnum LIKE lqua-lqnum,
END OF t_lqua.

DATA: gt_lqua TYPE SORTED TABLE OF t_lqua
        WITH UNIQUE KEY matnr lgnum lgtyp lgpla lqnum,
      wa_lqua LIKE LINE OF gt_lqua.

SELECT lqua~matnr lagp~lgnum lagp~lgtyp lagp~lgpla lagp~anzqu lqua~lqnum
  FROM lagp JOIN lqua ON lagp~lgtyp = lqua~lgtyp
                      AND lagp~lgpla = lqua~lgpla
  APPENDING table gt_lqua
  WHERE anzqu > '1'.
Wie man das Ergebnis aufbereitet bleibt Dir überlassen. Entweder im ABAP darüber LOOPen und nach doppelten Materialnummern suchen, oder die interne Tabelle gt_lqua nach Excel lesen und in einer Pivot-Tabelle verdichten

Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Wie meinst du das mit drüber Loopen und nach den doppelten Nummern suchen. Dies ist genau das was ich mir schwer vorstellen kann.

Danke LG

Re: Abfrage auf doppeltes Material

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
damit bekommst du eine Liste aller Materialnummern die auf mehr als nur einem Lagerquant zu finden sind.

Code: Alles auswählen.

TYPES: BEGIN OF t_lqua,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  lgpla LIKE lagp-lgpla,
  anzqu LIKE lagp-anzqu,
  lqnum LIKE lqua-lqnum,
END OF t_lqua.

DATA: gt_lqua TYPE SORTED TABLE OF t_lqua
        WITH UNIQUE KEY matnr lgnum lgtyp lgpla lqnum,
      wa_lqua LIKE LINE OF gt_lqua,
      l_count TYPE p LENGTH 5.

SELECT lqua~matnr lagp~lgnum lagp~lgtyp lagp~lgpla lagp~anzqu lqua~lqnum
  FROM lagp JOIN lqua ON lagp~lgtyp = lqua~lgtyp
                      AND lagp~lgpla = lqua~lgpla
  APPENDING table gt_lqua
  WHERE anzqu > '1'.

LOOP AT gt_lqua INTO wa_lqua.
  AT NEW matnr.
    CLEAR l_count.
  ENDAT.

  l_count = l_count + 1.

  AT END OF matnr.
    IF l_count > 1.
      WRITE: wa_lqua-matnr, l_count.
      NEW-LINE.
    ENDIF.
  ENDAT.
ENDLOOP.
Falls mehr Informationen angezeigt werden sollten, wie z.B. zu jedem Material die Quants und die Lagerplätze, so müsste das Programm noch etwas geändert werden...

Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Es wäre nicht schlecht wenn die Materialnummer, der Lagerplatz und die Quantennummer ausgegeben würden, damit unsere Lagermitarbeiter eine korrigierte Buchung durchführen können.

Aber sonst sieht das Programm nicht schlecht aus.

Lg

Re: Abfrage auf doppeltes Material

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
commolus hat geschrieben:Es wäre nicht schlecht wenn die Materialnummer, der Lagerplatz und die Quantennummer ausgegeben würden, damit unsere Lagermitarbeiter eine korrigierte Buchung durchführen können.

Aber sonst sieht das Programm nicht schlecht aus.

Lg
dann probier es doch nach deinen Bedürfnissen umzuschreiben. Wenn es irgendwo nicht weiter gehen sollte, so melde dich einfach noch ein mal

Folgende Benutzer bedankten sich beim Autor Alexander D. für den Beitrag:
commolus

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Werde ich machen, Danke!

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Servus Alexander,
nun habe ich versucht bei der Ausgabe noch das Feld mit dem Lagerplatz ein zu fügen. Wenn ich jedoch nun den Debugger drüber laufen lasse sehe ich dass zwischen den beiden AT NEW matnr --> ENDAT. und zwischen AT END OF und END DAT die Lagerplatznummer verschwindet und durch Sterne ersetzt wird. Nach diesen beiden Anweisungen erscheint die Lagerplatznummer wieder.

Warum? Ist etwas lästig da die Writeanweisung nur Sterne ausgibt.


Lg

Code: Alles auswählen.

LOOP AT gt_lqua INTO wa_lqua.
  AT NEW matnr.
    CLEAR l_count.
  ENDAT.

  l_count = l_count + 1.

  AT END OF matnr.
    IF l_count > 1.
      " WRITE: wa_lqua-matnr, l_count.
      WRITE: wa_lqua-matnr, l_count, wa_lqua-lgpla.
      NEW-LINE.
    ENDIF.
  ENDAT.
ENDLOOP.


Re: Abfrage auf doppeltes Material

Beitrag von JHM (Top Expert / 1225 / 2 / 204 ) »
commolus hat geschrieben:Lagerplatznummer verschwindet und durch Sterne ersetzt wird. Nach diesen beiden Anweisungen erscheint die Lagerplatznummer wieder.
Ist Standardverhalten bei AT und Workarea. Am einfachsten mit Fieldsymbols zu umgehen:

Code: Alles auswählen.

FIELD-SYMBOLS: <gs_lqua> TYPE lqua.

LOOP AT gt_lqua ASSIGING <gs_lqua>.

ENDLOOP.

kleine Anmerkung:
So wie du das löst würde nur der letzte Satz zu einem Material ausgegeben, nicht aber alle Sätze zu dem Material. Du brauchst einen zweiten LOOP um deine Anforderung um zu setzten:

Code: Alles auswählen.

LOOP AT gt_lqua INTO wa_lqua.
  AT NEW matnr.
    CLEAR l_count.
  ENDAT.

  l_count = l_count + 1.

  AT END OF matnr.
    IF l_count > 1. "Material ist auf mehreren Quants gelagert, also alle Quants zu diesem Material ausgeben
        LOOP AT gt_lqua INTO wa_lqua_tmp WHERE matnr = wa_lqua-matnr.
          WRITE: / wa_lqua_tmp-matnr, l_count, wa_lqua_tmp-lgpla.
    ENDLOOP.
    ENDIF.
  ENDAT.
ENDLOOP.

 

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
commolus

Gruß Hendrik

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Das mit dem 2. Loop war es. Als ich diesen enbaute hat es funktioniert.


Danke!!!

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Hallo Profis

Leider doch noch nicht ganz!

Heute ist mir beim testen aufgefallen dass meine abfrage nicht ganz stimmt.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  Z_BW_TEST_ALLG
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

INCLUDE z_bw_test_allg_top.

TYPES: BEGIN OF t_lqua,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  "lgpla LIKE lqua-lgpla,
  lgpla LIKE lagp-lgpla,
  anzqu LIKE lagp-anzqu,
  lqnum LIKE lqua-lqnum,
END OF t_lqua.

DATA: gt_lqua TYPE SORTED TABLE OF t_lqua
        WITH UNIQUE KEY matnr lgnum lgtyp lgpla lqnum,
      wa_lqua LIKE LINE OF gt_lqua,
      l_count TYPE p LENGTH 5.

SELECT lqua~matnr lagp~lgnum lagp~lgtyp lagp~lgpla lagp~anzqu lqua~lqnum
  FROM lagp JOIN lqua ON lagp~lgtyp = lqua~lgtyp
                      AND lagp~lgpla = lqua~lgpla
  APPENDING table gt_lqua
  WHERE anzqu > '1'.

LOOP AT gt_lqua INTO wa_lqua.
  AT NEW matnr.
    CLEAR l_count.
  ENDAT.
  l_count = l_count + 1.
  AT END OF matnr.
    TYPE-POOLS line.
    IF l_count > 1. "Material ist auf mehreren Quants gelagert, also alle Quants zu diesem Material ausgeben
      LOOP AT gt_lqua INTO wa_lqua WHERE matnr = wa_lqua-matnr  AND lgpla = wa_lqua-lgpla. "ne 'SAMMLER'.
        WRITE: / wa_lqua-matnr,
        wa_lqua-lgpla,
        wa_lqua-lqnum. "line_vertical_line AS LINE.
      ENDLOOP.
      ULINE.
    ENDIF.
  ENDAT.
ENDLOOP.

IF l_count < 2.
  WRITE: / 'Keine doppelten Datensätze mehr gefunden'.
ENDIF.
Ich glaube es liegt an meiner Teilabfrage welche lautet "AND lgpla = wa_lqua-lgpla." Wie kann ich diese umschreiben dass eine Prüfung auch auf diese stattfindet?
LOOP AT gt_lqua INTO wa_lqua WHERE matnr = wa_lqua-matnr AND lgpla = wa_lqua-lgpla.

Wie man an dem Screenshot erkennen kann, sollte die Abfrage wirklich nur auf die Lagerplätze gehen, auf denen die Materialnummer und der Lagerplatz der selbe sind.


Herzlichen Dank und LG

Re: Abfrage auf doppeltes Material

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
hallo commolus,

hier ist ein möglicher Ansatz: du liest die Bestände in eine Tabelle und verdichtest anschliessend die Kombination Material + Lagerplatz in einer zweiten Tabelle

Code: Alles auswählen.

"GT_LQUA - Tabelle mit sämtlichen Beständen
TYPES: BEGIN OF t_lqua,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  "lgpla LIKE lqua-lgpla,
  lgpla LIKE lagp-lgpla,
  anzqu LIKE lagp-anzqu,
  lqnum LIKE lqua-lqnum,
END OF t_lqua.

DATA: gt_lqua TYPE SORTED TABLE OF t_lqua
        WITH UNIQUE KEY matnr lgnum lgtyp lgpla lqnum,
      wa_lqua LIKE LINE OF gt_lqua.

"GT_MAT - Material auf unterschiedlichen Lagerplätzen
TYPES: BEGIN OF t_mat,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  lgpla LIKE lagp-lgpla,
  count type i,
END OF t_mat.

DATA: gt_mat TYPE SORTED TABLE OF t_mat
        WITH UNIQUE KEY matnr lgnum lgtyp lgpla,
      wa_mat LIKE LINE OF gt_mat.

*--------------------------------------------------------------------*
"Bestände lesen --> GT_LQUA
*--------------------------------------------------------------------*
SELECT lqua~matnr lagp~lgnum lagp~lgtyp lagp~lgpla lagp~anzqu lqua~lqnum
  FROM lagp JOIN lqua ON lagp~lgtyp = lqua~lgtyp
                      AND lagp~lgpla = lqua~lgpla
  APPENDING table gt_lqua
  WHERE anzqu > '1'.

*--------------------------------------------------------------------*
"Bestände aus GT_LQUA nach Material/Lagerplatz verdichten --> GT_MAT
*--------------------------------------------------------------------*
LOOP AT gt_lqua INTO wa_lqua.

  MOVE-CORRESPONDING wa_lqua TO wa_mat.
  wa_mat-count = 1.
  COLLECT wa_mat INTO gt_mat.

ENDLOOP.

"nur die Materialnummern behalten welche mehr als nur 1 Mal vorkommen
delete gt_mat WHERE count = 1.
anschliessend hast du die Wahl: möchtest du nur zeigen welches Material mehr als nur ein mal auf einem Lagerplatz liegt, so reicht es über einen LOOP die Tabelle GT_MAT auszugeben. Willst du dazu die einzelnen Quants auflisten, so baust du in dem LOOP über GT_MAT einen zweiten über GT_LQUA ein, ungefähr so, wie wir es bereits erarbeitet haben
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: Abfrage auf doppeltes Material

Beitrag von JHM (Top Expert / 1225 / 2 / 204 ) »
Alexander D. hat geschrieben:verdichtest anschliessend die Kombination Material + Lagerplatz in einer zweiten Tabelle
Wieso das denn so umständlich ;-)

Man muss nur die Gruppenstufenverarbeitung anpassen, damit auch auf die Änderung des Lagerplatzes reagiert wird, den Rest hat commolus bereits heraus gefunden:

Code: Alles auswählen.


TYPES: BEGIN OF t_lqua,
  matnr LIKE lqua-matnr,
  lgpla LIKE lagp-lgpla,            "Feld muss für die Gruppenstufenverarbeitung vorne stehen

  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  anzqu LIKE lagp-anzqu,
  lqnum LIKE lqua-lqnum,
END OF t_lqua.

*** Feldreihenfolge beim Select anpassen:
SELECT lqua~matnr lagp~lgpla lagp~lgnum lagp~lgtyp lagp~anzqu lqua~lqnum
  FROM lagp JOIN lqua ON lagp~lgtyp = lqua~lgtyp
                      AND lagp~lgpla = lqua~lgpla
  APPENDING TABLE gt_lqua
  WHERE anzqu > '1'.


*** Tabelle sortieren:
SORT gt_lqua BY matnr lgpl.


*** Loop anpassen:
LOOP AT gt_lqua INTO wa_lqua.
  AT NEW lgpla.                "Wenn sich das Material oder der Lagerplatz ändert
    CLEAR l_count.
  ENDAT.
  l_count = l_count + 1.

  AT END OF lgpla.            "auch hier: Material ODER Lagerplatz ende 
    IF l_count > 1. "Material ist auf mehreren Quants gelagert, also alle Quants zu diesem Material ausgeben
      LOOP AT gt_lqua INTO wa_lqua WHERE matnr = wa_lqua-matnr  AND lgpla = wa_lqua-lgpla. "das wurde ja bereits angepasst
        WRITE: / wa_lqua-matnr,
        wa_lqua-lgpla,
        wa_lqua-lqnum. 
      ENDLOOP.
      ULINE.
    ENDIF.
  ENDAT.
ENDLOOP.
Anmerkung: AT NEW / AT END wird ausgelöst, wenn sich das angegebene Feld oder ein Feld links davon ändert.

Folgende Benutzer bedankten sich beim Autor JHM für den Beitrag:
commolus

Gruß Hendrik

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Servus Alexander,

anbei der umgeschriebene Code.

Code: Alles auswählen.

*&---------------------------------------------------------------------*
*& Report  Z_BW_TEST_ALLG
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

"INCLUDE z_bw_test_allg_top.
Report  Z_BW_TEST_ALLG.

*--------------------------------------------------------------------*
"GT_LQUA - Tabelle mit sämtlichen Beständen
*--------------------------------------------------------------------*
TYPES: BEGIN OF t_lqua,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  lgpla LIKE lagp-lgpla,
  anzqu LIKE lagp-anzqu,
  lqnum LIKE lqua-lqnum,
END OF t_lqua.

DATA: gt_lqua TYPE SORTED TABLE OF t_lqua
       WITH UNIQUE KEY matnr lgnum lgtyp lgpla lqnum,
      wa_lqua LIKE LINE OF gt_lqua,
      l_count TYPE p LENGTH 5.


" Eingefügt 08.05.2012 ********************************* BW Anfang
*--------------------------------------------------------------------*
"GT_MAT - Material auf unterschiedlichen Lagerplätzen
*--------------------------------------------------------------------*
TYPES: BEGIN OF t_mat,
  matnr LIKE lqua-matnr,
  lgnum LIKE lagp-lgnum,
  lgtyp LIKE lagp-lgtyp,
  lgpla LIKE lagp-lgpla,
 " lqnum LIKE lqua-lqnum, "eingefügt um die Lagerquanten auszugeben
  count TYPE i,
END OF t_mat.

DATA: gt_mat TYPE SORTED TABLE OF t_mat
        WITH UNIQUE KEY matnr lgnum lgtyp lgpla,
      wa_mat LIKE LINE OF gt_mat.

"Eingefügt**************************************** BW  08.05.12 ENDE


*--------------------------------------------------------------------*
"Bestände lesen --> GT_LQUA
*--------------------------------------------------------------------*
SELECT lqua~matnr lagp~lgnum lagp~lgtyp lagp~lgpla lagp~anzqu lqua~lqnum
  FROM lagp JOIN lqua ON lagp~lgtyp = lqua~lgtyp
                      AND lagp~lgpla = lqua~lgpla
  APPENDING table gt_lqua
  WHERE anzqu > '1'.


*--------------------------------------------------------------------*
"Bestände aus GT_LQUA nach Material/Lagerplatz verdichten --> GT_MAT
*--------------------------------------------------------------------*
LOOP AT gt_lqua INTO wa_lqua.

  MOVE-CORRESPONDING wa_lqua TO wa_mat.
  wa_mat-count = 1.
  COLLECT wa_mat INTO gt_mat.

ENDLOOP.

*--------------------------------------------------------------------*
"nur die Materialnummern behalten welche mehr als nur 1 Mal vorkommen
*--------------------------------------------------------------------*
DELETE gt_mat WHERE count = 1.

LOOP AT gt_mat INTO wa_mat.
  AT NEW matnr.
    CLEAR l_count.
  ENDAT.
  l_count = l_count + 1.
  AT END OF matnr.
    TYPE-POOLS line.
    IF l_count  >= 1.

      TYPE-POOLS line.
      IF l_count >= 1. "Material ist auf mehreren Quants gelagert, also alle Quants zu diesem Material ausgeben
        LOOP AT gt_mat INTO wa_mat WHERE matnr = wa_mat-matnr AND lgpla NE 'DUMMY' AND lgpla NE 'U-ZONE'
            AND lgpla NE 'IN-ZONE' AND lgpla NE 'DUMMY-1' AND lgpla NE 'UML-ZONE'.
          LOOP AT gt_lqua INTO wa_lqua WHERE matnr = wa_mat-matnr.

            WRITE: / wa_mat-matnr,
                        wa_lqua-lgpla,
                        wa_lqua-lqnum.
          ENDLOOP.
 ULINE.
        ENDLOOP.


      ENDIF.

    ENDIF.

  ENDAT.

ENDLOOP.
Nur die Ausgabe past noch nicht ganz. Ich verstehe nicht warum er den 2. Loop 3 mal hintereinander ausführt (siehe Screenshot)?

Re: Abfrage auf doppeltes Material

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Und hier der Screenshot :)

Vergleichbare Themen

1
Antw.
8604
Views
fetch material group,material account 3010 and Plant(WERKS)
von dragospirnut1 » 05.07.2017 12:27 • Verfasst in ABAP Objects®
7
Antw.
5463
Views
3 Bedingungen abfrage
von 1337 » 27.11.2013 13:09 • Verfasst in ABAP® für Anfänger
1
Antw.
2561
Views
Fehler in der Abfrage
von commolus » 31.05.2012 10:03 • Verfasst in Dialogprogrammierung
2
Antw.
1870
Views
Berechtigungsprüfung vor SQL-Abfrage
von km216 » 04.11.2011 15:01 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

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.