ABAP Abfage

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

ABAP Abfage

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

Anbei ist mein Codeing für mein Problem. Ich soll eine Abfrage im SAP programmieren welche mir eine Liste erzeugt welche ich wie im Anhang gezeigt ins Excel exportieren kann. Über die Ausgabe hab ich mir noch keine gedanken gemacht. Mir gehts jetzt eher um die richtige Schachtellung und um die Performance.

Die Parametersabfrage funktioniert, zwar langsam aber sie funktioniert ebenfalls mit der Einschränkung auf die SOBSL's. Nun wollte ich die erste SELECT-OPTIONS Anweisung einbauen und siehe da, ich habe keine Ahnung mehr wie ich diese Schachtelung nun dazu "bauen" soll.

Meine Idee war es den ganzen ersten Teil der Selektion zu kopieren und ihn auf die Abfrage nach dem Datum "umzu basteln". Danach den 2. Teil zu lassen (Materialnummer, da diese ja funktioniert) und danach noch eine Selektion auf die Materialart zu implementieren. Scheint aber nicht ein "guter" Weg zu sein.

Doch nun bekomme ich schon den Einbau der Datumsabfrage nicht richtig hin.

Da ich neu in dieser Firma bin und leider der einzige mit ABAP-Kenntnissen bräuchte ich sonst einen externen Berater und dies würde ich mir als Jobeinsteier gerne ersparren.


Hatt jemand eine Idee für die Schachtellung oder zur Verbessung der Performance.

Herzlichen Dank an alle!!! :up:

Code: Alles auswählen.

 
*&---------------------------------------------------------------------*
*& Report  Z_KOPIEREN
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  z_kopieren.


INCLUDE zdata010.


""Und irgendetwas passt bei den Select-Options noch nicht""""""""""""""""""""""""""""""""""""
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.







PARAMETERS: pa_matnr TYPE mara-matnr.

"Hier fehlt noch die passenden F4 suchhilfen""""""""""""""""""""""""""""""""""
SELECT-OPTIONS : so_mtart FOR  wa_mara-mtart. "DEFAULT 'ROH'.


SELECTION-SCREEN BEGIN OF BLOCK werksueb WITH FRAME.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
            r2 RADIOBUTTON GROUP rad1,
            r3 RADIOBUTTON GROUP rad1,
            r4 RADIOBUTTON GROUP rad1.


SELECTION-SCREEN END OF BLOCK werksueb.





"""""""""""""""""" hier soll in eine Internetabelle alle Werte geschrieben werden """""""""""""""""""""""""
"""""""""""""""""" zb. zwerstat """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

""""""""""""""""""""""""""""""" AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1."""""""""""""""""""""""""""""

LOOP AT SCREEN.
  IF r1 = 'X'.


SELECT * FROM mara INTO wa_mara
         WHERE ersda  = so_ersda.


*      SELECT SINGLE * FROM mara INTO wa_mara
*            WHERE matnr  = pa_matnr.


    SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
                   WHERE matnr = wa_mara  AND
                 sobsl = '20' OR sobsl = '30'.
ENDSELECT.

    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr.


      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.
        "
        IF    wa_cdpos-value_new = 'G'
            OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
            OR  wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.


          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .",
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.


        ENDIF.
        check wa_cdpos-value_new = 0.
      ENDSELECT.
    ENDSELECT.
"endselect.
  ENDIF.

ENDLOOP.


LOOP AT SCREEN.
  IF r2 = 'X'.
    SELECT SINGLE * FROM mara INTO wa_mara
            WHERE matnr  = pa_matnr.


    SELECT SINGLE * FROM marc INTO wa_marc
                   WHERE matnr = pa_matnr  AND
                 sobsl = '10' OR sobsl = '50'.


    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr.

      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.
        "
        IF    wa_cdpos-value_new = 'G'
            OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.


          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.

        ENDIF.
      ENDSELECT.
    ENDSELECT.

  ENDIF.

ENDLOOP.


LOOP AT SCREEN.
  IF r3 = 'X'.
    SELECT SINGLE * FROM mara INTO wa_mara
            WHERE matnr  = pa_matnr.


    SELECT  * FROM marc INTO wa_marc
                   WHERE matnr = pa_matnr  AND
                 sobsl = '10' .
    ENDSELECT.

    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr.


      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.

        IF    wa_cdpos-value_new = '4'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
            OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new =  '2'
            OR  wa_cdpos-value_old = '2' AND wa_cdpos-value_new =  '1'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new =  '1'
            OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new =  '1'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new =  '2'.
          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.
        ENDIF.
      ENDSELECT.


    ENDSELECT.

  ENDIF.

ENDLOOP.



LOOP AT SCREEN.
  IF r4 = 'X'.
    SELECT SINGLE * FROM mara INTO wa_mara
            WHERE matnr  = pa_matnr.


    SELECT  * FROM marc INTO wa_marc
                   WHERE matnr = pa_matnr  AND
                 sobsl = '10' OR sobsl = '30' OR sobsl = '50'.
    ENDSELECT.

    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr." AND
      "

      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.

        IF    wa_cdpos-value_new = '4'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'.


          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .",
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.
        ENDIF.
      ENDSELECT.
    ENDSELECT.

  ENDIF.

ENDLOOP.
"ENDSELECT.



CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
  EXPORTING
    input        = matnr
  IMPORTING
    output       = wa_cdhdr-objectid
  EXCEPTIONS
    length_error = 1
    OTHERS       = 2.
IF sy-subrc <> 0.

ELSE.
  wa_cdhdr-objectid = matnr.
*[/Ergänzung]
ENDIF.




LOOP AT SCREEN.
IF r1 = 'X'.
  SELECT SINGLE * FROM mara INTO wa_mara
          WHERE matnr  = pa_matnr.


  SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
                 WHERE matnr = pa_matnr  AND
               sobsl = '20' OR sobsl = '30'.


  SELECT        * FROM  cdhdr INTO wa_cdhdr
               WHERE  objectid  = pa_matnr.


    SELECT  * FROM cdpos INTO wa_cdpos
              WHERE changenr = wa_cdhdr-changenr.
      "
      IF    wa_cdpos-value_new = 'G'
          OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
          OR  wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.


        WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
        WRITE: /    wa_cdhdr-changenr,
                               wa_cdhdr-udate,
                               wa_cdhdr-username,
                               wa_cdhdr-objectid .",
        ULINE.
        WRITE: /  wa_cdpos-value_old,
               /  wa_cdpos-value_new.
        ULINE.

      ENDIF.
    ENDSELECT.
  ENDSELECT.

ENDIF.

ENDLOOP.


LOOP AT SCREEN.
IF r2 = 'X'.
  SELECT SINGLE * FROM mara INTO wa_mara
          WHERE matnr  = pa_matnr.


  SELECT SINGLE * FROM marc INTO wa_marc
                 WHERE matnr = pa_matnr  AND
               sobsl = '10' OR sobsl = '50'.


  SELECT        * FROM  cdhdr INTO wa_cdhdr
               WHERE  objectid  = pa_matnr.

    SELECT  * FROM cdpos INTO wa_cdpos
              WHERE changenr = wa_cdhdr-changenr.
      "
      IF    wa_cdpos-value_new = 'G'
          OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.


        WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
        WRITE: /    wa_cdhdr-changenr,
                               wa_cdhdr-udate,
                               wa_cdhdr-username,
                               wa_cdhdr-objectid .
        ULINE.
        WRITE: /  wa_cdpos-value_old,
               /  wa_cdpos-value_new.
        ULINE.

      ENDIF.
    ENDSELECT.
  ENDSELECT.

ENDIF.

ENDLOOP.


LOOP AT SCREEN.
IF r3 = 'X'.
  SELECT SINGLE * FROM mara INTO wa_mara
          WHERE matnr  = pa_matnr.


  SELECT  * FROM marc INTO wa_marc
                 WHERE matnr = pa_matnr  AND
               sobsl = '10' .
  ENDSELECT.

  SELECT        * FROM  cdhdr INTO wa_cdhdr
               WHERE  objectid  = pa_matnr.


    SELECT  * FROM cdpos INTO wa_cdpos
              WHERE changenr = wa_cdhdr-changenr.

      IF    wa_cdpos-value_new = '4'
          OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
          OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new =  '2'
          OR  wa_cdpos-value_old = '2' AND wa_cdpos-value_new =  '1'
          OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new =  '1'
          OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new =  '1'
          OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new =  '2'.
        WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
        WRITE: /    wa_cdhdr-changenr,
                               wa_cdhdr-udate,
                               wa_cdhdr-username,
                               wa_cdhdr-objectid .
        ULINE.
        WRITE: /  wa_cdpos-value_old,
               /  wa_cdpos-value_new.
        ULINE.
      ENDIF.
    ENDSELECT.


  ENDSELECT.

ENDIF.

ENDLOOP.



LOOP AT SCREEN.
IF r4 = 'X'.
  SELECT SINGLE * FROM mara INTO wa_mara
          WHERE matnr  = pa_matnr.


  SELECT  * FROM marc INTO wa_marc
                 WHERE matnr = pa_matnr  AND
               sobsl = '10' OR sobsl = '30' OR sobsl = '50'.
  ENDSELECT.

  SELECT        * FROM  cdhdr INTO wa_cdhdr
               WHERE  objectid  = pa_matnr." AND
    "

    SELECT  * FROM cdpos INTO wa_cdpos
              WHERE changenr = wa_cdhdr-changenr.

      IF    wa_cdpos-value_new = '4'
          OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'.


        WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
        WRITE: /    wa_cdhdr-changenr,
                               wa_cdhdr-udate,
                               wa_cdhdr-username,
                               wa_cdhdr-objectid .",
        ULINE.
        WRITE: /  wa_cdpos-value_old,
               /  wa_cdpos-value_new.
        ULINE.
      ENDIF.
    ENDSELECT.
  ENDSELECT.

ENDIF.

ENDLOOP. 

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


Re: ABAP Abfage

Beitrag von ratsnus (Specialist / 357 / 2 / 56 ) »
hmm ändere mal als erstes alle select * , das tut ja in den Augen weh. wenn du von der mara nur die MATNR brauchst, selektier auch nur die:

select matnr from mara into wa_mara-matnr

Code: Alles auswählen.

    SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
                   WHERE matnr = wa_mara  AND
                 sobsl = '20' OR sobsl = '30'.

hier bei where matnr = wa_mara  ?????   wa_mara-matnr     meinst du wohl eher.

ENDSELECT.
Zuletzt geändert von ratsnus am 29.03.2012 12:27, insgesamt 1-mal geändert.
<:: XING-Gruppe Tricktresor::>

Re: ABAP Abfage

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

hier auf die Schnelle man ein paar Anmerkungen zu Deinem Beispielcode:

- auf SELECT * würde ich versuchen zu verzichten, wenn du aus der MARA nur drei Felder benötigst, dann lies auch nur diese
- beim Select auf MARC bedienst du nicht den vollen Schlüssel, WERKS ist nämlich ein Teil davon. Ich weiss jetzt nicht mit wievielen Werken ihr arbeitet, eventuell hilft hier auch ein neuer Index auf der DB
- weiterhin würde ich versuchen die in sich verschachtelten Selects aufzubrechen. mara-->marc und cdhdr-->cdpos. Schau doch mal, ob du da nicht mit einem JOIN alle benötigten Sätze auf ein Mal in eine interne Tabelle lesen kannst (Stichwort APPENDING TABLE)

über die Transaktionen ST05 (SQL-Trace) und SE30 (Laufzeitanalyse) lässt es sich gut nach den Stellen forschen wo die meisste Zeit verbraucht wird

hoffe das hilft erstmal ein wenig weiter

Gruss
Alexander

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

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ABAP Abfage

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
Alexander D. hat geschrieben:hallo commolus,

hier auf die Schnelle man ein paar Anmerkungen zu Deinem Beispielcode:

- auf SELECT * würde ich versuchen zu verzichten, wenn du aus der MARA nur drei Felder benötigst, dann lies auch nur diese
- beim Select auf MARC bedienst du nicht den vollen Schlüssel, WERKS ist nämlich ein Teil davon. Ich weiss jetzt nicht mit wievielen Werken ihr arbeitet, eventuell hilft hier auch ein neuer Index auf der DB
- weiterhin würde ich versuchen die in sich verschachtelten Selects aufzubrechen. mara-->marc und cdhdr-->cdpos. Schau doch mal, ob du da nicht mit einem JOIN alle benötigten Sätze auf ein Mal in eine interne Tabelle lesen kannst (Stichwort APPENDING TABLE)

über die Transaktionen ST05 (SQL-Trace) und SE30 (Laufzeitanalyse) lässt es sich gut nach den Stellen forschen wo die meisste Zeit verbraucht wird

hoffe das hilft erstmal ein wenig weiter

Gruss
Alexander
Danke für deine gute Antwort. :up:

Wir haben nur ein Werk. Könntest du deine Aussagen bitte etwas präzieser gestalten bzw. mit einem Bsp. versehen. Bin wie gesagt Anfänger und bin mir auch nicht 100%ig sicher was du meinst.

Danke

Re: ABAP Abfage

Beitrag von black_adept (Top Expert / 4159 / 136 / 960 ) »
Hallo commolus,

dein Programm sieht aber arg merkwürdig aus.

1.) Lt. Kommentar soll das Ganze bei AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1 ausgeführt werden. Aber die Zeitpunktdefinition fehlt und ein WRITE zu dem Zeitpunkt ist nicht sinnvoll.
2.) Das Ganze Coding scheint bei "AT END-of-Seleciton" ausgeführt zu werden. Aber hier sollte man nicht groß mit "LOOP AT SCREEN" hantieren. Mir scheinen die ganzen LOOP AT SCREENs sowieso überflüssig.
3.) Irgendwie hast du dein Coding doppelt abgelegt.
4.) Wenn ich das richtig sehe sollen die Radiobuttons doch nur die Sonderbeschaffungsschlüssel vorgeben mit denen selektiert werden soll. Daher wäre es sinnvoll die Selektion so anzupassen, dass du nur ein select hast für alle Radiobuttons statt fast gleichen Codings für jeden einzelnen Radiobutton.
5.) Der SELECT SINGLE auf die MARC ist nicht gut, da nicht eindeutig
6.) Bei der Selektion der Änderungsbelege fragst du gar nicht auf den Feldnamen ab, der geändert wurde.
7.) Die Objectclass bei Selektion der Änderungsbelege darf ruhig auch mitgegeben werden
8.) Irgendwo habe ich einen Konvertierungsexit auf die Materialnummer gesehen. Wenn das zugehörige Feld von einem Dynpro stammt oder aus einer Selektion sollte es normalerweise schon das richtige Format aufweisen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: ABAP Abfage

Beitrag von Alexander D. (Expert / 682 / 30 / 84 ) »
ich denke der Grund für die schlechte Performance ist hier die falsche WHERE-Bedingung.
SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
WHERE matnr = wa_mara AND
sobsl = '20' OR sobsl = '30'.
Das AND bindet stärker als das OR, Deine Bedingung liest also entweder alle passenden MATNR mit SOBSL = '20' oder ALLE Materialnummern mit SOBSL = '30'.

wenn Du die Bedingung klammerst, sollte es schon deutlich schneller werden:

Code: Alles auswählen.

    SELECT SINGLE * FROM marc INTO wa_marc "Ab diesem select wird die Laufzeit langsam
                   WHERE matnr = wa_mara  AND (sobsl = '20' OR sobsl = '30').
trotzdem würde ich versuchen die hier bereits angesprochenen Punkte umzusetzen und das Programm weiter optimieren. Sorry, aber jetzt gerade fehlt mir die Zeit meine Punkte ausführlicher zu beschreiben. Spiel einfach ein wenig mit der SE30 rum und schau Dir an, was im Programm am meissten Zeit frisst. Mach einen eindeutigen Select auf MARC. Such im Internet nach Stichpunkten "ABAP performance" und arbeite Dich in dort empfohlene Methoden ein. Sobald ich ein wenig Luft habe kann ich ja noch was zu von mir erwähnten Punkten schreiben.

einige Links zu diesem Thema:

http://www.tricktresor.de/content/index ... =110&aID=0
http://www.4ap.de/pages/abap/abap-performance-4.6.php
http://www.apentia-forum.de/viewtopic.p ... nce#p76292

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

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ABAP Abfage

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

hier ist ein Ansatz wie ich an dieses Thema rangehen würde. Er ist nicht ganz fertig, aber man lernt ja am meissten, wenn man Dinge selbst macht ;-)
Meine Kommentare zu Deinem Code habe ich mit ### markiert. Falls Du noch Fragen haben solltest, immer her damit!

Code: Alles auswählen.

*--------------------------------------------------------------------*
* Report  Z_KOPIEREN
*--------------------------------------------------------------------*

REPORT  z_kopieren.

TABLES: mara.

"### wurde nicht verwendet
*INCLUDE zdata010.

"### Deklaration der Workarea´s
DATA: wa_mara LIKE mara,
      wa_marc LIKE marc,
      wa_cdhdr LIKE cdhdr,
      wa_cdpos LIKE cdpos.

"Deklaration einer Tabelle für die Zwischenspeicherung MARA+MARC
TYPES: BEGIN OF t_itab,
  matnr LIKE mara-matnr,
  sobsl LIKE marc-sobsl,
  ersda LIKE mara-ersda,
  ernam LIKE mara-ernam,
  objectid LIKE cdhdr-objectid,
  END OF t_itab.

DATA: gt_itab TYPE SORTED TABLE OF t_itab
        WITH NON-UNIQUE KEY matnr sobsl,
      wa_itab LIKE LINE OF gt_itab.

FIELD-SYMBOLS: <itab> TYPE t_itab.

"Deklaration einer Tabelle für die Zwischenspeicherung CDHDR
TYPES: BEGIN OF t_cdhdr,
  objectid LIKE cdhdr-objectid,
  changenr LIKE cdhdr-changenr,
  udate LIKE cdhdr-udate,
  username LIKE cdhdr-username,
  END OF t_cdhdr.

DATA: gt_cdhdr TYPE HASHED TABLE OF t_cdhdr
        WITH UNIQUE KEY objectid changenr,
      wa_cdhdr2 LIKE LINE OF gt_cdhdr.

"Deklaration einer Tabelle für die Zwischenspeicherung CDPOS
TYPES: BEGIN OF t_cdpos,
  objectid LIKE cdhdr-objectid,
  changenr LIKE cdhdr-changenr,
  value_old LIKE cdpos-value_old,
  value_new LIKE cdpos-value_new,

  udate LIKE cdhdr-udate,
  username LIKE cdhdr-username,
  END OF t_cdpos.

DATA: gt_cdpos TYPE SORTED TABLE OF t_cdpos
        WITH NON-UNIQUE KEY objectid,
      wa_cdpos2 LIKE LINE OF gt_cdpos.

FIELD-SYMBOLS: <cdpos> TYPE t_cdpos.

""Und irgendetwas passt bei den Select-Options noch nicht
"### was genau passt denn nicht?
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.

PARAMETERS: pa_matnr TYPE mara-matnr.

"### F4-Hilfe bekommt man, wenn man auf mara-mtart verweist
"### mtart wird nicht verwendet
"Hier fehlt noch die passenden F4 suchhilfen""""""""""""""""""""""
SELECT-OPTIONS : so_mtart FOR mara-mtart. "DEFAULT 'ROH'.


SELECTION-SCREEN BEGIN OF BLOCK werksueb WITH FRAME.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
            r2 RADIOBUTTON GROUP rad1,
            r3 RADIOBUTTON GROUP rad1,
            r4 RADIOBUTTON GROUP rad1.


SELECTION-SCREEN END OF BLOCK werksueb.



START-OF-SELECTION.

  "Materialnummern passend zur Selektion lesen --> GT_ITAB
  PERFORM lesen_daten.

  IF r1 = 'X'.

* SELECT * FROM mara INTO wa_mara
*          WHERE ersda  = so_ersda.

"### da so_ersda eine Range ist müsste es hier richtigerweise WHERE ersda IN so_ersda heissen

"gecashte Materialnummern lesen mit sobsl passend zu R1
    LOOP AT gt_itab INTO wa_itab
      WHERE sobsl = '20' OR sobsl = '30'.

      "### hier zumindest über OBJECTCLAS, OBJECTID selektieren!!!
      "###und wenn du über pa_matnr selektierst, dann stell sicher, daß
      "das Feld auch gefüllt ist:
      " PARAMETERS: pa_matnr TYPE mara-matnr OBLIGATORY.
      "Sonst liest du ALLE Änderungsbelege

      "an diese Stelle statt diesem Code hier kommt nun ein LOOP über
      "GT_CDPOS...
      SELECT * FROM  cdhdr INTO wa_cdhdr
                   WHERE objectid  = pa_matnr.

        "### auch hier reicht die CHANGENR allein nicht aus!
        SELECT  * FROM cdpos INTO wa_cdpos
                  WHERE changenr = wa_cdhdr-changenr.
          "
          IF    wa_cdpos-value_new = 'G'
              OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
              OR  wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.


            WRITE: 'Erstellt am:', wa_itab-ersda, wa_itab-ernam.
            WRITE: /    wa_cdhdr-changenr,
                                   wa_cdhdr-udate,
                                   wa_cdhdr-username,
                                   wa_cdhdr-objectid .",
            ULINE.
            WRITE: /  wa_cdpos-value_old,
                   /  wa_cdpos-value_new.
            ULINE.


          ENDIF.
          CHECK wa_cdpos-value_new = 0.
        ENDSELECT.

      ENDSELECT.
    ENDLOOP.

  ELSEIF r2 = 'X'.

*    SELECT SINGLE * FROM mara INTO wa_mara
*            WHERE matnr  = pa_matnr.
*
*
*    SELECT SINGLE * FROM marc INTO wa_marc
*                   WHERE matnr = pa_matnr  AND
*                 sobsl = '10' OR sobsl = '50'.


    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr.

      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.
        "
        IF    wa_cdpos-value_new = 'G'
            OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.


          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.

        ENDIF.
      ENDSELECT.
    ENDSELECT.

  ELSEIF r3 = 'X'.

    "### SELECT-ENDSELECT auf MARC macht keinen Sinn. es kommt nur ein
    "Treffer

*    SELECT SINGLE * FROM mara INTO wa_mara
*            WHERE matnr  = pa_matnr.
*
*
*    SELECT  * FROM marc INTO wa_marc
*                   WHERE matnr = pa_matnr  AND
*                 sobsl = '10' .
*    ENDSELECT.

    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr.


      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.

        IF    wa_cdpos-value_new = '4'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
            OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '2'
            OR  wa_cdpos-value_old = '2' AND wa_cdpos-value_new = '1'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'
            OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '1'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '2'.
          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                       wa_cdhdr-udate,
                       wa_cdhdr-username,
                       wa_cdhdr-objectid .
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.
        ENDIF.
      ENDSELECT.


    ENDSELECT.

  ELSEIF r4 = 'X'.

*    SELECT SINGLE * FROM mara INTO wa_mara
*            WHERE matnr  = pa_matnr.
*
*
*    SELECT  * FROM marc INTO wa_marc
*                   WHERE matnr = pa_matnr  AND
*                 sobsl = '10' OR sobsl = '30' OR sobsl = '50'.
*    ENDSELECT.

    SELECT        * FROM  cdhdr INTO wa_cdhdr
                 WHERE  objectid  = pa_matnr." AND
      "

      SELECT  * FROM cdpos INTO wa_cdpos
                WHERE changenr = wa_cdhdr-changenr.

        IF    wa_cdpos-value_new = '4'
            OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'.


          WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .",
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.
        ENDIF.
      ENDSELECT.
    ENDSELECT.

  ENDIF.

  "### wo kommt matnr her?
  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      input        = pa_matnr
    IMPORTING
      output       = wa_cdhdr-objectid
    EXCEPTIONS
      length_error = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.

  ELSE.
    wa_cdhdr-objectid = pa_matnr.

  ENDIF.

*&---------------------------------------------------------------------*
*&      Form  LESEN_DATEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM lesen_daten .

  "erster Step - cashen von MARA+MARC mit Einschränkung auf so_ersda
  "bei AND marc~werks = 'MET' muss natürlich euer Werk stehen
  SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
    APPENDING TABLE gt_itab
     FROM mara JOIN marc ON mara~matnr = marc~matnr
                         AND marc~werks = 'MET'
           WHERE mara~ersda IN so_ersda.

  "umschaufeln der Matnr nach objectid
  LOOP AT gt_itab ASSIGNING <itab>.
    <itab>-objectid = <itab>-matnr.
  ENDLOOP.

  "zweiter Step - cashen von cdhdr für alle MATNR in GT_ITAB
  "hier ist kein Join auf CDHDR+CDPOS möglich
  IF gt_itab IS NOT INITIAL.

    SELECT objectid changenr udate username
      APPENDING TABLE gt_cdhdr
      FROM cdhdr
      FOR ALL ENTRIES IN gt_itab
      WHERE cdhdr~objectclas = 'MATERIAL'
        AND cdhdr~objectid = gt_itab-objectid.

  ENDIF.

  "dritter Step - cashen von cdpos für alle objectid in CDHDR
  IF NOT gt_cdhdr IS INITIAL.

    SELECT objectid changenr value_old value_new
      FROM cdpos APPENDING TABLE gt_cdpos
      FOR ALL ENTRIES IN gt_cdhdr
      WHERE objectclas = 'MATERIAL'
        AND objectid = gt_cdhdr-objectid.

  ENDIF.

  " zu den Änderungspositionen die Werte aus CDHDR dazu lesen
  LOOP AT gt_cdpos ASSIGNING <cdpos>.

    CLEAR wa_cdhdr2.
    READ TABLE gt_cdhdr INTO wa_cdhdr2
      WITH TABLE KEY objectid = <cdpos>-objectid
                     changenr = <cdpos>-changenr.

    <cdpos>-username = wa_cdhdr2-username.
    <cdpos>-udate = wa_cdhdr2-udate.

  ENDLOOP.

ENDFORM.                    " LESEN_DATEN

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

schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ABAP Abfage

Beitrag von commolus (Specialist / 153 / 32 / 0 ) »
@ Alexander D.

Code: Alles auswählen.

.
""Und irgendetwas passt bei den Select-Options noch nicht
"### was genau passt denn nicht?
SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.

PARAMETERS: pa_matnr TYPE mara-matnr.
[u]Antwort[/u]
[color=#FF0000] ”### was genau past denn nicht
*#* Es sollte die erste Selektion auf das Datum gehen, nur wenn das 
*#* Datumsfeld leer bleibt sollte die Selektion auf eine Materialnummer 
*#* gehen. [/color]@ 
.
.
.


  IF r1 = 'X'.

* SELECT * FROM mara INTO wa_mara
*          WHERE ersda  = so_ersda.

"### da so_ersda eine Range ist müsste es hier richtigerweise WHERE ersda IN so_ersda heissen
*#* Sobald ich die obrige Selections aktiviere kommt es zu einer 
*#* Fehlermeldung weil die IF und ELSEIF-Anweisungen nicht mehr passt. Ich *#* glaub ich brauche aber diese Selektion auf das Datum, weil dies die  *#* Hauptabfrage sein sollte.

"gecashte Materialnummern lesen mit sobsl passend zu R1
    LOOP AT gt_itab INTO wa_itab
      WHERE sobsl = '20' OR sobsl = '30'.

      "### hier zumindest über OBJECTCLAS, OBJECTID selektieren!!!
      "###und wenn du über pa_matnr selektierst, dann stell sicher, daß
      "das Feld auch gefüllt ist:
      " PARAMETERS: pa_matnr TYPE mara-matnr OBLIGATORY.
      "Sonst liest du ALLE Änderungsbelege

      "an diese Stelle statt diesem Code hier kommt nun ein LOOP über
      "GT_CDPOS...
      SELECT * FROM  cdhdr INTO wa_cdhdr
                   WHERE objectid  = pa_matnr.

        "### auch hier reicht die CHANGENR allein nicht aus!
        SELECT  * FROM cdpos INTO wa_cdpos
                  WHERE changenr = wa_cdhdr-changenr.
[u]Antwort[/u]
[color=#FF0000]*#* SELECT  * FROM cdpos INTO wa_cdpos
*#*                  WHERE objectclas = wa_cdhdr-objectclas
*#* AND changenr = wa_cdhdr-changenr.
 
*#* Wie dies mit dem Loop gemeint ist leuchtet mir leider nicht ganz ein.  *#* Sollte dieser im Ansatz so aussehen wie der LOOP AT gt_itab? [/color]@ 
      .
.
.
   

  ELSEIF r2 = 'X'.

*    SELECT SINGLE * FROM mara INTO wa_mara
*            WHERE matnr  = pa_matnr.
*
*
*    SELECT SINGLE * FROM marc INTO wa_marc
*                   WHERE matnr = pa_matnr  AND
*                 sobsl = '10' OR sobsl = '50'.
[color=#FF0000]
*#* Sollten hier die gleichen Veränderungen vorgenommen warden wie bei dem *#* ersten Auswahlbutton? Ich habe noch nicht so viel mit IF und ELSEIF 
*#* gearbeitet. Deshalb sieht meine Selectanweisung auch so verwirrend aus. [/color]@ 
   

 

 "### wo kommt matnr her?
  CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
    EXPORTING
      INPUT        = pa_matnr
    IMPORTING
      OUTPUT       = wa_cdhdr-objectid
    EXCEPTIONS
      length_error = 1
      OTHERS       = 2.
  IF sy-subrc <> 0.

  ELSE.
    wa_cdhdr-objectid = pa_matnr.

  ENDIF.
[color=#FF0000]
*#* Die Materialnummer sollte aus der PARAMETERSselektion kommen falls das *#* Eingabefeld auf das Datum nicht befüllt wurde.
[/color]@ 


*&---------------------------------------------------------------------*
*&      Form  LESEN_DATEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM lesen_daten .

  "erster Step - cashen von MARA+MARC mit Einschränkung auf so_ersda
  "bei AND marc~werks = 'MET' muss natürlich euer Werk stehen
  SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
    APPENDING TABLE gt_itab
     FROM mara JOIN marc ON mara~matnr = marc~matnr
                         AND marc~werks = '130'
           WHERE mara~ersda IN so_ersda.

  "umschaufeln der Matnr nach objectid
  LOOP AT gt_itab ASSIGNING <itab>.
    <itab>-objectid = <itab>-matnr.
  ENDLOOP.

  "zweiter Step - cashen von cdhdr für alle MATNR in GT_ITAB
  "hier ist kein Join auf CDHDR+CDPOS möglich
  IF gt_itab IS NOT INITIAL.

    SELECT objectid changenr udate username
      APPENDING TABLE gt_cdhdr
      FROM cdhdr
      FOR ALL ENTRIES IN gt_itab
      WHERE cdhdr~objectclas = 'MATERIAL'
        AND cdhdr~objectid = gt_itab-objectid.

  ENDIF.

  "dritter Step - cashen von cdpos für alle objectid in CDHDR
  IF NOT gt_cdhdr IS INITIAL.

    SELECT objectid changenr value_old value_new
      FROM cdpos APPENDING TABLE gt_cdpos
      FOR ALL ENTRIES IN gt_cdhdr
      WHERE objectclas = 'MATERIAL'
        AND objectid = gt_cdhdr-objectid.

  ENDIF.

  " zu den Änderungspositionen die Werte aus CDHDR dazu lesen
  LOOP AT gt_cdpos ASSIGNING <cdpos>.

    CLEAR wa_cdhdr2.
    READ TABLE gt_cdhdr INTO wa_cdhdr2
      WITH TABLE KEY objectid = <cdpos>-objectid
                     changenr = <cdpos>-changenr.

    <cdpos>-username = wa_cdhdr2-username.
    <cdpos>-udate = wa_cdhdr2-udate.

  ENDLOOP.

ENDFORM.                    
[color=#FF0000]
*#* Mit den letzten Zeilen die hier im Code stehen sollte doch eine Ausgabe *#* mittels ALV auch leichter möglich sein als mit meinem ursprünglichen *#* Coding oder?
[/color]@
.


Herzlichen Danke Alexander du hast mir wirklich sehr geholfen!!!!!

Re: ABAP Abfage

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

ich bin mir nicht sicher, ob ich Deine Fragen richtig verstanden habe. Die Grundüberlegung bei meinem Coding war folgende:

1) die betroffenen Materialdaten und Änderungsbelege aus der Datenbank in interne Tabellen lesen (cashen), siehe FORM lesen_daten. Du hast dann erstmal alle Daten da die für deine Anweisung in Fragen kommen würden, egal welcher Radiobutton aktiv ist.
2) bei der weiteren Verarbeitung greifst du nicht mehr auf die Datenbank, sondern nur noch auf die Daten in der internen Tabelle zu, was einen großen Geschwindigkeitsvorteil bringt. Dabei liesst du nur die Daten, die für den jeweiligen Radiobutton relevant sind.

nun zu den Fragen
”### was genau past denn nicht
*#* Es sollte die erste Selektion auf das Datum gehen, nur wenn das
*#* Datumsfeld leer bleibt sollte die Selektion auf eine Materialnummer
*#* gehen. @
dies könntest du beim Lesen der Daten aus der MARA+MARC in FORM lesen_daten berücksichtigen.

Code: Alles auswählen.

      "erster Step - cashen von MARA+MARC mit Einschränkung auf so_ersda
      "bei AND marc~werks = 'MET' muss natürlich euer Werk stehen
if so_ersda is initial.
      "es ist kein Datum angegeben, lesen über die Materialnummer
      SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
        APPENDING TABLE gt_itab
         FROM mara JOIN marc ON mara~matnr = marc~matnr
                             AND marc~werks = 'MET'
               WHERE mara~matnr = pa_matnr.
else.
       "über Datum selektieren
      SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
        APPENDING TABLE gt_itab
         FROM mara JOIN marc ON mara~matnr = marc~matnr
                             AND marc~werks = 'MET'
               WHERE mara~ersda IN so_ersda.
endif.
*#* Wie dies mit dem Loop gemeint ist leuchtet mir leider nicht ganz ein. *#* Sollte dieser im Ansatz so aussehen wie der LOOP AT gt_itab? @
mit

Code: Alles auswählen.

        LOOP AT gt_itab INTO wa_itab
          WHERE sobsl = '20' OR sobsl = '30'.
         ....
        ENDLOOP.
gehst du über alle gecashten Einträge, die sobsl = 20 oder 30 haben. Dies war ja in deinem Code die Bedingung, falls der erste Radiobutton aktiviert ist. Bei r2 = 'X' wäre das dann sobsl = 10 oder 50 usw.
*#* Sollten hier die gleichen Veränderungen vorgenommen warden wie bei dem *#* ersten Auswahlbutton? Ich habe noch nicht so viel mit IF und ELSEIF
*#* gearbeitet. Deshalb sieht meine Selectanweisung auch so verwirrend aus. @
ja. für jeden Radiobutton unterscheiden sich nur die Bedingungen für den LOOP.
*#* Die Materialnummer sollte aus der PARAMETERSselektion kommen falls das *#* Eingabefeld auf das Datum nicht befüllt wurde.
dein Beispiel war bei mir so nicht lauffähig. Bei CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT' verwendest du eine Variable mit dem Namen matnr, welche aber nicht deklariert ist. ich habe den Namen daher in pa_matnr abgewandelt.
Mit den letzten Zeilen die hier im Code stehen sollte doch eine Ausgabe *#* mittels ALV auch leichter möglich sein als mit meinem ursprünglichen *#* Coding oder?
die Ausgabe wäre somit in der Tat leichter. Die Daten sind zZ in zwei Tabellen abgelegt, sie müssten dann noch in einer auszugebenden Tabelle zusammengefügt 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: ABAP Abfage

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


So hab nun das Coding soweit geändert wie ich glaube dass du es meintest. :up: oder :down:

Hier ist nun der Vollständige Code:

Code: Alles auswählen.

*--------------------------------------------------------------------*
* Report  Z_KOPIEREN
*--------------------------------------------------------------------*

REPORT  z_kopieren.

TABLES: mara.

"### Deklaration der Workarea´s
DATA: wa_mara LIKE mara,
      wa_marc LIKE marc,
      wa_cdhdr LIKE cdhdr,
      wa_cdpos LIKE cdpos.

"Deklaration einer Tabelle für die Zwischenspeicherung MARA+MARC
TYPES: BEGIN OF t_itab,
  matnr LIKE mara-matnr,
  sobsl LIKE marc-sobsl,
  ersda LIKE mara-ersda,
  ernam LIKE mara-ernam,
  objectid LIKE cdhdr-objectid,
  END OF t_itab.

DATA: gt_itab TYPE SORTED TABLE OF t_itab
        WITH NON-UNIQUE KEY matnr sobsl,
      wa_itab LIKE LINE OF gt_itab.

FIELD-SYMBOLS: <itab> TYPE t_itab.

"Deklaration einer Tabelle für die Zwischenspeicherung CDHDR
TYPES: BEGIN OF t_cdhdr,
  objectid LIKE cdhdr-objectid,
  changenr LIKE cdhdr-changenr,
  udate LIKE cdhdr-udate,
  username LIKE cdhdr-username,
  END OF t_cdhdr.

DATA: gt_cdhdr TYPE HASHED TABLE OF t_cdhdr
        WITH UNIQUE KEY objectid changenr,
      wa_cdhdr2 LIKE LINE OF gt_cdhdr.

"Deklaration einer Tabelle für die Zwischenspeicherung CDPOS
TYPES: BEGIN OF t_cdpos,
  objectid LIKE cdhdr-objectid,
  changenr LIKE cdhdr-changenr,
  value_old LIKE cdpos-value_old,
  value_new LIKE cdpos-value_new,
objectclas LIKE cdpos-objectclas,
  udate LIKE cdhdr-udate,
  username LIKE cdhdr-username,
  END OF t_cdpos.

DATA: gt_cdpos TYPE SORTED TABLE OF t_cdpos
        WITH NON-UNIQUE KEY objectid,
      wa_cdpos2 LIKE LINE OF gt_cdpos.

FIELD-SYMBOLS: <cdpos> TYPE t_cdpos.

SELECT-OPTIONS: so_ersda FOR wa_mara-ersda.

PARAMETERS: pa_matnr TYPE mara-matnr. "OBLIGATORY.

SELECT-OPTIONS : so_mtart FOR mara-mtart. "DEFAULT 'ROH'.


SELECTION-SCREEN BEGIN OF BLOCK werksueb WITH FRAME.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
            r2 RADIOBUTTON GROUP rad1,
            r3 RADIOBUTTON GROUP rad1,
            r4 RADIOBUTTON GROUP rad1.


SELECTION-SCREEN END OF BLOCK werksueb.



START-OF-SELECTION.

  "Materialnummern passend zur Selektion lesen --> GT_ITAB
  PERFORM lesen_daten.



  IF r1 = 'X'.


    LOOP AT gt_itab INTO wa_itab
      WHERE sobsl = '20' OR sobsl = '30'.

      "an diese Stelle statt diesem Code hier kommt nun ein LOOP über
      "GT_CDPOS...

      LOOP AT gt_cdpos INTO wa_cdpos2
        WHERE objectid = pa_matnr
        AND objectclas = wa_cdhdr-objectclas 
        AND changenr = wa_cdhdr-changenr.

        IF    wa_cdpos-value_new = 'G'
            OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'F'
            OR  wa_cdpos-value_old = 'F' AND wa_cdpos-value_new = 'B'.


          WRITE: 'Erstellt am:', wa_itab-ersda, wa_itab-ernam.
          WRITE: /    wa_cdhdr-changenr,
                                 wa_cdhdr-udate,
                                 wa_cdhdr-username,
                                 wa_cdhdr-objectid .",
          ULINE.
          WRITE: /  wa_cdpos-value_old,
                 /  wa_cdpos-value_new.
          ULINE.


      ENDIF.
       ENDLOOP.
      CHECK wa_cdpos-value_new = 0.

    ENDLOOP.


  ELSEIF r2 = 'X'.
    LOOP AT gt_itab INTO wa_itab
     WHERE sobsl = '10' OR sobsl = '50'.

      LOOP AT gt_cdpos INTO wa_cdpos2
        WHERE objectid = pa_matnr
        AND objectclas = wa_cdhdr-objectclas 
        AND changenr = wa_cdhdr-changenr.

      IF    wa_cdpos-value_new = 'G'
          OR  wa_cdpos-value_old = 'G' AND wa_cdpos-value_new = 'A'.


        WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
        WRITE: /    wa_cdhdr-changenr,
                               wa_cdhdr-udate,
                               wa_cdhdr-username,
                               wa_cdhdr-objectid .
        ULINE.
        WRITE: /  wa_cdpos-value_old,
               /  wa_cdpos-value_new.
        ULINE.
      ENDIF.
       ENDLOOP.
    ENDLOOP.

  
ELSEIF r3 = 'X'.
    LOOP AT gt_itab INTO wa_itab
     WHERE sobsl = '10'.

LOOP AT gt_cdpos INTO wa_cdpos2
        WHERE objectid = pa_matnr
        AND objectclas = wa_cdhdr-objectclas 
        AND changenr = wa_cdhdr-changenr.

          IF    wa_cdpos-value_new = '4'
              OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '3'
              OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '2'
              OR  wa_cdpos-value_old = '2' AND wa_cdpos-value_new = '1'
              OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '1'
              OR  wa_cdpos-value_old = '3' AND wa_cdpos-value_new = '1'
              OR  wa_cdpos-value_old = '4' AND wa_cdpos-value_new = '2'.
            WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
            WRITE: /    wa_cdhdr-changenr,
                         wa_cdhdr-udate,
                         wa_cdhdr-username,
                         wa_cdhdr-objectid .
            ULINE.
            WRITE: /  wa_cdpos-value_old,
                   /  wa_cdpos-value_new.
            ULINE.
          ENDIF.
          ENDLOOP.
        ENDLOOP.


      ELSEIF r4 = 'X'.
        LOOP AT gt_itab INTO wa_itab
         WHERE sobsl = '20' OR sobsl = '30' OR sobsl = '50'.


LOOP AT gt_cdpos INTO wa_cdpos2
        WHERE objectid = pa_matnr
        AND objectclas = wa_cdhdr-objectclas 
        AND changenr = wa_cdhdr-changenr.

              IF    wa_cdpos-value_new = '4'
                  OR  wa_cdpos-value_old = '4' 
        AND wa_cdpos-value_new = '1'.


                WRITE: 'Erstellt am:', wa_mara-ersda, wa_mara-ernam.
                WRITE: /    wa_cdhdr-changenr,
                                       wa_cdhdr-udate,
                                       wa_cdhdr-username,
                                       wa_cdhdr-objectid .",
                ULINE.
                WRITE: /  wa_cdpos-value_old,
                       /  wa_cdpos-value_new.
                ULINE.
              ENDIF.
               ENDLOOP.
            ENDLOOP.
          ENDIF.

          
          CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
            EXPORTING
              input        = pa_matnr
            IMPORTING
              output       = wa_cdhdr-objectid
            EXCEPTIONS
              length_error = 1
              OTHERS       = 2.
          IF sy-subrc <> 0.

          ELSE.
            wa_cdhdr-objectid = pa_matnr.

          ENDIF.

*&---------------------------------------------------------------------*
*&      Form  LESEN_DATEN
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM lesen_daten .

  
  IF so_ersda IS INITIAL.
    SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
      APPENDING TABLE gt_itab
       FROM mara JOIN marc ON mara~matnr = marc~matnr
                           AND marc~werks = '130'
      WHERE mara~matnr = pa_matnr.

  ELSE.
    
    SELECT mara~matnr marc~sobsl mara~ersda mara~ernam
      APPENDING TABLE gt_itab
      FROM mara JOIN marc ON mara~matnr = marc~matnr
                       AND marc~werks = '130'
      WHERE mara~ersda IN so_ersda.

  ENDIF.
  "umschaufeln der Matnr nach objectid
  LOOP AT gt_itab ASSIGNING <itab>.
    <itab>-objectid = <itab>-matnr.
  ENDLOOP.

  
  IF gt_itab IS NOT INITIAL.

    SELECT objectid changenr udate username
      APPENDING TABLE gt_cdhdr
      FROM cdhdr
      FOR ALL ENTRIES IN gt_itab
      WHERE cdhdr~objectclas = 'MATERIAL'
        AND cdhdr~objectid = gt_itab-objectid.

  ENDIF.

  "dritter Step - cashen von cdpos für alle objectid in CDHDR
  IF NOT gt_cdhdr IS INITIAL.

    SELECT objectid changenr value_old value_new
      FROM cdpos APPENDING TABLE gt_cdpos
      FOR ALL ENTRIES IN gt_cdhdr
      WHERE objectclas = 'MATERIAL'
        AND objectid = gt_cdhdr-objectid.

  ENDIF.

  " zu den Änderungspositionen die Werte aus CDHDR dazu lesen
  LOOP AT gt_cdpos ASSIGNING <cdpos>.

    CLEAR wa_cdhdr2.
    READ TABLE gt_cdhdr INTO wa_cdhdr2
      WITH TABLE KEY objectid = <cdpos>-objectid
                     changenr = <cdpos>-changenr.

    <cdpos>-username = wa_cdhdr2-username.
    <cdpos>-udate = wa_cdhdr2-udate.

  ENDLOOP.

ENDFORM.                    " LESEN_DATEN

Wenn ich nun nach dem Datum oder Materialnummer selektiere funktioniert es leider noch nicht. Es kommt zu keiner Anzeige.

Die Selektion nach der Materialnummer hat aber vorher schon funktioniert.

Wo bin ich schon wieder falsch "abgebogen"?!

LG und danke nochmals

Re: ABAP Abfage

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

in solchen Fällen kann man sich durch den Code Stück-für-Stück durcharbeiten und versuchen rauszufinden an welcher Stelle sich der Fehler eingeschlichen hat. Ein weiterer Vorteil des Cashen in interne Tabellen ist nämlich, dass man sofort erkennen kann, ob und welche Daten hier gelesen worden sind. Alles was man tun muss ist sich an den jeweiligen Stellen die internen Tabellen anzuschauen.

Wenn Du einen Stopppunkt bei ENDFORM in lesen_daten machst und Dir die Tabellen gt_itab, gt_cdhdr und gt_cdpos anschaust, so wirst Du feststellen, dass hier noch alles wie gewünscht funktioniert, die Tabellen werden gefüllt. So hat man auch bequem auf einen Blick die Übersicht welche Daten überhaupt gelesen worden sind. Die Tabelle gt_cdhdr wid übrigens nur temporär gebraucht. Im letzten LOOP in FORM lesen_daten übertragen wir die uns interessierenden Werte in die gt_cdpos.

An der Stelle nach IF R1 = 'X' haben sich aber einige Fehler eingeschlichen:

Code: Alles auswählen.

      IF r1 = 'X'.

"### wir LOOPEN über alle selektierte Materialnummern, die jeweiligen Werte stehen in WA_ITAB
        LOOP AT gt_itab INTO wa_itab
          WHERE sobsl = '20' OR sobsl = '30'.

          "ein LOOP über GT_CDPOS für das jeweilige Material

"### wir wollen die Änderungsbelege zu der jeweils aktuellen MATNR in der Schleife lesen. Mit der 
"### Anweisung WHERE objectid = pa_matnr  liest du immer nur die Belege zu einer MATNR aus deinem Selektionsbild
"### richtig wäre hier WHERE objectid = wa_itab-objectid

"### Des weiteren hat die Tabelle gt_cdpos nur einen Schlüssel, das ist objectid. Die beiden weiteren AND-Bedingungen
"### hätten aber auch so nicht funktioniert, da Du wa_cdhdr garnicht gefüllt hast

*          LOOP AT gt_cdpos INTO wa_cdpos2
*            WHERE objectid = pa_matnr  
*            AND objectclas = wa_cdhdr-objectclas
*            AND changenr = wa_cdhdr-changenr.

          LOOP AT gt_cdpos INTO wa_cdpos2
            WHERE objectid = wa_itab-objectid.

"### es heisst ja LOOP AT gt_cdpos INTO wa_cdpos2, also musst du hier auch auf Werte in
"### wa_cdpos2 und nicht in wa_cdpos zugreifen. 
"### Spätestens hier kann ich das nicht mehr testen, wir haben keine Daten die auf diese Bedingungen zutreffen
"### schau dir einfach die Tabelle gt_cdpos als Ganzes an, und prüfe, ob da Werte vorliegen die Du überhaupt 
"### selektieren möchtest
            IF wa_cdpos2-value_new = 'G' OR
               wa_cdpos2-value_old = 'G' AND wa_cdpos2-value_new = 'F' OR
               wa_cdpos2-value_old = 'F' AND wa_cdpos2-value_new = 'B'.
schöne Grüße
Alexander

ECC 6.0 EHP 7

Re: ABAP Abfage

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

Nun habe aber noch ein Problem mit dem Debugger. Egal wo ich die Breakpoints setze, er spring mir nicht mehr in den Debugger. Daher ist es schwierig die Internen Tabellen auszulesen. Mit der SE30 LZ-Analyse sehe ich das gerademal die Mara gefetcht wird, danach bricht das Programm ab und bleibt im Eingabefenster (Select Options und Parameter-Eingabe).

Hast du da noch eine Lösung dazu?

Danke

Seite 1 von 1

Vergleichbare Themen

6
Antw.
11817
Views
ABAP Workbench und ABAP Dictionary - für Einsteiger
von schnonus » 03.04.2008 10:39 • Verfasst in ABAP® für Anfänger
3
Antw.
9496
Views
OLE und ABAP: Aufruf von Excel-VBA Prozeduren aus ABAP
von OnkelSAP » 26.05.2010 09:45 • Verfasst in ABAP Objects®
3
Antw.
31077
Views
ABAP 7.02 - Neues Feature - Pragmas in ABAP
von foessleitnerj » 09.01.2013 17:02 • Verfasst in Tips + Tricks & FAQs
6
Antw.
9080
Views
Umstellung ABAP auf ABAP Objects
von Andreas G » 25.07.2006 12:46 • Verfasst in ABAP Objects®
3
Antw.
7820
Views
ABAP vs. ABAP Objects
von Mr.Black » 11.07.2007 14:27 • Verfasst in ABAP Objects®

Aktuelle Forenbeiträge

Ermittlung der Arbeitstage (Mosid)
vor 2 Tagen von Radinator 11 / 45917
LSMW-Problem
vor einer Woche von DeathAndPain gelöst 6 / 3817
SFP (Adobe Forms) QR-Code wird nicht angezeigt
vor einer Woche von Sebastian82 gelöst 4 / 2308

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

Ermittlung der Arbeitstage (Mosid)
vor 2 Tagen von Radinator 11 / 45917
LSMW-Problem
vor einer Woche von DeathAndPain gelöst 6 / 3817
SFP (Adobe Forms) QR-Code wird nicht angezeigt
vor einer Woche von Sebastian82 gelöst 4 / 2308