Listen-Ausgabe

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Listen-Ausgabe

Beitrag von christof (Specialist / 122 / 6 / 0 ) »
Hallo zusammen

Ich fange erst mit ABAP zu programmieren an, leider habe ich gewisse Schwierigkeiten mit einer einfachen Listenausgabe. Das Programm funktioniert zwar einwandfrei, aber die Struktur kann mit sicherheit verbessert werden. Da ich leider keine Möglichkeit habe um mein Programmm korrigieren zu lassen stelle ich es nun hier ins Forum. Ich bin über jede Rückmeldung dankbar.
Vielen Dank

Code: Alles auswählen.


Report ZR_ZAPROS.


Tables: mara,
marc,
mard,
mbew,
makt,
mver.

DATA: Preis(12),
Verbrauch(6).

SELECT-OPTIONS Material FOR mara-matnr.
SELECT-OPTIONS Gejahr FOR mver-gjahr.
PARAMETERS Sprache type makt-spras OBLIGATORY.


SELECT * FROM MARA CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR in Material.


SELECT * FROM MARC CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr.

ENDSELECT.

SELECT * FROM MARD CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr.
ENDSELECT.


SELECT * FROM MBEW CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr.
ENDSELECT.


SELECT * FROM MAKT CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr
AND SPRAS = Sprache.
ENDSELECT.



SELECT * FROM MVER CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = makt-matnr
AND GJAHR in Gejahr.

ENDSELECT.



*--------------------------------------------------------------------*
*Wenn-Funktion Standart-Gleitenderpreis*
*--------------------------------------------------------------------*

CASE MBEW-VPRSV.
WHEN 'S'.
Preis = MBEW-STPRS.
WHEN 'V'.
Preis = MBEW-VERPR.
WHEN OTHERS.
Preis = '---'.
ENDCASE.


*Verbräuche berechnen*


Verbrauch = 
MVER-GSV01 + MVER-GSV02 + MVER-GSV03 + MVER-GSV04 + MVER-GSV05 +
MVER-GSV06 + MVER-GSV07 + MVER-GSV08 + MVER-GSV09 + MVER-GSV10 + 
MVER-GSV11 + MVER-GSV12 + MVER-GSV13.


*Ausgabe*


WRITE: / MARA-MATNR,
25 MAKT-MAKTX,
70 MARA-MATKL,
76 MARA-PRDHA,
82 MARC-EKGRP,
86 MARC-DISPO,
90 MARC-BESKZ,
92 MARC-SOBSL,
96 MARD-LGPBE,
106 MBEW-VPRSV,
110 Preis,
125 MARC-NCOST,
142 MBEW-HRKFT,
148 MBEW-EKALR,
150 MARC-LOSGR,
156 Gejahr,
165 Verbrauch.


ENDSELECT.

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


Re: Listen-Ausgabe

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Moin,

ich kann dir jetzt eher weniger allgemeine Tipps geben, sondern mehr meine persönliche Meinung/Einstellung zum Coding:

1. Bei den Datendeklarationen Typangaben mit hinschreiben, das macht es mMn. einfach etwas übersichtlicher. Außerdem sollten in ABAP Variablen mit LV (LocalVariable) oder GV_ (GlobalVariable) als Präfix haben, was es anderen und auch dir später einfacher machen wird, das Coding zu lesen.

Weiterhin arbeite ich persönlich weniger mit "Tables"-Anweisungen, sondern eher mit separaten eigens definierten internen Tabellen (ohne Kopfzeile sondern mit separat deklarierten Kopfzeilen). In diese lade ich die Daten dann erstmal rein und arbeite dann komplett intern, um die Datenbankzugriffe soweit möglich zu reduzieren. Select/Endselect Anweisungen benutze ich persönlich nicht gerne und versuche diese auch soweit möglich zu vermeiden.
Du hast quasi um dein komplettes Coding ein Select/Endselect gebaut, das ließe sich meiner Meinung nach schöner mit einer internen Tabelle mit einem Loop lösen. Erstens ist es etwas übersichtlicher und zweitens lässt es sich leichter Debuggen.

Soweit meine Meinung dazu, kann aber gut sein, dass es hier wer aus dem Forum anders sieht;)

Gruß
Pyro

Re: Listen-Ausgabe

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Die "kleinen" SELECTs in einer Schleife sollten auch nicht sein.
Man sollte immer versuchen, alles in einem Rutsch zu selektieren, da dadurch die Datenbank und die Schnittstellen von SAP viel effizienter ausgenutzt werden.
(Empfehlung: Immer SELECT ... INTO TABLE ... statt SELECT ... INTO ... ENDSELECT)

Eventuell, wäre auch ein JOIN von allen Tabellen denkbar. Das muss man aber von Fall zu Fall abwägen, da diese relativ viel Last auf der Datenbank, dem Flaschenhals von SAP, erzeugen. Im Gegenzug müssen aber uU weniger Daten übertragen werden als bei mehreren SELECTs auf die einzelnen Tabellen. Auch funktionieren bei JOINs die SAP eigenen Pufferungen nicht.
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: Listen-Ausgabe

Beitrag von JHM (Top Expert / 1188 / 1 / 195 ) »
christof hat geschrieben:Ich bin über jede Rückmeldung dankbar.
SY-MANDT brauchst du eigentlich nie beim Select angeben, dies macht SAP automatisch, es gibt nur sehr wenige Sonderfälle, in denen der Mandant explizit angegeben werden muss.

Du baust dir je nach Materialstamm und seinen OrgEbenen auch Fehler in die Ausgabe ein:

Code: Alles auswählen.

SELECT * FROM MARC CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr.
ENDSELECT.
Wieviele Werke habt ihr? Wenn es nur ein Werk gibt, dann würde ein SELECT SINGLE reichen, wenn es mehrere Werk gibt liest du alle Sätze ein, verarbeitest aber nur den letzten Satz. Welcher Satz der letzte ist, kann sich dabei auch noch von Aufruf zu Aufruf unterscheiden.

Code: Alles auswählen.

SELECT * FROM MARD CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr.
ENDSELECT.
MARD ist Werks und Lagerort abhängig, nur bei einem Werk und einem Lagerort macht der Zugriff so sinn, dann reicht aber auch ein SELECT SINGLE. Wenn es mehrere Werk und/oder Lagerorte gibt, muss der Lagerplatz in allen Kombinationen gleich sein, sonst wird etwas zufällig ausgeben.

Code: Alles auswählen.

SELECT * FROM MBEW CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr.
ENDSELECT.
Ähnlich MARC/MARD, wie viele Bewertungskreise gibt es?

Code: Alles auswählen.

SELECT * FROM MAKT CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = mara-matnr
AND SPRAS = Sprache.
ENDSELECT.
Hier reicht ein SELECT SINGLE, da der Tabellenkey vollständig angeben ist.

Code: Alles auswählen.

SELECT * FROM MVER CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = makt-matnr
AND GJAHR in Gejahr.

ENDSELECT.
Hier wird es dann wieder speziell, da du nur mit einem Teilkey zugreifst. Es wird nur der letzte Satz verarbeite, dabei gibt es mehrere Sätze. Verbräuche werden je Werk erfasst, wenn es nur ein Werk gibt, ok. Aber die Werte werden je GJAHR und Periode gespeichert. Wenn du alle Verbräuche eines Materials haben willst muss du auch alle GJAHRE/Periodensätze verarbeiten und nicht nur den letzten. Die Berechnung muss also in der Select-Schleife erfolgen

Code: Alles auswählen.

CLEAR Verbrauch. "für jedes Material den Verbrauch zurück setzten
SELECT * FROM MVER CLIENT SPECIFIED
WHERE MANDT = sy-mandt
AND MATNR = makt-matnr
AND GJAHR in Gejahr.

Verbrauch = Verbrauch + 
MVER-GSV01 + MVER-GSV02 + MVER-GSV03 + MVER-GSV04 + MVER-GSV05 +
MVER-GSV06 + MVER-GSV07 + MVER-GSV08 + MVER-GSV09 + MVER-GSV10 + 
MVER-GSV11 + MVER-GSV12 + MVER-GSV13.

ENDSELECT.
Gruß Hendrik

Re: Listen-Ausgabe

Beitrag von christof (Specialist / 122 / 6 / 0 ) »
Vielen Dank für eure Antworten, ich habe es mit einer internen Tabelle zu lösen probiert. Leider funktioniert dieser Report hinten und vorne nicht.
Vielleicht habt ihr mir weiter Tipps.
Vielen Dank

Report ZR_ZAPROS.

TABLES:
mara,
marc,
mard,
mbew,
makt,
mver.

types: begin of TY_MARC,
MATNR type MATNR,
WERKS type WERKS_D,
MATKL type MATKL_D,
EKGRP type EKGRP,
DISPO type DISPO,
BESKZ type BESKZ,
SOBSL type SOBSL,
VPRSV type VPRSV,
NCOST type MARC-NCOST,
HRKFT type HRKFT,
EKALR type MBEW-EKALR,
LOSGR type LOSGR,
MAKTX TYPE MAKTX,
PRDHA TYPE MARA-PRDHA,
LGPBE TYPE LGPBE,
STPRS TYPE STPRS,
GJAHR TYPE GJAHR,
SPRAS TYPE SPRAS,
end of TY_MARC.


data:
IT_MARC type standard table of TY_MARC,
WA_MARC type TY_MARC.

*--------------------------------------------------------------------*
*Selektionsbild gesalten*
*--------------------------------------------------------------------*
START-OF-SELECTION.

SELECT-OPTIONS Material FOR mara-matnr.
SELECT-OPTIONS Gejahr FOR mver-gjahr.
SELECT-OPTIONS WERKS FOR MARC-WERKS.
PARAMETERS SPRAS type makt-spras OBLIGATORY.

END-OF-SELECTION.

SELECT
MARA~MATNR
MARC~WERKS
MARA~MATKL
MARC~EKGRP
MARA~MAKTX
MARA~PRDHA
MARC~DISPO
MARC~BESKZ
MARC~SOBSL
MARD~LGPBE
MBEW~VPRSV
MBEW~STPRS
MARC~NCOST
MBEW~HRKFT
MBEW~EKALR
MARC~LOSGR
MVER~GJAHR
MAKT~SPRAS


From MARA.
join MARC on ( MARC~MATNR = MARA~MATNR )
join MBEW on ( MBEW~MATNR = MARA~MATNR )
join MAKT on ( MARA~MATNR = MARA~MATNR )
join MARD on ( MARD~MATNR = MARA~MATNR )
join MVER on ( MVER~MATNR = MARA~MATNR )
into corresponding fields of IT_MARC
where MARA~MATNR in MATERIAL
and MARC~WERKS in WERKS
and MBEW~BWKEY in WERKS.

*--------------------------------------------------------------------*
*Schleife über interne Tabelle*
*--------------------------------------------------------------------*
loop at IT_MARC into WA_MARC.
loop at IT_MARC into WA_MAKT.
loop at IT_MARC into WA_MARD.
loop at IT_MARC into WA_MVER.

*--------------------------------------------------------------------*
*Wenn-Funktion Standart-Gleitenderpreis*
*--------------------------------------------------------------------*
CASE MBEW-VPRSV.
WHEN 'S'.
Preis = MBEW-STPRS.
WHEN 'V'.
Preis = MBEW-VERPR.
WHEN OTHERS.
Preis = '---'.
ENDCASE.


*----------------------------------------------------------------------*
*Verbräuche berechnen*
* --------------------------------------------------------------------*
Verbrauch = MVER-GSV01 + MVER-GSV02 + MVER-GSV03 + MVER-GSV04 + MVER-GSV05 +
MVER-GSV06 + MVER-GSV07 + MVER-GSV08 + MVER-GSV09 + MVER-GSV10 +
MVER-GSV11 + MVER-GSV12 + MVER-GSV13.


*--------------------------------------------------------------------*
*Ausgabe*
*--------------------------------------------------------------------*
WRITE: / MARA-MATNR,
25 WA_MAKT-MAKTX,
70 WA_MARA-MATKL,
76 WA_MARA-PRDHA,
82 WA_MARC-EKGRP,
86 WA_MARC-DISPO,
90 WA_MARC-BESKZ,
92 WA_MARC-SOBSL,
96 WA_MARD-LGPBE,
106 WA_MBEW-VPRSV,
110 Preis,
125 WA_MARC-NCOST,
142 WA_MBEW-HRKFT,
148 WA_MBEW-EKALR,
150 WA_MARC-LOSGR,
156 WA_MVER-GJAHR,
165 Verbrauch.
endloop.

Re: Listen-Ausgabe

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Ich schreib dir den Report morgen früh mal neu. Welchen Releasestand habt ihr?
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Listen-Ausgabe

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »

Code: Alles auswählen.

loop at IT_MARC into WA_MARC.
loop at IT_MARC into WA_MAKT.
loop at IT_MARC into WA_MARD.
loop at IT_MARC into WA_MVER.
Ähm... nein;)

Damit das Coding generell mal funktioniert (so, wie es jetzt ist müsstest du eigentlich einen Sytnaxfehler bekommen) lass am besten nur den ersten loop stehen und die anderen 4 löscht du einfach. In WA_MARC hast du ja auch dank der lokalen Struktur alle benötigten Felder drin, welche du direkt darüber ansprechen kannst.

Re: Listen-Ausgabe

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
So, das sollte in etwa das sein, was du brauchst - getestet habe ich es allerdings nicht. Wenn du Fragen dazu hast, einfach fragen.

@alle: Bitte keine Diskussion für / wider Feldsymbole :D

Code: Alles auswählen.

REPORT ZR_ZAPROS

TABLES:
  mara,
  marc,
  mver.

TYPES:
  BEGIN OF ty_list,
    matnr     TYPE matnr,
    werks     TYPE werks_d,
    matkl     TYPE matkl_d,
    ekgrp     TYPE ekgrp,
    dispo     TYPE dispo,
    beskz     TYPE beskz,
    sobsl     TYPE sobsl,
    vprsv     TYPE vprsv,
    ncost     TYPE marc-ncost,
    hrkft     TYPE hrkft,
    ekalr     TYPE mbew-ekalr,
    losgr     TYPE losgr,
    maktx     TYPE maktx,
    prdha     TYPE mara-prdha,
    lgpbe     TYPE lgpbe,
    stprs     TYPE stprs,
    gjahr     TYPE gjahr,
    spras     TYPE spras,
    verbrauch TYPE mver-gsv01,
    preis     TYPE mbew-stprs,
  END OF ty_list,

  BEGIN OF ty_bwkey,
    bwkey TYPE bwkey,
    werks TYPE werks_d,
    bukrs TYPE bukrs,
  END OF ty_bwkey.

DATA:
  it_mara   TYPE SORTED TABLE OF mara
    WITH UNIQUE KEY matnr,

  " da du nur eine Sprache selektierst, sparen wir uns das Keyfeld SPRAS
  it_makt   TYPE SORTED TABLE OF makt
      WITH UNIQUE KEY matnr,

  it_marc   TYPE SORTED TABLE OF marc
    WITH UNIQUE KEY matnr werks,

  it_mard   TYPE SORTED TABLE OF mard
    WITH UNIQUE KEY matnr werks lgort,

  it_mver   TYPE SORTED TABLE OF mver
    WITH UNIQUE KEY matnr werks gjahr perkz zahlr,

  it_mbew   TYPE SORTED TABLE OF mbew
    WITH UNIQUE KEY matnr bwkey bwtar,

  it_t001w  TYPE SORTED TABLE OF t001w
   WITH UNIQUE KEY  werks,

  bwkrs_cus TYPE tcurm-bwkrs_cus,

  it_bwkey  TYPE SORTED TABLE OF ty_bwkey
   WITH UNIQUE KEY bwkey
   WITH NON-UNIQUE SORTED KEY wrk COMPONENTS werks
   WITH NON-UNIQUE SORTED KEY buk COMPONENTS bukrs,

  it_list   TYPE STANDARD TABLE OF ty_list.

FIELD-SYMBOLS:
  <mara>  TYPE mara,
  <marc>  TYPE marc,
  <mard>  TYPE mard,
  <makt>  TYPE makt,
  <mver>  TYPE mver,
  <mbew>  TYPE mbew,
  <t001w> TYPE t001w,
  <bwkey> TYPE ty_bwkey,
  <list>  TYPE ty_list.

*--------------------------------------------------------------------*
*Selektionsbild gesalten*
*--------------------------------------------------------------------*
SELECT-OPTIONS so_matnr FOR mara-matnr.
SELECT-OPTIONS so_gjahr FOR mver-gjahr.
SELECT-OPTIONS so_werks FOR marc-werks.
PARAMETERS pa_spras TYPE makt-spras OBLIGATORY.

" Das gehört HINTER das Selektionsbild:
" (Beginn der Selektion)

START-OF-SELECTION.

  " Wir machen das jetzt mal richtig korrekt....:
  "
  " Bewertungsebene lesen (das schenken wir uns mal)
  " bwkrs_cus = 1 -> ein Werk, so scheint das ja bei euch zu sein
  " bwkrs_cus = 2 -> mehrere Werke
  " bwkrs_cus = 3 -> bukrs
  " SELECT SINGLE bwkrs_cus
  " FROM tcurm INTO bwkrs_cus.

  " für 1 und 2 würde man dann z. B. so lesen:
  SELECT werks bwkey
  FROM t001w INTO CORRESPONDING FIELDS OF TABLE it_bwkey.
  " zwar scheint bei euch bwkrs_cust = 1 zu sein, ich würde mich
  " aber NIE darauf verlassen, dass werks = bwkey!!!

  SELECT matnr
         matkl prdha
  FROM mara INTO CORRESPONDING FIELDS OF TABLE it_mara
  WHERE matnr IN so_matnr.

  SELECT matnr spras
         maktx
  FROM makt INTO CORRESPONDING FIELDS OF TABLE it_makt
  WHERE matnr IN so_matnr
  AND   spras EQ pa_spras.

  SELECT matnr werks
         ekgrp dispo beskz sobsl ncost losgr
  FROM marc INTO CORRESPONDING FIELDS OF TABLE it_marc
  WHERE matnr IN so_matnr
  AND   werks IN so_werks.

  SELECT matnr werks lgort
         lgpbe
  FROM mard INTO CORRESPONDING FIELDS OF TABLE it_mard
  WHERE matnr IN so_matnr
  AND   werks IN so_werks.

  SELECT matnr werks gjahr perkz zahlr
  FROM mver INTO CORRESPONDING FIELDS OF TABLE it_mver
  WHERE matnr IN so_matnr
  AND   werks IN so_werks.

  IF it_bwkey IS NOT INITIAL.
    SELECT matnr bwkey bwtar
           vprsv stprs hrkft ekalr
    FROM mbew INTO TABLE it_mbew
    FOR ALL ENTRIES IN it_bwkey
    WHERE matnr IN so_matnr
    AND   bwkey EQ it_bwkey-bwkey.
  ENDIF.

  " Das gehört HINTER die Selektion:

END-OF-SELECTION.
*--------------------------------------------------------------------*
*Schleife über interne Tabelle*
*--------------------------------------------------------------------*
  LOOP AT it_mara ASSIGNING <mara>.

    " SPRAS wird per parameter selektiert, es gibt also nur einen,
    " dann reicht ein
    READ TABLE it_makt ASSIGNING <makt>
    WITH KEY matnr = <marc>-matnr
             spras = pa_spras.

    LOOP AT it_marc ASSIGNING <marc>
    WHERE matnr EQ <mara>-matnr.

      LOOP AT it_mver ASSIGNING <mver>
      WHERE matnr EQ <marc>-matnr
      AND   werks EQ <marc>-werks.

*----------------------------------------------------------------------*
*Verbräuche berechnen*
* --------------------------------------------------------------------*
        <list>-verbrauch = <mver>-gsv01 + <mver>-gsv02 + <mver>-gsv03 + <mver>-gsv04 + <mver>-gsv05 +
        <mver>-gsv06 + <mver>-gsv07 + <mver>-gsv08 + <mver>-gsv09 + <mver>-gsv10 +
        <mver>-gsv11 + <mver>-gsv12 + <mver>-gsv13.

        READ TABLE it_bwkey ASSIGNING <bwkey>
        WITH TABLE KEY wrk COMPONENTS werks = <marc>-werks.

        LOOP AT it_mbew ASSIGNING <mbew>
        WHERE matnr EQ <marc>-matnr
        AND   bwkey EQ <bwkey>-bwkey.

          LOOP AT it_mard ASSIGNING <mard>
          WHERE matnr EQ <mard>-matnr.


*--------------------------------------------------------------------*
*Wenn-Funktion Standart-Gleitenderpreis*
*--------------------------------------------------------------------*
            CASE <mbew>-vprsv.
              WHEN 'S'.
                <list>-preis = <mbew>-stprs.
              WHEN 'V'.
                <list>-preis = <mbew>-verpr.
              WHEN OTHERS.
                <list>-preis = '---'.
            ENDCASE.

            MOVE-CORRESPONDING:
              <mara> TO <list>,
              <makt> TO <list>,
              <marc> TO <list>,
              <mard> TO <list>,
              <mbew> TO <list>,
              <mver> TO <list>.

          ENDLOOP.
        ENDLOOP.
      ENDLOOP.
    ENDLOOP.
  ENDLOOP.

*--------------------------------------------------------------------*
*Ausgabe*
*--------------------------------------------------------------------*
  WRITE: / <list>-matnr,
        25 <list>-maktx,
        70 <list>-matkl,
        76 <list>-prdha,
        82 <list>-ekgrp,
        86 <list>-dispo,
        90 <list>-beskz,
        92 <list>-sobsl,
        96 <list>-lgpbe,
       106 <list>-vprsv,
       110 <list>-preis,
       125 <list>-ncost,
       142 <list>-hrkft,
       148 <list>-ekalr,
       150 <list>-losgr,
       156 <list>-gjahr,
       165 <list>-verbrauch.
Bei Zugriffen auf interne Tabellen sollte man auf gescheite Keys achten. Früher™ haben wir einen READ mit BINARY SEARCH gemacht, um den Einstieg für einen LOOP AT ... FROM ... zu finden, das hat das Coding nicht gerade übersichtlicher gemacht und ich hab "gern" die Ausstiegsbedingung vergessen. Das braucht man nu nicht mehr.

Ich habe mich bei der Syntax (da ich nicht weiß, was für ein Release du verwendest) daran gehalten, was vor 7.40 notwendig war - unter 7.40 gibt es eine Reihe von Sprachelementen, die das Coding deutlich übersichtlicher aussehen lassen, weil es sowas wie "Inline Deklaration" und neue Funktionen auf interne Tabellen gibt.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Listen-Ausgabe

Beitrag von christof (Specialist / 122 / 6 / 0 ) »
WOW... Also wir besitzen 730 Final Release

Vielen Dank, ich werde dies mal anschauen und probieren es zu verstehen ;-)

Re: Listen-Ausgabe

Beitrag von christof (Specialist / 122 / 6 / 0 ) »
Wenn ich es auf Syntax überprüfe bekomme ich in der Fett gedruckten Zeile die Fehlermeldung: Nach "WITH" wurde "HEADER LINE" erwartet.

Kannst du mir da nochmal helfen? Somit hätte ich dann eine gute Grundlage für ein Listenausgabe..

it_bwkey TYPE SORTED TABLE OF ty_bwkey
WITH UNIQUE KEY bwkey
WITH NON-UNIQUE SORTED KEY wrk COMPONENTS werks
WITH NON-UNIQUE SORTED KEY buk COMPONENTS bukrs,

it_list TYPE STANDARD TABLE OF ty_list.

FIELD-SYMBOLS:
<mara> TYPE mara,

Re: Listen-Ausgabe

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
[quote="christof"WITH HEADER LINE"[/quote]

Oooops, kann es sein, dass ihr ein ziemlich altes AS ABAP Release habt? Kannst du das mal bitte nachsehen?

System -> Status, Button "Komponenteninformation" (neben der Komponentenversion im Kasten "SAP Systemdaten"), Zeile "SAP_ABA".
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Listen-Ausgabe

Beitrag von christof (Specialist / 122 / 6 / 0 ) »
Hab mich bisher noch nie mit Release auseinander gesetzt.
Wir haben das Release 700

Re: Listen-Ausgabe

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
christof hat geschrieben:Wir haben das Release 700
Eiweh. Dann sollte es aber so funktionieren:

Code: Alles auswählen.

REPORT ZR_ZAPROS.

TABLES:
  mara,
  marc,
  mver.

TYPES:
  BEGIN OF ty_list,
    matnr     TYPE matnr,
    werks     TYPE werks_d,
    matkl     TYPE matkl_d,
    ekgrp     TYPE ekgrp,
    dispo     TYPE dispo,
    beskz     TYPE beskz,
    sobsl     TYPE sobsl,
    vprsv     TYPE vprsv,
    ncost     TYPE marc-ncost,
    hrkft     TYPE hrkft,
    ekalr     TYPE mbew-ekalr,
    losgr     TYPE losgr,
    maktx     TYPE maktx,
    prdha     TYPE mara-prdha,
    lgpbe     TYPE lgpbe,
    stprs     TYPE stprs,
    gjahr     TYPE gjahr,
    spras     TYPE spras,
    verbrauch TYPE mver-gsv01,
    preis     TYPE mbew-stprs,
  END OF ty_list,

  BEGIN OF ty_bwkey,
    bwkey TYPE bwkey,
    werks TYPE werks_d,
    bukrs TYPE bukrs,
  END OF ty_bwkey.

DATA:
  it_mara   TYPE SORTED TABLE OF mara
    WITH UNIQUE KEY matnr,

  " da du nur eine Sprache selektierst, sparen wir uns das Keyfeld SPRAS
  it_makt   TYPE SORTED TABLE OF makt
      WITH UNIQUE KEY matnr,

  it_marc   TYPE SORTED TABLE OF marc
    WITH UNIQUE KEY matnr werks,

  it_mard   TYPE SORTED TABLE OF mard
    WITH UNIQUE KEY matnr werks lgort,

  it_mver   TYPE SORTED TABLE OF mver
    WITH UNIQUE KEY matnr werks gjahr perkz zahlr,

  it_mbew   TYPE SORTED TABLE OF mbew
    WITH UNIQUE KEY matnr bwkey bwtar,

  it_t001w  TYPE SORTED TABLE OF t001w
   WITH UNIQUE KEY  werks,

  bwkrs_cus TYPE tcurm-bwkrs_cus,

  it_bwkey  TYPE STANDARD TABLE OF ty_bwkey,            " geändert
*   WITH UNIQUE KEY bwkey
*   WITH NON-UNIQUE SORTED KEY wrk COMPONENTS werks
*   WITH NON-UNIQUE SORTED KEY buk COMPONENTS bukrs,

  it_list   TYPE STANDARD TABLE OF ty_list.

FIELD-SYMBOLS:
  <mara>  TYPE mara,
  <marc>  TYPE marc,
  <mard>  TYPE mard,
  <makt>  TYPE makt,
  <mver>  TYPE mver,
  <mbew>  TYPE mbew,
  <t001w> TYPE t001w,
  <bwkey> TYPE ty_bwkey,
  <list>  TYPE ty_list.

*--------------------------------------------------------------------*
*Selektionsbild gesalten*
*--------------------------------------------------------------------*
SELECT-OPTIONS so_matnr FOR mara-matnr.
SELECT-OPTIONS so_gjahr FOR mver-gjahr.
SELECT-OPTIONS so_werks FOR marc-werks.
PARAMETERS pa_spras TYPE makt-spras OBLIGATORY.

" Das gehört HINTER das Selektionsbild:
" (Beginn der Selektion)

START-OF-SELECTION.

  " Wir machen das jetzt mal richtig korrekt....:
  "
  " Bewertungsebene lesen (das schenken wir uns mal)
  " bwkrs_cus = 1 -> ein Werk, so scheint das ja bei euch zu sein
  " bwkrs_cus = 2 -> mehrere Werke
  " bwkrs_cus = 3 -> bukrs
  " SELECT SINGLE bwkrs_cus
  " FROM tcurm INTO bwkrs_cus.

  " für 1 und 2 würde man dann z. B. so lesen:
  SELECT werks bwkey
  FROM t001w INTO CORRESPONDING FIELDS OF TABLE it_bwkey.
  " zwar scheint bei euch bwkrs_cust = 1 zu sein, ich würde mich
  " aber NIE darauf verlassen, dass werks = bwkey!!!

  SELECT matnr
         matkl prdha
  FROM mara INTO CORRESPONDING FIELDS OF TABLE it_mara
  WHERE matnr IN so_matnr.

  SELECT matnr spras
         maktx
  FROM makt INTO CORRESPONDING FIELDS OF TABLE it_makt
  WHERE matnr IN so_matnr
  AND   spras EQ pa_spras.

  SELECT matnr werks
         ekgrp dispo beskz sobsl ncost losgr
  FROM marc INTO CORRESPONDING FIELDS OF TABLE it_marc
  WHERE matnr IN so_matnr
  AND   werks IN so_werks.

  SELECT matnr werks lgort
         lgpbe
  FROM mard INTO CORRESPONDING FIELDS OF TABLE it_mard
  WHERE matnr IN so_matnr
  AND   werks IN so_werks.

  SELECT matnr werks gjahr perkz zahlr
  FROM mver INTO CORRESPONDING FIELDS OF TABLE it_mver
  WHERE matnr IN so_matnr
  AND   werks IN so_werks.

  IF it_bwkey IS NOT INITIAL.
    SELECT matnr bwkey bwtar
           vprsv stprs hrkft ekalr
    FROM mbew INTO TABLE it_mbew
    FOR ALL ENTRIES IN it_bwkey
    WHERE matnr IN so_matnr
    AND   bwkey EQ it_bwkey-bwkey.
  ENDIF.

  " Das gehört HINTER die Selektion:

END-OF-SELECTION.
*--------------------------------------------------------------------*
*Schleife über interne Tabelle*
*--------------------------------------------------------------------*
  LOOP AT it_mara ASSIGNING <mara>.

    " SPRAS wird per parameter selektiert, es gibt also nur einen,
    " dann reicht ein
    READ TABLE it_makt ASSIGNING <makt>
    WITH KEY matnr = <marc>-matnr
             spras = pa_spras.

    LOOP AT it_marc ASSIGNING <marc>
    WHERE matnr EQ <mara>-matnr.

      LOOP AT it_mver ASSIGNING <mver>
      WHERE matnr EQ <marc>-matnr
      AND   werks EQ <marc>-werks.

*----------------------------------------------------------------------*
*Verbräuche berechnen*
* --------------------------------------------------------------------*
        <list>-verbrauch = <mver>-gsv01 + <mver>-gsv02 + <mver>-gsv03 + <mver>-gsv04 + <mver>-gsv05 +
        <mver>-gsv06 + <mver>-gsv07 + <mver>-gsv08 + <mver>-gsv09 + <mver>-gsv10 +
        <mver>-gsv11 + <mver>-gsv12 + <mver>-gsv13.

        SORT it_bwkey BY werks.                                 " hinzugefügt

        READ TABLE it_bwkey ASSIGNING <bwkey>
        WITH KEY werks = <marc>-werks BINARY SEARCH.            " geändert

        LOOP AT it_mbew ASSIGNING <mbew>
        WHERE matnr EQ <marc>-matnr
        AND   bwkey EQ <bwkey>-bwkey.

          LOOP AT it_mard ASSIGNING <mard>
          WHERE matnr EQ <mard>-matnr.


*--------------------------------------------------------------------*
*Wenn-Funktion Standart-Gleitenderpreis*
*--------------------------------------------------------------------*
            CASE <mbew>-vprsv.
              WHEN 'S'.
                <list>-preis = <mbew>-stprs.
              WHEN 'V'.
                <list>-preis = <mbew>-verpr.
              WHEN OTHERS.
                <list>-preis = '---'.
            ENDCASE.

            MOVE-CORRESPONDING:
              <mara> TO <list>,
              <makt> TO <list>,
              <marc> TO <list>,
              <mard> TO <list>,
              <mbew> TO <list>,
              <mver> TO <list>.

          ENDLOOP.
        ENDLOOP.
      ENDLOOP.
    ENDLOOP.
  ENDLOOP.

*--------------------------------------------------------------------*
*Ausgabe*
*--------------------------------------------------------------------*
  WRITE: / <list>-matnr,
        25 <list>-maktx,
        70 <list>-matkl,
        76 <list>-prdha,
        82 <list>-ekgrp,
        86 <list>-dispo,
        90 <list>-beskz,
        92 <list>-sobsl,
        96 <list>-lgpbe,
       106 <list>-vprsv,
       110 <list>-preis,
       125 <list>-ncost,
       142 <list>-hrkft,
       148 <list>-ekalr,
       150 <list>-losgr,
       156 <list>-gjahr,
       165 <list>-verbrauch.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Listen-Ausgabe

Beitrag von christof (Specialist / 122 / 6 / 0 ) »
Super es hat keine Sytaxfehler mehr. Leider habe ich bei den einen Laufzeitfehler.
Die Auslöse ist die Zeile 138.

Fehleranalyse
Es ist eine Ausnahme aufgetreten, die weiter unten näher erläutert wird
Die Ausnahme, der die Klasse 'CX_SY_OPEN_SQL_DB' zugeordnet ist,
wurde nicht abgefangen und führte deshalb zu einem Laufzeitfehler.
Der Grund für die Ausnahme ist:

Bei einem SELECT-Zugriff konnten die gelesenen Daten nicht in das zur
Verfügung gestellte Zielfeld gestellt werden.
Die Konvertierung wird entweder für den Typ des Zielfelds nicht
unterstützt, oder das Zielfeld ist zur Aufnahme des Werts zu klein,
oder die Daten weisen nicht das für das Zielfeld geforderte Format auf.

Fehlerzeile

SELECT matnr werks gjahr perkz zahlr
FROM mver INTO CORRESPONDING FIELDS OF TABLE it_mver
WHERE matnr IN so_matnr
AND werks IN so_werks.

IF it_bwkey IS NOT INITIAL.
SELECT matnr bwkey bwtar
vprsv stprs hrkft ekalr
FROM mbew INTO TABLE it_mbew
FOR ALL ENTRIES IN it_bwkey
WHERE matnr IN so_matnr
AND bwkey EQ it_bwkey-bwkey.
ENDIF.

Re: Listen-Ausgabe

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
christof hat geschrieben: IF it_bwkey IS NOT INITIAL.
SELECT matnr bwkey bwtar
vprsv stprs hrkft ekalr
FROM mbew INTO CORRESPONDING FIELDS OF TABLE it_mbew
FOR ALL ENTRIES IN it_bwkey
WHERE matnr IN so_matnr
AND bwkey EQ it_bwkey-bwkey.
ENDIF.
So ist das mit ungerüsteten Programmen, die man ohne System schreibt - der rote Zusatz fehlt, sry.
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Vergleichbare Themen

5
Antw.
2502
Views
Listen Ausgabe
von SOS » 25.08.2004 16:16 • Verfasst in Dialogprogrammierung
3
Antw.
1494
Views
PBO bei Listen
von the-FoX » 02.12.2004 15:05 • Verfasst in ABAP® Core
10
Antw.
2268
Views
ABAP Listen
von CTom » 11.04.2008 08:21 • Verfasst in ABAP® für Anfänger
2
Antw.
1622
Views
Listen scrollen?
von Spaulding » 16.08.2005 17:47 • Verfasst in ABAP® Core
10
Antw.
4872
Views
Listen in Dynpros
von Jurko » 10.09.2005 13:15 • Verfasst in Dialogprogrammierung

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 4 Tagen von Lucyalison 1 / 72
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141