Abap aufgaben Thema ist als GELÖST markiert

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

Abap aufgaben

Beitrag von jasmine (ForumUser / 3 / 0 / 0 ) »
Hallo leute ich habe diese aufgabe bekommen und brauche hilfe !

ich darf keine join benutzen und keine select/endselect
ich muss mit internetabelle arbeiten


Selektion über bestehende Aufträge.

Selektionsfelder:
Auftraggeber
Warenempfänger
Material-Nr
Checkbox, ob die Adressen von Auftraggeber und Warenempfänger mit ausgegeben werden sollen.
Alle Selektionsfelder mit F1-Hilfe und Mehrfachselektion (ausser Adress-Ausgabe-Anforderung).
Eingegebene Kombinationen sind beliebig, dementsprechend müssen die Selektionen gemacht werden (also Eingabe von einem Feld ist OK, von 2 Feldern ist OK, auch alle 3 sind in Ordnung)
Ist die Material-Nr. leer, werden die Aufträge der Selektion mit allen Material-Positionen angezeigt.

Ausgabe einer Write-Liste mit Auftragsnr. +. Postionsnummer + die o.g. Daten + Adressen (falls Adressen angefordert sind). Diese Liste sollte auch übersichtlich ausgegeben werden.

Tabellen: VBAK Auftragskopf
VBAP Auftragsposition
VBPA Partner Vertriebsbeleg



Konzept für Selektionsprogramm

Bitte versuche, mit diesen Vorgaben das Programm zu schreiben:
1. 3 Tabellenstrukturen anlegen, die Deiner Auftrags-Tabelle entsprechen

2. Mindestens eines der Selektionsfelder muss gefüllt sein

3. Wenn AG gefüllt ist:
a. Formroutine GET_AG_DATA aufrufen,
Übergabe mit Änderung: Tabelle1
In der Formroutine die Tabelle1 mit den eingetragenen Werten selektieren

4. Wenn WE gefüllt ist:
a. Formroutine GET_WE_DATA aufrufen
Übergabe mit Änderung: Tabelle2
In der Formroutine die Tabelle2 mit den eingetragenen Werten selektieren
Achtung: wenn gelesen, die Daten der Tabelle noch so verändern, dass sich der WE auch im richtigen Feld befindet!

5. Wenn Material-Nr. gefüllt ist:
a. Formroutine GET_MAT_DATA aufrufen
Übergabe mit Änderung: Tabelle3
In der Formroutine die Tabelle3 mit den eingetragenen Werten selektieren

Jetzt haben wir in mindestens einer Tabelle Inhalte (mindestens eines der Selektions-Felder muss ja gefüllt sein)
6. Formroutine BUILD_OUTPUT anlegen,
Übergabe zum Lesen:
Tabelle2
Tabelle3
Übergabe mit Änderung
Tabelle1
Coding zu dieser Routine in Punkt 8.

7. Routine OUTPUT_DATA anlegen,
Übergabe zum Lesen:Tabelle1
In der Routine loop über die Übergebene Tabelle1 und Daten ausgeben

8. Coding in der Formroutine BUILD_OUTPUT:
In dieser Routine werden die Daten so zusammen gestellt, dass sie am Ende in der Tabelle1 stehen.
Coding in der Routine BUILD_OUTPUT:
a. Ist Tabelle1 gefüllt
JA:
Ist Tabelle2 gefüllt:
JA:
Loop über Tabelle1
lesen Tabelle2 mit der Belegnummer aus dem gelesenen Satz der Tabelle1
Ist die Belegnummer in der Tabelle2 vorhanden?
JA:
WE-Daten aus Tabelle 2 in die Tabelle1 übertragen
Tabelle 1 modifizieren
NEIN:
Der WE passt nicht zu den selektierten AG, diesen Satz,
den können wir also nicht brauchen:
Satz aus der Tabell1 löschen.
ENDE
NEIN:
Loop über Tabelle1
lesen den WE-Daten zu dieser Auftragsnummer
WE-Daten in Tabelle1 einstellen
Tabelle1 modifizieren
ENDE
NEIN:
Ist Tabelle2 gefüllt?
JA:
Tabelle2 wird komplett in die Tabelle1 übertragen.
ENDE
ENDE

So, jetzt haben wir Tabelle1 + Tabelle 2 zusammen gebracht, falls da was gefüllt ist. Nun müssen wir uns noch mit Tabelle 3 beschäftigen.
b. Ist Tabelle3 gefüllt:
JA:
Ist Tabelle1 gefüllt
JA:
Loop über Tabelle 1
Lesen Tabelle3 mit der Belegnr. aus Tabelle1
Ist der Satz in Tabelle3 vorhanden
JA:
Fehlende Daten aus Tabelle3 nach Tabelle1 übertragen
Tabelle1 modifizieren
NEIN:
Satz aus der Tabelle1 löschen
ENDE
NEIN:
Tabelle3 wird vollständig nach Tabelle1 übertragen
ENDE
ENDE

c. Jetzt kann es sein, dass uns noch Daten fehlen, wenn nicht alle 3 Selektionskriterien gefüllt sind
Loop über Tabelle1
• Sind die Daten des AG leer, dann zusätzlich lesen (nur für diesen einen Satz aus Tabelle1)
fehlende Daten übertragen, Satz modifizieren
• Sind die Daten des WE leer, dann zusätzlich lesen (nur diesen einen Satz ausTabelle1) fehlende Daten übertragen, Satz modifizieren
• Sind die Daten mit der Material-Nr. leer
Material-Position zu diesem Beleg lesen (Positionsnummer < 900000)
ENDE


LG
Zuletzt geändert von jasmine am 20.07.2021 11:45, insgesamt 1-mal geändert.


Re: Abap aufgaben

Beitrag von IHe (ForumUser / 71 / 21 / 22 ) »
Was ist denn deine konkrete Frage oder möchtest du einfach, dass jemand deine Aufgabe übernimmt und für dich macht? Das wird dir langfristig nicht helfen.

Re: Abap aufgaben

Beitrag von jasmine (ForumUser / 3 / 0 / 0 ) »
ich habe es scho gelosst ich will nur andere moglichkeiten sehen !

LG

Re: Abap aufgaben

Beitrag von Thomas R. (Expert / 718 / 51 / 30 ) »
Edit: Seltsam, jetzt sehe ich die früheren Einträge wieder. Wahrscheinlich hatte ich nur Tomaten auf den Augen!
Auch wenn das nicht mein Thread ist:
Irgendwie fehlen jetzt der ursprüngliche Post sowie die Antwort darauf.
Bisher bin ich davon ausgegangen, dass Einträge nicht gelöscht werden.

MfG
Thomas R.
Zuletzt geändert von Thomas R. am 20.07.2021 12:34, insgesamt 1-mal geändert.

Re: Abap aufgaben

Beitrag von jasmine (ForumUser / 3 / 0 / 0 ) »
das ist mein coding ! wo habe ich probleme?



*&---------------------------------------------------------------------*
*& Report ZJMO_WSWSCHR4
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

report zjmo_wswschr4.

tables: vbak, vbap, vbpa.

data: gt_auftrag type zjmo_ts_wswschr4.

data: lv_fehler type xfeld,
ls_auftrag type zjmo_tt_wswschr4,
lt_auftrag type zjmo_tt_wswschr4,
ls_waren type zjmo_tt_wswschr4,
lt_waren type zjmo_tt_wswschr4,
lt_mtnr type zjmo_tt_wswschr4,
ls_mtnr type line of zjmo_tt_wswschr4,
lt_adrs type zjmo_tt_wswschr4,
ls_adrs type zjmo_tt_wswschr4,
struktur_auftrag type zjmo_ts_wswschr4 .

selection-screen begin of block block1 with frame title title1.
******************************************Auftraggeber
select-options pa_ag for vbak-kunnr.
******************************************Warenempfänger
select-options pa_we for vbpa-kunnr.
******************************************Material-Nr
select-options pa_mnr for vbap-kdmat.

selection-screen end of block block1.

selection-screen begin of block block2 with frame title title2.
parameter pa_adr as checkbox.
selection-screen end of block block2.

start-of-selection.

if
pa_ag is initial and
pa_we is initial and
pa_mnr is initial.

lv_fehler = 'X'.

message 'Fehler: Bitte füllen Sie mind. einer der Felder aus!!!'
type 'S' display like 'E'.

endif.


if pa_ag is not initial.
perform get_ag_data.
endif.

if pa_we is not initial.
perform get_we_data.
endif.

if pa_mnr is not initial.
perform get_mat_data.
endif.

* if pa_adr = 'X'.
* lv_fehler = ''.
* perform print_main.
* endif.

form get_ag_data.

data: lt_auftrag type zjmo_tt_wswschr4,
ls_auftrag type line of zjmo_tt_wswschr4,
lt_waren type zjmo_tt_wswschr4,
ls_waren type line of zjmo_tt_wswschr4,
lt_mtnr type zjmo_tt_wswschr4,
ls_mtnr type line of zjmo_tt_wswschr4.

select * from vbak
appending corresponding fields of table lt_auftrag
where kunnr in pa_ag.

* loop at lt_auftrag into ls_auftrag-kunnr.
* read table lt_auftrag with key vbeln = ls_auftrag-vbeln into ls_waren.


* endloop.


endform. "print_ag

*&---------------------------------------------------------------------*
*& Form get_we_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form get_we_data.

data: lt_auftrag type zjmo_tt_wswschr4,
ls_auftrag type line of zjmo_tt_wswschr4,
lt_waren type zjmo_tt_wswschr4,
ls_waren type line of zjmo_tt_wswschr4,
lt_mtnr type zjmo_tt_wswschr4,
ls_mtnr type line of zjmo_tt_wswschr4.


select * from vbpa
appending corresponding fields of table lt_waren
where kunnr in pa_we.

* loop at lt_waren into ls_waren-kunnr_we.
* read table lt_waren with key vbeln = ls_auftrag-vbeln into ls_auftrag.

* endloop.


endform. "print_we

*&---------------------------------------------------------------------*
*& Form get_mat_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form get_mat_data.

data: lt_auftrag type zjmo_tt_wswschr4,
ls_auftrag type line of zjmo_tt_wswschr4,
lt_waren type zjmo_tt_wswschr4,
ls_waren type line of zjmo_tt_wswschr4,
lt_mtnr type zjmo_tt_wswschr4,
ls_mtnr type line of zjmo_tt_wswschr4.


select * from vbap
appending corresponding fields of table lt_mtnr
where matnr in pa_mnr.

* loop at lt_mtnr into ls_mtnr-kdmat.
* read table lt_mtnr with key posnr = ls_waren-posnr into ls_waren.


* endloop.


endform. "get_mat_data


*&---------------------------------------------------------------------*
*& Form output_data
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form BUILD_OUTPUT.

data: lt_auftrag type zjmo_tt_wswschr4,
ls_auftrag type line of zjmo_tt_wswschr4,
lt_waren type zjmo_tt_wswschr4,
ls_waren type line of zjmo_tt_wswschr4,
lt_mtnr type zjmo_tt_wswschr4,
ls_mtnr type line of zjmo_tt_wswschr4.


if lt_auftrag is not initial.
if lt_waren is not initial.

loop at lt_auftrag into ls_auftrag.
read table lt_waren with key vbeln = ls_auftrag-vbeln into ls_waren.

if sy-subrc <> 0. "Wenn Vbeln nicht gefunden -> eintrag loeschen
delete lt_auftrag from ls_auftrag.

elseif sy-subrc = 0. "Wenn Vbln in Waren gefunden -> Tabelle modifizieren
modify lt_auftrag from ls_auftrag
transporting kunnr_we where vbeln = ls_waren-vbeln.

endif.

if lt_waren is initial.

loop at lt_auftrag into ls_auftrag.
read table lt_auftrag with key 'WE' into ls_auftrag.

modify lt_auftrag from ls_auftrag.

if lt_waren is not initial.
lt_waren = lt_auftrag.

endif.
endloop.
endif.
endloop.
endif.
endif.

if lt_mtnr is not initial .

if lt_auftrag is not initial.

loop at lt_auftrag into ls_auftrag.
read table lt_mtnr with key vbeln = ls_auftrag-vbeln into ls_mtnr.

if sy-subrc = 0.
lt_mtnr = lt_auftrag.

modify lt_auftrag from ls_auftrag.

if sy-subrc <> 0.
delete lt_auftrag from ls_auftrag.

if lt_mtnr is not initial.
lt_mtnr = lt_auftrag.

endif.
endif.
endif.
endloop.
endif.
endif.

loop at lt_auftrag into ls_auftrag.

if 'AG' is initial.
read table lt_auftrag with key 'AG' into ls_auftrag.

if 'WE' is initial.
read table lt_auftrag with key 'WE' into ls_auftrag.

if 'Material-Nr.' is initial.
read table lt_auftrag with key posnr = 900000 into ls_auftrag.

endif.
endif.
endif.
endloop.


write:/ 'Auftraggeber: ', ls_auftrag-kunnr,
'Warenempfänger: ', ls_auftrag-kunnr_we,
'Material-Nr: ', ls_auftrag-kdmat.
uline.

endform. "output_data

Re: Abap aufgaben

Beitrag von jocoder (Specialist / 260 / 3 / 75 ) »
Zu bestehenden Implementierung:
Ein Problem besteht sicherlich mit dem Gültigkeitsbereich der Variablen. In den Prozeduren werden alle Variablen, die Programmglobal bereits deklariert wurden, nochmals deklariert (Verschattung), was unnötig ist (z.B. Prozedur get_ag_data).

Code: Alles auswählen.

form get_ag_data.

data: lt_auftrag type zjmo_tt_wswschr4,
ls_auftrag type line of zjmo_tt_wswschr4,
lt_waren type zjmo_tt_wswschr4,
ls_waren type line of zjmo_tt_wswschr4,
lt_mtnr type zjmo_tt_wswschr4,
ls_mtnr type line of zjmo_tt_wswschr4.

select * from vbak
appending corresponding fields of table lt_auftrag
where kunnr in pa_ag.


endform. "print_ag
Wenn die Prozedur get_we_data die Warenempfänger gelesen werden sollten, ist die SELECT-Bedingung unvollständig.

Code: Alles auswählen.

select * from vbpa
appending corresponding fields of table lt_waren
where kunnr in pa_we.
Die Partnerrolle sollte eigentlich Bestandteil der SELECT-Bedingung sein.

Code: Alles auswählen.

select * from vbpa
appending corresponding fields of table lt_waren
where kunnr in pa_we and parvw = 'WE'.
In der Prozedur build_output habe ich auch eine Inkonsistenz gefunden.

Code: Alles auswählen.

if lt_auftrag is not initial.
if lt_waren is not initial.

loop at lt_auftrag into ls_auftrag.
read table lt_waren with key vbeln = ls_auftrag-vbeln into ls_waren.

if sy-subrc <> 0. "Wenn Vbeln nicht gefunden -> eintrag loeschen
delete lt_auftrag from ls_auftrag.

elseif sy-subrc = 0. "Wenn Vbln in Waren gefunden -> Tabelle modifizieren
modify lt_auftrag from ls_auftrag
transporting kunnr_we where vbeln = ls_waren-vbeln.

endif.

Die Modify-Anweisung hat hier keine Auswirkungen. Falls der Warenempfänger in die Tabelle lt_auftrag geschrieben werden sollte, kann dies einfacher mit Feld-Symbolen bewerkstelligt werden.

Code: Alles auswählen.

field-symbols <fs_auftrag> like line lt_auftrag.
loop at lt_auftrag assigning <fs_auftrag>.
  read lt_waren with key vbeln = <fs_auftrag>-vbeln into ls_waren
  if sy-subrc = 0.
    <fs_auftrag>-kunnr_we = ls_waren-kunnr_we.
  else.
     delete lt_auftrag from <fs_auftrag>.
  endif.
endloop.
Ein weiterer Punkt, der nicht unbedingt für den korrekten Programmablauf notwendig ist, aber den Lesefluss vereinfacht, ist die Namensgebung.
Bei korrekter Anwendung der ungarischen Notation müsste lt_auftrag in gt_auftrag umbenannt werden.
Der Name get_orders_for_customers beschreibt den Sinn der Prozedur get_ag_data zudem besser.

Code: Alles auswählen.

form get_orders_for_customers.
  select * from vbak
    into corresponding fields of table gt_auftrag
    where kunnr in pa_ag.
endform.
Für zukünftige Implementierungen:
Einfacher lassen sich solche Anforderungen mit Tabellenjoins bzw. SELECT FOR ALL ENTRIES Anweisungen lösen.

Re: Abap aufgaben

Beitrag von black_adept (Top Expert / 3564 / 76 / 722 ) »
Moin Jasmin,

ich glaube nicht, dass irgend jemand hier im Forum diese Aufgabe schreiben wird ( die meisten hier können schon ABAP und brauchen keine weiteren Übungsaufgaben) - aber ich mache mal ein paar Anmerkungen zu deiner Lösung:
  • Es gibt ein Code-Tag hier im Forum, womit man deinen Code halbwegs schön formatiert ausgeben kann - Beispiel siehe nächster Punkt von mir
  • Code: Alles auswählen.

    select-options pa_mnr for vbap-kdmat.
    Warum KDMAT und nicht MATNR zumal du nachher auch nach VBAP-MATNR selektierst? Und warum heißt eine Selektionsoption "PA...", da "PA" steht doch meist für PArameter steht. Und warum verwendest du nur 6 Buchstaben? Du hast 8 Buchstaben zur Verfügung und SO_MATNR würde passen.
  • Deine Variable "fehler" macht nix. Es gibt im Editor die "Erweiterte Syntaxprüfung" mit der man ein Programm "schön" machen kann. Die findet u.a. solche überflüssigen Variablen ( Kein Lesezugriff )
  • Wenn du schon einen Fehler erkennst brauchst du die ganzen anderen Sachen gar nicht durchführen - Vielleicht solltest du diese Prüfung inkl. Fehlermeldung zum Zeitpunkt "AT SELECTION SCREEN" durchführen und als echte E-Meldung um auf dem Selektionsbild zu bleiben.
  • Die Prüfung

    Code: Alles auswählen.

    pa_ag is initial and
    pa_we is initial and
    pa_mnr is initial.
    macht gemeinerweise das was du möchtest - aber genau betrachtet rollen sich mir die Zehennägel auf wenn ich das sehe, da du die (leider vorhandene) Kopfzeile anschaust obwohl du stattdessen die Selekt-Options-Tabelle überprüfen solltest.
  • Entgegen der Aufgabenstellung hast du keine Routine "OUTPUT_DATA" sondern machst die Ausgabe in der Routine "BUILD_OUTPUT" und diese wird auch nicht aufgerufen
  • Warum machst du stets ein "SELECT...APPENDING" statt "SELECT ... INTO"? Du sollteste dir letzteres angewöhnen und ersteres nur dann verwenden wenn du das tatsächlich willst.
  • Die Routine BUILD_OUTPUT ist grundsätzlich falsch aufgesetzt. Aber das liegt an der sinnlosen ( und völlig am ABAP-Alltag vorbei definierten ) Anweisung, was diese Routine erledigen soll. Daher habe ich davon abgesehen nachzuschauen, ob du das korrekt umgesetzt hast.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Seite 1 von 1

Vergleichbare Themen

Suche ABAP Aufgaben mit Lösung
von ssteger » 08.08.2013 16:06
Kundeneigene ABAP-Muster Vorlage im ABAP-Editor anlegen
von Stentor » 19.07.2005 11:10
ABAP Workbench und ABAP Dictionary - für Einsteiger
von schnonus » 03.04.2008 10:39
ABAP 7.02 - Neues Feature - Pragmas in ABAP
von foessleitnerj » 09.01.2013 17:02
ABAP Objects oder ABAP Referenz
von Gast » 23.06.2005 15:52