dynamischer Append / Field-Symbols

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

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

dynamischer Append / Field-Symbols

Beitrag von Steve ( / / 0 / 3 ) »
Hallo,

schreibe gerade ein "sehr" dynamisches Programm.

Problem 1: Kann ich den Code auch nur mit einem field-symbol lösen? Habe es nicht hingekriegt, z.B. <f1>-low einen Wert zuzuweisen. ist dies möglich???

Problem 2: So, am Schluß ist <f1>, also auch das Feld R01 (steht in feldname) mit Sachen gefüllt (Sign, option, low, high => ist ja ein Range).
Will jetzt R01 Appenden, aber wie???

Brauche dringend Hilfe!



LOOP AT h_selopt.

AT NEW fieldname.

ADD 1 TO zaehler.
CONCATENATE 'R' zaehler INTO feldname.
ASSIGN (feldname) TO <f1>.

ENDAT.

CONCATENATE feldname '-low' INTO feldname2.
ASSIGN (feldname2) TO <f2>.
<f2> = h_selopt-flnam_low.
CONCATENATE feldname '-high' INTO feldname2.
ASSIGN (feldname2) TO <f2>.
<f2> = h_selopt-flnam_high.
CONCATENATE feldname '-option' INTO feldname2.
ASSIGN (feldname2) TO <f2>.
<f2> = h_selopt-flnam_opt.
CONCATENATE feldname '-sign' INTO feldname2.
ASSIGN (feldname2) TO <f2>.
<f2> = h_selopt-flnam_sign.
* append <f1>.

ENDLOOP.

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


Beitrag von Hermann ( / / 0 / 3 ) »
Hallo Steve,

kannst Du bitte in Worten beschreiben was Du genau vorhast. So ganz bin ich nämlich noch nicht bei Dir. Danke.

Hermann

Beitrag von Gast ( / / 0 / 3 ) »
Okay, werde es versuchen.

Problem 1 ist nicht so schlimm, geht ja mit zwei field-symbols...

Problem 2:
Wo fange ich an???
Habe DB-Tabelle angelegt, in der quasi eine range gespeichert ist:
Tabellenname, Feldname, low, high, option und sign, z.B.
LIPS, MATNR, NEGATIV, -, EQ, I.

Diese lese ich aus, habe sie dann in h_selopt stehen.
Da in der DB-Tabelle mehrere Einträge zu einem Feld (hier lips-matnr) stehen können, will ich sie zusammenpacken, deshalb "AT NEW fieldname).

In der Deklaration habe ich mehrere ranges deklariert, z.b.
RANGES: r01 FOR zcr_rules-attribute, <= char30

Beim ersten Durchlauf der LOOP Schleife wird also in feldname durch das concatenate r01 geschrieben und durch das assign in das field-symbol gepackt.

Durch den nächsten Block (entstanden durch mein problem 1) füllt sich nun <f2> und somit auch <f1> da in beiden ja "r01" steht

Habe dann am Schluss in <f1> stehen:
low : NEGATIV
high: -
option: EQ
sign: I
=> so soll es auch sein, in (feldname) steht dann natürlich das gleiche.

aber dann klappt der dyn. Append nicht alla
append <f1> oder append (feldname)

Habe dazu auch nix in der Hilfe gefunden.

Das gleiche Problem besteht bei einem Funktionsbaustein-Aufruf, kann da auch nicht schreiben
tables:
xxx = <fs1> oder (feldname).


Verstehst du mich jetzt besser?

Beitrag von Hermann ( / / 0 / 3 ) »
Hallo Steve,

ich hoffe mal :-). Du hast eine DB-Tabelle die Ranges speichert, wobei es für ein und dasselbe Tabellenfeld mehrere Einträge geben kann. Diese Einträge sollen nun verdichtet werden auf einzelne von Dir definierte Ranges. Hab ich das so richtig verstanden? Wenn ja, dann - denke ich - kann ich Dir weiterhelfen.

Hermann

Beitrag von Steve ( / / 0 / 3 ) »
Ja, so ist es!

Das Problem was sich allerdings im Anschluß stellt, habe ich auch schon ausfindig gemacht und das scheint wesentlich "schlimmer" zu sein:

Dynamische Bedingungen

Um eine Bedingung dynamisch anzugeben, schreibt man:

SELECT... WHERE (<itab>). ..

Dabei ist <itab> eine interne Tabelle mit dem Zeilentyp C und einer der maximalen Länge von 72 Zeichen. Alle obigen Bedingungen außer der Überprüfung einer Selektionstabelle können in den Zeilen von <itab> abgelegt werden. Dabei dürfen aber nur Literale und keine Namen von Datenobjekten verwendet werden. Die Tabelle <itab> darf auch leer sein.

Wie soll ich dynamisch dann meine Range-Tabelle in ein Select einbauen???

Unser Senior-Programmierer weiß auch keine Lösung...

Beitrag von Hermann ( / / 0 / 3 ) »
Ok, der Reihe nach.
Das Problem mit der Select-Anweisung müßte sich eigentlich durch eine dynamische where-Bedingung lösen lassen. Dazu folgendes Beispiel aus der Abapdocu:

Code: Alles auswählen.

PARAMETERS: p_from TYPE SPFLI-CITYFROM, p_to TYPE SPFLI-CITYTO. 

DATA: where_clause TYPE STRING, 
      carr         TYPE spfli-carrid, 
      conn         TYPE spfli-connid. 

CONCATENATE 'CITYFROM = ''' p_from ''' AND CITYTO = ''' p_to '''' 
  INTO where_clause. 

SELECT carrid connid FROM spfli 
  INTO (carr, conn) 
  WHERE (where_clause). 
  WRITE: / carr, conn. 
ENDSELECT. 
Eine statische select-Anweisung unter Verwendung eines ranges sieht so aus:

Code: Alles auswählen.

    SELECT * FROM db_table
                        INTO TABLE internal_table
              WHERE field IN range.
d.h. was in die where_clause-Variable eingefügt werden muss ist etwas in der Richtung: field in range (siehe concatenate-Anweisung im Beispiel oben).

Hermann

Beitrag von black_adept (Top Expert / 3946 / 105 / 886 ) »
Hi Steve,

je mehr du dynamisch vorgehen willst desto sinniger ist es irgendwann auf "GENERATE SUBROUTINEPOOL" umzusteigen.

Damit kannst du dann fast alles machen was es gibt. :D
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Beitrag von Hermann ( / / 0 / 3 ) »
Hallo,

was dynamisches programmieren anbelangt hat Stefan natürlich vollkommen recht. Ich nehme mal stark an, dass Du in Deinem Programm derzeit die Ranges für jedes Feld in entsprechenden Ranges-Anweisungen bereits definiert hast. Das bedeutet natürlich, dass jedesmal wenn Deine DB-Tabelle neue Felder (für neue Ranges) hinzubekommt, Dein Programm um ein neues Range erweitert werden muss. Stimmt doch oder?
In dem Fall würde ich mich der Empfehlung von Stefan auf jeden Fall anschliessen. Dann würde ich nämlich die Ranges die ich benötige zur Laufzeit über den Subroutine-Pool dynamisch erzeugen.
Ein schönes Beispiel, wie Du das am besten bewerkstelligen kannst findest Du in der Klasse CL_ALV_TABLE_CREATE, Methode CREATE_DYNAMIC_TABLE. Dort wird dann recht bald der FuBa ALV_TABLE_CREATE aufgerufen. Den Perform dort würde ich Dir empfehlen anzuschauen.

Hermann

Beitrag von Hermann ( / / 0 / 3 ) »
z.B. so:

Code: Alles auswählen.

REPORT  ZTEST_DP                                .

types: begin of myfieldcat,
          table type tabname,
          field type fieldname,
       end of myfieldcat.

data: lv_guid type crmt_object_guid,
      dref type ref to data.
data: lt_orderadm_h type table of crmd_orderadm_h.

data: ls_source type string,
      lt_source like standard table of ls_source with header line,
      l_form(30) type c value 'RANGE_CREATE',
      ls_fieldcat type myfieldcat,
      lt_fieldcat type standard table of myfieldcat.

data: l_message(240) type c,
      l_line type i,
      l_word(72) type c,
      l_name like sy-repid.

field-symbols: <l_range> type table,
               <l_wa> type any,
               <l_sign> type any,
               <l_option> type any,
               <l_low> type any,
               <l_high> type any.

data: lt_table type ref to data.
field-symbols: <l_table> type table.


constants:
  con_report(60) type c value 'REPORT GENENERATED_SUBROUTINE_POOL.'.

ls_fieldcat-table = 'CRMD_ORDERADM_H'.
ls_fieldcat-field = 'GUID'.

concatenate 'CREATE_' ls_fieldcat-field '_RANGE' into l_form.
clear lt_source.
lt_source = con_report.
append lt_source.
concatenate 'TYPES: BEGIN OF%' ls_fieldcat-field '_RANGE,' into
             lt_source.
translate lt_source using '% '.
append lt_source.
lt_source = 'SIGN(1), OPTION(2), '.
append lt_source.
concatenate 'LOW LIKE%' ls_fieldcat-table '-' ls_fieldcat-field ',' into lt_source.
translate lt_source using '% '.
append lt_source.
concatenate 'HIGH LIKE%' ls_fieldcat-table '-' ls_fieldcat-field ',' into lt_source.
translate lt_source using '% '.
append lt_source.
concatenate 'END OF%' ls_fieldcat-field '_RANGE.' into lt_source.
translate lt_source using '% '.
append lt_source.
concatenate 'FORM CREATE_' ls_fieldcat-field '_RANGE using pointer type ref to data' into lt_source.
append lt_source.
lt_source = 'wa_pointer type ref to data.'.
append lt_source.
concatenate 'CREATE DATA POINTER TYPE STANDARD TABLE OF%' ls_fieldcat-field '_RANGE.' into lt_source.
translate lt_source using '% '.
append lt_source.
concatenate 'CREATE DATA WA_POINTER TYPE%' ls_fieldcat-field '_RANGE.' into lt_source.
translate lt_source using '% '.
append lt_source.
lt_source = 'ENDFORM.'.
append lt_source.

l_name = 'TEST'.
break-point.

catch system-exceptions generate_subpool_dir_full = 9.
  generate subroutine pool lt_source name l_name
           message l_message line l_line word l_word.
endcatch.
case sy-subrc.
  when 0.
  when 9.
  when others.
    message x000(0k) with l_message l_line l_word.
endcase.

data: lv_range type ref to data,
      lv_wa type ref to data.


perform (l_form) in program (l_name) using lv_range lv_wa.
assign lv_range->* to <l_range>.
assign lv_wa->* to <l_wa>.


assign component 'SIGN' of structure <l_wa> to <l_sign>.
assign component 'OPTION' of structure <l_wa> to <l_option>.
assign component 'LOW' of structure <l_wa> to <l_low>.

<l_sign> = 'I'.
<l_option> = 'EQ'.
<l_low> = '000B147F69751943AF66D20CEA797415'.
append <l_wa> to <l_range>.
<l_low> = '008EE69ED61DC94DAC4C05D8A51A9BD1'.
append <l_wa> to <l_range>.

break-point.

create data lt_table type standard table of (ls_fieldcat-table).
assign lt_table->* to <l_table>.
select * from (ls_fieldcat-table) into table <l_table>
              where guid in <l_range>.

break-point.
Ist zwar nur ein Beispiel, läßt sich aber prima erweitern. Funzt derzeit nur in einem CRM-System. Wer anderes hat, muss eben Tabellen- und Feldname entsprechend abändern. Erzeugt wird dynamisch ein Range. Der wird in obigem Beispiel zwar dann 'statisch' gefüllt, es ist jedoch kein Problem das auch anders zu machen.
Danach erfolgt in Abhängigkeit des erzeugten Ranges ein select auf die DB in eine ebenfalls dynamisch erzeugte interne Tab.

Have fun :D

Seite 1 von 1

Vergleichbare Themen

15
Antw.
4440
Views
Dynamischer Strukturzugriff mit Field Symbols
von Abaphalbsocke » 17.05.2018 13:01 • Verfasst in ABAP® für Anfänger
7
Antw.
2836
Views
field symbols
von bohne » 20.10.2006 15:07 • Verfasst in ABAP® für Anfänger
10
Antw.
4013
Views
FIELD-SYMBOLS
von kostonstyle » 15.08.2008 08:07 • Verfasst in ABAP® für Anfänger
3
Antw.
1840
Views
field symbols
von Riceman » 20.03.2006 15:08 • Verfasst in ABAP® Core
13
Antw.
11886
Views
Field-Symbols
von cschmoel » 23.08.2012 09:21 • Verfasst in ABAP® für Anfänger

Ü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.