Anfrage

Liebe/-r Experte/-in,

Liebe/-r Experte/-in,

ich habe ein Problem als Neueinsteiger in ABAP (Student), und zwar verstehe ich einige Anweisungen nicht (trotz Googeln), Das Programm gibt Sachkonten mit dem ALV-Grid aus, dabei beinhaltet der erste Programmteil ein Include, da sonst der Programmcode zu lang und unübersichtlich geworden wäre. Die Select-Option, soll zwischen 3 verschieden Optionen auswählen können, nämlich: GUV und Bilanzkonten, nur Bilanzkonten, und nur GuV-Konten. Das Programm nimmt die Daten aus der Struktur, welche angelegt worden ist, und zwar aus den Tabellen SKA1, SKB1 und SKAT. Die hauptsächlichen Probleme habe ich mit dem Include. Ich hoffe Sie können mir die einzelnen wichtigsten Begriffe näher erläutern bezüglich ihrer Funktion. Vor allem verstehe ich If lv_lines >0 nicht. Ich bedanke mich herzlichst im Vorausund verbleibe

mit freundlichen Grüßen

FORM f_fill_tables.

DATA: lv_lines TYPE i.

CLEAR: it_ska1[], it_skb1[], it_skat[],it_tab[].

* Einträge aus SKA1-Tabelle auswählen
DESCRIBE TABLE so_ktonr LINES lv_lines.

IF lv_lines > 0.
* Selektion über Kontenplan und Kontennummer
SELECT * FROM ska1 INTO TABLE it_ska1
WHERE ktopl = p_ktplan AND saknr IN so_ktonr.

ELSE.
* Selektion nur über Kontenplan
SELECT * FROM ska1 INTO TABLE it_ska1
WHERE ktopl = p_ktplan.

ENDIF.

* passende Einträge aus der SKB1-Tabelle auswählen

DESCRIBE TABLE it_ska1 LINES lv_lines.

IF lv_lines > 0.

IF NOT p_bkreis IS INITIAL.
* Selection über Kontennummer und Buchungskreis
SELECT * FROM skb1 INTO TABLE it_skb1
FOR ALL ENTRIES IN it_ska1
WHERE saknr = it_ska1-saknr AND bukrs = p_bkreis.
ELSE.
* Selektion nur über Kontennummer
SELECT * FROM skb1 INTO TABLE it_skb1
FOR ALL ENTRIES IN it_ska1
WHERE saknr = it_ska1-saknr.
ENDIF.

* passende Bezeichnungen auswählen
SELECT * FROM skat INTO TABLE it_skat
FOR ALL ENTRIES IN it_ska1
WHERE SPRAS = sy-langu AND KTOPL = it_ska1-ktopl
AND SAKNR = it_ska1-saknr.

ENDIF.

* Ergebnistabelle zusammenbauen

LOOP AT it_skb1 INTO wa_skb1.
* Arbeitszeile initialisieren
CLEAR wa_zeile.

* Komponenten der SKB1-Tabelle übernehmen
wa_zeile-BUKRS = wa_skb1-BUKRS.
wa_zeile-SAKNR = wa_skb1-SAKNR.
wa_zeile-BEGRU = wa_skb1-BEGRU.
wa_zeile-BUSAB = wa_skb1-BUSAB.
wa_zeile-DATLZ = wa_skb1-DATLZ.
wa_zeile-ERDAT_SKB1 = wa_skb1-ERDAT.
wa_zeile-ERNAM_SKB1 = wa_skb1-ERNAM.
wa_zeile-FDGRV = wa_skb1-FDGRV.
wa_zeile-FDLEV = wa_skb1-FDLEV.
wa_zeile-FIPLS = wa_skb1-FIPLS.
wa_zeile-FSTAG = wa_skb1-FSTAG.
wa_zeile-HBKID = wa_skb1-HBKID.
wa_zeile-HKTID = wa_skb1-HKTID.
wa_zeile-KDFSL = wa_skb1-KDFSL.
wa_zeile-MITKZ = wa_skb1-MITKZ.
wa_zeile-MWSKZ = wa_skb1-MWSKZ.
wa_zeile-STEXT = wa_skb1-STEXT.
wa_zeile-VZSKZ = wa_skb1-VZSKZ.
wa_zeile-WAERS = wa_skb1-WAERS.
wa_zeile-WMETH = wa_skb1-WMETH.
wa_zeile-XGKON = wa_skb1-XGKON.
wa_zeile-XINTB = wa_skb1-XINTB.
wa_zeile-XKRES = wa_skb1-XKRES.
wa_zeile-XLOEB = wa_skb1-XLOEB.
wa_zeile-XNKON = wa_skb1-XNKON.
wa_zeile-XOPVW = wa_skb1-XOPVW.
wa_zeile-XSPEB_SKB1 = wa_skb1-XSPEB.
wa_zeile-ZINDT = wa_skb1-ZINDT.
wa_zeile-ZINRT = wa_skb1-ZINRT.
wa_zeile-ZUAWA = wa_skb1-ZUAWA.
wa_zeile-ALTKT = wa_skb1-ALTKT.
wa_zeile-XMITK = wa_skb1-XMITK.
wa_zeile-RECID = wa_skb1-RECID.
wa_zeile-FIPOS = wa_skb1-FIPOS.
wa_zeile-XMWNO = wa_skb1-XMWNO.
wa_zeile-XSALH = wa_skb1-XSALH.
wa_zeile-BEWGP = wa_skb1-BEWGP.
wa_zeile-INFKY = wa_skb1-INFKY.
wa_zeile-TOGRU = wa_skb1-TOGRU.

* Komponenten der SKA1-Tabelle füllen
READ TABLE it_ska1 INTO wa_ska1 WITH KEY saknr = wa_skb1-saknr.

IF sy-subrc = 0.

MOVE-CORRESPONDING wa_ska1 TO wa_zeile.

* dabei auch zugehörige Bezeichnungen füllen
READ TABLE it_skat INTO wa_skat WITH KEY
SPRAS = sy-langu KTOPL = wa_ska1-ktopl
SAKNR = wa_ska1-saknr.

IF sy-subrc = 0.
wa_zeile-TXT20 = wa_skat-TXT20.
wa_zeile-TXT50 = wa_skat-TXT50.
ENDIF.

ENDIF.

* gefüllte Zeile an Tabelle anhängen
APPEND wa_zeile TO it_tab.

ENDLOOP.

ENDFORM. " f_get_tables

Hier der Include

Hallo Rufat,

If lv_lines >0 ist eindeutig ein Fehler, richtig wäre: If lv_lines GT 0.
oder: If lv_lines > 0.

Was das Include betrifft, habe ich mich vor Jahren damit herumgeärgert und dann einfach auf das Include verzichtet und mache seitdem alles in demselben Quelltext. Als Beispiel schicke ich Dir das Coding meines jüngsten Reports mit ALV-Grid (siehe z.B. die Definition von CLASS lcl_event_handler).

Ersetze bitte meine Variablen, Tabellen und Selektion durch Deine eigenen und versuch es noch einmal. Es müsste funktionieren. Mein Report läuft auf jeden Fall gut.

Viele Grüße

Nicolai

Quelltext:

REPORT z_beispiel_crm_vertraege MESSAGE-ID zcs_isu."

* DATENDEKLARATION
*------------------------------------------------------
TABLES: ztcvw_contract, zcrm_contract_kurz.
* Interne Tabelle(n) für selektiert daten
DATA: itab TYPE TABLE OF zcrm_contract_kurz,
wa TYPE zcrm_contract_kurz.
* Hilfsfelder: allgemein und für ALV-Grid
DATA: g_index TYPE i, "#EC NEEDED "Index (z.B. ein Zähler)
g_tabix TYPE i,
g_color,
* Variablen für Dynpro
list_area TYPE scrfname VALUE ‚LIST_AREA‘,
ok_code TYPE sy-ucomm,
* Referenzvariablen zu glob. Klassen f. ALV-Grid, Container u.a.
ref_alv_grid TYPE REF TO cl_gui_alv_grid,
ref_custom_cont TYPE REF TO cl_gui_custom_container,
o_gpart TYPE REF TO cl_isu_business_partner,
* Feldkatalog, Layout, Variant
it_fcat TYPE lvc_t_fcat, "slis_t_fieldcat_alv - alt?
wa_fcat LIKE LINE OF it_fcat, "lvc_s_fcat
wa_layout TYPE lvc_s_layo,
wa_disvariant TYPE disvariant.

***********************************************************************
* Lokale Klassen: zuerst Behandler-Klasse, dann die anderen

*---------------------------------------------------------------------*
* CLASS lcl_event_handler DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
CLASS-METHODS:
double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
ENDCLASS. "lcl_event_handler DEFINITION
*-----------------------------------------------------------------*
* CLASS lcl_event_handler IMPLEMENTATION
*-----------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
METHOD double_click.
* The event DOUBLE_CLICK provides parameters for row and column
* of the click. Use row parameter to select a line of the itab
* In díesem Fall interessiert uns nur die Zeile, keine Spalte
* IF e_column NE ‚CONTRACTPOS‘.
* MESSAGE i024. "Nicht auf beliebige Felder doppelklicken!
READ TABLE itab INDEX e_row-index INTO wa.
CALL FUNCTION ‚Z_CVW_DISPLAY_CONTRACT‘
EXPORTING
iv_contractpos = wa-contractpos
EXCEPTIONS
not_found = 1
input_error = 2
OTHERS = 3.
IF sy-subrc 0.
MESSAGE Fehler bei Anzeige des CRM-Vorgangs TYPE ‚I‘.
ENDIF.

ENDMETHOD. "double_click

ENDCLASS. "lcl_event_handler
* Objektreferenz für CREATE OBJECT: hier, bei Klassenmethoden unnötig!
DATA: event_handler TYPE REF TO lcl_event_handler.

*---------------------------------------------------------------------*
* CLASS lcl_list DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_list DEFINITION.
PUBLIC SECTION.
CLASS-METHODS: list.
ENDCLASS. "lcl_list DEFINITION
*-----------------------------------------------------------------*
* CLASS lcl_list IMPLEMENTATION
*-----------------------------------------------------------------*
CLASS lcl_list IMPLEMENTATION.
METHOD list.
* Controls verwenden
IF ref_custom_cont IS INITIAL.
CREATE OBJECT ref_custom_cont
EXPORTING
container_name = list_area.
CREATE OBJECT ref_alv_grid
EXPORTING
i_parent = ref_custom_cont.
* Set a titlebar for the grid control, Layout
wa_disvariant-report = sy-repid.
wa_disvariant-username = sy-uname.
wa_disvariant-variant = ‚/ZCRM1‘.

* Feldkatalog füllen (siehe auch *BC412_GRDT_EXERCISE_2)
CLEAR: wa_fcat, it_fcat[].
wa_fcat-fieldname = ‚CONTRACTPOS‘.
wa_fcat-emphasize = ‚C100‘. "Color 1, 110 wäre INTENSIFIED
APPEND wa_fcat TO it_fcat.
CLEAR wa_fcat. "sonst wird das nachste Feld farbig

* Send basic list to alv grid control
CALL METHOD ref_alv_grid->set_table_for_first_display
EXPORTING
i_structure_name = ‚ZCRM_CONTRACT_KURZ‘
is_variant = wa_disvariant
i_save = ‚A‘
is_layout = wa_layout
CHANGING
it_outtab = itab
it_fieldcatalog = it_fcat
EXCEPTIONS
invalid_parameter_combination = 1
program_error = 2
too_many_lines = 3
OTHERS = 4.
IF sy-subrc 0.
MESSAGE e000 WITH ‚ALV Grid Fehler!‘.
ENDIF.
* Den Event-Behandler setzen
SET HANDLER:
* lcl_event_handler=>user_command FOR ref_alv_grid,
lcl_event_handler=>double_click FOR ref_alv_grid.

ENDIF. "IF ref_custom_cont IS INITIAL
DESCRIBE TABLE itab LINES g_tabix.
MESSAGE s000 WITH ‚Anzahl der Treffer:‘ g_tabix.
ENDMETHOD. "list
ENDCLASS. "lcl_list IMPLEMENTATION

************************************************************************
* SELEKTIONSBILD *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK block1 WITH FRAME TITLE bl1. "#EC NEEDED
SELECT-OPTIONS: s_datum FOR ztcvw_contract-erdat.
SELECTION-SCREEN SKIP.
SELECT-OPTIONS: s_prtype FOR ztcvw_contract-processtype,
s_status FOR ztcvw_contract-status,
s_sparte FOR ztcvw_contract-sparte,
s_ktokl FOR ztcvw_contract-ktokl.
SELECTION-SCREEN END OF BLOCK block1.
SELECTION-SCREEN BEGIN OF BLOCK block2 WITH FRAME TITLE bl2. "#EC NEEDED
SELECT-OPTIONS: s_partn FOR ztcvw_contract-partner,
s_vkont FOR ztcvw_contract-vkonto,
s_vertr FOR ztcvw_contract-vertrag,
s_anlage FOR ztcvw_contract-anlage,
s_crm_ob FOR ztcvw_contract-crm_object_id,
s_vstell FOR ztcvw_contract-vstelle,
s_int_ui FOR ztcvw_contract-int_ui NO-DISPLAY,
s_ext_ui FOR ztcvw_contract-ext_ui,
s_contrp FOR ztcvw_contract-contractpos.
SELECTION-SCREEN END OF BLOCK block2.

*----------------------------------------------------------------------*
* Vorschlagswerte initialisieren *
*----------------------------------------------------------------------*
INITIALIZATION.

*----------------------------------------------------------------------*
* Processing the event : AT SELECTION-SCREEN OUTPUT
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
bl1 = text-001.
bl2 = text-002.
*----------------------------------------------------------------------*
* Processing the event : AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
** Prüfen ob die Aktionen existieren
* IF s_cclass IS INITIAL AND s_action IS INITIAL AND
* s_ctype IS INITIAL AND s_coming IS INITIAL AND p_oe IS INITIAL AND
* s_partn IS INITIAL.
* MESSAGE e000 WITH ‚Bitte geben Sie mindestens‘
* ‚noch ein Suchkriterium an!‘.
* ENDIF.

***********************************************************************
* PROGRAMMHAUPTABLAUF *
***********************************************************************
START-OF-SELECTION.
* Kontakte selektieren: ob nach OE oder OE-unabhängig
SELECT * FROM ztcvw_contract INTO CORRESPONDING FIELDS OF TABLE itab
WHERE contractpos IN s_contrp AND
( erdat IN s_datum OR ( erdat = ‚00000000‘ AND aedat IN s_datum ) )
AND processtype IN s_prtype AND status IN s_status AND
ktokl IN s_ktokl AND sparte IN s_sparte AND vertrag IN s_vertr AND
vkonto IN s_vkont AND anlage IN s_anlage AND partner IN s_partn AND
crm_object_id IN s_crm_ob AND vstelle IN s_vstell AND
int_ui IN s_int_ui AND ext_ui IN s_ext_ui.

IF itab[] IS INITIAL.
MESSAGE s001.
EXIT.
ENDIF.
SORT itab BY crm_object_id.

* Daten vervollständigen: Kontoklasse
LOOP AT itab INTO wa.

* VK und seine Stammdaten wg. Strom & Option "NJ010208
IF NOT wa-vkonto IS INITIAL AND wa-ktokl IS INITIAL.
SELECT SINGLE ktokl FROM fkkvkp INTO wa-ktokl WHERE
vkont = wa-vkonto.
IF sy-subrc = 0.
MODIFY itab FROM wa.
CLEAR wa.
ENDIF.
ENDIF.
** Falls erforderlich
* PERFORM namen_ermitteln USING wa-partner wa-name.

ENDLOOP.
* Nur wenn die gesuchte Brienummer nicht gefunden wurde
IF itab[] IS INITIAL.
MESSAGE s001.
EXIT.
ENDIF.

* Verarbeitung siehe Dynpro und lokale Klassen
CALL SCREEN 100.

* PERFORM verarbeitung." - nur im Echtmodus
* PERFORM ausgabe.
END-OF-SELECTION.

************************************************************************
* VERARBEITUNGS - FORMS / Dynpro-Module *

*&-----------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&-----------------------------------------------------------------*
* GUI settings
*------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS ‚SCREEN_0100‘.
SET TITLEBAR ‚SCREEN_0100‘.
CALL METHOD lcl_list=>list.
ENDMODULE. " STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*& Module clear_ok_code OUTPUT
*&---------------------------------------------------------------------*
MODULE clear_ok_code OUTPUT.
CLEAR: ok_code.
ENDMODULE. " clear_ok_code OUTPUT
*&---------------------------------------------------------------------*
*& Module exit INPUT
*&---------------------------------------------------------------------*
* für alle Dynpros AT EXIT-COMMAND
*----------------------------------------------------------------------*
MODULE exit INPUT.
* Controls clearen
IF NOT ref_alv_grid IS INITIAL.
CALL METHOD ref_alv_grid->free.
ENDIF.
CALL METHOD ref_custom_cont->free.
IF ok_code = ‚CANCEL‘.
MESSAGE s008.
ENDIF.
LEAVE TO SCREEN 0.

ENDMODULE. " exit INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_0100 INPUT
*&---------------------------------------------------------------------*
* Im Unterschied zu double_click muss hier dieses Modul sein
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
* IF ok_code = ‚EXPORT‘. "nicht in diesem Report
* CALL METHOD lcl_event_handler=>user_command
* EXPORTING
* e_ucomm = ok_code.
* ENDIF.
ENDMODULE. " USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------*
*& Form free_all_new_objects
*&---------------------------------------------------------------------*
* -->x_every_n_calls max. Anzahl von Objekten, z.B. GP
*----------------------------------------------------------------------*
FORM free_all_new_objects USING x_every_n_calls TYPE i.

STATICS: g_free_counter TYPE i.

ADD 1 TO g_free_counter.
IF g_free_counter >= x_every_n_calls.
g_free_counter = 0.
CALL METHOD cl_isu_business_partner=>free_all.
CALL METHOD cl_isu_address=>free_all.
ENDIF.
ENDFORM. " free_all_new_objects

*&---------------------------------------------------------------------*
*& Form Namen_ermitteln
*&---------------------------------------------------------------------*
* Den Namen des GP ermitteln
*----------------------------------------------------------------------*
* --> p1 GP-Nummer
* select
EXPORTING
partnerid = v_gpart
RECEIVING
partner = o_gpart
EXCEPTIONS
invalid_object = 1.
CALL METHOD o_gpart->get_name
IMPORTING
y_name = v_name
EXCEPTIONS
not_selected = 1
invalid_object = 2.
* clear all instances every 20 calls of this function
PERFORM free_all_new_objects USING 20.
CLEAR: o_gpart.

ENDFORM. " Namen_ermitteln

Hallo,

mit der IF-Abfrage wird geprüft, ob die interne Tabelle so_ktonr Zeilen enthält, mit anderen Worten, ob Eingaben in der Select-Option so_ktonr gemacht wurden.