Mehrfachselektion

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

Mehrfachselektion

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
Moin Moin!

Ich versuche mich gerade an einem Progrämmchen und möchte für ein Parameterfeld eine Mehrfachselektion a là Standard implemtieren.
Im Parameterfeld kann ein User dynamisch Feldwerte wählen (abhängig davon, welche Tabellenfelder welcher DB er wählt).
Ein F4-Hilfe habe ich bereits hineinprogrammiert, würde aber gerne zusätzlich eine Mehrfachselektion anbieten.

Nun habe ich mich bereits mit 'DDIF_FIELDINFO_GET' beschäftigt, komme aber zu keinem Nicht-Dump. :cry:

Code: Alles auswählen.

CALL FUNCTION 'DDIF_FIELDINFO_GET'
  EXPORTING
    TABNAME              = tabname
*   FIELDNAME            = ' '
    LANGU                = SY-LANGU
*   LFIELDNAME           = ' '
   ALL_TYPES            = 'X'
* IMPORTING
*   X030L_WA             = tabname
*    DDOBJTYPE            = TRANSP
*   DFIES_WA             =
*   LINES_DESCR          =
 TABLES
    DFIES_TAB            = <table>
*   FIXED_VALUES         =
 EXCEPTIONS
   NOT_FOUND            = 1
   INTERNAL_ERROR       = 2
   OTHERS               = 3
          .
IF SY-SUBRC <> 0.
 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
Meine interne Tabelle <table> ist einspaltig und aus der F4-Hilfe übernommen.

Kann mir jemand helfend unter die Arme greifen, oder bin ich gar auf dem Holzweg?

Viele Grüße,

Robert

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


Re: Mehrfachselektion

Beitrag von km216 (Specialist / 151 / 6 / 11 ) »
Hallo Robert,

was genau sagen die Dumps denn aus?
Kannst du noch deine Deklaration der Daten dazu posten?

gruß

Edit: 2 Anmerkungen, die vielleicht schon weiterhelfen:
1.) soweit ich weiß, muss der Tabellenname in Hochkommata '
2.) Wieso ist es <table> anstatt table? Greifst du mit einem Field-Symbol darauf zu?

Re: Mehrfachselektion

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
Aloha!

Vielen Dank für die Antwort.
Die Laufzeitfehlerbeschreibung ist angehängt.

Code: Alles auswählen.

  
TYPES: strucdfies TYPE dfies.
DATA:  it_table TYPE TABLE OF strucdfies.

FIELD-SYMBOLS:
                     <table>     TYPE table
Das Feldsymbol wahr falsch gesetzt. Richtiger wäre es so, oder?

Code: Alles auswählen.

CALL FUNCTION 'DDIF_FIELDINFO_GET'
  EXPORTING
    TABNAME              = <table>
*   FIELDNAME            = ' '
    LANGU                = SY-LANGU
*   LFIELDNAME           = ' '
   ALL_TYPES            = 'X'
* IMPORTING
*   X030L_WA             = tabname
*    DDOBJTYPE            = TRANSP
*   DFIES_WA             =
*   LINES_DESCR          =
 TABLES
    DFIES_TAB            = it_table
*   FIXED_VALUES         =
 EXCEPTIONS
   NOT_FOUND            = 1
   INTERNAL_ERROR       = 2
   OTHERS               = 3
          .
IF SY-SUBRC <> 0.
 MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
Viele Grüße,

Robert

Re: Mehrfachselektion

Beitrag von Unit605 (Expert / 975 / 37 / 93 ) »
Der letzte Satz in dem Kurzdump sagt alle aus.

Der Paramter im den FubA DDIF_FIELDINFO_GET erwartet einen ANDEREN Typ als den, den Du bentutzt.

Re: Mehrfachselektion

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
hi!
Orestes hat geschrieben:Das Feldsymbol wahr falsch gesetzt.
Jau!
Aber ich würde an deiner Stelle auch noch die <TABLE> vor dem Aufruf in eine Variable vom Typ DDOBJNAME umwandeln.
Funktionsbausteine können sehr tricky sein vorallem mit der Typprüfung die erst zur Laufzeit vollzogen wird.
Wenn du dann irgendwann mal was änderst und sich dadurch der tatsächliche Typ von <TABLE> ändert, stehst du wieder vor demselben Problem.
Ich hab mir daher angewöhnt vor dem Aufruf von Funktionsbausteinen immer sicherzustellen die richtigen Datentypen zu verwenden.

Und noch was der Vollständigkeit halber:

Code: Alles auswählen.

DATA:  it_table TYPE STANDARD TABLE OF dfies WITH DEFAULT KEY.
Damit wäre es auch für ABAP-OO eine vollständige Typdefinition.
Sonst kann es sein, dass du hin und wieder einen Fehler in der Form "generischer Datentyp nicht erlaubt" bekommst.
Übrigens gibts für DFIES im DDIC bereits haufenweise Tabellentyp-Definitionen. z.b.: DDFIELDS, DFIES_TAB, DFIES_TABLE
Für solche Fälle immer in der SE11 Verwendungsnachweis von Datentypen oder Strukturen in Tabellentypen.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Orestes

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Mehrfachselektion

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
Moin!

Vielen Dank für die ausführliche Darstellung.
Jedoch muss ich gestehen, dass ich zwar deine Einwände verstehe und gerne umsetzen würde, aber es mir an der Idee der technischem Umsetzung mangelt.


Und nun nochmal eine Grundsatzfrage:
Kann man mit dem Coding überhaupt eine Mehrfachselektion bewerkstelligen?

Viele Grüße,

Robert

Re: Mehrfachselektion

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
okay... mom...

Du wählst eine oder mehere Tabellen mittels SELECT-OPTIONS (inkl. F4 usw) und dann möchtest du dazu alle Felder der dadurch ausgewählten Tabelle(n) haben und diese in einer anderen F4-Hilfe anzeigen (für eine andere SELECT-OPTION).
Verstehe ich dich da richtig?

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Mehrfachselektion

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
Heiho!

Unten ist ein Beispiel zu sehen, welches nicht ganz zu meinem Szenario passt.
In dem dargestelltem Fall wird SELECT-OPTIONS genutzt, das ich nicht nutze (sondern nur PARAMETERS).
Der Vorteil der Mehrfachselektion ist, dass ich nicht zwangsläufig Intervalle nutzen muss, sondern beliebig angeordnete Einzelwerte. Demnach können die Intervall-Reiter außen vor gelassen werden.

Die Mehrfachauswahl soll autark neben der F4-Hilfe bestehen.
Meine Ausgangstabelle <table> enthält eine einzige Spalte, in der alle Feldwerte aufgelistet sind, die in einem Tabellenfeld einer Datenbank vorkommen. Da die DB freigewählt werden kann, habe ich Feldsymbole verwendet. Und aus dieser Tabelle soll der Anwender die Möglichkeit besitzen, einzelne Werte zu slektieren, mit denen weiter prozessiert wird.

Wie würde ein :evil: nun sagen: Savvy?

Re: Mehrfachselektion

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
hi!

Mit Standardmitteln könntest du problemlos eine Werteauswahl auf eine Select-Option anbieten wenn du statisch einen DDIC-Bzug zu einer Tabelle verwendest. Aber ich glaube du willst das Ganze dynamisch machen, sprich zuerst die Tabelle wählen (z.B. mittels Select-options) und dann eine Werteeinschränkung auf ein bestimmtes Tabellenfeld. Grob gesprochen sowas wie die Transaktion SE16? Verstehe ich dich da richtig?

Da wirst du recht viel dynamisch Programmieren müssen:
DDIF_FIELDINFO_GET ist definitiv der falsche Baustein, da kriegst du nur die Felddefinitionen aber nicht den tatsächlichen Inhalt auf der Datenbank.
Du wirst dir eine generische SELECT-Abfrage schreiben müssen. Schau dir dazu bitte die Hilfe durch wie du eine solche aufbauen kannst.
Die Daten die du damit abfragst müssen dann auch in entsprchenden Tabellenfeldern Platz finden. Mehr dazu verrät dir der Befehl CREATE DATA ... TYPE (...)
Dann musst du die Datenreferenz nur noch in ein Feldsymbol umwandeln mit ASSIGN ...->* TO ...
Du kannst alternativ auch die RTTI (CL_ABAP_TYPEDESCR und seine Sub-Klassen) verwenden um eine verkürzte Struktur für die Abfrage zu erstellen.
Dann musst du dein Ergebnis nur noch in ein Format umwandeln, mit dem du die F4-Hilfe aufrufen kannst.
Einzelne Felder einer Struktur kannst du übrigens mit ASSIGN COMPONENT ... OF STRUCTURE ... auslesen. Mehr dazu in der Hilfe.

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Orestes

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Mehrfachselektion

Beitrag von Bitfummler (Specialist / 111 / 4 / 3 ) »
hallo,

das ist richtig so. das kannst du mit rttc handeln.

hier ein beispiel von mir, mit dem ich variabel z-tabellen zum archivieren ausgelesen habe:
report z_archiv_tabellen.

* externe Tabellen
* ----------------

* Selektionsauswahl
*------------------
* Laufwerk L Explorer unsere Datei
selection-screen begin of block sel with frame title text-f01.
parameters: p_modul type char2 default 'ZM' obligatory, "Gruppe Revision
p_table type tabname default 'ZTABELLE' obligatory,
p_dfield type fieldname default 'DAT_BIS' obligatory,
p_adk type fileintern default 'Z_ARCHIVE_DATA_FILE' obligatory,
p_loekz as checkbox default 'X',
p_anzjj(2) type n default '1' obligatory.

selection-screen skip.

selection-screen begin of line.
parameters r_bin radiobutton group a2.
selection-screen comment 3(40) text-r01 for field r_bin.
selection-screen position 45.
parameters r_text radiobutton group a2.
selection-screen comment 48(40) text-r02 for field r_text.
selection-screen end of line.
selection-screen end of block sel.

* Konstanten
* ----------
constants: gc_j type c value 'J',
gc_x type c value 'X',
gc_on type c value '1',
gc_off type c value '0'.

* References
* ----------
data: gr_table type ref to data,
gr_struct type ref to data,
gr_struct_type type ref to cl_abap_structdescr,
gr_table_type type ref to cl_abap_tabledescr.

* Field-Symbols
*--------------
field-symbols: <fs_struct> type any,
<fs_table> type any table.

* Tabellen und Strukturen
* -----------------------
data: gs_cond(500) type c,
gt_cond like standard table of gs_cond.

* Workbereich
* -----------
data: gv_datum like sy-datum,
gv_arch_tabrows(5) type p,
gv_dele_tabrows(5) type p,
gv_praefix(20) type c,
gv_pfad like rlgrap-filename,
gv_length like sy-tabix,
gv_answer type c.

* I N I T I A L I S I E R U N G
* -----------------------------
initialization.

gv_arch_tabrows = 0.
gv_dele_tabrows = 0.

* S E L E C T I O N - S C R E E N O U T P U T
* --------------------------------------------
at selection-screen output.

loop at screen.
* Sperren Art für Eingabe
case screen-name.
when 'P_ADK'.
screen-input = gc_off.
modify screen.
when 'P_LOEKZ'.
if sy-sysid+0(1) = 'P' or
sy-sysid+0(3) = 'OGP'.
screen-input = gc_off.
modify screen.
endif.
endcase.
endloop.

* S T E U E R L E I S T E
* -----------------------
start-of-selection.

perform check.

concatenate p_modul p_table into gv_praefix separated by '_'.
perform file_get_name using p_adk gv_praefix gv_pfad.

* Ermitteln Datum
clear gv_datum.
gv_datum = sy-datum - ( p_anzjj * 365 ).

*-------------------------------------
* Aus BC401 - Kapitel 4 - Seite 382
*-------------------------------------
*
* CL_ABAP_TYPEDESCR
* +----------------
* |
* +--- CL_ABAP_DATADESCR
* | +----------------
* | |
* | +--- CL_ABAP_ELEMDESCR
* | |
* | +--- CL_ABAP_REFDESCR
* | |
* | +--- CL_ABAP_COMPLEXDESCR
* | +-------------------
* | |
* | +--- CL_ABAP_STRUCTDESCR
* | |
* | +--- CL_ABAP_TABLEDESCR
* |
* +--- CL_ABAP_DATADESCR
* +----------------
* |
* +--- CL_ABAP_CLASSDESCR
* |
* +--- CL_ABAP_INTFDESCR
*
*-------------------------------------

* Type handling über RTTC
gr_struct_type ?= cl_abap_typedescr=>describe_by_name( p_table ).
gr_table_type = cl_abap_tabledescr=>create( p_line_type = gr_struct_type ).

* erzeugen interne Tabelle für Select
create data gr_table type handle gr_table_type.
assign gr_table->* to <fs_table>. "dereferenzieren

* Erzeugen Struktur für Loop
* SO:
create data gr_struct type handle gr_struct_type.
assign gr_struct->* to <fs_struct>.
** GEHT AUCH SO:
** assign gv_stru to <fs_struct> casting type (p_table).

* Ermitteln Strukturlänge
describe field <fs_struct> length gv_length in byte mode. "181


** gv_length = lines( <fs_table> ). "anzahl lines anstatt describe

* Erzeugen conditions-table
clear: gs_cond, gt_cond[].
concatenate p_dfield ' < ''' gv_datum '''' into gs_cond.
append gs_cond to gt_cond.

* Lesen zu archivierenden Datensätze in interne Tabelle
<fs_struct> = space.
clear: <fs_struct>.
select * from (p_table) into table <fs_table>
where (gt_cond).

if p_loekz = space.
perform popup.
describe table <fs_table> lines gv_arch_tabrows.
check: gv_answer = gc_j.
endif.

if <fs_table> is not initial.
case gc_x.
when r_bin.
open dataset gv_pfad for output in binary mode.
when r_text.
open dataset gv_pfad for output in text mode encoding default.
when others.
exit.
endcase.
endif.

* Archivieren Datensätze
gv_arch_tabrows = 0.
loop at <fs_table> into <fs_struct>.

transfer <fs_struct> to gv_pfad length gv_length.
gv_arch_tabrows = gv_arch_tabrows + 1.

endloop.

if <fs_table> is not initial.
close dataset gv_pfad.

check: p_loekz = 'X'.

delete from (p_table)
where (gt_cond).
if sy-subrc <> 0.
message a000(zq) with 'Fehler beim Löschen:' p_table gv_datum.
endif.
gv_dele_tabrows = sy-dbcnt.
endif.

* P R O G R A M M E N D E
* -----------------------
end-of-selection.

if sy-batch = 'X'.
message i000(zq) with 'Anzahl zu löschende Sätze aus '
p_table gv_arch_tabrows.
message i000(zq) with 'Anzahl gelöschte Sätze aus '
p_table gv_dele_tabrows.
else.
if gv_answer = gc_j.
write: / 'Anzahl archivierter Sätze aus ', p_table, gv_arch_tabrows.
else.
write: / 'Anzahl zu löschende Sätze aus ', p_table, gv_arch_tabrows.
endif.
write: / 'Anzahl gelöschte Sätze aus ', p_table, gv_dele_tabrows.
endif.


*---------------------------------------------------------------------*
* FORM ermitt_pfade *
*---------------------------------------------------------------------*
* Ermitteln Pfade für Ausgabe und Protokolle *
*---------------------------------------------------------------------*
form file_get_name using p_adk p_prefix p_gv_pfad .

clear p_gv_pfad.

call function 'FILE_GET_NAME'
exporting
client = sy-mandt
logical_filename = p_adk
operating_system = 'AIX'
* parameter_1
* parameter_2
parameter_3 = p_prefix
* use_presentation_server
with_file_extension = 'X'
* use_buffer
eleminate_blanks = 'X'
importing
* EMERGENCY_FLAG
* FILE_FORMAT
file_name = p_gv_pfad.
* exeptions
* file_not_found = .

if p_gv_pfad = space.
message a000(zq) with 'Archivpfad konnte nicht ermittelt werden'.
endif.

endform. "file_get_name
*&---------------------------------------------------------------------*
*& Form check
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form check.

data: lv_datatype type datatype_d.

if p_table+0(1) <> 'Z'.
message a000(zs) with 'Dieser Report ist nur für Kundentabellen zugelassen.'.
endif.

select single datatype from dd03l
into lv_datatype
where tabname = p_table
and fieldname = p_dfield.
if sy-subrc <> 0.
message a000(zs) with 'Tabelle/Tabellenfeld nicht vorhanden'.
endif.
if lv_datatype <> 'DATS'.
message a000(zs) with 'Tabellenfeld hat nicht den Typ DATS'.
endif.

endform. "check
*&---------------------------------------------------------------------*
*& Form popup
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
form popup.

gv_answer = space.

call function 'POPUP_TO_CONFIRM_WITH_MESSAGE'
exporting
diagnosetext1 = 'Wollen Sie wirklich'
diagnosetext2 = 'ohne Löschen ADK-Files'
diagnosetext3 = 'erzeugen?'
textline1 = 'Das kann zu mehrfacher Archivierung'
textline2 = 'führen!!'
titel = 'ACHTUNG'
cancel_display = space
importing
answer = gv_answer
exceptions
others = 0.

endform. " popup

gruss bitfummler

Folgende Benutzer bedankten sich beim Autor Bitfummler für den Beitrag:
Orestes


Re: Mehrfachselektion

Beitrag von Orestes (ForumUser / 9 / 3 / 0 ) »
So, ich möchte mich endlich bei euch bedanken. Es hat wunderbar funktioniert. :up:

Seite 1 von 1

Vergleichbare Themen

8
Antw.
2166
Views
Mehrfachselektion
von christof » 18.09.2014 14:24 • Verfasst in ABAP® für Anfänger
8
Antw.
5096
Views
MB51 - Mehrfachselektion
von Ulrich B. » 15.07.2016 09:31 • Verfasst in ABAP® für Anfänger
6
Antw.
3340
Views
Auf Mehrfachselektion prüfen
von Fistandantilus » 23.07.2013 12:29 • Verfasst in ABAP® für Anfänger
5
Antw.
2606
Views
ABAP Mehrfachselektion
von SAP-Thomas » 12.07.2013 13:58 • Verfasst in ABAP® für Anfänger
2
Antw.
2327
Views
Überschrift der Mehrfachselektion ändern?
von Nordlicht » 27.02.2017 08:33 • Verfasst in Dialogprogrammierung

Aktuelle Forenbeiträge

Trennen Strasse und Hausnummer
vor 11 Stunden von msfox 18 / 11004
Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 27 / 4106
IT0024 Qualifikationen CP-ID
vor 15 Stunden von ArjenR 1 / 111

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

Trennen Strasse und Hausnummer
vor 11 Stunden von msfox 18 / 11004
Dialog-Container mit Toolbar/Status
vor 13 Stunden von black_adept gelöst 27 / 4106
IT0024 Qualifikationen CP-ID
vor 15 Stunden von ArjenR 1 / 111

Unbeantwortete Forenbeiträge

IT0024 Qualifikationen CP-ID
vor 15 Stunden von ArjenR 1 / 111
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 3045
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9638