Anfrage

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.

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

In lv_lines steht die Anzahl der jeweils zuvor betrachteten internen Tabelle.

If lv_lines > 0

Fragt also, ob die interner Tabelle Datensätze enthält oder halt nicht.

Sonst empfehle ich die F1-Taste.
Alles notwendige findet man in der übersichtlichen Online-Hilfe.

MfG
Heiko Zink

Hallo Rufat,

so_ktonr ist ein Range, also eine Tabelle, welche die Einträge aus Select-Options enthält. Die Abfrage IF lv_lines > 0. dient nur dazu herauszufinden, ob überhaupt etwas eingegeben wurde. Diese Abfrage ist komplett überflüssig, weil ein leerer Range bedeutet, dass alle Daten ohne Einschränkung gelesen werden!
Bei der zweiten Abfrage macht das schon mehr Sinn, nämlich die Prüfung, ob etwas gefunden wurde:
DESCRIBE TABLE it_ska1 LINES lv_lines.
IF lv_lines > 0.
Aber auch diese Anweisungen sind nicht notwendig: Nach jedem Befehl, also auch nach dem Select kann man den sy-subrc abfragen. Ist dieser initial, war der Befehl erfolgreich. In diesem Beispiel: Es wurden Daten gefunden!

Viele Grüße

Peter

Hallo Rufat,
nur kurz:
* Einträge aus SKA1-Tabelle auswählen
DESCRIBE TABLE so_ktonr LINES lv_lines.

stellt fest wie viele Zeilen in der Tablle so_ktonr sind. Danach wird dann mit einem jeweiligen Select weitergearbeitet abhängig ob Zeilen in so_ktonr sind oder nicht.

Moin,

DATA: lv_lines TYPE i.

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

IF lv_lines > 0.

Das kann ich dir beantworten. Es wird eine (Zähler-)Variable vom Typ i angelegt mit Namen lv_lines. Mit dem Befehl „Describe tables“ werden die Anzahl der Datensätze in der internen Tabelle so_ktonr in die Variable lv_lines geschrieben. Wenn hier mindestens ein Eintrag drin ist, dann ist die Bedingung erfüllt.

Kürzer wäre:
if so_ktonr[] is not initial.

end if.

Mit [] fragt er den Tabellenrumpf ab des Select-Options. Wenn hier mindestens ein Eintrag drin ist, ist die Bedingung erfüllt.

Hoffe das hat weitergeholfen.

Gruß, René

in der variable lv_lines steht die anzahl der zeilen die in der Tabelle so_ktonr enthalten sind

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

gruss