interne Tabelle zugreifen im Unterprogramm

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
15 Beiträge • Seite 1 von 1
15 Beiträge Seite 1 von 1

interne Tabelle zugreifen im Unterprogramm

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Kollegen, ich habe folgendes Problem.

Ich rufe 2 unterschiedliche Unterprogramme mir Perform auf. Eigentlich soll das ganze über ein Unterprogramm funktionieren. Statt der Parameter Space möchte ich gerne ob es um it_zvokabelsearch-vokabel_eng oder it_zvokabelsearch-vokabel_art handelt per Parameter übergeben. Es funktioniertleider nicht. Im Unterprogramm werden nur Komponenten der it_zvokabelsearch verlangt. Parameter kann ich nicht verwenden. Kennt jemand sich damit aus?


WHEN 'SEARCH_VOKABEL'.
IF tabstrip_vokabel-activetab EQ 'FKT_VOKABEL'.

PERFORM search USING space
p_vokabel_art
wa_zvokabelsearch-antwort_art
CHANGING it_zvokabelsearch
wa_zvokabelsearch
p_antwort_art.

ELSEIF tabstrip_vokabel-activetab EQ 'FKT_ENGDE'.

PERFORM search_eng USING space
p_vokabel_eng
wa_zvokabelsearch-vokabel_de
CHANGING it_zvokabelsearch
wa_zvokabelsearch
p_vokabel_de.
ENDIF.

FORM search USING p_vokabel
p_dyn_vokabel
p_antwort LIKE wa_zvokabel-vokabel_art
CHANGING
p_it_zvokabel LIKE it_zvokabelsearch
p_wa_zvokabel LIKE wa_zvokabel
p_ausgabe LIKE p_vokabel_de.

LOOP AT it_zvokabelsearch INTO p_wa_zvokabel WHERE vokabel_art =
p_dyn_vokabel.
p_ausgabe = p_antwort.
ENDLOOP.

ENDFORM. "search

FORM search_eng USING p_vokabel
p_dyn_vokabel
p_antwort LIKE wa_zvokabel-vokabel_art
CHANGING
p_it_zvokabel LIKE it_zvokabelsearch
p_wa_zvokabel LIKE wa_zvokabel
p_ausgabe LIKE p_vokabel_de.

LOOP AT it_zvokabelsearch INTO p_wa_zvokabel WHERE vokabel_eng =
p_dyn_vokabel.
p_ausgabe = p_antwort.
ENDLOOP.

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


Beitrag von babap (Expert / 681 / 1 / 1 ) »
Hallo,

ich habe es noch nicht ganz geblickt.

Du hast eine golbale Tabelle it.... .

Du ruftst zwei Form-Routinen auf, mit einem (...) Parameter SPACE, mit noch ein paar Parametern und ein paar Changing-Pararmetern.

Dann LOOPst du in der Form-Routine über die globale Tabelle und suchst da irgendwas.

Sorry, solche Programme findet man zwar noch als Altlast im SAP-Kernel, aber selbst neu machen sollte man sowas nicht.

Schön alle Parameter füllen und alle übergeben, auch die Tabelle, korrekt typisiert etc.
Dann findet man auch was man sucht ... und die Fehlermeldungen sind aussagekräftiger.

Für eine Beantwortung der Frage wäre tatsächlich auch die DATA: Anweisung wichtig.
Und erst mit einer Beschreibung, was in den Tabellen drin ist, was die Parameter enthalten, und was das Programm eigentlich machen soll kann man überhaupt an eine Problemlösung denken ...

Gruß
babap

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Babap,
vielen Dank für deine Interesse.

Das ist genau mein Problem, statt Space möchte ich Parameter eingeben. Und nur das Unterprogramm search aufrufen.
Es soll so geschrieben werden.
WHEN 'SEARCH_VOKABEL'.
IF tabstrip_vokabel-activetab EQ 'FKT_VOKABEL'.

PERFORM search USING it_zvokabelsearch-vokabel_art
p_vokabel_art
wa_zvokabelsearch-antwort_art
CHANGING it_zvokabelsearch
wa_zvokabelsearch
p_antwort_art.

ELSEIF tabstrip_vokabel-activetab EQ 'FKT_ENGDE'.

PERFORM search USING it_zvokabelsearch-vokabel_eng
p_vokabel_eng
wa_zvokabelsearch-vokabel_de
CHANGING it_zvokabelsearch
wa_zvokabelsearch
p_vokabel_de.
ENDIF.

FORM search USING p_vokabel
p_dyn_vokabel
p_antwort LIKE wa_zvokabel-vokabel_art
CHANGING
p_it_zvokabel LIKE it_zvokabelsearch
p_wa_zvokabel LIKE wa_zvokabel
p_ausgabe LIKE p_vokabel_de.

LOOP AT it_zvokabelsearch INTO p_wa_zvokabel WHERE vokabel_variable =
p_dyn_vokabel.
p_ausgabe = p_antwort.
ENDLOOP.

ENDFORM. "search

Es funktioniert aber nicht. Ich habe die interne Tabelle auch mit Header Line probiert. Ich soll wert statt Referenz übergeben.
Referenz ist it_zvokabelsearch-vokabel_eng
Wert ist: Vokabel_eng und Vokabel_art. Das sind die Spaltenüberschriften der InterneTabelle.
babap hat geschrieben:Hallo,

ich habe es noch nicht ganz geblickt.

Du hast eine golbale Tabelle it.... .

Du ruftst zwei Form-Routinen auf, mit einem (...) Parameter SPACE, mit noch ein paar Parametern und ein paar Changing-Pararmetern.

Dann LOOPst du in der Form-Routine über die globale Tabelle und suchst da irgendwas.

Sorry, solche Programme findet man zwar noch als Altlast im SAP-Kernel, aber selbst neu machen sollte man sowas nicht.

Schön alle Parameter füllen und alle übergeben, auch die Tabelle, korrekt typisiert etc.
Dann findet man auch was man sucht ... und die Fehlermeldungen sind aussagekräftiger.

Für eine Beantwortung der Frage wäre tatsächlich auch die DATA: Anweisung wichtig.
Und erst mit einer Beschreibung, was in den Tabellen drin ist, was die Parameter enthalten, und was das Programm eigentlich machen soll kann man überhaupt an eine Problemlösung denken ...

Gruß
babap

Beitrag von GastX (Specialist / 277 / 4 / 18 ) »
Du möchtest Deiner Form mitgeben, auf welche Spalte die Where-Bedingung angewendet wird? Dann musst Du die Where-Bedingung auch dynamisch aufbauen und entsprechend (d.h. mit Klammern drum) mitgeben.

Die von Dir geschriebene Form scheint mir eh noch zu überarbeiten zu sein:
die Variable vokabel_variable wird nicht gefüllt, soll das der Inhalt des Paramters p_vokabel sein? Etwas aufgehübscht hattest Du geschrieben

Code: Alles auswählen.

FORM search USING p_vokabel
                  p_dyn_vokabel
                  p_antwort LIKE wa_zvokabel-vokabel_art
            CHANGING
                  p_it_zvokabel LIKE it_zvokabelsearch
                  p_wa_zvokabel LIKE wa_zvokabel
                  p_ausgabe LIKE p_vokabel_de.

  LOOP AT it_zvokabelsearch INTO p_wa_zvokabel 
                           WHERE vokabel_variable = p_dyn_vokabel.
    p_ausgabe = p_antwort.
  ENDLOOP.

ENDFORM. "search
So wird über alle Zeilen geloopt, die in der Spalte vokabel_variable den Wert p_dyn_vokabel haben. Wenn Du per p_vokabel o.ä. aber die Spalte selbst mitgeben willst, würdest Du so zu einem Ergebnis kommen:

Code: Alles auswählen.

FORM search USING p_vokabel
                  p_dyn_vokabel
                  p_antwort LIKE wa_zvokabel-vokabel_art
            CHANGING
                  p_it_zvokabel LIKE it_zvokabelsearch
                  p_wa_zvokabel LIKE wa_zvokabel
                  p_ausgabe LIKE p_vokabel_de.

  DATA: iv_bedingung type char40.
  CONCATENATE p_vokabel ' = ''' p_dyn_vokabel '''' INTO iv_bedingung
              RESPECTING BLANKS.
  LOOP AT it_zvokabelsearch INTO p_wa_zvokabel
                           WHERE (iv_bedingung).
    p_ausgabe = p_antwort.
  ENDLOOP.

ENDFORM. "search

danke GastX

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Guten Morgen Gastx,

vielen danke für die Nachricht und die Mühe. Obwohl ich sehr kompliziert das Problem erklärt habe, hast du es verstanden, was ich meinte :-) Respekt:-)

Ich wollte wie du meintest in der where Bedingung Inhalt des Paramters p_vokabel (das ist eine Spalte der Tabelle, also die überschirft der Spalte mit dem Eingabefeld p_dyn_vokabel Inhalt aus dem Dynpro vergleichen, dann entsprechendes Feld ausgeben.

Ich werde heute abend versuchen den Code zu verbessern.

Was bedeuten die Hoch Kommas ich mach ein Concatenate into iv_bedingung das ist ok aber den Teil habe ich nicht verstanden, wozu ist es? (p_vokabel ' = ''' p_dyn_vokabel '''' RESPECTING BLANKS)

Schöne Grüße

Beitrag von GastX (Specialist / 277 / 4 / 18 ) »
Hallo meliz,
die Variable iv_bedingung soll eine where-Bedingung, inklusive Hochkomma, enthalten. Ein einfaches Hochkomma würde aber als Anfang bzw. Ende eines Literals verstanden.
Um die mitzugeben, werden die innerhalb eines Literals als doppelte Hochkomma mitgegeben.
Beispiel:

Code: Alles auswählen.

alpha = 'ab''c'.
write:/ alpha.
ergibt als Ausgabe und

Code: Alles auswählen.

p_vokabel = 'VOKABEL_ENG'.
p_dyn_vokabel = 'Vokabel'.
CONCATENATE p_vokabel ' = ''' p_dyn_vokabel '''' INTO iv_bedingung 
           RESPECTING BLANKS.
füllt iv_bedingung mit dem Inhalt

Code: Alles auswählen.

 VOKABEL_ENG = 'Vokabel'

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Gastx,
ich habe mich bisher nicht mit dem Programm beschäftigen können. Ich werde es am WE ausprobieren.
Freue mich schon drauf.
danke, schöne Grüße

Syntaxfehler

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Gastx,
ich habe das Programm angepaßt. Es kommt die Fehlermeldung:
Der Satz mit "...(IV_BEDINGUNG)" am Ende unerwartet abgeschlossen. Stimmt syntaktisch etwas nicht?
Ich habe einiges ausprobiert, mit Klammern und ohne es kommt immer die selbe Meldung.
Schöne Grüße

Beitrag von edwin (Specialist / 302 / 10 / 68 ) »
Hallo,

Im CONCATENATE sollte an letzter Stelle noch ein '.' sein,
Statements in SAP werden mit '.' abgeschlossen.

das Ergebnis sollte lauten:

Code: Alles auswählen.

 VOKABEL_ENG = 'Vokabel'.
 

Gruss Edwin

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo edwin,
danke fü die Nachricht. Es geht leider immer noch nicht. Die Klammer vor iv_vokabel ist rot. Die zweite ist schwarz.
Was meinst du mit letzte Stelle? Letzte Stelle ist nach Repecting blanks oder? Ich habe nac INTO iv_bedingung komma gesetzt einiges ausprobiert, geht leider nicht. Eine Klammer ist immer noch rot. Und es kommt die gleiche Fehlermeldung.
Grüße

Beitrag von GastX (Specialist / 277 / 4 / 18 ) »
Mist, da habe ich nicht richtig nachgedacht, sorry.
Der vorgeschlagene Aufbau funktioniert, wenn Du statt eines Loops einen Select hättest, also

Code: Alles auswählen.

 select * from sflight into it_sflight where (bedingung).
(Apropos: den von edwin angesprochenen Punkt habe ich nach der Klammer wie in obigem Beispiel. An dem liegt's nicht.)
Bei Loops funktioniert das nicht! Steht so auch noch in der F1-Hilfe zu Loop, das macht das ja schon peinlich
Zusatz 3
... WHERE log_exp
...
Damit sind alle logischen Ausdrücke bis auf IS ASSIGNED, IS REQUESTED und IS SUPPLIED möglich. Die dynamische Angabe einer Komponente über eingeklammerte zeichenartige Datenobjekte ist nicht möglich.
...
Ich denk nochmal drüber nach...

Wie viele Spalten gibt es eigentlich, nach denen du fragen willst?
Hintergrund:
Wenn Du die Daten in einer DDIC-Tabelle hast, könntest Du dynamische Selects machen statt der Loops über interne Tabellen.
Wenn es nicht allzuviele Spalten sind, könntest Du für jede einen eigenen Loop schreiben und die vokabel-Variable per CASE auswerten, um festzustellen, welchen Loop Du aufrufst...

Wie oben geschrieben: ich denk nochmal drüber nach. (Später, jetzt ist es mir zur spät.)
Gruß,
Frank

dynamische Werte zuweisen

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Frank ,

dadurch habe ich was Neues gelernt:-) Danke.
Das Programm arbeitet mit einer DDIC-Tabelle die zvokabel heißt. Ich arbeite nicht mit DDIC Tabelle die zvokabel heißt sondern mit internen Tabellen. Weil das Program, das ich geschrieben habe ist ein Vokabeltrainingsprogramm, und macht viel mehr als search, deshalb arbeite ich mit mehreren interne tabellen. Wie z.B. wenn ich answer klicke kommt die Antwort, wenn ich nächst klicke, oder back, oder clear oder Tabellenpflege usw. macht das Programm unterschiedliche dinge. Deshalb denke ich ist es sinnvoll mit internen Tabellen weiter zu arbeiten. Ich habe momentan 16 Spalten. 8 für die Sprachen sowie
Deutsch/englisch, englisch/deutsch, deutsch/italienisch, italienisch/deutsch ?. Und 8 Spalten für die Bewertung der Eingaben (richtig/falsch) . Das heißt das Programm ist erweiterbar durch die Unterprogramme. Ich kann mehrere Sprachen dazu fügen, wenn ich die akutell Parameter richtig eingebe. Deshalb die Anzahl der Spalten spielen nicht viele Rolle. Das Programm arbeitet einwandfrei. Nur wenn ich search klicke, habe ich das Problem, Bisher habe ich mich nicht mit der dynamische Programmierung beschäftigt.Da habe ich noch Probleme. Ich kann jetzt zu den DDIC-Tabellen Werte zuweisen, durch deinen Code :-)
Was ich mit der internen Tabelle machen soll, weiß ich auch noch nicht.

Schöne Grüße

Hier ist der code

START-OF-SELECTION.

SELECT * FROM zvokabel INTO TABLE it_zvokabel.
SELECT * FROM zvokabel INTO TABLE it_zvokabelinhalt.
SELECT * FROM zvokabel INTO TABLE it_zvokabelsearch.
CALL SCREEN 100.

Lösung

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Halllo Leute,
ich habe das Problem anders gelöst:
Ich hätte gerne mit der dynamischen Wertübergabe (im Unterprogram mit Loop gearbeitet aber die Parameter kann ich nicht übergeben) gearbeitet, leider konnte keiner mir helfen. So funktioniert es auch.:
Also die LOOP Schleife nicht im Unterprogram.
Falls jemandem eine andere Lösung einfällt, würde ich mich darauf freuen.

WHEN 'SEARCH_VOKABEL'.

LOOP AT it_zvokabelsearch INTO wa_zvokabelsearch.

IF tabstrip_vokabel-activetab EQ 'FKT_VOKABEL'.
IF wa_zvokabelsearch-vokabel_art EQ p_vokabel_art.
PERFORM search USING wa_zvokabelsearch-vokabel_art
wa_zvokabelsearch-antwort_art
CHANGING var_vokabel
p_antwort_art.
ENDIF.

ELSEIF tabstrip_vokabel-activetab EQ 'FKT_DTR'.
IF wa_zvokabelsearch-vokabel_de EQ p_vokabel_de.
PERFORM search USING wa_zvokabelsearch-vokabel_de
wa_zvokabelsearch-vokabel_tr
CHANGING var_vokabel
p_vokabel_tr.
ENDIF.

ENDLOOP.

FORM search USING p_vokabel LIKE wa_zvokabelsearch-vokabel_art
p_antwort LIKE wa_zvokabelsearch-antwort_art
CHANGING p_vokabel_dyn LIKE p_vokabel_art
p_ausgabe.
p_ausgabe = p_antwort.
p_vokabel_dyn = p_vokabel.

ENDFORM. "search

Beitrag von GastX (Specialist / 277 / 4 / 18 ) »
Hallo meliz,
sicher nicht laufzeitoptimal, aber ich hab mir Deinen ersten Ansatz ganz oben nochmal angesehen. Wenn Du statt

Code: Alles auswählen.

FORM search USING p_vokabel
                  p_dyn_vokabel
                  p_antwort LIKE wa_zvokabel-vokabel_art
            CHANGING
                  p_it_zvokabel LIKE it_zvokabelsearch
                  p_wa_zvokabel LIKE wa_zvokabel
                  p_ausgabe LIKE p_vokabel_de.

  LOOP AT it_zvokabelsearch INTO p_wa_zvokabel
                            WHERE vokabel_variable = p_dyn_vokabel.
    p_ausgabe = p_antwort.
  ENDLOOP.
ENDFORM. "search
folgende Fassung nimmst, sollte das mit dynamischer Spaltenwahl auch im Loop funktionieren:

Code: Alles auswählen.

FORM search USING p_vokabel
                  p_dyn_vokabel
                  p_antwort LIKE wa_zvokabel-vokabel_art
            CHANGING
                  p_it_zvokabel LIKE it_zvokabelsearch
                  p_wa_zvokabel LIKE wa_zvokabel
                  p_ausgabe LIKE p_vokabel_de.
  FIELD-SYMBOLS: <fs> TYPE ANY.
  LOOP AT it_zvokabelsearch INTO p_wa_zvokabel.
    ASSIGN COMPONENT vokabel_variable 
                 OF STRUCTURE p_wa_zvokabel TO <fs>.
    IF <fs>  = p_dyn_vokabel.
      p_ausgabe = p_antwort.
      EXIT.
    ENDIF.
  ENDLOOP.
ENDFORM. "search
Gruß, Frank.

Beitrag von meliz (ForumUser / 18 / 0 / 0 ) »
Hallo Gastx,
danke für die Mühe.
Iich hatte bis jetzt keine Zeit. Und jetzt werde ich das Programm anzupassen.

Schöne Grüße

Seite 1 von 1

Vergleichbare Themen

1
Antw.
1180
Views
Changing interne Tabelle Unterprogramm in einem Fuba
von kbit100 » 12.02.2016 10:15 • Verfasst in ABAP® für Anfänger
4
Antw.
1535
Views
Verschachtelte Interne Tabelle zugreifen
von L0w-RiDer » 22.09.2020 13:02 • Verfasst in ABAP® für Anfänger
11
Antw.
6055
Views
Übergabe einer Tabelle an Unterprogramm
von Steffi221185 » 15.08.2006 10:48 • Verfasst in ABAP® Core
4
Antw.
1070
Views
5
Antw.
2097
Views
Inhalt interne Tabelle an andere interne Tabelle übergeben
von L0w-RiDer » 30.01.2020 16:28 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag


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

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
vor 2 Tagen von Bright4.5 1 / 744
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2368
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8954