Archiv für September 2010

Selektion mehrerer Sprachen in einem Schritt

Montag, 27. September 2010

Selektieren mehrerer Sprachen eines bestimmten Materials in einem Schritt

SELECT
SINGLE       maktx
FROM          makt:
INTO            ls_output-maktxde
WHERE  matnr EQ ls_output-matnr
AND         spras EQ ‘DE’,
INTO           ls_output-maktxen
WHERE   matnr EQ ls_output-matnr
AND          spras EQ ‘EN’.

Ergebnis:
In dem Feld ls_output-maktxde is anschliessend der Inhalt aus der Tabelle MAKTX zum Sprachenkürzel DE und im Feld
ls_output-maktxen der Inhalt aus der Tabelle MAKTX zum Sprachenkürzel EN

Dynamisches Selektionsbild

Montag, 27. September 2010

Beschreibung

In diesem Beispielprogramm wird ein Selektionsbild zur Tabelle VBAK erzeugt und als Popup angezeigt. Der Benutzer kann nach belieben andere Felder ein- oder ausblenden. Aus den Selektionsoptionen zu den Feldern wird eine WHERE-Klausel für den Select-Befehl erzeugt, so dass die Daten einfach gelesen werden können.

Quelle: http://tricktresor.de/content/index.php?navID=25&aID=402


Werte übergeben

Soll mehr als ein Wert übergeben werden, so muss die LT_EXPRESSIONS-Tabelle so aufgebaut werden, dass in der ersten Zeile steht

LOGOP = ‘AND’.

ARITY = Anzahl der zu übergebenden Felder

Danach kommen dann die Feldwerte, die vorgeblendet werden sollen.

LOGOP ARITY FIELDNAME OPTION LOW HIGH

AND 3

VBELN BT 1000 2000

ERDAT EQ 20070401

ERNAM EQ XK0945

Dynamisches Selektionsbild mit Einblendung der Felder

Coding

REPORT ZZ_DYNSEL.

*** Type-Pool für “Freie Abgrenzungen”

TYPE-POOLS rsds.

DATA:

*** Datentabelle

lt_vbak TYPE STANDARD TABLE OF vbak,

*** Datenstruktur

ls_vbak TYPE vbak,

*** Selection-ID zur Unterscheidung mehrerer Sets

lv_selection_id LIKE rsdynsel-selid,

*** Anzahl der Felder

lv_number_of_fields TYPE i,

*** Tabellenname

lv_tablename TYPE tablename,

*** Init: Tabellen

lt_tables TYPE STANDARD TABLE OF rsdstabs,

*** Init: Felder

ls_fields TYPE rsdsfields,

lt_fields TYPE STANDARD TABLE OF rsdsfields,

*** Daten für Where-Tabelle

lt_where_clauses TYPE rsds_twhere,

ls_where_clause TYPE rsds_where,

*** Expressions

lt_expressions TYPE rsds_texpr,

ls_expression TYPE rsds_expr,

lt_expr TYPE rsds_expr_tab,

ls_expr TYPE rsdsexpr,

*** Ranges

lt_field_ranges TYPE rsds_trange,

ls_field_ranges TYPE rsds_range,

ls_field_ranges TYPE rsds_range,

lt_range TYPE rsds_frange_t,

ls_range TYPE rsds_frange,

lt_selopt TYPE rsds_selopt_t,

ls_selopt LIKE rsdsselopt.

PARAMETERS:

*** Anzeige der Feldauswahl im Tree?

p_tree AS CHECKBOX DEFAULT ‘X’,

*** Vorgabe eines Selektionswertes?

p_vorg AS CHECKBOX DEFAULT ‘X’.

START-OF-SELECTION.

*** Tabellenname vorgeben

lv_tablename = ‘VBAK’.

*** Tabelle im Dialog bekannt machen:

APPEND lv_tablename TO lt_tables.

*** einzublendende Felder übergeben

ls_fields-tablename = lv_tablename.

*** …Dazu nehmen wir die ersten Felder der Tabelle

SELECT fieldname FROM dd03l INTO ls_fields-fieldname

WHERE tabname = lv_tablename

AND as4local = ‘A’

AND as4vers = 0

AND position < 15

AND datatype <> ‘CLNT’.

APPEND ls_fields TO lt_fields.

ENDSELECT.

IF p_vorg <> space.

*** Name des Erfassers mit SY-UNAME vorbelegen

ls_expr-fieldname = ‘ERNAM’.

ls_expr-option = ‘EQ’.

ls_expr-low = sy-uname.

APPEND ls_expr TO lt_expr.

ls_expression-tablename = lv_tablename.

ls_expression-expr_tab = lt_expr.

APPEND ls_expression TO lt_expressions.

ENDIF.

*** “Freie Abgrenzungen” initialisieren

CALL FUNCTION ‘FREE_SELECTIONS_INIT’

EXPORTING

kind = ‘T’

expressions = lt_expressions

IMPORTING

selection_id = lv_selection_id

field_ranges = lt_field_ranges

TABLES

tables_tab = lt_tables

fields_tab = lt_fields

EXCEPTIONS

OTHERS = 20.

IF sy-subrc <> 0.

WRITE: / sy-subrc.

ELSE.

*** Dialog mit “freien Abgrenzungen” aufrufen

CALL FUNCTION ‘FREE_SELECTIONS_DIALOG’

EXPORTING

selection_id = lv_selection_id

title = ‘Tricktresor’

frame_text = ‘Bitte Selektion eingeben’

as_window = ‘X’

start_row = 3

start_col = 3

tree_visible = p_tree

no_frame = ‘X’

IMPORTING

where_clauses = lt_where_clauses

expressions = lt_expressions

field_ranges = lt_field_ranges

number_of_active_fields = lv_number_of_fields

TABLES

fields_tab = lt_fields

EXCEPTIONS

internal_error = 1

no_action = 2

selid_not_found = 3

illegal_status = 4

OTHERS = 5.

IF sy-subrc > 0.

IF sy-subrc = 2.

*** Meldung “Auswahl wurde abgebrochen”

MESSAGE s000(oo) WITH ‘Auswahl wurde abgebrochen’.

ELSE.

*** Meldung “Fehler bei Funktionsbausteinaufruf”

MESSAGE i000(oo) DISPLAY LIKE ‘E’

WITH ‘Fehler bei FREE_SELECTIONS_DIALOG’ sy-subrc.

ENDIF.

ELSE.

*** vom Baustein generierte WHERE-Klausel zur Selektion lesen

READ TABLE lt_where_clauses INTO ls_where_clause

WITH KEY tablename = lv_tablename.

*** Selektion durchführen

SELECT * FROM (lv_tablename) INTO TABLE lt_vbak

WHERE (ls_where_clause-where_tab).

IF sy-subrc > 0.

MESSAGE s000(oo) WITH ‘Keine Daten zur Selektion

vorhanden’.

ELSE.

*** …und ausgeben

LOOP AT lt_vbak INTO ls_vbak.

WRITE: / ls_vbak-vbeln.

ENDLOOP.

ENDIF.

ENDIF.

ENDIF.