Abap

Liebe/-r Experte/-in,

TYPE-POOLS SLIS.

DATA: it_tab TYPE table of ZFSAKOLIST_STRUCT,
wa_zeile TYPE ZFSAKOLIST_STRUCT,
gs_layout TYPE SLIS_LAYOUT_ALV,
gv_ktonr TYPE ZFSAKOLIST_STRUCT-SAKNR. ""Dummy-variable

PARAMETERS: p_ktplan TYPE ZFSAKOLIST_STRUCT-KTOPL DEFAULT ‚KKLE‘
OBLIGATORY,
p_bkreis TYPE ZFSAKOLIST_STRUCT-BUKRS.

SELECT-OPTIONS so_ktonr FOR gv_ktonr.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.
PARAMETERS: GuV-Blnz RADIOBUTTON GROUP rad1 DEFAULT ‚X‘,
Blnz_kto RADIOBUTTON GROUP rad1,
GuV_kto RADIOBUTTON GROUP rad1.

SELECTION-SCREEN END OF BLOCK b1.

AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1.

IF GuV-Blnz = ‚X‘.
MESSAGE w888(sabapdocu) WITH text-001.
ENDIF.

SELECT * FROM SKA1
INTO CORRESPONDING FIELDS OF TABLE it_tab WHERE KTOPL = p_ktplan AND
SAKNR IN so_ktonr.

gs_layout-zebra = ‚X‘.

CALL FUNCTION ‚REUSE_ALV_GRID_DISPLAY‘
EXPORTING
I_STRUCTURE_NAME = ‚ZFSAKOLIST_STRUCT‘

TABLES
T_OUTTAB = it_tab
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

Ich bin ein Student und soll ein Programm in ABAP schreiben. Der Report soll Sachkonten in Form einer ALV-Liste anzeigen. Es sind 2 Tabellen vorhanden, diese Tabellen habe ich mit einem VIEW verknüpft. Die Selektion von Kontentypen soll per Radiobuttons stattfinden. Diese habe ich aufzuteilen in Bilanzkonto und GuV (Gewinn-und Verlustkonto). An dieser Stelle würde ich auch gerne wissen, wie man ein GuV Konto von einem Bilanzkonto unterscheiden kann. Auch weiß ich leider nicht, wie ich den RADIOBUTTON-Code so modifizieren soll, sodass diese gezielt nach dem Bilanzkonto und GuV-ä Konto selektiert. Die ALV-Liste soll 18 gewählte Felder beinhalten, Felder die in den Tabellen enthalten sind, doch leider weiß ich nicht, wie ich diese in der ALV-Liste anzeigen lassen soll. Ich hoffe ihr könnt mir irgendwie behilflich sein und bedanke mich herzlichst im Voraus.

Mit freundlichen Grüßen

Hallo,

habe diese Anfrage erhalten, bin aber leider kein Experte dafür :frowning:
Gruß
A. Richter

Hallo,

ich kann dir zwar nicht im ABAP Code weiterhelfen, weil es schon viele Jahre her ist, dass ich in ABAP programmiert habe. Fachlich kann ich aber schon einiges dazu sagen:
Ein GuV Konto ist ein Aufwands- oder Ertragskonto, das nicht als eigenständiger Posten in der Bilanz steht, sondern in die GuV Rechnung einfließt und im Eigenkapitalkonto aufgelöst wird. Du erkennst in der Tabelle SKA1 ein GuV Konto daran, dass das Feld XBILK nicht gefüllt ist. Wenn in diesem Feld ein X steht, dann handelt es sich um ein Bilanzkonto.

Hallo Rufat,

das Problem das du da hast ist weniger ein ABAP, als ein fachspezifisches Problem. Soweit ich weiß unterscheiden sich Bilanzkonten von GuV anhand des Nummernbandes, sprich anhand der ersten Ziffer. Leider habe ich aktuell keine Zugang zu einem SAP System um das genauer für dich in Erfahrung zu bringen. Hast du es schon mit der SAP Hilfe help.sap.com versucht?

In diesem Report verwendest du aber keinen View, du ließt lediglich die Sachkonten.

Den „Radiobutton-Code“ kann sicherlich nicht modifiziert werden. Dort steht entweder space oder ‚X‘, je nachdem ob der Radiobutton aktiv oder nicht aktiv ist. Das heißt du musst anschließend noch etwas implementieren, wie etwas folgendes

case ‚X‘.
when Blnz_kto.
* Definiere ein Selektionskriterum
* wie z.B. SAKNR(1) = ‚6‘. " lese aller 6er Konten

when GuV_kto.
* verarbeite GuV Konten
endcase.

Beim anschließenden SELECT-Statement musst du dieses Kriterum berücksichten.

Ich hoffe ich konnte dir etwas weiterhelfen.

Viele Grüße
Alex

Hallo Rufat,

diese E-Mail wurde zweimal zugestellt. Ich habe dir schon eine Antwort geschickt.

Viele Grüße
Alex

Hallo Rufat,

offensichtlich hast Du einen Datenbankview angelegt, ich würde zu einem Join im SELECT-Statement raten.

Leider weiß ich so nicht genau, welche beiden Tabellen du meinst.

Aber prinzipiell ist die Vorgehensweise gleich:

Mit IF Abfrage geht es, ich habe aber mal das CASE benutzt:

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.

PARAMETERS:
 guv-blnz RADIOBUTTON GROUP rad1 DEFAULT 'X', "Vorsicht mit "-"
 blnz\_kto RADIOBUTTON GROUP rad1,
 guv\_kto RADIOBUTTON GROUP rad1.

SELECTION-SCREEN END OF BLOCK b1.


 CASE 'X'.
 WHEN guv-blnz. "wenn alle Konten angezeigt werden sollen
 SELECT \* FROM ska1
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 WHERE ktopl = p\_ktplan
 AND saknr IN so\_ktonr.

 WHEN blnz\_kto.
 SELECT \* FROM ska1
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 WHERE ktopl = p\_ktplan
 AND saknr IN so\_ktonr
 AND xbilk = 'X'.

 WHEN guv\_kto.
 SELECT \* FROM ska1
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 WHERE ktopl = p\_ktplan
 AND saknr IN so\_ktonr
 AND xbilk = space.

 ENDCASE.

Zu deiner Frage mit den Feldern im ALV:
Ich habe deine Ausgabestruktur einfach mal durch die Tabelle SKA1 ersetzt, da werden alle Felder korrekt angezeigt. Wo liegt denn da genau das Problem?

beste Grüße

Hi Michi,

ich habe bereits eine Struktur angelegt namens ZFSAKOLIST_STRUCT. Wenn ich dein Coding ändere und

SELECT * FROM ZFSAKOLIST_STRUCT schreibe statt ska1, dann meldet er einen Error, ich hab ja nämlich 2 Tabellen, ska1 und skb2, ich will ja die daten aus beiden Tabellen haben, weshalb ich eine Struktur angelegt hatte. Ich wüsste net wie ich darauf zugreife in der SELECT Anweisung.

Also zum Beispiel an dieser Stelle bei den Radiobutton-Cases:

WHEN blnz_kto.
> SELECT * FROM ZFSAKOLIST_STRUCT oder: SELECT * FROM ska1,skb1 … an dieser Stelle mein ich bei den 3 Radiobuttons in dem Case
> INTO CORRESPONDING FIELDS OF TABLE it_tab
> WHERE ktopl = p_ktplan
> AND saknr IN so_ktonr
> AND xbilk = ‚X‘.

Ich habe den INNER JOIN Befehl gefunden, nur weiß ich nicht, wie ich den hier einbinde. Und allgemein: Angenommen ich hätte keine Struktur angelegt, sondern würde es mit 2 SELECT-Anweisungen versuchen, wie würde dann das Coding aussehen ?

LG Rufat

Hallo Rufat,

in der Tat ist der JOIN Befehl etwas unglücklich dokumentiert.

 SELECT \*
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 FROM ska1
 INNER JOIN skb1
 ON skb1~saknr = ska1~saknr
 AND skb1~bukrs = p\_bkreis
 WHERE ska1~ktopl = p\_ktplan
 AND ska1~saknr IN so\_ktonr.

XBILK mußt Du entsprechend noch einbauen. IT_TAB hat ja durch die Referenz auf Deine DDIC Structur den richtigen Aufbau, also sollte es funktionieren.

Versuchs mal.

Michi

Hi Michi,

Danke für die schnelle Antwort, meine Frage wäre nun, an welcher Stelle im Programmcoding sollte ich diese SELECT-Anweisung denn einbauen ? Und falls ich den JOIN habe, dann ist der VIEW (ZFSSAKOLIST_VIEW) bzw die Struktur (ZFSAKOLIST_STRUCT), also das was ich zur Verknüpfung angelegt habe, sinnlos oder ? Falls dies der Fall sein sollte, wie deklariere ich dann meine Daten bzw Parameter ? weil früher hatte ich ja noch den VIEW, die Struktur oder einen Tabellennamen. Bsp:

DATA: it_tab TYPE table of ZFSAKOLIST_VIEW,

Hallo Rufat,

ich mußte Dein Programm etwas anpassen, damit es bei mir läuft. Deswegen hatte ich den View übersehen.

Also, den Datenbank View kannst Du prinzipiell verwenden. Der DB View hat viele Vorteile. Den kannst Du ja direkt in der SM30 und in Querys verwenden. Dem gegenüber steht, daß insbesondere bei größeren Projekten, eine Änderung des Views eine Neugenerierung abhängiger Objekte beim Transport ins produktive System nach sich zieht. Eventuelle Fehler durch entfernen eines Feldes sind erst erkennbar, wenn jemand das Unterobjekt (Funktionsbaustein und dergleichen) benutzt.

Deswegen rate ich zum JOIN:

TYPE-POOLS slis.

DATA:
 it\_tab TYPE TABLE OF zfsakolist\_struct,
 wa\_zeile LIKE LINE OF it\_tab,
 gs\_layout TYPE slis\_layout\_alv,
 gv\_ktonr LIKE wa\_zeile-saknr. ""Dummy-variable


PARAMETERS:
 p\_ktplan TYPE zfsakolist\_struct-ktopl
 DEFAULT 'KKLE'
 OBLIGATORY,
 p\_bkreis TYPE zfsakolist\_struct-bukrs.

SELECT-OPTIONS so\_ktonr FOR gv\_ktonr.


SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME.

PARAMETERS:
 guv-blnz RADIOBUTTON GROUP rad1 DEFAULT 'X', "Vorsicht mit "-"
 blnz\_kto RADIOBUTTON GROUP rad1,
 guv\_kto RADIOBUTTON GROUP rad1.


SELECTION-SCREEN END OF BLOCK b1.


CASE 'X'.
 WHEN guv-blnz. "wenn alle Konten angezeigt werden sollen

 SELECT \*
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 FROM ska1
 INNER JOIN skb1
 ON skb1~saknr = ska1~saknr
 AND skb1~bukrs = p\_bkreis
 WHERE ska1~ktopl = p\_ktplan
 AND ska1~saknr IN so\_ktonr.

 WHEN blnz\_kto.
 SELECT \*
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 FROM ska1
 INNER JOIN skb1
 ON skb1~saknr = ska1~saknr
 AND skb1~bukrs = p\_bkreis
 WHERE ska1~ktopl = p\_ktplan
 AND ska1~saknr IN so\_ktonr
 AND ska1~xbilk = 'X'.

 WHEN guv\_kto.
 SELECT \*
 INTO CORRESPONDING FIELDS OF TABLE it\_tab
 FROM ska1
 INNER JOIN skb1
 ON skb1~saknr = ska1~saknr
 AND skb1~bukrs = p\_bkreis
 WHERE ska1~ktopl = p\_ktplan
 AND ska1~saknr IN so\_ktonr
 AND ska1~xbilk = space.

ENDCASE.


gs\_layout-zebra = 'X'.



CALL FUNCTION 'REUSE\_ALV\_GRID\_DISPLAY'
 EXPORTING
 i\_structure\_name = 'ZFSAKOLIST\_STRUCT'
 TABLES
 t\_outtab = it\_tab
 EXCEPTIONS
 program\_error = 1
 OTHERS = 2.
IF sy-subrc 0.
 MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Hoffe, das geht so.

Den DB View kannst Du dann löschen.

Wenn Du nur wenige Felder in deiner Struktur zfsakolist_struct hast, dann wäre eine Einzelauflistung der Felder statt des * im SELECT günstiger. Beim JOIN immer mit ~ Referenzierer.

Michi

Hallo Rufat,
schau mal in dem Entwicklungspaket SLIS nach. Unter den Programmen findest Du genügend Beispiele, wie Du so einen Ausgabereport machen kannst.
Der Funktionsbaustein REUSE_ALV_GRID_DISPLAY braucht auf jeden Fall noch ein paar mehr Parameter, als Du hier angegeben hast.

Anbei mal ein Beispiel (nicht lauffähig), wie man den REUSE_ALV_GRID_DISPLAY befüllt und vorbereitet.

*&---------------------------------------------------------------------*
*& Report ZMYPROGRAM *
*& *
*&---------------------------------------------------------------------*
report ZMYPROGRAM message-id ZMESSAGE.
include ZMYPROGRAM top . " global Data
include ZMYPROGRAM select. " Selection-Include
include ZMYPROGRAM forms. " FORM-Routines
include ZMYPROGRAM ucomm. " User-Commands

initialization.
perform initialize.

start-of-selection.
perform get_ selection changing gt_select.
" nun noch am Bildschirm anzeigen
perform reuse_alv_grid_display.

end-of-selection.

*&---------------------------------------------------------------------*
*& Include ZMYPROGRAM_TOP *
*&---------------------------------------------------------------------*
type-pools: slis, imrep, rsds.

data: gt_select type table of st_select,
gt_output type table of st_select.

data: gcl_grid type ref to cl_gui_alv_grid,
gcl_dock_container type ref to cl_gui_docking_container.

*…
data: gt_fieldcat type slis_t_fieldcat_alv,
gs_layout type slis_layout_alv,
gv_sortfield(30) type c,
gv_desc_order type boole_d,
gs_variant type disvariant, "Display-Variante
gv_grid_title type lvc_title.

*…
tables: ska1.

*…
data: gv_repid type syrepid,
gv_rows_str type string,
gv_row type i,
gv_row_color type lvc_cifnm value ‚LINECOLOR‘,
gv_save(1) type c value ‚A‘, " Parameter X, U oder A
gv_subrc type sysubrc.

*&---------------------------------------------------------------------*
*& Include ZMYPROGRAM_SELECT *
*&---------------------------------------------------------------------*
selection-screen begin of block sel with frame title text-001.
* Selektionsblock 1
selection-screen begin of block sel1 with frame title text-002.
select-options s_belnr for bkpf-belnr.
select-options s_bukrs for bkpf-bukrs.
select-options s_gjahr for bkpf-gjahr.
select-options s_lifnr for bkpf-lifnr.

selection-screen end of block sel1

selection-screen begin of block sel2 with frame title text-004.
parameter: p_max type i default 300.
parameter: pa_varia type slis_vari.
selection-screen end of block sel2…

*&---------------------------------------------------------------------*
*& Include ZMYPROGRAM_FORMS *
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*& Form initialize
*&---------------------------------------------------------------------*
form initialize .
clear: gt_fieldcat, gt_select.

perform prepare_fieldcat.
perform layout_init.

* Title der Selektionsmaske
set titlebar c_init_title with text-110.

* Report ID zuordnen
gv_repid = sy-repid.

endform. " initialize

*&--------------------------------------------------------------------*
*& Form prepare_fieldcatalog
*&--------------------------------------------------------------------*
form prepare_fieldcat.

data: lt_tabname type slis_tabname,
lv_repid type sy-repid,
ls_fcat type line of slis_t_fieldcat_alv.

lt_tabname = ‚gt_select‘.
lv_repid = sy-repid.

"REFRESH gt_fieldcatalog. fieldcounter = 0.
call function ‚REUSE_ALV_FIELDCATALOG_MERGE‘
exporting
i_program_name = lv_repid
i_internal_tabname = lt_tabname
i_structure_name = ‚MYGRIDSTRUCTURE‘
* I_CLIENT_NEVER_DISPLAY = ‚X‘
* I_INCLNAME =
* I_BYPASSING_BUFFER =
* I_BUFFER_ACTIVE =
changing
ct_fieldcat = gt_fieldcat
exceptions
inconsistent_interface = 1
program_error = 2
others = 3.

if sy-subrc 0.
message s015.
endif.

" Nun die anklickbaren Hotspot-Felder definieren.
loop at gt_fieldcat into ls_fcat.

case ls_fcat-fieldname.

" — Felder nicht anzeigen
when ‚WIID‘ or ‚AR_OBJECT‘ or ‚ARC_DOC_ID‘
ls_fcat-tech = ‚X‘.
" — Ändern der Position, Beschriftung, etc.
when ‚BELNR‘.
ls_fcat-seltext_s = text-302. "‚FI Beleg‘.
ls_fcat-seltext_l = text-303. "‚FI Belegnummer‘.
ls_fcat-hotspot = ‚X‘.
when ‚LIFNR‘.
ls_fcat-seltext_s = text-306. "‚Kreditorennr‘.
ls_fcat-seltext_l = text-307. "‚Kreditorennummer‘.
ls_fcat-hotspot = ‚X‘.
when ‚BUKRS‘.
ls_fcat-seltext_s = text-310. "‚BKrs.‘.
ls_fcat-seltext_l = text-311. "‚Buchungskreis‘.
ls_fcat-outputlen = ‚4‘.
endcase.

modify gt_fieldcat from ls_fcat index sy-tabix.

endloop.

endform. "prepare_fieldcatalog

*---------------------------------------------------------------------*
* FORM layout_init *
*---------------------------------------------------------------------*
form layout_init.

" Layout-Parameter setzen
gs_layout-no_hotspot = ‚‘. " headings not as hotspot
gs_layout-zebra = ‚X‘. " striped pattern
gs_layout-f2code = ‚DISPLAY‘. "
gs_layout-colwidth_optimize =‚X‘.
gs_layout-totals_before_items = ‚X‘. " diplay totals before the items
gs_layout-group_change_edit = ‚X‘. " Settings by user for new group
gs_layout-info_fieldname = gv_row_color. " infofield for listoutput

endform. "LAYOUT_INIT

*&---------------------------------------------------------------------*
*& Form get_selection
*&---------------------------------------------------------------------*
form get_selection changing gt_select.
data: lv_result type sysubrc,
lv_lifname type name1_gp.

clear: lv_result, lv_lifname, gt_output[], gt_select[].

perform manipulate_lifname.
perform manipulate_erdat changing s_tstmp.
if not s_tstmp is initial.
append s_tstmp.
endif.

select * from bkpf
into corresponding fields of table gt_select up to p_max rows
where bukrs in s_bukrs "Buchungskreis
and belnr in s_belnr "FI-Belegnummer
and gjahr in s_gjahr "Geschäftsjahr
and lifnr in s_lifnr "Lieferantennummer
order by belnr descending.

" Anzahl Treffer ermitteln
gv_row = sy-dbcnt.

gv_rows_str = sy-tfill.
replace ‚&hits‘ in gv_grid_title with gv_rows_str.

gt_output = gt_select.

endform. " get_selection

*&---------------------------------------------------------------------*
*& Form reuse_alv_grid_display
*&---------------------------------------------------------------------*
form reuse_alv_grid_display .

gs_variant-report = sy-repid.
gs_variant-variant = pa_varia.

call function ‚REUSE_ALV_GRID_DISPLAY‘
exporting
i_buffer_active = ‚X‘
i_callback_program = sy-repid
i_callback_pf_status_set = ‚WHOLE_TOOLBAR‘
i_callback_user_command = ‚USER_COMMAND‘
is_layout = gs_layout
it_fieldcat = gt_fieldcat
i_default = ‚X‘
i_save = ‚A‘
is_variant = gs_variant " Layout-Variante
tables
t_outtab = gt_select
exceptions
program_error = 1
others = 2.

if sy-subrc 0.
message id sy-msgid type sy-msgty number sy-msgno
with sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
endif.

endform. " reuse_alv_grid_display

Fank erst einmal klein an. Liste nur mal im ALV die Sachkonten auf. Wenn das klappt, dann füge die weiteren Felder ein.

Have fun.
Calvin

Hallo,

Das sind 3 Fragen in einer.
Ich teile daher meine Antwort etwas auf:

  1. Unterscheidung der Kontotypen
    Da kann ich leider nichts sagen, an welchem Attribut man die verschiedenen Kontotypen unterscheiden kann. Vielleicht hilft ein Debugger-Lauf innerhalb einer Transaktion, wo einer der Typen bearbeitet wird. Das sollte i.d.R. ein bestimmtes Feld sein mit Domänenfestwerten.

Da ich allerdings die konkrete Anwendung nicht kenne, kann ich darüber nur mutmaßen.

  1. RadioButton Code modifizieren
    Was soll dort passieren?
    Es sollte ausreichen, ein Ereignis START-OF-SELECTION zu definieren, in dem die Datenselektion und - wenn erforderlich - die Datenanzeige gemacht wird. Oder was soll mit der W-Nachricht erreicht werden?
    Sonst muss halt die gewählte Option noch mit in die Selektion aufgenommen werden. Die Ergebnisausgabe und die Datenselektion werden ja eh auf 2 Dynpros gemacht, oder?

  2. ALV Grid Anzeige:
    Wie der angebenene Funktionsbaustein genau funktioniert, weiß ich nicht.
    Ich würde die Variante mit der ABAP-Klasse CL_GUI_ALV_GRID nutzen. Bei dieser Variante muss man auf einem Dynpro einen Custom Container statisch definieren. Dann muss im PBO eine globale Objektreferenz vom Typ CL_GUI_CUSTOM_CONTAINER erzeugt werden. Danach dann kann die globale Objektreferenz vom Typ CL_GUI_ALV_GRID mit ihrem Konstruktor erzeugt werden. Die anzuzeigenden Daten übergibt man dann dem ALV mit der Methode SET_TABLE_FOR_FIRST_DISPLAY.
    Nun kommt es auf die Ausgabe an: Will man alle Spalten seiner Datenstruktur anzeigen, dann kann man den Strukturnamen dieser eben genannten Methode mitgeben. Will man die Ausgabe modifizieren, bietet sich der halb-automatische Aufbau des Feldkataloges an (Per Baustein LVC_FIELDCATALOG_MERGE den gesamten Feldkatalog generieren lassen und dann per Schleife entsprechend modifizieren).
    Wenn man dann die Datentabelle ändert, kann man mit REFRESH_TABLE_DISPLAY die Ausgabe auffrischen, ohne die ganzen Objekterzeugungen nochmals machen zu müssen. Die zu verwendenden DDIC-Objekte haben als Präfix „LVC_“.

Beispielprogramme sollten unter dem Namen BC_ALV_GRID_* vorhanden sein. (Weiß gerade nicht, ob die „_“ dort stehen müssen - bitte probieren).

Und hier noch der Link in die SAP-Doku zum ALV Grid Control (hier im NW 7.0 EHP1):

Das hängt natürlich vom eingesetzten Release ab, ob das alles schon verfügbar ist.

Allerdings sollte es in dem Baustein ‚REUSE_ALV_GRID_DISPLAY‘ ähnliche Parameter geben. Ich arbeite aber in der Regel mit der CL_GUI_ALV_GRID.

Ich hoffe, dass meine Erklärungen verständlich sind und weiter helfen können.

Viele Grüße