Hilfe! Feldzuweisung nach Select

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

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

Hilfe! Feldzuweisung nach Select

Beitrag von Nici ( / / 0 / 3 ) »
Hallo Zusammen!

Ich bekomm´s nicht geregelt! :cry:
In meinem Programm mache ich ein Select auf die Tabelle konp; Das klappt auch ganz gut - nun möchte ich aber, dass in jeder Zeile die passende Materialnummer dazu steht.
Die Materialnummer steht in gst_data-artikelnummer.

Ich habe schon folgendes ausprobiert:
MOVE gst_data-artikelnummer TO gst_konp-matnr.
MODIFY gt_konp FROM gst_konp TRANSPORTING matnr.
Aber da bekomme ich ein Laufzeitfehler.

Mein Coding sieht so aus:

Code: Alles auswählen.


  LOOP AT gt_data INTO gst_data.

* Selektion aus der Tabelle A006
    SELECT *
    APPENDING CORRESPONDING FIELDS OF TABLE gt_a006
    FROM a006
    WHERE ( kschl = 'PR00'
    OR      kschl = 'ZMPR' )
    AND     kappl = 'V'
    AND     vkorg = '0001'
    AND     vtweg = '01'
    AND     matnr = gst_data-artikelnummer
    AND     datab LE '20050701'
    AND     datbi GE '20050701'
    AND     waerk = 'EUR'.

* Selektion der Preise (KBETR) aus der Tabelle KONP
    SELECT *
    APPENDING CORRESPONDING FIELDS OF TABLE gt_konp
    FROM konp
    FOR ALL ENTRIES IN gt_a006
    WHERE knumh = gt_a006-knumh
    AND kschl = gt_a006-kschl.

  ENDLOOP.

Wie bekomme ich in die gt_konp noch meine matnr?

Danke, Nici

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


Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
in der Annahme, dass es keine Einträge mit leerer MATNR gibt...

Code: Alles auswählen.

  LOOP AT gt_data INTO gst_data. 

* Selektion aus der Tabelle A006 
    SELECT * 
    APPENDING CORRESPONDING FIELDS OF TABLE gt_a006 
    FROM a006 
    WHERE ( kschl = 'PR00' 
    OR      kschl = 'ZMPR' ) 
    AND     kappl = 'V' 
    AND     vkorg = '0001' 
    AND     vtweg = '01' 
    AND     matnr = gst_data-artikelnummer 
    AND     datab LE '20050701' 
    AND     datbi GE '20050701' 
    AND     waerk = 'EUR'. 

* Selektion der Preise (KBETR) aus der Tabelle KONP 
    SELECT * 
    APPENDING CORRESPONDING FIELDS OF TABLE gt_konp 
    FROM konp 
    FOR ALL ENTRIES IN gt_a006 
    WHERE knumh = gt_a006-knumh 
    AND kschl = gt_a006-kschl. 

    MOVE gst_data-artikelnummer TO gst_konp-matnr. 
    MODIFY gt_konp FROM gst_konp 
                   TRANSPORTING matnr
                   WHERE matnr EQ space.  "<<< dann geht's auch mit dem Nachbar...
  ENDLOOP. 
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Hi Nici,

du musst nachher noch einen LOOP über die GT_konp machen und *jeweils* mit Modify die Materialnummer nachtragen.

Ausserdem solltest du unbedingt vor dem SELECT FOR ALL ENTRIES abfragen, ob die Tabelle gt_a006 auch gefüllt ist!! Ansonsten selektierst du ALLE Einträge aus der KONP!

Zudem ist eine direkte Feldzuweisung im Select deutlich schneller, als die Zuweisung mit INTO CORRESPONDING FIELDS!

Gruß,
_.Enno._

Beitrag von Nici ( / / 0 / 3 ) »
:D Es geht! DANKE! :D

Komisch, als ich das Modify gemacht habe (an der gleichen Stelle), habe ich einen Laufzeitfehler bekommen...
Liegt es vielleicht an der Bedingung WHERE matnr EQ space?

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
richtig.

Bei Verwendung von TRANSPORTING muss eine Information angegeben werden, auf welche Datensätze sich die Anweisung bezieht (INDEX, WHERE, TABLE).
Schau mal in der Hilfe... ;)

PS: Reihenfolge ist auch wichtig.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von black_adept (Top Expert / 4098 / 128 / 941 ) »
Nici hat geschrieben: Liegt es vielleicht an der Bedingung WHERE matnr EQ space?
Ja.
Ohne die WHERE-Bedingung hast du keinen gültigen Zeiger, der angibt welche Tabellenzeile du ansprechen willst.


Noch mal ein paar Anmerkungen.

1.) Ich hoffe mal, dass deine Tabelle gt_data keine doppelten Materialnummern enthält. Sonst Selektierst du mehrfach, was nicht nötig wäre.

2.) Im 1. Select benutzt du "... APPENDING CORRESPONDING..."
Damit wird deine Tabelle gt_a006 zwangsläufig bei jedem Durchlauf größer und größer. Das mag ja durchaus gewollt sein, dass du die Tabelle gt_a006 nachher noch anders auswerten willst - nichtsdestotrotz wird dadurch aber dein nachfolgender 2. SELECT immer langsamer werden und das völlig unnötig.
Änderungsvorschlag. Statt "APPENDING" mach doch ein "INTO" in eine Hilfstabelle "temp_a006" - diese kannst du ja dann via

Code: Alles auswählen.

APPEND LINES OF temp_a006 TO gt_a006.
an die gt_a006 dranhängen, falls du die nachher noch benötigst.
Den 2. Select machst du dann mit "... FOR ALL ENTRIES IN temp_a006 ..."
Ab jetzt sollte der nachfolgende 2. SELECT (wenn du mehr als 2 Einträge in gst_data hast ) fast immer schneller ablaufen als vorher.

3.) Dasselbe Problem wie in 2. tritt auch beim 2. Select auf. Du brauchst doch nur die Preise des neuen Materials und nicht aller bisher gelesenen. Änderungsvorschlag: Selbes Vorgehen wie in 2.

4.) Auch wenn ich mir nicht vorstellen kann, dass es leere Materialnummern gibt. Eine immer machbare Vorgehensweise ist folgende.

Code: Alles auswählen.

MODIFY tmp_konp FROM gst_konp 
                   TRANSPORTING matnr 
                   WHERE matnr NE gst_konp-matnr.  "<<< dann geht's auch mit dem Nachbar. ( auch wenn dieser leer ist )


Die Tabelle tmp_konp ist die in 3.) vorgeschlagene temporäre Tabelle - dort willst du ja alle Datensätze, die neu gelesen wurden anpassen
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Hilfe! Feldzuweisung nach Select

Beitrag von Frank Dittrich (Expert / 674 / 0 / 15 ) »
(war bereits alles von anderen gesagt)

Beitrag von Nici ( / / 0 / 3 ) »
Wow, danke für die ganzen Tipps!

Ich dachte, dass es meinem Rechner schon klar ist in welcher Zeile ich die Matnr haben möchte, weil ich ja in einem Loop bin.
Ausserdem solltest du unbedingt vor dem SELECT FOR ALL ENTRIES abfragen, ob die Tabelle gt_a006 auch gefüllt ist!! Ansonsten selektierst du ALLE Einträge aus der KONP!
Danke für den Tipp, Enno!


@black_adept
Bei dem 3. Punkt habe ich Verständnisschwierigkeiten...
Meinst du damit ich soll den Select genau so machen wie den ersten mit der temp-Tabelle und ohne den Zusatz "for all entries"?
[/quote]

Beitrag von black_adept (Top Expert / 4098 / 128 / 941 ) »
Hi Nici,
Meinst du damit ich soll den Select genau so machen wie den ersten mit der temp-Tabelle und ohne den Zusatz "for all entries"?
Nicht ganz. Der "for all entries" ist schon ok - aber du sollst "INTO" statt "APPENDING" machen und dafür in eine temporäre Tabelle tmp_konp.

Grund: Wenn du im nachfolgenden Befehl das MODIFY machst, ist es m.E. besser dies auf eine kleine Tabelle zu machen, dort dann überall dieselbe Materialnummer einzutragen und dann die kleine Tabelle an die große anzuhängen. Andernfalls muss der MODIFY einen full-tablescan machen auf der großen Tabelle um letztlich doch nur die eben neu angefügten Tabellenzeilen zu verändern.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Nici ( / / 0 / 3 ) »
Hi Stefan,

also sieht es dann so aus:

Code: Alles auswählen.

LOOP...
...
..
SELECT * 
INTO CORRESPONDING FIELDS OF TABLE gtemp_konp 
FROM konp 
FOR ALL ENTRIES IN gt_a006 
WHERE knumh = gt_a006-knumh 
AND kschl = gt_a006-kschl. 

MOVE gst_data-artikelnummer TO gtemp_konp-matnr. 
MODIFY gtemp_konp.

APPEND LINES OF gtemp_konp TO gt_konp.
..
...
ENDLOOP.
Sehe ich das so richtig?

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Jein!

Beim Modify musst Du 'TRANSPORTING matnr WHERE matnr NE gtemp_konp-matnr' benutzen, weil Du ja die anderen Felder der jewiligen Zeile nicht mit dem Inhalt aus der (impliziten) Kopfzeile der gtemp_konp überschreiben willst...

PS:
mit dem 'einfachen' MODIFY wird wieder ein Laufzeitfehler ausgelöst, weil es keinen impliziten Zeiger innerhalb eines LOOP's auf die gtemp_konp gibt.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von black_adept (Top Expert / 4098 / 128 / 941 ) »

Code: Alles auswählen.

SELECT * 
INTO CORRESPONDING FIELDS OF TABLE gtemp_konp 
FROM konp 
FOR ALL ENTRIES IN gt_a006 
WHERE knumh = gt_a006-knumh 
AND kschl = gt_a006-kschl. 
"FOR ALL ENTRIES in gt_a006" Da würde ich schon eine gtemp_a006 nehmen, die du beim 1. Select gefüllt hast ( siehe mein 1. Posting in diesem Thread )

Code: Alles auswählen.

MODIFY gtemp_konp.
Ich vermisse ein WHERE und ein TRANSPORTING.

Code: Alles auswählen.

APPEND LINES OF gtemp_konp TO gt_konp.
ja - so in etwa meinte ich das.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Nici ( / / 0 / 3 ) »
Richtig, "transporting" und "where"!
...damit kein Laufzeitfehler kommt.

Hm, hatte das wieder vergessen.

Danke nochmals für die ganzen Tipps!
-> Wieder was gelernt! <- :D

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Nici,

wenn ich mich an Deinen Abschlußkommentar eines früheren Threads richtig erinnere, muss ich Dir widersprechen :twisted:


Dumme Blondinen fragen nicht und bleiben dumm.
Ergo, bist Du eine schlaue Blondine ;)
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Nici ( / / 0 / 3 ) »
:D :lol: :D
Vielen Dank für das Kompliment!

Jetzt bin ich bestimmt 5 cm gewachsen!!! :wink:
Ganz ehrlich!!!

Mit dem programmieren habe ich es noch nicht so, aber ich versuche stets mein Bestes zu geben!
Manchmal habe ich schon so meine Probleme mit der ganzen Logik...ob das aber an der Haarfarbe liegt?!? Fraglich, fraglich... :wink: :D

Vergleichbare Themen

2
Antw.
1440
Views
Feldzuweisung in einem Select
von ermel » 25.07.2008 11:03 • Verfasst in ABAP® für Anfänger
4
Antw.
1455
Views
Hilfe bei SELECT
von treyfifty » 18.02.2016 13:57 • Verfasst in ABAP® für Anfänger
2
Antw.
1130
Views
Hilfe bei SELECT
von supermario73 » 31.01.2008 14:02 • Verfasst in ABAP® für Anfänger
1
Antw.
1294
Views
Select-Options und F4 Hilfe
von guest » 25.10.2005 17:57 • Verfasst in ABAP® Core
2
Antw.
1859
Views
Hilfe bei Select-Optimierung
von Troilus » 14.12.2007 14:47 • Verfasst in ABAP® Core

Ü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

Aktuelle Forenbeiträge

Regex in where
vor 2 Stunden von edwin 1 / 41
Programm anlegen mit Vorlage
vor 6 Stunden von DeathAndPain 2 / 95
IT0024 Qualifikationen CP-ID
vor 6 Stunden von DeathAndPain 2 / 337
BUSOBJEKT zu CMIS PHIO ermitteln
vor 8 Stunden von snooga87 1 / 70

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

Regex in where
vor 2 Stunden von edwin 1 / 41
Programm anlegen mit Vorlage
vor 6 Stunden von DeathAndPain 2 / 95
IT0024 Qualifikationen CP-ID
vor 6 Stunden von DeathAndPain 2 / 337
BUSOBJEKT zu CMIS PHIO ermitteln
vor 8 Stunden von snooga87 1 / 70

Unbeantwortete Forenbeiträge

Regex in where
vor 2 Stunden von edwin 1 / 41
BUSOBJEKT zu CMIS PHIO ermitteln
vor 8 Stunden von snooga87 1 / 70
aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3249