Sei sulla pagina 1di 124

ABAP/4 Basis

Funktionsbausteine
ABAP/4 Basis Funktionsbausteine

Dokument-Historie

Version Datum Author nderungsgrund


1.0 Jan. 2013 Erhard Horak Ersterstellung
1.1 Apr. 2014 Erhard Horak Feiertag prfen
1.2 Sept. 2014 Erhard Horak Fubas fr Nachrichten aufgenommen

Haftungsausschluss
Wir haben dieses Dokument zur internen Verwendung erstellt und stellen dieses Dokument via
Homepage unseren Mitarbeitern zur Verfgung.

Falls sie dieses Dokument oder Auszge aus diesem Dokument verwenden mchten, tun sie dies auf ihr
eigenes Risiko.

Wir bernehmen keinerlei Gewhr fr die Richtigkeit der Dokumentation und Verwendung in ihrem
Coding und den daraus evtl. entstehenden Schden.

Urheberrechte
SAP und ABAP sind eingetragene Warenzeichen und Eigentum der SAP AG.

Kontakt
B.O.A. Unternehmensberatung GmbH

Web www.boa-soft.de
ABAP/4 Basis Funktionsbausteine

Inhaltsverzeichnis

1 KURZBESCHREIBUNG ........................................................................................................................... 1
1.1 BERECHTIGUNGSPRFUNG ..................................................................................................................... 2
1.2 FB AUFRUF FEHLER ABFANGEN ............................................................................................................. 3
1.3 RFC FUNKTIONSBAUSTEINE .................................................................................................................. 4
1.4 FUBAS VARIABEL AUFRUFEN .................................................................................................................. 7
1.5 BERGABE RANGE TABELLE ............................................................................................................... 9
1.6 BAPI FUBAS TESTEN ............................................................................................................................. 9
2 MATERIALSTAMM.................................................................................................................................10
2.1 VERBRAUCHSWERTE LESEN ..................................................................................................................10
3 KUNDENSERVICE...................................................................................................................................10
3.1 CODES LESEN .......................................................................................................................................10
3.2 MELDUNG LESEN ..................................................................................................................................11
3.3 LISTE SERVICEMELDUNGEN LESEN ........................................................................................................11
3.4 SYSTEMSTATUS LESEN ..........................................................................................................................13
3.5 USER STATUS IN MELDUNG ..................................................................................................................14
3.6 USER-STATUS IN MELDUNG SETZEN ......................................................................................................14
3.7 USERSTATUS IN AUFTRAG SETZEN ........................................................................................................15
3.8 MELDUNG NDERN ..............................................................................................................................17
3.9 MATERIALRCKMELDUNG ....................................................................................................................20
3.10 ZEITEN FR INSTANDHALTUNGS-/SERVICEAUFTRAG RCKMELDEN ........................................................21
4 KLASSIFIZIERUNG.................................................................................................................................23
4.1 MERKMALE LESEN ...............................................................................................................................23
4.2 MERKMALSWERTE LESEN .....................................................................................................................24
4.3 TABELLEN ZUR KLASSE LESEN ..............................................................................................................25
4.4 KLASSENART LESEN/PRFEN .................................................................................................................25
5 BONUSABSPRACHEN (AGREEMENTS) ..............................................................................................26
5.1 VERKNPFUNGEN LESEN ......................................................................................................................26
5.2 ABSPRACHE KOPIEREN ..........................................................................................................................26
6 SALES & DISTRIBUTION .......................................................................................................................29
6.1 STATUS IN BELEGEN SETZEN .................................................................................................................29
6.2 KUNDENHIERARCHIE LESEN ..................................................................................................................29
7 KONDITIONEN ........................................................................................................................................31
7.1 KOPFKONDITIONEN LESEN ....................................................................................................................31
7.2 POSITIONSKONDITIONEN LESEN.............................................................................................................31
7.3 KONDITIONEN FR DYNPRO LESEN .......................................................................................................32
8 ALLGEMEINE ..........................................................................................................................................35
8.1 BERSICHT FUNKTIONSBAUSTEINE .......................................................................................................35
8.2 MAEINHEITEN .....................................................................................................................................37
8.3 MAEINHEITEN IM MATERIAL ...............................................................................................................39
8.4 BETRAG IN UNTERSCHIEDLICHEN WHRUNGEN .....................................................................................40
8.5 WHRUNGSFELD KONVERTIEREN ..........................................................................................................41
8.6 RFC CLOSE ........................................................................................................................................42
8.7 RFC T ABELLEN LESEN .........................................................................................................................42
8.8 STATUS ZU OBJEKTEN LESEN ................................................................................................................43
8.9 TERMINAL ERMITTELN ..........................................................................................................................44
8.10 DATUM ................................................................................................................................................44
8.10.1 Monate ermitteln .........................................................................................................................44
8.10.2 Datum ins externe Format umwandeln .........................................................................................46

Seite i
ABAP/4 Basis Funktionsbausteine

8.10.3 Datum ins interne Format umwandeln .........................................................................................46


8.10.4 Wochen .......................................................................................................................................47
8.10.5 Berechnen Datum ........................................................................................................................49
8.10.6 Berechnen Arbeitstage.................................................................................................................49
8.10.7 Berechnen Wochentage ...............................................................................................................51
8.10.8 Wochenanfang (Montag) ermitteln ...............................................................................................51
8.10.9 Datum prfen ..............................................................................................................................51
8.10.10 Wochentag ermitteln....................................................................................................................52
8.10.11 Letzter Tag des Monats ermitteln .................................................................................................52
8.10.12 Nchsten/vorherigen Werktag ermitteln .......................................................................................53
8.10.13 Periode ermitteln.........................................................................................................................56
8.10.14 Letzten und ersten Tag in Periode ermitteln .................................................................................57
8.10.15 Letzten/ersten Tag in Vormonat ermitteln.....................................................................................57
8.10.16 Monatsname ermitteln .................................................................................................................58
8.10.17 Beginn Fiscal Jahr ermitteln........................................................................................................58
8.10.18 Datum in Fiscal Periode umwandeln ...........................................................................................58
8.10.19 Feiertag prfen ...........................................................................................................................59
8.11 PROGRAMMVARIANTEN ........................................................................................................................61
8.12 FELDER KONVERTIEREN ........................................................................................................................62
8.13 TEXT KONVERTIEREN ...........................................................................................................................63
8.14 AUFRUF TRANSAKTIONEN ....................................................................................................................64
8.15 COMMAND AUSFHREN ........................................................................................................................65
8.16 ADRESSEN ...........................................................................................................................................67
8.16.1 Adresse lesen...............................................................................................................................67
8.16.2 Adresszusatz lesen .......................................................................................................................68
8.17 ADRESSDATEN USER ERMITTELN ..........................................................................................................73
8.17.1 Anrede/Titel ermitteln ..................................................................................................................74
8.18 BELEGDATEN .......................................................................................................................................75
8.18.1 Partnerdaten zum Beleg ..............................................................................................................75
8.19 F4 HILFE ..............................................................................................................................................76
8.19.1 Anzeige F4 zu einer Tabelle aus dem Data Dictionary. ................................................................76
8.19.2 Anzeige F4 zu einer internen Tabelle. ..........................................................................................76
8.19.3 Anzeige F4 zu einer internen Tabelle mit Update von Dynprofeldern. ...........................................80
8.19.4 F4 in PBO belegen ......................................................................................................................82
8.20 F4 FR PARAMETER .............................................................................................................................84
8.21 F4 HILFE FR SELECT-OPTIONS ............................................................................................................85
8.22 F4 HILFE ZU FELD KSCHL ...................................................................................................................86
8.23 ERMITTELN SAP STANDARD PFAD ........................................................................................................86
8.24 DATA DICTIONARY ...............................................................................................................................87
8.24.1 Feldinformationen zu Tabellen/Strukturen lesen...........................................................................87
8.25 DYNPRO DATEN LESEN .........................................................................................................................90
8.26 POPUPS ................................................................................................................................................91
8.26.1 Selektion Zeile aus interner Tabelle .............................................................................................91
8.27 APPLICATION LOG ANZEIGEN ................................................................................................................95
8.28 APPLICATION LOG SCHREIBEN ..............................................................................................................96
8.29 TEXTE ANZEIGEN ..................................................................................................................................99
8.30 BELEGFLUSS LESEN ............................................................................................................................ 100
8.31 PRFEN OB EIN FUNKTIONSBAUSTEIN EXISTIERT ................................................................................. 102
8.32 PRFZIFFER FR EAN ERMITTELN ...................................................................................................... 103
8.33 READ STATUS LINE ............................................................................................................................. 104
8.34 POPUP AUSGEBEN ............................................................................................................................... 105
8.35 NDERUNGSBELEGE LESEN ................................................................................................................. 107
8.36 IDOC AUSGABE ................................................................................................................................. 108
8.36.1 Ausgang .................................................................................................................................... 108
8.36.2 Eingang .................................................................................................................................... 108
8.37 EXCEL DATEI EINLESEN ...................................................................................................................... 110
8.38 FEHLERMELDUNGEN IM POPUP AUSGEBEN ........................................................................................... 111
8.38.1 BAL Fubas ................................................................................................................................ 111
8.38.2 Show Popup .............................................................................................................................. 114

Seite ii
ABAP/4 Basis Funktionsbausteine

8.39 RFC VERBIDNUNG TESTEN ................................................................................................................. 116


8.40 LESEN TEXTE ..................................................................................................................................... 117
8.41 NACHRICHTEN ................................................................................................................................... 118
8.42 WEB LINK .......................................................................................................................................... 119

Seite iii
ABAP/4 Basis Funktionsbausteine

1 Kurzbeschreibung
Die Funktionsbausteine befinden sich in der Tabelle TFDIR. Diese Tabelle kann man z.B. ber
den Rahmenprogrammname (SY-REPID) lesen.

ber den Modus kann man feststellen ob es sich um einen RFC Fuba handelt.

Die Funktionsgruppe zu den Fubas sind in der Tabelle ENLFDIR.

Seite 1 / 120
ABAP/4 Basis Funktionsbausteine

1.1 Berechtigungsprfung
Die Berechtigungsprfung erfolgt ber den Fuba AUTHORITY_CHECK_RFC.

DATA: l_fname TYPE tfdir-funcname,


l_fugr TYPE authb-rfc_name.

SELECT SINGLE funcname INTO l_fname


FROM tfdir WHERE pname EQ sy-repid.
SELECT SINGLE area INTO l_fugr
FROM enlfdir WHERE funcname = l_fname.

CALL FUNCTION 'AUTHORITY_CHECK_RFC'


EXPORTING
userid = sy-uname
* functiongroup = '/SIE/AD_ZAVGSDTABVF0000'
functiongroup = l_fugr
EXCEPTIONS
rfc_no_authority = 1
OTHERS = 2.

IF sy-subrc NE 0.
raise rfc_no_authority.
ELSE.

Seite 2 / 120
ABAP/4 Basis Funktionsbausteine

1.2 FB Aufruf Fehler abfangen


Mit dem Befehl CATCH CX_SY_DYN_CALL_ILLEGAL_FUNC kann man einen
Programmabbruch vermeiden.

DATA:
l_ref TYPE REF TO cx_root,
l_text TYPE string. "#EC NEEDED

IF ls_zamewcm1-fnam IS NOT INITIAL.


TRY.
CALL FUNCTION ls_zamewcm1-fnam
EXPORTING
i_idoc_control = i_idoc_control
CHANGING
ch_tcode = ch_tcode
ch_imkpf = ch_imkpf
cht_imseg = cht_imseg.

CATCH cx_sy_dyn_call_illegal_func INTO l_ref.


l_text = l_ref->get_text( ).

ENDTRY.
ENDIF.

Seite 3 / 120
ABAP/4 Basis Funktionsbausteine

1.3 RFC Funktionsbausteine


Bei einem RFC Funtkionsbaustein wird immer die Struktur des SAP Systems gezogen. Um die
Strukturen gleich zu halten, sollte man mit eigenen Strukturen arbeiten.

Beispiel
Die Range Tabelle IMT_MATNR_RANGE ist im Sende- und Empfangssystem unterschiedlich
definiert.

Im Sendesystem ist die Materialnummer 18-stellig definiert.

FUNCTION /sie/ad_zamewc_stock_a2p.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(IMT_MATNR_RANGE) TYPE WDFR_MATNR_RANG_TYP
*" EXPORTING
*" VALUE(EXT_MARA) TYPE MARA_TT
*"----------------------------------------------------------------------

SELECT * FROM mara


INTO TABLE ext_mara
WHERE matnr IN imt_matnr_range.

ENDFUNCTION.

Seite 4 / 120
ABAP/4 Basis Funktionsbausteine

Im Empfangssystem ist die Materialnummer 10-stellig definiert.

FUNCTION /sie/ad_zamewc_stock_a2p.
*"----------------------------------------------------------------------
*"*"Local Interface:
*" IMPORTING
*" VALUE(IMT_MATNR_RANGE) TYPE /SIE/AD_ZAM_MATNR_RANGE_T
*" EXPORTING
*" VALUE(EXT_MARA) TYPE MARA_TT
*"----------------------------------------------------------------------

SELECT * FROM mara


INTO TABLE ext_mara
WHERE matnr IN imt_matnr_range.

ENDFUNCTION.

Seite 5 / 120
ABAP/4 Basis Funktionsbausteine

Test

Sendesystem
Die Materialnummer wird in korrekter Lnge gefllt.

Empfangssystem
Die Materialnummer wird entsprechend abgeschnitten.

Seite 6 / 120
ABAP/4 Basis Funktionsbausteine

1.4 Fubas variabel aufrufen


Mit folgendem Coding kann man die Parameter variabel an den Fuba bergeben.

Beispiel
Der Fuba PRICING_SUBSCREEN_SET_DATA baut die Parameter dynamisch auf und
bergibt diese ber Tabellen.

type-pools: abap.
data: p_tab type ABAP_FUNC_PARMBIND_TAB, "sorted table
p_lin type ABAP_FUNC_PARMBIND,
e_tab type ABAP_FUNC_EXCPBIND_TAB, "hashed table
e_lin type ABAP_FUNC_EXCPBIND.

function pricing_subscreen_set_data .
*"----------------------------------------------------------------------
*"*"Globale Schnittstelle:
*" IMPORTING
*" REFERENCE(COMM_HEAD_I) LIKE KOMK STRUCTURE KOMK
*" REFERENCE(COMM_ITEM_I) LIKE KOMP STRUCTURE KOMP
*" VALUE(TRTYP_I) TYPE TRTYP OPTIONAL
*" VALUE(DISPLAY_ONLY) TYPE C DEFAULT ' '
*" VALUE(CTRL_NO_DISPLAY) TYPE X OPTIONAL
*" VALUE(CTRL_GREY) TYPE XFELD OPTIONAL
*" TABLES
*" SVBAP STRUCTURE VBAPU OPTIONAL
*" TKOMV STRUCTURE KOMV
*" YKOMV STRUCTURE KOMV OPTIONAL
*" CHANGING
*" VALUE(C_VFKOMV) TYPE REF TO DATA OPTIONAL
*" EXCEPTIONS
*" ERROR
*"----------------------------------------------------------------------

* import communication structures


komk = comm_head_i.
komp = comm_item_i.

* initialization
refresh xkomv.
refresh: p_tab,
e_tab.
clear old_calc_type.

* publication of global field symbol


if c_vfkomv is requested.
assign c_vfkomv->* to <vfkomv>.
else.
unassign <vfkomv>.
endif.

* provide the global variable with a definitive value


gv_no_display = ctrl_no_display.

* transfer table of document conditions TKOMV into item condition table


* XKOMV. Use standard pricing routines included in function pool V61A
* to do this.
if ctrl_grey is initial.

Seite 7 / 120
ABAP/4 Basis Funktionsbausteine

* build parameter list


if <vfkomv> is assigned.
p_lin-kind = ABAP_FUNC_CHANGING.
p_lin-name = 'C_VFKOMV'.
p_lin-value = C_VFKOMV. "reference of <vfkomv>
insert p_lin into table p_tab.
endif.

p_lin-kind = ABAP_FUNC_EXPORTING.
p_lin-name = 'COMM_HEAD_I'.
get reference of KOMK into p_lin-value.
insert p_lin into table p_tab.
p_lin-name = 'COMM_ITEM_I'.
get reference of KOMP into p_lin-value.
insert p_lin into table p_tab.

p_lin-kind = ABAP_FUNC_IMPORTING.
p_lin-name = 'COMM_HEAD_E'.
get reference of KOMK into p_lin-value.
insert p_lin into table p_tab.
p_lin-name = 'COMM_ITEM_E'.
get reference of KOMP into p_lin-value.
insert p_lin into table p_tab.

p_lin-kind = ABAP_FUNC_TABLES.
if SVBAP is supplied.
p_lin-name = 'SVBAP'.
get reference of SVBAP[] into p_lin-value.
get reference of SVBAP into p_lin-tables_wa.
insert p_lin into table p_tab.
endif.
p_lin-name = 'TKOMV'.
get reference of TKOMV[] into p_lin-value.
get reference of TKOMV into p_lin-tables_wa.
insert p_lin into table p_tab.
p_lin-name = 'YKOMV'. "XKOMV --> YKOMV
get reference of XKOMV[] into p_lin-value.
insert p_lin into table p_tab.

* build exception list


e_lin-name = 'ERROR'.
e_lin-value = 1.
insert e_lin into table e_tab.

* call subscreen preparation


call function 'PRICING_SUBSCREEN_PBO' parameter-table p_tab
exception-table e_tab.
endif.

Seite 8 / 120
ABAP/4 Basis Funktionsbausteine

1.5 bergabe RANGE Tabelle


Es knnen RANGE Tabellen bzw. SELECT-OPTIONS an die Funktionsbausteine bergeben
werden.

Als Bezugstyp fr diese Tabellen kann man die SAP Tabellentypen RANGE* verwenden.

1.6 BAPI Fubas testen


Testet man einen BAPI Funktionsbaustein ber SE37 wird zwar eine Meldung Beleg xx
angelegt erzeugt aber der Beleg ist nicht auf der DB, da der COMMIT WORK in dem Fuba
fehlt.

Um den Beleg anzulegen, kann man wie folgt vorgehen:

SE37 -> Testen -> Testsequenz


Hier wird der Fuba z.B. BAPI_PO_CREATE1 und der Fuba
BAPI_TRANSACTION_COMMIT eingetragen.

Anschlieend kann wie bisher weiter getestet werden. Siehe auch OSS Hinweis 420646.

Seite 9 / 120
ABAP/4 Basis Funktionsbausteine

2 Materialstamm

2.1 Verbrauchswerte lesen

CALL FUNCTION 'WOD1_READ_CONSUMPTIONS'


EXPORTING
i_matnr = <matnr>
i_werks = <l_werks>
i_perkz = p_perkz Periodenkennzeichen
i_provb = G U)
TABLES
t_ges_verb = li_consval
EXCEPTIONS
error = 1
not_found = 2
OTHERS = 3.

3 Kundenservice

3.1 Codes lesen


Das Eingabefeld (i_notif_cat) setzt sich zusammen aus Meldungsart (QMART) und
Berichtsschma (RBNR). Diese Werte erhlt man aus der Tabelle TQ80.

Die Katalogart (z.B. FEKAT, SAKAT) ist ebenfalls in der Tabelle TQ80.

Concatenate tq80-qmart tq80-rbnr


Into i_notif_cat.
*-Lesen aller Codes
refresh: t_code2.
CALL FUNCTION 'ALM_MEREP_015_GETDETAIL' DESTINATION pros-dest
EXPORTING
notif_catprofile = i_notif_cat
TABLES
codes = t_code2
return = lt_ret.
READ TABLE lt_ret TRANSPORTING NO FIELDS WITH KEY type = 'E'.
IF sy-subrc EQ 0.
RAISE EXCEPTION TYPE zcx_gto_ex
EXPORTING textid = zcx_gto_ex=>no_codes.
ENDIF.
*-selektieren relevante Codegruppen fr ValueHelp
DELETE t_code2 WHERE katalogart NE i_katalogart.

Seite 10 / 120
ABAP/4 Basis Funktionsbausteine

3.2 Meldung lesen


Eine bestehende Meldung kann ber den nachfolgenden Fuba gelesen werden.

CALL FUNCTION 'ALM_MEREP_011_GETDETAIL' DESTINATION pros-dest


EXPORTING
user = sy-uname
notif_no = lf_qmnum
IMPORTING
notification_header = notifheader
TABLES
notification_item = t_notifitem
notification_cause = t_notifcause
notification_partner = t_partner
notification_longtext = lt_notiftext
NOTIFICATION_STATUS = t_notifstatus
return = lt_ret.

User Status

Das Lesen kann auch via BAPI_SERVNOT_GET_DETAIL durchgefhrt werden.

Achtung: Bei beiden Fubas werden nicht alle Daten aus den Positionen bergeben.

3.3 Liste Servicemeldungen lesen


Die Liste der Servicemeldungen wird mit dem Fuba ALM_PM_NOTIFICATION_GETLIST
gelesen. Dazu muss vorher eine Variante (siehe Transaktion IW58) angelegt werden.

REFRESH: t_notif_list.

if not notif_header-contact is initial and


notif_header-contact ne '0000000000'.
la_parvw = 'ZG'.
la_parnr = notif_header-contact.
endif.

CALL FUNCTION 'ALM_PM_NOTIFICATION_GETLIST' DESTINATION pros-dest


EXPORTING
I_PARTN_ROLE = la_parvw
I_PARTNER = la_parnr
I_WORK_CNTR = notif_header-arbpl " Arbeitsplatz
i_sel_variant = 'HH_ANLBAU'
i_inventory_prof = la_c070
TABLES
et_sel_tab = t_notif_list
return = lt_ret.

Seite 11 / 120
ABAP/4 Basis Funktionsbausteine

if not lt_ret is initial.


read table lt_ret into ls_ret index 1.
la_msg1 = ls_ret-message.
RAISE EXCEPTION TYPE zcx_gto_ex
EXPORTING textid = zcx_gto_ex=>message
msg1 = la_msg1.
endif.

* Nicht relevanter Status wird entfernt


if not t_notif_list is initial.
delete t_notif_list
where ustxt ns i_ustxt.
endif.
if t_notif_list is initial.
RAISE EXCEPTION TYPE zcx_gto_ex
EXPORTING textid = zcx_gto_ex=>NO_ENTRY_ANLBAU.
endif.

Mchte man nur bestimmte User Status anzeigen, muss man den nicht relevanten Status aus
der Liste entfernen.

* Nicht relevanter Status wird entfernt


if not t_notif_list is initial.
delete t_notif_list
where ustxt ns i_ustxt.
endif.

Seite 12 / 120
ABAP/4 Basis Funktionsbausteine

3.4 Systemstatus lesen


Fr den Status zu den Meldungen gibt es keinen SAP Fuba. Mit dem nachfolgenden Fuba kann
man den System Status zu jeder Meldung lesen.

FUNCTION zw_gto_get_notifstat.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_SPRAS) TYPE SPRAS
*" TABLES
*" IT_QMNUM STRUCTURE JEST
*" OT_JEST STRUCTURE JEST
*" OT_STAT STRUCTURE TJ02T
*"----------------------------------------------------------------------

DATA: lt_jest TYPE TABLE OF jest,


lt_stat TYPE TABLE OF tj02t.

CHECK NOT it_qmnum[] IS INITIAL.


SELECT * FROM jest INTO TABLE lt_jest FOR ALL ENTRIES IN it_qmnum
WHERE objnr EQ it_qmnum-objnr
AND inact EQ space.
CHECK sy-subrc EQ 0.
ot_jest[] = lt_jest[].
SORT lt_jest BY stat.
DELETE ADJACENT DUPLICATES FROM lt_jest COMPARING stat.
SELECT * FROM tj02t INTO TABLE ot_stat FOR ALL ENTRIES IN lt_jest
WHERE istat = lt_jest-stat
AND spras = i_spras.

ENDFUNCTION.

Fuba Aufruf:

*-Status lesen
loop at t_notif_list into la_list.
la_jest-objnr = la_list-objnr.
append la_jest to lt_jesto.
endloop.
call function 'ZW_GTO_GET_NOTIFSTAT' DESTINATION pros-dest
EXPORTING
i_SPRAS = sy-langu
TABLES
it_qmnum = lt_jesto
ot_jest = lt_jestn
ot_stat = lt_stat
EXCEPTIONS
others = 1.

Seite 13 / 120
ABAP/4 Basis Funktionsbausteine

3.5 User Status in Meldung


Der User Status wird beim Lesen der Meldung mit zurckgeliefert.

3.6 User-Status in Meldung setzen

method SET_USSTAT.
data: ls_usstat type ZWS_GTO_NOTUSRSTATI,
ls_return type bapiret2,
lt_return type standard table of bapiret2,
lf_str type string.

* Alten Status lschen


ls_usstat-STATUS_EXT = i_usstat_old.

CALL FUNCTION 'BAPI_SERVNOT_CHANGEUSRSTAT' DESTINATION pros-dest


EXPORTING
number = i_qmnum
usr_status = ls_usstat
set_inactive = 'X'
IMPORTING
systemstatus = o_systat
userstatus = o_usstat
TABLES
t_error = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = co_e.
IF sy-subrc EQ 0.
lf_str = ls_return-message.
RAISE EXCEPTION TYPE zcx_gto_ex
EXPORTING textid = zcx_gto_ex=>message
msg1 = lf_str.

* Neuen Status einfgen


else.
ls_usstat-STATUS_EXT = i_usstat_new.

CALL FUNCTION 'BAPI_SERVNOT_CHANGEUSRSTAT' DESTINATION pros-dest


EXPORTING
number = i_qmnum
usr_status = ls_usstat
IMPORTING
systemstatus = o_systat
userstatus = o_usstat
TABLES
t_error = lt_return.
READ TABLE lt_return INTO ls_return WITH KEY type = co_e.
IF sy-subrc EQ 0.
lf_str = ls_return-message.
RAISE EXCEPTION TYPE zcx_gto_ex
EXPORTING textid = zcx_gto_ex=>message
msg1 = lf_str.

Seite 14 / 120
ABAP/4 Basis Funktionsbausteine

else.
call function 'BAPI_TRANSACTION_COMMIT' destination pros-dest.
ENDIF.
ENDIF.
endmethod.

3.7 Userstatus in Auftrag setzen


ndern User Status im Auftrag (Transaktion IW32).

Beispiel
Es soll der Status ZOFF gelscht und der Status ZAAB gesetzt werden.

Fuba ALM_ME_ORDER_CHANGE (Rel. 4.6C)


BAPI_TRANSACTION_COMMIT

Der Status muss im internen Format (siehe Tabelle TJ30T) mitgegeben werden.

Bei dem Status ZOFF muss das Kennz. I gesetzt werden.

Status zum Auftrag

Seite 15 / 120
ABAP/4 Basis Funktionsbausteine

Seite 16 / 120
ABAP/4 Basis Funktionsbausteine

3.8 Meldung ndern


Zum ndern der Meldungen gibt es BAPI Funktionsbausteine und ALM Fubas. Beide Fubas
haben den Nachteil, dass nicht alle Felder (z.B. ANZFEHLER) gendert werden knnen.

BAPI Fubas

FUNCTION zw_gto_change_notif_bapi.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_HEAD) LIKE MAM_20_NOTIF_HEADER STRUCTURE
*" MAM_20_NOTIF_HEADER
*" TABLES
*" I_ITEM STRUCTURE ZWS_GTO_NOTIF_ITEM
*" I_PARTN STRUCTURE ALM_ME_PARTNER_KEY_STRUCT
*" O_RETURN2 STRUCTURE BAPIRET2
*"----------------------------------------------------------------------

REFRESH: o_return2.

* Alte Daten zur Meldung lesen


CALL FUNCTION 'IQS1_FILL_WA_FROM_BUFFER'
EXPORTING
i_qmnum = i_head-notif_no
i_aktyp = 'A'
IMPORTING
e_wviqmel = g_wviqmel
d_viqmel = g_viqmel
* E_RIWO02 = RIWO02
e_riwo03 = g_riwo03
* E_RIWO00 = RIWO00
* E_RQM00 = RQM00
TABLES
e_iviqmfe = it_itemfe
* E_IVIQMMA = IVIQMMA
* E_FOACT = IFOACT
* E_IVIQMSM = IVIQMSM
* E_IVIQMUR = IVIQMUR
* D_IVIQMFE = *IVIQMFE
* D_IVIQMMA = *IVIQMMA
* D_IVIQMSM = *IVIQMSM
* D_IVIQMUR = *IVIQMUR
* E_WORKPAPER = IWORKPAPER
* E_RIWO020TAB = G_RIWO020TAB
EXCEPTIONS
number_initial = 1
OTHERS = 2.
IF NOT g_wviqmel-objnr IS INITIAL.
CALL FUNCTION 'PM_PARTNER_GET'
EXPORTING
objnr = g_wviqmel-objnr
* IMPORTING
* diadr_wa = h_diadr_wa
TABLES
ihpa_tab = it_partner.
ENDIF.

* Kurztext
IF i_head-short_text NE g_wviqmel-qmtxt.

Seite 17 / 120
ABAP/4 Basis Funktionsbausteine

g_head_bapi-short_text = i_head-short_text.
g_headx_bapi-short_text = 'X'.
ENDIF.

* Starttermin
IF i_head-desstdate NE g_wviqmel-strmn.
g_head_bapi-desstdate = i_head-desstdate.
g_headx_bapi-desstdate = 'X'.
ENDIF.
IF i_head-dessttime NE g_wviqmel-strur.
g_head_bapi-dessttime = i_head-dessttime.
g_headx_bapi-dessttime = 'X'.
ENDIF.

* Endtermin
IF i_head-desenddate NE g_wviqmel-ltrmn.
g_head_bapi-desenddate = i_head-desenddate.
g_headx_bapi-desenddate = 'X'.
ENDIF.
IF i_head-desendtm NE g_wviqmel-ltrur.
g_head_bapi-desendtm = i_head-desendtm.
g_headx_bapi-desendtm = 'X'.
ENDIF.

* Arbeitsplatz (Techniker)
IF i_head-mn_wk_ctr NE g_riwo03-arbpl.
perform get_arbpl using i_head-mn_wk_ctr
i_head-plant
changing g_head_bapi-pm_wkctr.
g_headx_bapi-pm_wkctr = 'X'.
ENDIF.

* Codegruppe/Codes
IF i_head-code_group NE g_wviqmel-qmgrp.
g_head_bapi-code_group = i_head-code_group.
g_headx_bapi-code_group = 'X'.
ENDIF.
IF i_head-coding NE g_wviqmel-qmcod.
g_head_bapi-coding = i_head-coding.
g_headx_bapi-coding = 'X'.
ENDIF.

* Projektleiter
REFRESH: it_partn_bapi, it_partnx_bapi.
READ TABLE i_partn WITH KEY partner_role = 'ZG'.
IF sy-subrc EQ 0.
READ TABLE it_partner INTO wa_partner
WITH KEY parvw = 'ZG'.
IF sy-subrc NE 0 OR
i_partn-partner_key NE wa_partner-parnr.
wa_partn_bapi-refobjectkey = g_wviqmel-objnr.
wa_partn_bapi-partn_role = 'ZG'.
wa_partn_bapi-partn_role_old = 'ZG'.
wa_partn_bapi-partner = i_partn-partner_key.
wa_partn_bapi-partner_old = wa_partner-parnr.
APPEND wa_partn_bapi TO it_partn_bapi.

wa_partnx_bapi-partner = 'X'.
wa_partnx_bapi-partn_role_old = 'ZG'.
wa_partnx_bapi-partner_old = wa_partner-parnr.
APPEND wa_partnx_bapi TO it_partnx_bapi.
ENDIF.
ENDIF.

Seite 18 / 120
ABAP/4 Basis Funktionsbausteine

* Positionen
REFRESH: it_item_bapi, it_itemx_bapi.
LOOP AT i_item.
READ TABLE it_itemfe INTO wa_itemfe
WITH KEY fenum = i_item-item_key.
CHECK sy-subrc EQ 0.

CLEAR: wa_item_bapi, wa_itemx_bapi.

IF i_item-d_codegrp NE wa_itemfe-fegrp.
wa_item_bapi-d_codegrp = i_item-d_codegrp.
wa_itemx_bapi-d_codegrp = 'X'.
ENDIF.

IF i_item-d_code NE wa_itemfe-fecod.
wa_item_bapi-d_code = i_item-d_code.
wa_itemx_bapi-d_code = 'X'.
ENDIF.
ENDLOOP.

CALL FUNCTION 'BAPI_SERVNOT_MODIFY_DATA'


EXPORTING
number = i_head-notif_no
notifheader = g_head_bapi
notifheader_x = g_headx_bapi
* IMPORTING
* NOTIFHEADER_EXPORT =
TABLES
notifitem = it_item_bapi
notifitem_x = it_itemx_bapi
* NOTIFCAUS =
* NOTIFCAUS_X =
* NOTIFACTV =
* NOTIFACTV_X =
* NOTIFTASK =
* NOTIFTASK_X =
notifpartnr = it_partn_bapi
notifpartnr_x = it_partnx_bapi
return = it_return2.
IF it_return2 IS INITIAL.

CALL FUNCTION 'BAPI_SERVNOT_SAVE'


EXPORTING
number = i_head-notif_no
* IMPORTING
* NOTIFHEADER =
TABLES
return = it_return2.
IF it_return2 IS INITIAL.

CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

* Restliche Felder direkt ndern


SELECT * FROM qmfe INTO TABLE it_qmfe
WHERE qmnum = i_head-notif_no.
IF sy-subrc EQ 0.
LOOP AT i_item.
LOOP AT it_qmfe INTO wa_qmfe
WHERE fenum = i_item-item_key.

IF i_item-anzfehler NE wa_qmfe-anzfehler.
UPDATE qmfe
SET anzfehler = i_item-anzfehler
WHERE qmnum EQ wa_qmfe-qmnum
AND fenum EQ wa_qmfe-fenum.

Seite 19 / 120
ABAP/4 Basis Funktionsbausteine

IF sy-subrc NE 0.
CLEAR wa_return2.
wa_return2-type = 'E'.
wa_return2-id = '38'.
wa_return2-number = '001'.
wa_return2-message_v1 = 'Fehler beim UPDATE QMFE'(003).
wa_return2-message_v2 = wa_qmfe-qmnum.
wa_return2-message_v3 = wa_qmfe-fenum.
APPEND wa_return2 TO it_return2.
ENDIF.
ENDIF.

ENDLOOP.
ENDLOOP.
ENDIF.

ELSE.
o_return2[] = it_return2.
ENDIF.

ELSE.
o_return2[] = it_return2.
ENDIF.

ENDFUNCTION.

3.9 Materialrckmeldung

FUNCTION zw_gto_create_matconf.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_ORDERID) TYPE AUFNR
*" VALUE(I_PLANT) TYPE WERKS_D
*" VALUE(I_STGE_LOC) TYPE LGORT_D
*" VALUE(I_CODE) TYPE BAPI2017_GM_CODE DEFAULT '03'
*" EXPORTING
*" VALUE(O_GOODSMVTDOC) TYPE BAPI2017_GM_HEAD_RET
*" TABLES
*" IT_MATCONF STRUCTURE BAPI2017_GM_ITEM_CREATE OPTIONAL
*" RETURN STRUCTURE BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
**
DATA: la_header TYPE bapi2017_gm_head_01,
lt_matser TYPE TABLE OF bapi2017_gm_serialnumber.

CALL FUNCTION 'ALM_ME_GOODSMVT_CREATE'


EXPORTING
orderid = i_orderid
plant = i_plant
stge_loc = i_stge_loc
* CUSTOMER =
goodsmvt_header = la_header
goodsmvt_code = i_code
IMPORTING
goodsmvt_doc = o_goodsmvtdoc
TABLES
goodsmvt_item = it_matconf
goodsmvt_serialnumber = lt_matser

Seite 20 / 120
ABAP/4 Basis Funktionsbausteine

return = return.

CALL FUNCTION 'ALM_ME_COMMIT_OR_ROLLBACK'


TABLES
return = return.

ENDFUNCTION.

3.10 Zeiten fr Instandhaltungs-/Serviceauftrag rckmelden

METHOD send_timeconf .

FIELD-SYMBOLS: <timeconf> TYPE zws_gto_timeconf.


DATA: la_ret TYPE bapiret2,
lt_timeconf TYPE TABLE OF zws_gto_timeconf,
la_timeconf TYPE zws_gto_timeconf,
lt_detret TYPE TABLE OF zws_gto_almret,
la_detret TYPE zws_gto_almret,
lf_str TYPE string,
lf_time type tims.

*-Zeit in QR1 beschaffen


CALL FUNCTION 'GET_SYSTEM_TIME_REMOTE' DESTINATION pros-dest
IMPORTING
l_time = lf_time.

*-Zeiten in BAPI-Struktur umfllen


LOOP AT t_timeconf INTO la_timeconf WHERE actual_dur NE 0
AND fin_conf EQ space.
la_timeconf-orderid = order_header-orderid.
la_timeconf-operation = co_vorg.
la_timeconf-act_work = la_timeconf-actual_dur.
IF la_timeconf-act_type EQ co_gsinka.
la_timeconf-un_act_dur = 'H'. "Inkasso immer in H
ENDIF.
la_timeconf-un_work = la_timeconf-un_act_dur.
la_timeconf-work_cntr = la_timeconf-ex_created_by.
la_timeconf-fin_conf = i_final.
*-Datum setzen
la_timeconf-EXEC_START_DATE = la_timeconf-postg_date.
la_timeconf-EXEC_FIN_DATE = la_timeconf-postg_date.
la_timeconf-EXEC_START_TIME = lf_time.
la_timeconf-EXEC_FIN_TIME = lf_time.
la_timeconf-postg_date = sy-datum.
APPEND la_timeconf TO lt_timeconf.
ENDLOOP.
*-Zeiten rckmelden
IF NOT lt_timeconf[] IS INITIAL.
CALL FUNCTION 'BAPI_ALM_CONF_CREATE' DESTINATION pros-dest
EXPORTING
testrun = ' '
IMPORTING
return = la_ret
TABLES
timetickets = lt_timeconf
detail_return = lt_detret.
ENDIF.
*-Fehlerhandling
LOOP AT lt_detret INTO la_detret WHERE type = 'E'.
lf_str = la_detret-message.
RAISE EXCEPTION TYPE zcx_gto_ex

Seite 21 / 120
ABAP/4 Basis Funktionsbausteine

EXPORTING textid = zcx_gto_ex=>order_timeitem


msg1 = lf_str.
ENDLOOP.
*-wenn alles o.k. -> Eintrge sperren
LOOP AT t_timeconf ASSIGNING <timeconf> WHERE actual_dur NE 0.
<timeconf>-fin_conf = co_x.
ENDLOOP.

ENDMETHOD.

Seite 22 / 120
ABAP/4 Basis Funktionsbausteine

4 Klassifizierung

4.1 Merkmale lesen

Die Merkmale knnen ber den Fuba CLSE_SELECT_CABN gelesen werden. Dazu muss man
man aber die ATINN bereits wissen.

In der Tabelle IN_CABN mssen die ATINN als Range Tabelle bergeben werden.

Die Bezeichnung zu den Merkmalen werden ber den Fuba CLSE_SELECT_CABNT gelesen.

Beispiel
In diesem Beispiel wird die Tabelle CABN direkt gelesen, da die interne Nummer ATINN
noch nicht bekannt war.

FORM READ_CABNT.
RANGES L_R_CABN FOR CABN-ATINN.

refresh it_cabn.
loop at editpos_with_header.
SELECT * FROM CABN into wa_cabn up to 1 rows
WHERE ATNAM = editpos_with_header-tabkey+21.
ENDSELECT.
if sy-subrc eq 0.
append wa_cabn to it_cabn.

l_r_cabn-sign = 'I'.
l_r_cabn-option = 'EQ'.
l_r_cabn-low = wa_cabn-atinn.
append l_r_cabn.
endif.
endloop.
sort it_cabn by atinn.
delete adjacent duplicates from it_cabn comparing atinn.
sort l_r_cabn by low.
delete adjacent duplicates from l_r_cabn comparing low.

CALL FUNCTION 'CLSE_SELECT_CABNT'


TABLES
IN_CABN = l_r_cabn
T_CABNT = it_cabnt
EXCEPTIONS
NO_ENTRY_FOUND = 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. " READ_CABNT

Seite 23 / 120
ABAP/4 Basis Funktionsbausteine

4.2 Merkmalswerte lesen


Die Merkmalswerte befinden sich in den Tabellen CAWN und CAWNT und knnen mit den
Fubas CLSE_SELECT_CAWN und CLSE_SELECT_CAWNT gelesen werden.

Die bergabe erfolgt ber die Range Tabelle IN_CABN.

Beispiel
In diesem Beispiel werden die Tabellen direkt gelesen, da zuerst ber die Anmeldesprache
gelesen wird. Ist fr diese Sprache keine Bezeichnung zum Wert vorhanden, wird die
Bezeichnung in einer anderen Sprache gelesen.

form read_cawnt using ip_atinn


ip_atwrt.
data: l_cawn type cawn.

clear cawnt.

select * from cawn into l_cawn up to 1 rows


where atinn eq ip_atinn
and atwrt eq ip_atwrt.
endselect.
if sy-subrc eq 0.
SELECT single * FROM CAWNT
WHERE ATINN = l_cawn-atinn
AND ATZHL = l_cawn-atzhl
AND SPRAS = sy-langu
AND ADZHL = l_cawn-adzhl.
if sy-subrc ne 0.
SELECT * FROM CAWNT up to 1 rows
WHERE ATINN = l_cawn-atinn
AND ATZHL = l_cawn-atzhl
AND ADZHL = l_cawn-adzhl.
endselect.
endif.

endif.
endform.

Seite 24 / 120
ABAP/4 Basis Funktionsbausteine

4.3 Tabellen zur Klasse lesen


Zu einer Klasse knnen Tabellen zugeordnet werden. Diese Zuordnung ist in der Tabelle
TCLAO.

CALL FUNCTION 'CLOB_SELECT_TABLE_FOR_CLASSTYP'


EXPORTING
classtype = p_klart
spras = sy-langu
with_text = c_x
TABLES
itable = fpi_object
EXCEPTIONS
OTHERS = 0.

4.4 Klassenart lesen/prfen

FORM check_klart CHANGING fp_artxt TYPE rmclf-artxt


fps_tcla TYPE tcla.

CALL FUNCTION 'CLCA_PROCESS_CLASSTYPE'


EXPORTING
classtype = p_klart
dynpros = space
spras = sy-langu
IMPORTING
classtype = p_klart
typetext = fp_artxt
imptcla = fps_tcla
EXCEPTIONS
not_found = 1
no_auth_klart = 2
OTHERS = 3.

CASE sy-subrc.
WHEN 1.
MESSAGE e014(cl) WITH p_klart.
WHEN 2.
MESSAGE e545(cl) WITH p_klart.
ENDCASE.
ENDFORM. "check_klart

Seite 25 / 120
ABAP/4 Basis Funktionsbausteine

5 Bonusabsprachen (Agreements)
Transaktionen VBO1, VBO2 etc.

5.1 Verknpfungen lesen

* Baustein aufrufen
call function 'MM_ARRANG_EXTENSIONS_READ'
EXPORTING
arrangement = kona
perform_only_check = no
TABLES
extended_arrangements = xmebog
EXCEPTIONS
no_extension_for_arrangement = 1
internal_error_arrangements = 2
arrangement_not_found = 3
arrang_already_new_period = 4
others = 5.

5.2 Absprache kopieren

CALL FUNCTION 'MM_ARRANGEMENT_NEW_PERIOD'


EXPORTING
arrangement = xkona
i_periods_ahead = perio
use_outbound_call = bool
IMPORTING
arrangement_new = *kona "Verlngerte Absprache
TABLES
variable_key_new = xvake
error_messages = error_messages
EXCEPTIONS
OTHERS = 1.

Beispiel
FORM new_agreement.
* Initialisierung
CLEAR error_auto_extend.
CLEAR warn_auto_extend.
REFRESH error_messages.
CLEAR: old_kschl, old_kotabnr.
* Lesen der Konditionen
IF auto_extend = no.
PERFORM bonus_record_read.
ELSE.
CHECK error_auth_check = 0.
* BADI for Maintenance Check
DATA: badi_instance TYPE REF TO if_ex_agr_maintenance_chck.
DATA: badi_active TYPE xfeld.

CALL FUNCTION 'AGR_MNT_BADI_INSTANCE_GET'


IMPORTING
e_badi_instance = badi_instance
e_badi_active = badi_active.
IF NOT badi_active IS INITIAL.

Seite 26 / 120
ABAP/4 Basis Funktionsbausteine

* Check whether copying this agreement is allowed


CALL METHOD badi_instance->agr_mnt_copy_check
EXPORTING
i_knuma = kona-knuma
EXCEPTIONS
OTHERS = 1.
error_auto_extend = sy-subrc.
ENDIF.
IF error_auto_extend IS INITIAL.
* Verlngerung gem Kalender durchfhren
bool = yes.
CALL FUNCTION 'MM_ARRANGEMENT_NEW_PERIOD'
EXPORTING
arrangement = xkona
i_periods_ahead = perio
use_outbound_call = bool
IMPORTING
arrangement_new = *kona "Verlngerte Absprache
TABLES
variable_key_new = xvake
error_messages = error_messages
EXCEPTIONS
OTHERS = 1.
* Fehler merken
error_auto_extend = sy-subrc.
LOOP AT error_messages WHERE msgty <> 'S'.
ENDLOOP.
IF sy-subrc = 0.
* Es gab vermutlich Warnungen -> merken.
warn_auto_extend = 1.
ENDIF.
IF *kona-vkorg(1) = '5'
AND *kona-knuma(2) NE '$$'
AND error_auto_extend IS INITIAL.
COMMIT WORK.
PERFORM update_kona.
ENDIF.
ENDIF.
ENDIF.

FORM update_kona.

DATA: w_mode(1),
w_date_to TYPE aedat_bi.

DATA: li_msg TYPE tab_bdcmsgcoll,


lws_msg TYPE bdcmsgcoll,
li_bdcdata TYPE bdcdata_tab.
DATA: l_balance TYPE kona-zzbalance,
l_balance_c(26) TYPE c.

DATA: lcl_messages TYPE REF TO zbc_messages.

CREATE OBJECT lcl_messages.

REFRESH: li_msg, li_bdcdata.

PERFORM det_date_to CHANGING w_date_to.

Seite 27 / 120
ABAP/4 Basis Funktionsbausteine

PERFORM bdc_dynpro USING 'SAPMV13A' '0401'


CHANGING li_bdcdata.
PERFORM bdc_field USING 'BDC_CURSOR'
'RV13A-KNUMA_BO'
CHANGING li_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'
CHANGING li_bdcdata.
PERFORM bdc_field USING 'RV13A-KNUMA_BO'
*kona-knuma
CHANGING li_bdcdata.
PERFORM bdc_dynpro USING 'SAPMV13A' '0410'
CHANGING li_bdcdata.
PERFORM bdc_field USING 'BDC_CURSOR'
'KONA-ZZBALANCE'
CHANGING li_bdcdata.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SICH'
CHANGING li_bdcdata.
PERFORM bdc_field USING 'KONA-IDENT2'
ident2-low
CHANGING li_bdcdata.
PERFORM bdc_field USING 'KONA-DATBI'
w_date_to
CHANGING li_bdcdata.
* Calculate begin balance from original agreement
PERFORM calculate_balance USING kona
CHANGING l_balance.

WRITE l_balance TO l_balance_c.

PERFORM bdc_field USING 'KONA-ZZBALANCE'


* ' '
l_balance_c
CHANGING li_bdcdata.

w_mode = 'N'.

CALL TRANSACTION 'VBO2' USING li_bdcdata


MODE w_mode
UPDATE 'S'
MESSAGES INTO li_msg.

Seite 28 / 120
ABAP/4 Basis Funktionsbausteine

6 Sales & Distribution

6.1 Status in Belegen setzen


Kopf
Fuba RV_XVBUK_MAINTAIN

Position
Fuba RV_XVBUP_MAINTAIN

6.2 Kundenhierarchie lesen


Bei Eingabe eines neun Kunden AG soll die Kundenhierarchie fr die Bildschirmausgabe
gelesen werden.

DATA: li_hpath TYPE vbpa_tab,


ls_hpath TYPE vbpavb.

READ TABLE tpar_tab INTO tpar_wa WITH KEY parvw = 'AG'.


IF sy-subrc = 0.
PERFORM get_customer_hier_path USING tpar_wa-parnr
vbak-vtweg
vbak-spart
vbak-vkorg
CHANGING li_hpath.

ENDIF.

FORM get_customer_hier_path USING fp_parnr TYPE kunnr


fp_vtweg TYPE vtweg
fp_spart TYPE spart
fp_vkorg TYPE vkorg
CHANGING fpi_hpath TYPE vbpa_tab.

CALL FUNCTION 'SD_CUSTOMER_HIERARCHY_PATH'


EXPORTING
customer = fp_parnr
* DATE = SY-DATUM
htype = 'A' "Standard Hierarchy
sales_channel = fp_vtweg
sales_division = fp_spart
sales_org = fp_vkorg
* IMPORTING
* CUSTOMER_HZUOR =
TABLES
hpath = fpi_hpath
EXCEPTIONS
hityp_not_exist = 1
node_not_exist = 2
parvw_not_exist = 3
OTHERS = 4
.
IF sy-subrc <> 0.

Seite 29 / 120
ABAP/4 Basis Funktionsbausteine

CALL FUNCTION 'SD_CUSTOMER_HIERARCHY_PATH'


EXPORTING
customer = fp_parnr
* DATE = SY-DATUM
htype = 'B' "Standard Hierarchy
sales_channel = fp_vtweg
sales_division = fp_spart
sales_org = fp_vkorg
* IMPORTING
* CUSTOMER_HZUOR =
TABLES
hpath = fpi_hpath
EXCEPTIONS
hityp_not_exist = 1
node_not_exist = 2
parvw_not_exist = 3
OTHERS = 4
.
ENDIF.

ENDFORM. " GET_CUSTOMER_HIER_PATH

Seite 30 / 120
ABAP/4 Basis Funktionsbausteine

7 Konditionen

7.1 Kopfkonditionen lesen

Beispiel
Kopfkonditionen fr Rechnung lesen.

DATA: PR_KAPPL(01) TYPE C VALUE 'V'.

MOVE vbdkr-waerk TO h_waerk.

FORM get_header_prices.

IF komk-knumv NE vbdkr-knumv.
CLEAR komk.
komk-mandt = sy-mandt.
komk-kalsm = vbdkr-kalsm.
komk-fkart = vbdkr-fkart.
komk-kappl = pr_kappl.
IF vbdkr-kappl NE space.
komk-kappl = vbdkr-kappl.
ENDIF.
komk-bukrs = vbdkr-bukrs.
komk-waerk = h_waerk.
komk-hwaer = h_t001_waers.
komk-knumv = vbdkr-knumv.
komk-vbtyp = vbdkr-vbtyp.
komk-knuma = vbdkr-knuma.
komk-land1 = vbdkr-lland.
komk-vkorg = vbdkr-vkorg.
komk-vtweg = vbdkr-vtweg.
komk-spart = vbdkr-spart.
komk-prsdt = vbdkr-erdat.
komk-kurst = vbdkr-kurst.
komk-kurrf = vbdkr-kurrf.
komk-kurrf_dat = vbdkr-kurrf_dat.
ENDIF.
CALL FUNCTION 'RV_PRICE_PRINT_HEAD' " Kopfkonditionen lesen
EXPORTING comm_head_i = komk
language = object-spras
IMPORTING comm_head_e = komk
TABLES tkomv = ikomv
tkomvd = ikomvd.

ENDFORM. "get_header_prices

7.2 Positionskonditionen lesen

Beispiel
Kopfkonditionen fr Rechnung lesen.

DATA: PR_KAPPL(01) TYPE C VALUE 'V'.

MOVE vbdkr-waerk TO h_waerk.

Seite 31 / 120
ABAP/4 Basis Funktionsbausteine

FORM get_item_prices
USING posnr.

CLEAR komp.
CLEAR ikomv.
CLEAR ikomvd.

IF komk-knumv NE vbdkr-knumv.
CLEAR komk.
komk-mandt = sy-mandt.
komk-kalsm = vbdkr-kalsm.
komk-fkart = vbdkr-fkart.
komk-kappl = pr_kappl.
IF vbdkr-kappl NE space.
komk-kappl = vbdkr-kappl.
ENDIF.
komk-bukrs = vbdkr-bukrs.
komk-waerk = h_waerk.
komk-hwaer = h_t001_waers.
komk-knumv = vbdkr-knumv.
komk-vbtyp = vbdkr-vbtyp.
komk-land1 = vbdkr-lland.
komk-vkorg = vbdkr-vkorg.
komk-vtweg = vbdkr-vtweg.
komk-spart = vbdkr-spart.
komk-prsdt = vbdkr-erdat.
komk-kurst = vbdkr-kurst.
komk-kurrf = vbdkr-kurrf.
komk-kurrf_dat = vbdkr-kurrf_dat.
ENDIF.

komp-kposn = posnr.
komp-mglme = tvbdpr-fklmg.
komp-lagme = tvbdpr-meins.
komp-kursk = tvbdpr-kursk.
komp-kursk_dat = tvbdpr-kursk_dat.

CALL FUNCTION 'RV_PRICE_PRINT_ITEM'


EXPORTING
comm_head_i = komk
comm_item_i = komp
language = object-spras
IMPORTING
comm_head_e = komk
comm_item_e = komp
TABLES
tkomv = ikomv
tkomvd = ikomvd.

ENDFORM. "get_item_prices

7.3 Konditionen fr Dynpro lesen


Mit den nachfolgenden Fubas werden die Konditionen fr das Konditionsdynpro gelesen.

Seite 32 / 120
ABAP/4 Basis Funktionsbausteine

CALL FUNCTION 'RV_INVOICE_PRICE_PBO'


EXPORTING
t185f_i = t185f
t185v_i = t185v
t185_i = t185
vbrk_i = vbrk
vbrp_i = vbrp
IMPORTING
comm_head_e = tkomk
comm_item_e = tkomp
TABLES
xkomv = xkomv
xvbpa = xvbpa
xvbrk = xvbrk
xvbrp = xvbrp
xkomfk = xkomfk
xvbfs = xvbfs.

* Fakturaseitig sind die Daten jetzt aufbereitet, jetzt kommt die


* bergabe an die Preisfindungsbilder

CALL FUNCTION 'PRICING_SUBSCREEN_SET_DATA'


EXPORTING
comm_head_i = tkomk
comm_item_i = tkomp
trtyp_i = t185f-trtyp
ctrl_grey = da_ctrl_grey
TABLES
tkomv = xkomv
EXCEPTIONS
error = 1
OTHERS = 2.

Die interne Tabelle XKOMV aus dem Fuba PRICING_SUBSCREEN_SET_DATA enthlt die
gesamten Konditionen der Positionen.

Seite 33 / 120
ABAP/4 Basis Funktionsbausteine

Die interne Tabelle XKOMV in dem Fuba PRICING_SUBSCREEN_SET_DATA(SAPLV69A)


enthlt die Daten wie auf dem Konditionsdynpro angezeigt.

Seite 34 / 120
ABAP/4 Basis Funktionsbausteine

8 Allgemeine

8.1 bersicht Funktionsbausteine

RS_TOOL_ACCESS Aufruf der Werkzeuge der Abap Development


Workbench
(z.B. fr Anzeige Programmdokumentation)
BAPI_MESSAGE_GETDETAIL Aufbereiten von Nachrichten
SAPGUI_PROGRESS_INDICATOR Hinweise in der Statuszeile ausgeben
UNIT_CONVERSION_SIMPLE Gewichte umrechnen
RFC_READ_TABLE Lesen Tabelle via RFC (Beschreibung sieh
unter RFC)
NUMBER_GET_NEXT Nummernkreisvergabe
DYNP_VALUES_READ Dynprodaten lesen
DYNP_VALUES_UPDATE Dynprodaten ndern
F4IF_FIELD_VALUE_REQUEST Eingabehilfe fr F4-Taste
KOKRS_GET_FROM_BUKRS Kostenrechnungskreis ermitteln
RK_KOKRS_FIND Ermitteln Kostenrechnungskreis ber den
Buchungskreis
RV_CALL_CHANGE_TRANSACTION Aufruf der RV-Transaktionen (z.B. VA22)

CALL FUNCTION
'RV_CALL_CHANGE_TRANSACTION'
EXPORTING
* POSNR = <i>-posnr
vbeln = <i>-vbeln.

UNIT_OF_MEASURE_SAP_TO_ISO Mengeneinheit von SAP nach ISO


umwandeln.

Wird z.B. bei der Datenmigration bentigt.


SYSTEM_FORMAT Liefert Codepage und Zahlenformat des
Systems zurck.
TR_OBJECT_INSERT Mit diesem Fuba kann man Objekte in
Transportauftrge (TA) aufnehmen.
SAPGUI_SET_FUNCTIONCODE Setzen eines Funktionscodes und Fortsetzen

Seite 35 / 120
ABAP/4 Basis Funktionsbausteine

der Verarbeitung
CONTROL_FLUSH Flush, SyncPoint

Seite 36 / 120
ABAP/4 Basis Funktionsbausteine

8.2 Maeinheiten
Die Maeinheiten sind in der Tabelle T006 sprachunabhngig gespeichert.

Beispiel
ST Stck

Selektion der Tabelle T006


Anmeldesprache DE Selektion ST Anzeige bersicht ST Anzeige Detail ST
Anmeldesprache EN Selektion PCE Anzeige bersicht ST Anzeige Detail PCE

Die sprachabhngigen Texte sind in den Tabellen T006A und T006B.

Es ist zu beachten das im Programm bei einigen Befehlen (z.B. bei WRITE mit UNIT) die
sprachunabhngige Einheit bentigt wird.

Bei dem Funktionsbaustein UNIT_CONVERSATION_SIMPLE muss ebenfalls die


sprachunabhngige Einheit bergeben werden, da es sonst zu einem Fehler in dem Fuba
kommt.

FORM einheiten_konv USING p_value_in


p_unit_in
p_unit_out
CHANGING p_value_out.
DATA: unit_in LIKE t006-msehi,
unit_out LIKE t006-msehi.

CHECK NOT p_value_in IS INITIAL.

* Die sprachabhngige Einheit muss fr den Fuba UNIT_CONVERSION_SIMPLE


* in das interne Format gewandelt werden (z.B. PCE in ST ndern)
unit_in = p_unit_in.
unit_out = p_unit_out.

READ TABLE t006_tab TRANSPORTING NO FIELDS


WITH KEY msehi = p_unit_in.
IF sy-subrc NE 0.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = p_unit_in
language = sy-langu
IMPORTING
output = unit_in
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
unit_in = p_unit_in.
ENDIF.
ENDIF.
*
READ TABLE t006_tab TRANSPORTING NO FIELDS

Seite 37 / 120
ABAP/4 Basis Funktionsbausteine

WITH KEY msehi = p_unit_out.


IF sy-subrc NE 0.
CALL FUNCTION 'CONVERSION_EXIT_CUNIT_INPUT'
EXPORTING
input = p_unit_out
language = sy-langu
IMPORTING
output = unit_out
EXCEPTIONS
unit_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
unit_out = p_unit_out.
ENDIF.
ENDIF.

CALL FUNCTION 'UNIT_CONVERSION_SIMPLE'


EXPORTING
input = p_value_in
unit_in = unit_in
unit_out = unit_out
IMPORTING
output = p_value_out
EXCEPTIONS
conversion_not_found = 1
division_by_zero = 2
input_invalid = 3
output_invalid = 4
overflow = 5
type_invalid = 6
units_missing = 7
unit_in_not_found = 8
unit_out_not_found = 9
OTHERS = 10.

IF sy-subrc NE 0.
ENDIF.
ENDFORM. " EINHEITEN_KONV

Die sprachabhngige Einheit muss nur bei Ausgabe von Batch Input genutzt werden, da es
sonst beim Abspielen der Mappe zu einem Fehler kommt.

Seite 38 / 120
ABAP/4 Basis Funktionsbausteine

8.3 Maeinheiten im Material


Im Materialstamm (MARM) knnen pro Material unterschiedliche Mengeneinheiten angegeben
werden.

Diese knnen mit dem nachfolgenden Funktionsbaustein umgerechnet werden:

IF <s_gi>-meins NE 'ST'.
CALL FUNCTION 'MATERIAL_UNIT_CONVERSION'
EXPORTING
input = <s_gi>-rfmng
* kzmeinh = 'X'
matnr = <s_gi>-matnr
meinh = 'ST'
meins = <s_gi>-meins
IMPORTING
output = <s_gi>-rfmng
EXCEPTIONS
conversion_not_found = 1
input_invalid = 2
material_not_found = 3
meinh_not_found = 4
meins_missing = 5
no_meinh = 6
output_invalid = 7
overflow = 8
OTHERS = 99.

IF sy-subrc NE 0.
ENDIF.
ENDIF.

Seite 39 / 120
ABAP/4 Basis Funktionsbausteine

8.4 Betrag in unterschiedlichen Whrungen

FORM currency_convert USING fp_curr_in TYPE konwa


fp_curr_out TYPE konwa
fp_amount_in TYPE kbetr
CHANGING fp_amount_out TYPE kbetr.
DATA:
l_date TYPE sy-datum.

CHECK fp_curr_in IS NOT INITIAL AND


fp_curr_out IS NOT INITIAL.

l_date = sy-datum.

CALL FUNCTION 'CONVERT_TO_FOREIGN_CURRENCY'


EXPORTING
date = l_date
foreign_currency = fp_curr_out
local_amount = fp_amount_in
local_currency = fp_curr_in
IMPORTING
foreign_amount = fp_amount_out
EXCEPTIONS
no_rate_found = 1
overflow = 2
no_factors_found = 3
no_spread_found = 4
derived_2_times = 5
OTHERS = 6.

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. " convert_kbetr

Seite 40 / 120
ABAP/4 Basis Funktionsbausteine

8.5 Whrungsfeld konvertieren


Bei Whrungswerten aus Eingabedateien muss je nach Whrung der Wert in ein Dezimalfeld
gestellt werden.

DATA:
betr TYPE wrbtr. (Type P decimals 2)

PARAMETERS:
p_char17 TYPE char17,
p_waers TYPE waers DEFAULT 'USD'.

CALL FUNCTION 'CURRENCY_AMOUNT_IDOC_TO_SAP'


EXPORTING
currency = p_waers
idoc_amount = p_char17
IMPORTING
sap_amount = betr.

Beispiele
Charfeld 108000.00
Whrung USD (mit 2 Dezimalstellen)
Dec Feld 108000.00

Charfeld 108000.00
Whrung JPY (mit 0 Dezimalstellen)
Dec Feld 1080.00

Hierzu gibt es noch weitere Funktionsbausteine:

Function group Function group short text


Function Module Name Short text for function module

ISOC
CURRENCY_AMOUNT_BAPI_TO_SAP
CURRENCY_AMOUNT_IDOC_TO_SAP
CURRENCY_AMOUNT_SAP_TO_BAPI
CURRENCY_AMOUNT_SAP_TO_IDOC

WMTO
CURRENCY_AMOUNT_DISPLAY_TO_SAP
CURRENCY_AMOUNT_SAP_TO_DISPLAY

Seite 41 / 120
ABAP/4 Basis Funktionsbausteine

8.6 RFC CLOSE

method CLOSE_RFC .

*-beim erneuten Sichern ist das Memory in Q11 etc. noch gefllt
data: lf_str type string.
*->Abbruch beim Sichern, da duplicate key
CALL FUNCTION 'RFC_CONNECTION_CLOSE'
EXPORTING
destination = pros-dest
* TASKNAME =
EXCEPTIONS
destination_not_open = 1
OTHERS = 2.
IF sy-subrc <> 0.
lf_str = pros-dest.
raise exception type zcx_gto_ex
exporting textid = zcx_gto_ex=>close_rfc
msg1 = lf_str.
ENDIF.

endmethod.

8.7 RFC Tabellen lesen

method READ_JEST.
data: lf_opt type RFC_DB_OPT,
lt_opt type table of RFC_DB_OPT,
lt_data type table of TAB512,
lwa_data type tab512,
ls_jest type jest.

concatenate 'objnr eq ' '''' i_objnr '''' into lf_opt.


append lf_opt to lt_opt.

CALL FUNCTION 'RFC_READ_TABLE' DESTINATION pros-dest


EXPORTING
QUERY_TABLE = 'JEST'
TABLES
options = lt_opt
data = lt_data
EXCEPTIONS
OTHERS = 1.

if sy-subrc eq 0.
e_jest = lt_data.

else.
clear e_jest.
endif.
endmethod.

Seite 42 / 120
ABAP/4 Basis Funktionsbausteine

8.8 Status zu Objekten lesen


ber diesen Z-Fuba werden die Status zu Objekten (z..B. ORxxxx fr Service Auftrge)
zurckgeben

FUNCTION zw_gto_get_notifstat.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" VALUE(I_SPRAS) TYPE SPRAS
*" TABLES
*" IT_QMNUM STRUCTURE JEST
*" OT_JEST STRUCTURE JEST
*" OT_STAT STRUCTURE TJ02T
*" OT_USSTAT STRUCTURE TJ30T OPTIONAL
*"----------------------------------------------------------------------

DATA: lt_jest TYPE TABLE OF jest,


lt_stat TYPE TABLE OF tj02t.

CHECK NOT it_qmnum[] IS INITIAL.


SELECT * FROM jest INTO TABLE lt_jest FOR ALL ENTRIES IN it_qmnum
WHERE objnr EQ it_qmnum-objnr
AND inact EQ space.
CHECK sy-subrc EQ 0.
ot_jest[] = lt_jest[].
SORT lt_jest BY stat.
DELETE ADJACENT DUPLICATES FROM lt_jest COMPARING stat.
SELECT * FROM tj02t INTO TABLE ot_stat FOR ALL ENTRIES IN lt_jest
WHERE istat = lt_jest-stat
AND spras = i_spras.

ENDFUNCTION.

Seite 43 / 120
ABAP/4 Basis Funktionsbausteine

8.9 Terminal ermitteln


Ermitteln Terminal Id des Users.

Fuba TERMINAL_ID_GET

8.10 Datum

8.10.1 Monate ermitteln


SELECT-OPTIONS:
s_seldat FOR sy-datum NO-EXTENSION OBLIGATORY.

DATA: l_month(3) TYPE p.

READ TABLE s_seldat INDEX 1.


CALL FUNCTION 'MONTHS_BETWEEN_TWO_DATES'
EXPORTING
i_datum_bis = s_seldat-high
i_datum_von = s_seldat-low
* i_kz_incl_bis = k-on
IMPORTING
e_monate = l_month.

Seite 44 / 120
ABAP/4 Basis Funktionsbausteine

Seite 45 / 120
ABAP/4 Basis Funktionsbausteine

8.10.2 Datum ins externe Format umwandeln

* Date
CALL FUNCTION 'CONVERT_DATE_TO_EXTERNAL'
EXPORTING
date_internal = sy-datlo
IMPORTING
date_external = date
EXCEPTIONS
date_internal_is_invalid = 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.

8.10.3 Datum ins interne Format umwandeln

Seite 46 / 120
ABAP/4 Basis Funktionsbausteine

8.10.4 Wochen

8.10.4.1 Woche vorbelegen

DATA: g_week TYPE spwoc.


SELECT-OPTIONS: s_week FOR g_week OBLIGATORY NO-EXTENSION.

INITIALIZATION.

* get current week number


CALL FUNCTION 'DATE_GET_WEEK'
EXPORTING
date = sy-datum
IMPORTING
week = g_curr_week
EXCEPTIONS
date_invalid = 1
OTHERS = 2.
IF sy-subrc EQ 0.
s_week-sign = 'I'.
s_week-option = 'EQ'.
s_week-low = g_curr_week.
APPEND s_week.
ENDIF.

8.10.4.2 F4 fr Woche

DATA: g_week TYPE spwoc.


SELECT-OPTIONS: s_week FOR g_week OBLIGATORY NO-EXTENSION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_week-low.


PERFORM f4_week.

FORM f4_week.
DATA: l_week TYPE scal-week.

CALL FUNCTION 'F4_DATE'


EXPORTING
date_for_first_month = sy-datum
* DISPLAY = ' '
* FACTORY_CALENDAR_ID = ' '
gregorian_calendar_flag = 'X'
* HOLIDAY_CALENDAR_ID = ' '
* PROGNAME_FOR_FIRST_MONTH = ' '
IMPORTING
* SELECT_DATE =
select_week = l_week
* SELECT_WEEK_BEGIN =
* SELECT_WEEK_END =
EXCEPTIONS
calendar_buffer_not_loadable = 1
date_after_range = 2
date_before_range = 3
date_invalid = 4

Seite 47 / 120
ABAP/4 Basis Funktionsbausteine

factory_calendar_not_found = 5
holiday_calendar_not_found = 6
parameter_conflict = 7
OTHERS = 8.

IF l_week IS NOT INITIAL.


CLEAR s_week[].
s_week-sign = 'I'.
s_week-option = 'EQ'.
s_week-low = l_week.
APPEND s_week.
ENDIF.
ENDFORM. "f4_week

8.10.4.3 Start-/End-Datum ermitteln

DATA: g_week TYPE spwoc.


SELECT-OPTIONS: s_week FOR g_week OBLIGATORY NO-EXTENSION.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_week-low.


PERFORM f4_week.

FORM get_start_end_date.
DATA: l_week TYPE scal-week,
l_date TYPE d.
DATA: l_periods TYPE i.

CHECK sscrfields-ucomm EQ 'ONLI' OR


sscrfields-ucomm EQ 'PRIN'.

READ TABLE s_week INDEX 1.

IF s_week-option NE 'EQ' AND


s_week-option NE 'BT'.
MESSAGE e000 WITH text-002.
ENDIF.

l_week = s_week-low.

CALL FUNCTION 'WEEK_GET_FIRST_DAY'


EXPORTING
week = l_week
IMPORTING
date = g_start_date
EXCEPTIONS
week_invalid = 1
OTHERS = 2.

IF sy-subrc = 1.
MESSAGE e102 WITH l_week.
ENDIF.

IF s_week-option EQ 'EQ'.
g_end_date = g_start_date + 6.

ELSE.
l_week = s_week-high.

Seite 48 / 120
ABAP/4 Basis Funktionsbausteine

CALL FUNCTION 'WEEK_GET_FIRST_DAY'


EXPORTING
week = l_week
IMPORTING
date = l_date
EXCEPTIONS
week_invalid = 1
OTHERS = 2.

IF sy-subrc EQ 0.
g_end_date = l_date + 6.
ELSE.
MESSAGE e102 WITH l_week.
ENDIF.
ENDIF.

l_date = g_start_date.
CALL FUNCTION 'DATE_GET_PERIOD'
EXPORTING
iv_date = l_date
iv_periodid = 'W'
iv_periods = '1'
IMPORTING
ev_periodstart = g_start_date
ev_periodend = g_end_date
EXCEPTIONS
error = 1
OTHERS = 2.
ENDFORM. "get_start_end_date

8.10.5 Berechnen Datum


Mit dem Fuba SUBTRACT_TIME_FROM_DATE bzw. ADD_TIME_TO_DATE kann man ein Datum
berechnen.

Beispiel
Es soll von einem Datum 6 Monate abgezogen werden und der letzte Tag des Monats ermittelt
werden.

CALL FUNCTION 'SUBTRACT_TIME_FROM_DATE'


EXPORTING
i_idate = g_ldate
i_time = 6
i_iprkz = '2'
i_rdmhd = '+'
IMPORTING
o_idate = g_mdate.

Parameter
i_iprkz 2 fr Monat
i_rdmhd + fr letzten Tag im Monat.

8.10.6 Berechnen Arbeitstage


Mit dem Fuba WDKAL_DATE_ADD_FKDAYS kann man Arbeitstage addieren.

Seite 49 / 120
ABAP/4 Basis Funktionsbausteine

Seite 50 / 120
ABAP/4 Basis Funktionsbausteine

8.10.7 Berechnen Wochentage

8.10.8 Wochenanfang (Montag) ermitteln


ber folgende Routine kann man sich fr ein Datum den Montag ermitteln:

data:
weekday type i,
start type d,
end type d.

parameters:
p_datum type d default sy-datum.

start-of-selection.

weekday = p_datum mod 7.


if weekday <= 1.
weekday = 7 + weekday.
endif.
start = p_datum - weekday + 2.

Hat man als Eingabe die Woche kann man sich den Montag ber die Funktionsbausteine

PERIOD_AND_DATE_CONVERT_INPUT oder
WEEK_GET_FIRST_DAY

ermitteln.

8.10.9 Datum prfen


Mit dem Fuba DATE_CHECK_PLAUSIBILITY kann man prfen, ob das Datum gltig ist.

do 31 times.
Tagn = sy-index.
zac09-edatu+0(4) = zac00-monat+3(4).

Seite 51 / 120
ABAP/4 Basis Funktionsbausteine

zac09-edatu+4(2) = zac00-monat(2).
zac09-edatu+6(2) = tagn.

call function 'DATE_CHECK_PLAUSIBILITY'


exporting
date = zac09-edatu
exceptions
plausibility_check_failed = 01.
if sy-subrc = 01.
exit.
else.
ttag-tag = zac09-edatu+6(2).
endif.
ENDDO.

8.10.10 Wochentag ermitteln


Mit dem Fuba DATE_COMPUTE_DAY kann man sich den Wochentag zurckgeben lassen.

call function 'DATE_COMPUTE_DAY'


exporting
date = zac09-edatu
importing
day = w_tag.

case w_tag.
when 1. ttag-wtag = 'Mo,'.
when 2. ttag-wtag = 'Di,'.
when 3. ttag-wtag = 'Mi,'.
when 4. ttag-wtag = 'Do,'.
when 5. ttag-wtag = 'Fr,'.
when 6. ttag-wtag = 'Sa,'.
when 7. ttag-wtag = 'So,'.
endcase.

8.10.11 Letzter Tag des Monats ermitteln


Der Fuba LAST_DAY_OF_MONTHS ermittelt zu einem Datum den letzten Tag des Monats.

Seite 52 / 120
ABAP/4 Basis Funktionsbausteine

8.10.12 Nchsten/vorherigen Werktag ermitteln


Es ist nicht ganz klar, ob der zweite Fuba FACTORYDATE_CONVERT_TO_DATE bentigt
wird, da im ersten Fuba bereits das Datum (DATE) zurckgegeben wird.

FORM get_next_weekday USING ip_date


CHANGING op_date.
DATA: l_date LIKE scal-date,
l_date_out LIKE scal-date,
l_factory LIKE scal-facdate.

CLEAR op_date.

* nachster Arbeistag bestimmen


l_date = ip_date.
CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'
EXPORTING
correct_option = '+'
date = l_date
factory_calendar_id = 'CH'
IMPORTING
date = l_date_out
factorydate = l_factory
EXCEPTIONS
calendar_buffer_not_loadable = 1
correct_option_invalid = 2
date_after_range = 3
date_before_range = 4
date_invalid = 5
factory_calendar_not_found = 6
OTHERS = 7.
IF sy-subrc EQ 0.
op_date = l_date_out.
ENDIF.

ENDFORM.

Seite 53 / 120
ABAP/4 Basis Funktionsbausteine

Vorherigen Arbeitstag (mit Prfung, ob das Datum korrekt ist) ermitteln.

DATA:
g_date TYPE sy-datum.

g_date = '20080323'.
WRITE: / g_date.
PERFORM check_work_day USING '2200'
CHANGING g_date.
WRITE: / g_date.

*&---------------------------------------------------------------------*
*& Form check_work_day
*&---------------------------------------------------------------------*
* Check is the date a work day
* Yes -> OK
* No -> Get the previous work day
*----------------------------------------------------------------------*
*----------------------------------------------------------------------*
FORM check_work_day USING fp_vkorg TYPE vkorg
CHANGING fp_date TYPE scal-date.
DATA: l_fabkl TYPE scal-fcalid,
l_datn(8) TYPE n,
l_datc TYPE sy-datum,
l_scal_dati TYPE scal-date,
l_scal_dato TYPE scal-date.
DATA: lt_tagattr TYPE STANDARD TABLE OF casdayattr,
ls_tagattr TYPE casdayattr.

l_datn = fp_date.
DO 7 TIMES.
l_datc = l_datn.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = l_datc
EXCEPTIONS
plausibility_check_failed = 01.
IF sy-subrc EQ 0.
EXIT.
ELSE.
l_datn = l_datn - 1.
ENDIF.
ENDDO.
l_scal_dati = l_datn.

SELECT SINGLE vkokl FROM tvko INTO l_fabkl


WHERE vkorg = fp_vkorg.

CALL FUNCTION 'DATE_CONVERT_TO_FACTORYDATE'


EXPORTING
correct_option = '-'
date = l_scal_dati
factory_calendar_id = l_fabkl
IMPORTING
date = l_scal_dato
* factorydate = l_factory
EXCEPTIONS
calendar_buffer_not_loadable = 1
correct_option_invalid = 2

Seite 54 / 120
ABAP/4 Basis Funktionsbausteine

date_after_range = 3
date_before_range = 4
date_invalid = 5
factory_calendar_not_found = 6
OTHERS = 7.
IF sy-subrc EQ 0.
fp_date = l_scal_dato.
ENDIF.
ENDFORM. "check_work_day

Gleichen Tage zurckgeben, wenn dieser ein Arbeitstag ist sonst vorherigen Arbeitstag
ermitteln.

FORM check_work_day USING fp_vkorg TYPE vkorg


CHANGING fp_date TYPE scal-date.
DATA: l_fabkl TYPE scal-fcalid,
l_datn(8) TYPE n,
l_datc TYPE sy-datum.
DATA: lt_tagattr TYPE STANDARD TABLE OF casdayattr,
ls_tagattr TYPE casdayattr.

l_datn = fp_date.
DO 7 TIMES.
l_datc = l_datn.
CALL FUNCTION 'DATE_CHECK_PLAUSIBILITY'
EXPORTING
date = l_datc
EXCEPTIONS
plausibility_check_failed = 01.
IF sy-subrc EQ 0.
EXIT.
ELSE.
l_datn = l_datn - 1.
ENDIF.
ENDDO.
fp_date = l_datn.

SELECT SINGLE vkokl FROM tvko INTO l_fabkl


WHERE vkorg = fp_vkorg.

DO 7 TIMES.
CLEAR lt_tagattr. REFRESH lt_tagattr.
CALL FUNCTION 'DAY_ATTRIBUTES_GET'
EXPORTING
factory_calendar = l_fabkl
holiday_calendar = ' '
date_from = fp_date
date_to = fp_date
language = sy-langu
TABLES
day_attributes = lt_tagattr
EXCEPTIONS
factory_calendar_not_found = 1
holiday_calendar_not_found = 2

Seite 55 / 120
ABAP/4 Basis Funktionsbausteine

date_has_invalid_format = 3
date_inconsistency = 4
OTHERS = 5.
IF sy-subrc <> 0.
ls_tagattr-freeday = 'X'.
APPEND ls_tagattr TO lt_tagattr.
ENDIF.

READ TABLE lt_tagattr INTO ls_tagattr INDEX 1.


IF ls_tagattr-freeday IS INITIAL AND
ls_tagattr-holiday IS INITIAL.
EXIT.
ELSE.
fp_date = fp_date - 1.
ENDIF.
ENDDO.
ENDFORM. "check_work_day

8.10.13 Periode ermitteln

PERFORM periode USING xbmmh4-priod


ges_verb_tab-ertag
marc_wa-perkz
marc_wa-periv. " THK 30F

FORM periode USING priod LIKE bmmh3-priod


datum LIKE prowf-ertag
perkz LIKE marc_ueb-perkz
periv LIKE marc_ueb-periv. "Unicode
DATA: week LIKE scal-week,
dats LIKE sy-datum.
DATA: BEGIN OF int_pper OCCURS 2. "Buchhaltungsperioden
INCLUDE STRUCTURE pper.
DATA: END OF int_pper.
dats = datum.
CASE perkz.
WHEN 'M'. " Monat
dats+6(2) = '01'.
priod = dats. " aus dem Tag wird 01 gemacht
WHEN 'W'. " Woche
" Woche zum Datum
CALL FUNCTION 'DATE_GET_WEEK'
EXPORTING
date = datum
IMPORTING
week = week
EXCEPTIONS
date_invalid = 1
OTHERS = 2.
priod = week.
WHEN 'T'. " Tag
priod = datum. " Tag bleibt
WHEN 'P'. " Buchhaltungsperiode
CALL FUNCTION 'PROGNOSEPERIODEN_ERMITTELN'
EXPORTING
eanzpr = 1
edatum = datum
eperiv = periv " thk 30F PERIV instead of PERKZ
TABLES
pperx = int_pper
EXCEPTIONS

Seite 56 / 120
ABAP/4 Basis Funktionsbausteine

t009b_fehlerhaft = 01
t009_nicht_gefunden = 02.
" in note 60402 it's i_marc-periv, can be replaced.
IF sy-subrc = 0.
READ TABLE int_pper INDEX 1.
MOVE int_pper-prper TO priod.
ENDIF.
ENDCASE.
ENDFORM. "periode

8.10.14 Letzten und ersten Tag in Periode ermitteln


In i_poper muss die Periode (Monat) mitgegeben werden.

CALL FUNCTION 'LAST_DAY_IN_PERIOD_GET'


EXPORTING
i_gjahr = p_gjahr
i_periv = t001-periv
i_poper = p_perde
IMPORTING
e_date = g_ldate
EXCEPTIONS
input_false = 1
t009_notfound = 2
t009b_notfound = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE e013(zk).
* Cannot determine last day of selection period.
ENDIF.

CALL FUNCTION 'FIRST_DAY_IN_PERIOD_GET'


EXPORTING
i_gjahr = p_gjahr
i_periv = t001-periv
i_poper = p_perde
IMPORTING
e_date = g_fdate
EXCEPTIONS
input_false = 1
t009_notfound = 2
t009b_notfound = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE e015(zk).
* Cannot determine first day of selection period.
ENDIF.

8.10.15 Letzten/ersten Tag in Vormonat ermitteln

CALL FUNCTION 'RS_VARI_V_1_LAST_MONTH'


IMPORTING
p_date = s_erdat-low
TABLES
p_intrange = i_rsintrange.
CALL FUNCTION 'RS_VARI_V_L_LAST_MONTH'
IMPORTING
p_date = s_erdat-high
TABLES

Seite 57 / 120
ABAP/4 Basis Funktionsbausteine

p_intrange = i_rsintrange.
APPEND s_erdat.

8.10.16 Monatsname ermitteln

Fuba IDWT_READ_MONTH_TEXT

MONTH_NAMES_GET

8.10.17 Beginn Fiscal Jahr ermitteln


ber folgenden Fuba kann man den Beginn des Fiscal Jahr ermitteln.

Das Kennzeichen steht entweder im Buchungskreis (T001-PERIV) oder im


Kostenrechnungskreis (TKA01-LMONA). Zuordnung Buchungskreis via TKA02.

DATA: ls_tvko TYPE tvko,


ls_t001 TYPE t001,
l_date_from TYPE sy-datum.

SELECT SINGLE * FROM tvko INTO ls_tvko


WHERE vkorg = p_vkorg.

SELECT SINGLE * FROM t001 INTO ls_t001


WHERE bukrs = ls_tvko-bukrs.

READ TABLE s_erdat INDEX 1.


g_year = sy-datum(4) - 1.

CALL FUNCTION 'G_POSTING_DATE_OF_PERIOD_GET'


EXPORTING
period = '001'
variant = ls_t001-periv
year = g_year
IMPORTING
from_date = l_date_from
EXCEPTIONS
period_not_defined = 1
variant_not_defined = 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.

8.10.18 Datum in Fiscal Periode umwandeln

Seite 58 / 120
ABAP/4 Basis Funktionsbausteine

SELECT * FROM t001


WHERE bukrs IN so_bukrs.
EXIT.
ENDSELECT.
IF sy-subrc EQ 0 .
CALL FUNCTION 'DATE_TO_PERIOD_CONVERT'
EXPORTING
i_date = so_budat-low
i_periv = t001-periv
IMPORTING
e_buper = poper
e_gjahr = year
EXCEPTIONS
input_false = 1
t009_notfound = 2
t009b_notfound = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno "
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
perf = poper.
ELSE.

8.10.19 Feiertag prfen


Mit dem nachfolgenden Fuba kann ein Datum auf Feiertag geprft werden. Dazu wird die
Kalender Id bentigt.

Den Text fr den Feiertag kann man aus der Tabelle THOLT lesen.

Beispiel
Es werden die Feiertage fr das Bundesland Baden Wrttemberg geprft.

FORM check_holiday USING i_dat_akt TYPE scal-date


CHANGING ch_holiday TYPE scal-indicator
ch_ltext TYPE textl_d.
DATA:
ls_attributes TYPE thol,
lt_attributes TYPE STANDARD TABLE OF thol.

CLEAR: ch_holiday, ch_ltext.

CALL FUNCTION 'HOLIDAY_CHECK_AND_GET_INFO'


EXPORTING
date = i_dat_akt
holiday_calendar_id = '08' "Baden Wrtemberg
with_holiday_attributes = 'X'
IMPORTING
holiday_found = ch_holiday
TABLES
holiday_attributes = lt_attributes.
IF ch_holiday EQ 'X'.
READ TABLE lt_attributes INTO ls_attributes INDEX 1.
IF sy-subrc EQ 0.
SELECT SINGLE ltext FROM tholt
INTO ch_ltext

Seite 59 / 120
ABAP/4 Basis Funktionsbausteine

WHERE ftgid = ls_attributes-ftgid


AND spras = sy-langu.
ENDIF.
ENDIF.

ENDFORM. " CHECK_HOLIDAY

Seite 60 / 120
ABAP/4 Basis Funktionsbausteine

8.11 Programmvarianten
Programmvarianten knnen mit dem Fuba RS_VARIANT_CONTENTS gelesen und
geschrieben werden.

Seite 61 / 120
ABAP/4 Basis Funktionsbausteine

8.12 Felder konvertieren


Float Felder knnen mit Funktionsbausteinen in Character Felder konvertiert werden.

Fuba

FLTP_CHAR_CONVERSION und CHAR_FLTP_CONVERSION.

Beispiel
Das Ausgabefeld darf max. 22 stellig sein. Da hier das Feld wa_values-atwtb 30-stellig ist,
muss ber ein Zwischenfeld gearbeit werden.

Seite 62 / 120
ABAP/4 Basis Funktionsbausteine

8.13 Text konvertieren


Mit diesem Fuba knnen Texte konvertiert werden.

FORM character_replacement CHANGING pw_string.

DATA:
lw_string_in TYPE string,
lw_string_ot TYPE string,
lw_is_ok TYPE scpuserec.

lw_string_in = pw_string.

CALL FUNCTION 'SCP_CHECK_CHARSET_OF_STRING'


EXPORTING
text = lw_string_in
langu = sy-langu
blended_japanese = ' '
IMPORTING
is_ok = lw_is_ok
* WRONG_POS =
* METHOD =
proposal = lw_string_ot
* PROPOSAL_OVERFLOW =
EXCEPTIONS
internal_error = 1
fields_not_char = 2
overflow = 3
OTHERS = 4.

CHECK sy-subrc = 0.
IF NOT lw_is_ok = 'X'.
pw_string = lw_string_ot.
ENDIF.

ENDFORM. " CHARACTER_REPLACEMENT

Beispiel
Dieser Fuba konvertiert z.B. die deutschen Umlaute bei Ausgabe in Sprache EN entsprechend
der Codepage.

Seite 63 / 120
ABAP/4 Basis Funktionsbausteine

8.14 Aufruf Transaktionen


Mit diesen Fubas knnen verschiedene Transaktionen (z.B. MM Transaktionen MB03)
aufgerufen werden.

CALL FUNCTION 'RV_CALL_DISPLAY_TRANSACTION'


EXPORTING
fcode = l_fcode
posnr = <s_output>-posnr
vbeln = <s_output>-vbeln.

Z.B. VA02

CALL FUNCTION 'RV_CALL_CHANGE_TRANSACTION'


EXPORTING
vbeln = <s_output>-vbeln
vbtyp = 'C'
.

Seite 64 / 120
ABAP/4 Basis Funktionsbausteine

8.15 Command ausfhren


Command siehe Transaktion SM49

FORM transfer_ftp using p_plant p_path p_file p_sid.

* Example parameters:
* wr:5300 Plant
* pa:test Path on the FTP Server
* fn:MB52 Filename
* sid:Q01 SID SAP

data: begin of li_result occurs 0.


include structure btcxpm.
data: end of li_result.

data: lw_command like sxpgcolist-name,


lw_params like sxpgcolist-parameters,
lw_status like extcmdexex-status.

data: lw_para1 type char100,


lw_para2 type char100,
lw_para3 type char100,
lw_para4 type char100.

lw_command = 'ZBC_FTP'.
concatenate 'wr:' p_plant into lw_para1.
concatenate 'pa:' p_path into lw_para2.
concatenate 'fn:' p_file into lw_para3.
concatenate 'sid:' p_sid into lw_para4.
concatenate lw_para1 lw_para2 lw_para3 lw_para4
into lw_params separated by space.

Seite 65 / 120
ABAP/4 Basis Funktionsbausteine

CALL FUNCTION 'SXPG_CALL_SYSTEM'


EXPORTING
COMMANDNAME = lw_command
ADDITIONAL_PARAMETERS = lw_params
IMPORTING
STATUS = lw_status
* EXITCODE =
TABLES
EXEC_PROTOCOL = li_result
EXCEPTIONS
NO_PERMISSION = 1
COMMAND_NOT_FOUND = 2
PARAMETERS_TOO_LONG = 3
SECURITY_RISK = 4
WRONG_CHECK_CALL_INTERFACE = 5
PROGRAM_START_ERROR = 6
PROGRAM_TERMINATION_ERROR = 7
X_ERROR = 8
PARAMETER_EXPECTED = 9
TOO_MANY_PARAMETERS = 10
ILLEGAL_COMMAND = 11
OTHERS = 12.

ws_errmsg-name = 'File-Transfer'(104).
if ( lw_status = 'O' ) and ( sy-subrc = 0 ).
ws_errmsg-value = 'ohne Fehler'(105).
else.
ws_errmsg-value = 'Fehler bei Ausfhrung'(106).
endif.

ENDFORM.

Seite 66 / 120
ABAP/4 Basis Funktionsbausteine

8.16 Adressen

8.16.1 Adresse lesen


Mit dem Fuba ADDR_GET kann man die Adressdaten lesen.

FORM call_addr_get USING fp_kunnr TYPE kna1-kunnr


CHANGING fps_addr TYPE addr1_val
fps_email TYPE adsmtp-smtp_addr.
DATA: ls_addr1_sel TYPE addr1_sel,
ls_addr1_val TYPE addr1_val,
l_adrnr TYPE kna1-adrnr,
li_adr6 TYPE STANDARD TABLE OF adsmtp.
FIELD-SYMBOLS:
<ls_adr6> TYPE adsmtp.

SELECT SINGLE adrnr FROM kna1 INTO l_adrnr


WHERE kunnr = fp_kunnr.
CHECK sy-subrc EQ 0.

* Adresse lesen
ls_addr1_sel-addrnumber = l_adrnr.
CALL FUNCTION 'ADDR_GET'
EXPORTING
address_selection = ls_addr1_sel
IMPORTING
address_value = ls_addr1_val
EXCEPTIONS
parameter_error = 01
address_not_exist = 02
version_not_exist = 03
internal_error = 04
OTHERS = 99.
fps_addr = ls_addr1_val.
ENDFORM.

Die Adressdaten knnen auch via SD_ADDRESS_GET (FIF_ADRESS_TYPE = 1) gelesen


werden.

Seite 67 / 120
ABAP/4 Basis Funktionsbausteine

8.16.2 Adresszusatz lesen


Mit dem Fuba ADDR_COMM_GET kann man verschiedene Adresszusatzdaten (z.B. E-
Mail Daten via ADSMTP) lesen.

Beispiel
Bei nachfolgendem Beispiel wird die Adresse und E-Mail-Adresse zum Kunden gelesen.

Der Fuba ADDR_COMM_GET liefert die E-Mail Adressen aus der ADR6 und das Feld
REMARK (aus der ADRT) zurck.

FORM call_addr_get USING fp_kunnr TYPE kna1-kunnr


CHANGING fps_addr TYPE addr1_val
fps_email TYPE adsmtp-smtp_addr.
DATA: ls_addr1_sel TYPE addr1_sel,
ls_addr1_val TYPE addr1_val,
l_adrnr TYPE kna1-adrnr,
li_adr6 TYPE STANDARD TABLE OF adsmtp.
FIELD-SYMBOLS:
<ls_adr6> TYPE adsmtp.

SELECT SINGLE adrnr FROM kna1 INTO l_adrnr


WHERE kunnr = fp_kunnr.
CHECK sy-subrc EQ 0.

* E-Mail-Adressen lesen
CALL FUNCTION 'ADDR_COMM_GET'
EXPORTING
address_number = l_adrnr
table_type = 'ADSMTP'
TABLES
comm_table = li_adr6
EXCEPTIONS
parameter_error = 1
address_not_exist = 2
internal_error = 3
OTHERS = 4.
IF sy-subrc = 0.
LOOP AT li_adr6 ASSIGNING <ls_adr6>
WHERE flgdefault NE space.
fps_email = <ls_adr6>-smtp_addr.
EXIT.
ENDLOOP.
ENDIF.

IF fps_email IS INITIAL.
IF sy-batch IS INITIAL.
MESSAGE e024(zsd_allg) WITH fp_kunnr.
ELSE.
MESSAGE s024(zsd_allg) WITH fp_kunnr.
ENDIF.
* E-Mail Adresse fr Kunde &1 fehlt
ENDIF.
ENDFORM. "call_addr_get

Weitere Beispiele

Seite 68 / 120
ABAP/4 Basis Funktionsbausteine

Bei der Telefonnummer muss unterschieden werden zwischen Telefonnummer und


Mobilnummer.

CONSTANTS: c_on TYPE boolean_flg VALUE 'X',


c_off TYPE boolean_flg VALUE ' ',
c_not_mobile_def TYPE adr2-r3_user VALUE '1',
c_mobile_def TYPE adr2-r3_user VALUE '3'.

FORM phone_number_get USING fp_adrnr TYPE kna1-adrnr


CHANGING fp_telf1 TYPE char40.
DATA:
l_address_number TYPE adrc-addrnumber,
l_tel_number TYPE adtel-tel_number,
l_tel_extens TYPE adtel-tel_extens,
l_mob_number TYPE ad_mbnmbr1,
li_comm_tel TYPE STANDARD TABLE OF adtel.

FIELD-SYMBOLS:
<ls_comm_tel> TYPE adtel.

CLEAR fp_telf1.

CHECK fp_adrnr IS NOT INITIAL.

l_address_number = fp_adrnr.

CALL FUNCTION 'ADDR_COMM_GET'


EXPORTING
address_number = l_address_number
language = sy-langu
table_type = 'ADTEL'
TABLES
comm_table = li_comm_tel
EXCEPTIONS
parameter_error = 1
address_not_exist = 2
internal_error = 3
OTHERS = 4.

CHECK li_comm_tel IS NOT INITIAL.

LOOP AT li_comm_tel ASSIGNING <ls_comm_tel>


WHERE r3_user = c_not_mobile_def
OR r3_user = c_mobile_def
OR flgdefault = c_on.
IF <ls_comm_tel>-r3_user = c_not_mobile_def.
l_tel_number = <ls_comm_tel>-tel_number.
l_tel_extens = <ls_comm_tel>-tel_extens.
ELSEIF <ls_comm_tel>-r3_user = c_mobile_def.
l_mob_number = <ls_comm_tel>-tel_number.
ELSEIF NOT <ls_comm_tel>-flgdefault IS INITIAL
AND <ls_comm_tel>-r3_user IS INITIAL.
* Fr den Fall da es sich um einen alten Adresssatz
* handelt, fr den das Flag 'Festnetzdefault' noch nicht
* gesetzt worden ist.
l_tel_number = <ls_comm_tel>-tel_number.
l_tel_extens = <ls_comm_tel>-tel_extens.

Seite 69 / 120
ABAP/4 Basis Funktionsbausteine

ENDIF.
ENDLOOP.

CHECK sy-subrc EQ 0 AND


l_tel_number IS NOT INITIAL.

IF l_tel_extens IS INITIAL.
fp_telf1 = l_tel_number.

ELSE.
IF l_tel_extens(1) EQ '-'.
CONCATENATE l_tel_number l_tel_extens
INTO fp_telf1.

ELSE.
CONCATENATE l_tel_number '-' l_tel_extens
INTO fp_telf1.
ENDIF.
ENDIF.
ENDFORM. " PHONE_NUMBER_GET
*&---------------------------------------------------------------------*
*& Form FAX_NUMBER_GET
*&---------------------------------------------------------------------*
* Read fax number and return fax number plus extension
* e.g. +41 52 883-3800 (-3800 is the extension)
*----------------------------------------------------------------------*
* -->FP_ADRNR Address number
* <--FP_TELFX Fax number
*----------------------------------------------------------------------*
FORM fax_number_get USING fp_adrnr TYPE kna1-adrnr
CHANGING fp_telfx TYPE char40.
DATA:
l_address_number TYPE adrc-addrnumber,
li_comm_fax TYPE STANDARD TABLE OF adfax.

FIELD-SYMBOLS:
<ls_comm_fax> TYPE adfax.

CLEAR fp_telfx.

CHECK fp_adrnr IS NOT INITIAL.

l_address_number = fp_adrnr.

CALL FUNCTION 'ADDR_COMM_GET'


EXPORTING
address_number = l_address_number
language = sy-langu
table_type = 'ADFAX'
TABLES
comm_table = li_comm_fax
EXCEPTIONS
parameter_error = 1
address_not_exist = 2
internal_error = 3
OTHERS = 4.

CHECK li_comm_fax IS NOT INITIAL.

READ TABLE li_comm_fax ASSIGNING <ls_comm_fax>

Seite 70 / 120
ABAP/4 Basis Funktionsbausteine

WITH KEY flgdefault = c_on.


IF sy-subrc NE 0.
READ TABLE li_comm_fax ASSIGNING <ls_comm_fax> INDEX 1.
ENDIF.

CHECK sy-subrc EQ 0.

IF <ls_comm_fax>-fax_extens IS INITIAL.
fp_telfx = <ls_comm_fax>-fax_number.

ELSE.
IF <ls_comm_fax>-fax_extens(1) EQ '-'.
CONCATENATE <ls_comm_fax>-fax_number <ls_comm_fax>-fax_extens
INTO fp_telfx.

ELSE.
CONCATENATE <ls_comm_fax>-fax_number '-' <ls_comm_fax>-fax_extens
INTO fp_telfx.
ENDIF.
ENDIF.
ENDFORM. " FAX_NUMBER_GET
*&---------------------------------------------------------------------*
*& Form MAIL_ADDRESS_GET
*&---------------------------------------------------------------------*
* Read eMail address
*----------------------------------------------------------------------*
* -->FP_ADRNR Address number
* <--FP_SMTP_ADDR Mail address
*----------------------------------------------------------------------*
FORM mail_address_get USING fp_adrnr TYPE kna1-adrnr
CHANGING fp_smtp_addr TYPE adsmtp-smtp_addr.
DATA:
l_address_number TYPE adrc-addrnumber,
li_comm_smtp TYPE STANDARD TABLE OF adsmtp.

FIELD-SYMBOLS:
<ls_comm_smtp> TYPE adsmtp.

CLEAR fp_smtp_addr.

CHECK fp_adrnr IS NOT INITIAL.

l_address_number = fp_adrnr.

CALL FUNCTION 'ADDR_COMM_GET'


EXPORTING
address_number = l_address_number
language = sy-langu
table_type = 'ADSMTP'
TABLES
comm_table = li_comm_smtp
EXCEPTIONS
parameter_error = 1
address_not_exist = 2
internal_error = 3
OTHERS = 4.

CHECK li_comm_smtp IS NOT INITIAL.

READ TABLE li_comm_smtp ASSIGNING <ls_comm_smtp>

Seite 71 / 120
ABAP/4 Basis Funktionsbausteine

WITH KEY flgdefault = c_on.


IF sy-subrc NE 0.
READ TABLE li_comm_smtp ASSIGNING <ls_comm_smtp> INDEX 1.
ENDIF.

CHECK sy-subrc EQ 0.

fp_smtp_addr = <ls_comm_smtp>-smtp_addr.

ENDFORM. " MAIL_ADDRESS_GET


*&---------------------------------------------------------------------*
*& Form URL_ADDRESS_GET
*&---------------------------------------------------------------------*
* Read URL address
*----------------------------------------------------------------------*
* -->FP_ADRNR Address number
* <--FP_URL Fax number
*----------------------------------------------------------------------*
FORM url_address_get USING fp_adrnr TYPE kna1-adrnr
CHANGING fp_url TYPE aduri-uri_addr.
DATA:
l_address_number TYPE adrc-addrnumber,
li_comm_uri TYPE STANDARD TABLE OF aduri.

FIELD-SYMBOLS:
<ls_comm_uri> TYPE aduri.

CLEAR fp_url.

CHECK fp_adrnr IS NOT INITIAL.

l_address_number = fp_adrnr.

CALL FUNCTION 'ADDR_COMM_GET'


EXPORTING
address_number = l_address_number
language = sy-langu
table_type = 'ADURI'
TABLES
comm_table = li_comm_uri
EXCEPTIONS
parameter_error = 1
address_not_exist = 2
internal_error = 3
OTHERS = 4.

CHECK li_comm_uri IS NOT INITIAL.

READ TABLE li_comm_uri ASSIGNING <ls_comm_uri>


WITH KEY flgdefault = c_on.
IF sy-subrc NE 0.
READ TABLE li_comm_uri ASSIGNING <ls_comm_uri> INDEX 1.
ENDIF.

CHECK sy-subrc EQ 0.

fp_url = <ls_comm_uri>-uri_addr.

ENDFORM. " URL_ADDRESS_GET

Seite 72 / 120
ABAP/4 Basis Funktionsbausteine

8.17 Adressdaten User ermitteln


Die Adressdaten fr den User stehen in den Adresstabellen (ADRC, ADRP etc.).

Fr die Adresse muss die Adressnummer der Firma und Personalnummer des Users ermittelt
werden. Diese Nummern finden Sie in der Tabelle USR21. Man kann diese Nummern auch
ber den Funktionsbaustein SUSR_USER_READ ermitteln.

Die Adressdaten der Firma knnen ber den Funktionsbaustein ADDR_GET gelesen werden.

Der Funktionsbaustein ADDR_PERS_COMP_GET liest die Firmen Adressdaten und die


Adressdaten des Users.

Weitere Komponenten wie z.B. E-Mail oder Fax knnen mit den Funktionsbaustein
ADDR_PERS_COMP_COMM_GET gelesen werden.

Beispiel
DATA:
l_addrnum TYPE usaddress,
l_addrpers TYPE addr3_sel,
l_uname TYPE usr02-bname,
li_adr6 TYPE STANDARD TABLE OF adsmtp.

* Adress-/Personalnummer ermitteln
CALL FUNCTION 'SUSR_USER_READ'
EXPORTING
user_name = ip_uname
IMPORTING
user_address = l_addrnum
EXCEPTIONS
user_name_not_exists = 1
internal_error = 2
OTHERS = 3.
IF sy-subrc EQ 0.
* Firmen-/Adressdaten ermitteln
l_addrpers-persnumber = l_addrnum-persnumber.
l_addrpers-addrnumber = l_addrnum-addrnumber.
CALL FUNCTION 'ADDR_PERS_COMP_GET'
EXPORTING
address_pers_in_comp_selection = l_addrpers
IMPORTING
ADDRESS_PERS_IN_COMP_VALUE = op_addr3.

* Internetadresse ermitteln
CALL FUNCTION 'ADDR_PERS_COMP_COMM_GET'
EXPORTING
address_number = l_addrnum-addrnumber
person_number = l_addrnum-persnumber
table_type = 'ADSMTP'
TABLES
comm_table = li_adsmtp
EXCEPTIONS
parameter_error = 1
address_not_exist = 2
person_not_exist = 3
internal_error = 4
OTHERS = 5.
IF sy-subrc <> 0.
ENDIF.

Seite 73 / 120
ABAP/4 Basis Funktionsbausteine

Eine weitere Mglichkeit die Adressdaten zu lesen ist der Funktionsbaustein


SUSR_USER_ADDRESS_READ. Dieser Fuba kann die Adressdaten sowohl im alten (USR03)
als ach im neuen Format (ADDR3_VAL) zurckgeben.

CALL FUNCTION 'SUSR_USER_ADDRESS_READ'


EXPORTING
user_name = user_wa-uname
IMPORTING
user_usr03 = usr03
EXCEPTIONS
user_address_not_found = 1
OTHERS = 2.

8.17.1 Anrede/Titel ermitteln


Der Titel steht als Kennzeichen in den Adressfeldern. Der Text muss aus der Tabelle TSAD3T
ermittelt werden.

Funktionsbaustein ADDR_TSAD3T_READ.

Seite 74 / 120
ABAP/4 Basis Funktionsbausteine

8.18 Belegdaten

8.18.1 Partnerdaten zum Beleg


Der Fuba SD_PARTNER_READ liest Daten zum Beleg (es werden auch die Adressdaten
gelesen).

CALL FUNCTION 'SD_PARTNER_READ'


EXPORTING
f_vbeln = wa_s_detail-vbeln
TABLES
i_xvbadr = i_partner_address
i_xvbpa = i_partner_partner.
CLEAR: ws_partner_partner.
LOOP AT i_partner_partner INTO ws_partner_partner
WHERE parvw = 'ZE'.
w_endcons_name = ws_partner_partner-name1.
ENDLOOP.
LOOP AT i_partner_partner INTO ws_partner_partner
WHERE parvw = 'RE'.
w_billto_name = ws_partner_partner-name1.
w_billto = ws_partner_partner-kunnr.
ENDLOOP.

Seite 75 / 120
ABAP/4 Basis Funktionsbausteine

8.19 F4 Hilfe

8.19.1 Anzeige F4 zu einer Tabelle aus dem Data Dictionary.

MODULE zz_knuma_PI INPUT.


DATA: Tknuma_TAB like zzsd_tknuma occurs 2 with header line.

select knuma botext from kona


into corresponding fields of table tknuma_tab
where abtyp = 'B'
and vkorg = vbak-vkorg
and datab <= vbkd-prsdt
and datbi >= vbkd-prsdt.

* Ausgabe Werte
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
DDIC_STRUCTURE = 'ZZUH_TKNUMA'
RETFIELD = 'KNUMA'
VALUE_ORG = 'S'
TABLES
VALUE_TAB = TKNUMA_TAB
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
ENDMODULE. " zz_knuma_PI INPUT

8.19.2 Anzeige F4 zu einer internen Tabelle.

FORM f4_atnam.
TYPES:
BEGIN OF ts_cabx,
atnam TYPE cabn-atnam,
atbez TYPE cabnt-atbez,
END OF ts_cabx.
DATA:
l_dyname TYPE d020s-prog,
l_dynumb TYPE d020s-dnum.

DATA:
li_ksml TYPE tt_ksml,
li_cabn TYPE tt_cabn,
li_cabnt TYPE tt_cabnt,
li_cawn TYPE tt_cawn,
li_cabx TYPE STANDARD TABLE OF ts_cabx,
li_dynpfields TYPE cms_tab_search_fields,
lr_atinn TYPE RANGE OF cabn-atinn.
DATA:
ls_klah TYPE klah,
ls_ksml TYPE ksml,
ls_cabx TYPE ts_cabx,
ls_atinn LIKE LINE OF lr_atinn,
ls_dynpfields TYPE dynpread.
DATA:

Seite 76 / 120
ABAP/4 Basis Funktionsbausteine

l_dynprog TYPE sy-repid,


l_dynpnr TYPE sy-dynnr,
l_dynprofield TYPE help_info-dynprofld.
FIELD-SYMBOLS:
<ls_ksml> TYPE ksml,
<ls_cabn> TYPE cabn,
<ls_cabnt> TYPE cabnt.
DATA:
l_klart TYPE klassenart,
l_class TYPE clselinput-class.

MOVE 'P_KLART' TO ls_dynpfields-fieldname.


APPEND ls_dynpfields TO li_dynpfields.
MOVE 'P_CLASS' TO ls_dynpfields-fieldname.
APPEND ls_dynpfields TO li_dynpfields.

l_dyname = sy-repid.
l_dynumb = sy-dynnr.
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
dyname = l_dyname
dynumb = l_dynumb
TABLES
dynpfields = li_dynpfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

LOOP AT li_dynpfields INTO ls_dynpfields.


CASE ls_dynpfields-fieldname.
WHEN 'P_KLART'.
l_klart = ls_dynpfields-fieldvalue.
WHEN 'P_CLASS'.
l_class = ls_dynpfields-fieldvalue.
ENDCASE.
ENDLOOP.

SELECT * FROM klah INTO ls_klah UP TO 1 ROWS


WHERE klart = l_klart
AND class = l_class.
ENDSELECT.

CLEAR ls_ksml.

Seite 77 / 120
ABAP/4 Basis Funktionsbausteine

ls_ksml-clint = ls_klah-clint.
APPEND ls_ksml TO li_ksml.

CALL FUNCTION 'CLSE_SELECT_KSML'


EXPORTING
key_date = sy-datum
TABLES
imp_exp_ksml = li_ksml
EXCEPTIONS
no_entry_found = 00.

ls_atinn-sign = 'I'.
ls_atinn-option = 'EQ'.
LOOP AT li_ksml ASSIGNING <ls_ksml>.
ls_atinn-low = <ls_ksml>-imerk.
APPEND ls_atinn TO lr_atinn.
ENDLOOP.

CALL FUNCTION 'CLSE_SELECT_CABN'


EXPORTING
key_date = sy-datum
* IMPORTING
* ambiguous_obj_characteristic = x_mobj
TABLES
in_cabn = lr_atinn
t_cabn = li_cabn
EXCEPTIONS
no_entry_found = 00.

CALL FUNCTION 'CLSE_SELECT_CABNT'


EXPORTING
key_date = sy-datum
* IMPORTING
* ambiguous_obj_characteristic = x_mobj
TABLES
in_cabn = lr_atinn
t_cabnt = li_cabnt
EXCEPTIONS
no_entry_found = 00.

l_dynprog = sy-repid.
l_dynpnr = sy-dynnr.
l_dynprofield = 'P_ATNAM'.

LOOP AT li_cabn ASSIGNING <ls_cabn>.


READ TABLE li_cabnt ASSIGNING <ls_cabnt>
WITH KEY atinn = <ls_cabn>-atinn.
CHECK sy-subrc EQ 0.

ls_cabx-atnam = <ls_cabn>-atnam.
ls_cabx-atbez = <ls_cabnt>-atbez.
APPEND ls_cabx TO li_cabx.
ENDLOOP.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'


EXPORTING
retfield = 'ATNAM'
dynpprog = l_dynprog

Seite 78 / 120
ABAP/4 Basis Funktionsbausteine

dynpnr = l_dynpnr
dynprofield = l_dynprofield
value_org = 'S'
TABLES
value_tab = li_cabx.
ENDFORM. "f4_atnam

Seite 79 / 120
ABAP/4 Basis Funktionsbausteine

8.19.3 Anzeige F4 zu einer internen Tabelle mit Update von Dynprofeldern.

PROCESS ON VALUE-REQUEST.
FIELD w_antr_pos-wms_group MODULE wms_group_f4.

MODULE wms_group_f4 INPUT.


perform wms_group_f4.
ENDMODULE. " WMS_GROUP_F4 INPUT

FORM wms_group_f4 .
DATA:
ls_wms_grpval TYPE zmm_wms_grpval,
ls_dynpfields TYPE dynpread,
li_wms_grpt TYPE ti_wms_grpt,
li_wms_grpval TYPE STANDARD TABLE OF zmm_wms_grpval,
li_return TYPE STANDARD TABLE OF ddshretval,
li_dynpfields TYPE STANDARD TABLE OF dynpread.

FIELD-SYMBOLS:
<ls_return> TYPE ddshretval,
<ls_wms_grpt> TYPE ts_wms_grpt.

IF w_antr_pos-begru IS NOT INITIAL.


SELECT *
FROM zmm_wms_grpval
INTO TABLE li_wms_grpval
WHERE werks EQ w_antr_pos-begru.
ENDIF.

SELECT wms_group wms_group_desc


FROM zmm_wms_grpt
INTO TABLE li_wms_grpt
FOR ALL ENTRIES IN li_wms_grpval
WHERE wms_group EQ li_wms_grpval-wms_group
AND langu EQ sy-langu.

SORT li_wms_grpt BY wms_group.

* Ausgabe Werte
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
* ddic_structure = 'ZMM_WMS_GRPT'
retfield = 'WMS_GROUP'
value_org = 'S'
TABLES
value_tab = li_wms_grpt
return_tab = li_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc EQ 0.
READ TABLE li_return ASSIGNING <ls_return> INDEX 1.
* Set value for field WMS Group and Storage location
IF sy-subrc EQ 0.
w_antr_pos-wms_group = <ls_return>-fieldval.

PERFORM zmm_wms_grpval_read USING w_antr_pos-wms_group

Seite 80 / 120
ABAP/4 Basis Funktionsbausteine

w_antr_pos-begru
CHANGING ls_wms_grpval.
IF ls_wms_grpval-lgpro IS NOT INITIAL.
ls_dynpfields-fieldname = 'W_ANTR_POS-LGPRO'.
ls_dynpfields-fieldvalue = ls_wms_grpval-lgpro.
APPEND ls_dynpfields TO li_dynpfields.
READ TABLE li_wms_grpt ASSIGNING <ls_wms_grpt>
WITH KEY wms_group = w_antr_pos-wms_group.
IF sy-subrc EQ 0.
ls_dynpfields-fieldname = 'GS_WMS_GRPT-WMS_GROUP_DESC'.
ls_dynpfields-fieldvalue = <ls_wms_grpt>-wms_group_desc.
APPEND ls_dynpfields TO li_dynpfields.
ENDIF.
CALL FUNCTION 'DYNP_VALUES_UPDATE'
EXPORTING
dyname = sy-repid
dynumb = sy-dynnr
TABLES
dynpfields = li_dynpfields.

ENDIF.
ENDIF.
ENDIF.

ENDFORM. " WMS_GROUP_F4

Seite 81 / 120
ABAP/4 Basis Funktionsbausteine

8.19.4 F4 in PBO belegen


In der PBO kann man die F4 Daten mit dem nachfolgenden FB einstellen.

MODULE pov_bwart OUTPUT.

PERFORM pov_bwart.

ENDMODULE. " POV_BWART INPUT

FORM pov_bwart .

DATA: l_id TYPE vrm_id VALUE 'D0200-BWART'.

* STATICS: LT_VAL TYPE VRM_VALUES.

DATA: lt_val TYPE vrm_values.

DATA: l_val LIKE LINE OF lt_val.

IF lt_val[] IS INITIAL.

l_val-key = '101'.

Seite 82 / 120
ABAP/4 Basis Funktionsbausteine

l_val-text = 'Wareneingang zur Bestellung ans Lager'.


APPEND l_val TO lt_val.

l_val-key = '103'.
l_val-text = 'Wareneingang zur Bestellung in Sperrbestand'.
APPEND l_val TO lt_val.

l_val-key = '105'.
l_val-text = 'Freigeben des Sperrbestandes ans Lager'.
APPEND l_val TO lt_val.

SORT lt_val BY key.

CALL FUNCTION 'VRM_SET_VALUES'


EXPORTING
id = l_id
values = lt_val
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.

ENDIF.

ENDFORM. " POV_BWART

Seite 83 / 120
ABAP/4 Basis Funktionsbausteine

8.20 F4 fr Parameter

Parameter

PARAMETERS p_lgort TYPE lgort_d AS LISTBOX VISIBLE LENGTH 20


DEFAULT '0080'.

Aufbau F4 in PBO

**********************************************************************
AT SELECTION-SCREEN OUTPUT.
**********************************************************************
PERFORM output_modify.

DATA: l_id TYPE vrm_id VALUE 'P_LGORT'.


DATA: lt_val TYPE vrm_values.
DATA: l_val LIKE LINE OF lt_val.

IF lt_val[] IS INITIAL.

l_val-key = '0080'.
l_val-text = 'Lagerort1'.
APPEND l_val TO lt_val.
l_val-key = 'P092'.
l_val-text = 'Lagerort2'.
APPEND l_val TO lt_val.
l_val-key = 'P093'.
l_val-text = 'Lagerort3'.
APPEND l_val TO lt_val.
SORT lt_val BY key.

CALL FUNCTION 'VRM_SET_VALUES'


EXPORTING
id = l_id
values = lt_val
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
ENDIF.

Seite 84 / 120
ABAP/4 Basis Funktionsbausteine

8.21 F4 Hilfe fr Select-Options

SELECT-OPTIONS
SELECT-OPTIONS s_lgort FOR g_lgort.

**********************************************************************
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_lgort-low.
**********************************************************************
PERFORM lgort_f4 USING s_lgort-low
s_lgort[].

FORM lgort_f4 CHANGING ch_lgort_low TYPE lgort_d


ch_lgort_r TYPE tt_lgort_r.
DATA:
* l_lgort TYPE t001l-lgort,
ls_lgort_r TYPE ts_lgort_r,
ls_lgort_list TYPE ts_lgort_list,
lt_t001l TYPE tt_t001l,
lt_lgort_list TYPE tt_lgort_list,
lt_return TYPE dmc_ddshretval_table.

FIELD-SYMBOLS:
<ls_t001l> TYPE ts_t001l,
<ls_return> TYPE ddshretval.

*-> Wertetabelle versorgen


SELECT werks lgort lgobe
FROM t001l
INTO TABLE lt_t001l
WHERE werks EQ c_werks_amb
AND lgort IN (c_lgort_0080, c_lgort_p092, c_lgort_p093).

SORT lt_t001l BY werks lgort.

LOOP AT lt_t001l ASSIGNING <ls_t001l>.


ls_lgort_list-lgort = <ls_t001l>-lgort.
ls_lgort_list-lgobe = <ls_t001l>-lgobe.
APPEND ls_lgort_list TO lt_lgort_list.
ENDLOOP.

CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'


EXPORTING
retfield = 'LGORT'
value_org = 'S'
multiple_choice = 'X'
* IMPORTING
* USER_RESET =
TABLES
value_tab = lt_lgort_list
return_tab = lt_return
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.

Seite 85 / 120
ABAP/4 Basis Funktionsbausteine

IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

CHECK lt_return IS NOT INITIAL.

LOOP AT lt_return ASSIGNING <ls_return>.


IF sy-tabix EQ 1.
ch_lgort_low = <ls_return>-fieldval.
ENDIF.
ls_lgort_r-sign = 'I'.
ls_lgort_r-option = 'EQ'.
ls_lgort_r-low = <ls_return>-fieldval.
APPEND ls_lgort_r TO ch_lgort_r.
ENDLOOP.
ENDFORM. "auskt_f4

8.22 F4 Hilfe zu Feld KSCHL


Mit diesem Fuba kann man sich die Kondition z.B. fr die Preise anzeigen lassen.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_kschl-low.


CALL FUNCTION 'RV_CONDITION_RECORD_DISPLAY'
EXPORTING
condition_use = 'A'
application = 'V'
condition_classes_excl = 'C'
get_condition_type = 'X'
for_maintenance_only = 'X'
IMPORTING
condition_type = s_kschl-low
* condition_type_text = x_vtext
EXCEPTIONS
OTHERS = 1.

8.23 Ermitteln SAP Standard Pfad

DATA: w_dest LIKE zbc_var_struk=>pc,


w_path TYPE char255,
w_name TYPE localfile.

CALL FUNCTION 'GUI_GET_DESKTOP_INFO'


EXPORTING
type = 4
CHANGING
return = w_path.
CONCATENATE w_path '\' INTO w_path.

Seite 86 / 120
ABAP/4 Basis Funktionsbausteine

8.24 Data Dictionary

8.24.1 Feldinformationen zu Tabellen/Strukturen lesen

DDIF_TABL_GET
Offset der Felder wird nicht zurckgegeben.

Seite 87 / 120
ABAP/4 Basis Funktionsbausteine

DDIF_NAMETAB_GET
Offset ist vorhanden aber nicht fr Programm zu benutzen.

Seite 88 / 120
ABAP/4 Basis Funktionsbausteine

DDIF_FIELDINFO_GET
Mit Texten pro Feld in DFIES_TAB.

Hinweis Werden die Texte nicht bentigt sollte man den effizientieren Fuba
DDIF_NAMETAB_GET verwenden.

Seite 89 / 120
ABAP/4 Basis Funktionsbausteine

8.25 Dynpro Daten lesen

Fuba DYNP_VALUES_READ

DATA: li_dynpfields TYPE cms_tab_fields,


ls_dynpfields TYPE dynpread,
l_dyname TYPE d020s-prog,
l_dynumb TYPE d020s-dnum.

* read dynpro value for field Delivery block


l_dyname = sy-repid.
l_dynumb = sy-dynnr.

ls_dynpfields-fieldname = 'VBAK-LIFSK'.
APPEND ls_dynpfields TO li_dynpfields.

CALL FUNCTION 'DYNP_VALUES_READ'


EXPORTING
dyname = l_dyname
dynumb = l_dynumb
TABLES
dynpfields = li_dynpfields
EXCEPTIONS
invalid_abapworkarea = 1
invalid_dynprofield = 2
invalid_dynproname = 3
invalid_dynpronummer = 4
invalid_request = 5
no_fielddescription = 6
invalid_parameter = 7
undefind_error = 8
double_conversion = 9
stepl_not_found = 10
OTHERS = 11.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

READ TABLE li_dynpfields INTO ls_dynpfields INDEX 1.


l_lifsk_dynp = ls_dynpfields-fieldvalue.

Seite 90 / 120
ABAP/4 Basis Funktionsbausteine

8.26 Popups

8.26.1 Selektion Zeile aus interner Tabelle


Mit dem Fuba G_DISPLAY_SELECTION_DYNPRO kann man eine interne Tabelle fr die Selektion
ausgeben.

FORM popup_info_records USING fpi_eina TYPE wrb_eina_table


CHANGING fps_eina TYPE eina.
TYPES:
BEGIN OF lts_popup,
matnr TYPE zmms_alv_info_records-matnr,
maktx TYPE zmms_alv_info_records-maktx,
lifnr TYPE zmms_alv_info_records-lifnr,
name1 TYPE zmms_alv_info_records-name1,
ekorg TYPE zmms_alv_info_records-ekorg,
werks TYPE zmms_alv_info_records-werks,
infnr TYPE zmms_alv_info_records-infnr,
END OF lts_popup.
DATA:
l_matnr TYPE matnr,
li_eine TYPE tt_eine,
li_lfa1 TYPE wstn_lfa1_tab,
li_popup TYPE STANDARD TABLE OF lts_popup,
li_dfies TYPE dfies_tab,
ls_makt TYPE makt,
ls_popup TYPE lts_popup.
FIELD-SYMBOLS:
<ls_eina> TYPE eina,
<ls_eine> TYPE eine,
<ls_lfa1> TYPE lfa1,
<ls_dfies> TYPE dfies.

DATA: l_index TYPE sy-tabix,


help_title TYPE rgsel-dynp_title.

* Hilfsstruktur fr Spaltenberschriften
DATA: BEGIN OF help_coltitle,
matnr TYPE zmms_alv_info_records-matnr,
maktx TYPE zmms_alv_info_records-maktx,
lifnr TYPE zmms_alv_info_records-lifnr,
name1 TYPE zmms_alv_info_records-name1,
ekorg TYPE zmms_alv_info_records-ekorg,
werks TYPE zmms_alv_info_records-werks,
infnr TYPE zmms_alv_info_records-infnr,
END OF help_coltitle.

CLEAR: gs_eina, gs_eina_sel.

Seite 91 / 120
ABAP/4 Basis Funktionsbausteine

SELECT * FROM eine INTO TABLE li_eine


FOR ALL ENTRIES IN gi_eina
WHERE infnr EQ gi_eina-infnr.

READ TABLE fpi_eina ASSIGNING <ls_eina> INDEX 1.

SELECT SINGLE * FROM makt INTO ls_makt


WHERE matnr EQ <ls_eina>-matnr
AND spras EQ sy-langu.

SELECT * FROM lfa1 INTO TABLE li_lfa1


FOR ALL ENTRIES IN fpi_eina
WHERE lifnr EQ fpi_eina-lifnr.

LOOP AT fpi_eina ASSIGNING <ls_eina>.


CLEAR ls_popup.
WRITE <ls_eina>-matnr TO ls_popup-matnr.
ls_popup-maktx = ls_makt-maktx.
WRITE <ls_eina>-lifnr TO ls_popup-lifnr.

READ TABLE li_lfa1 ASSIGNING <ls_lfa1>


WITH KEY lifnr = <ls_eina>-lifnr.
IF sy-subrc EQ 0.
ls_popup-name1 = <ls_lfa1>-name1.
ENDIF.

READ TABLE li_eine ASSIGNING <ls_eine>


WITH KEY infnr = <ls_eina>-infnr.
IF sy-subrc EQ 0.
ls_popup-ekorg = <ls_eine>-ekorg.
ls_popup-werks = <ls_eine>-werks.
ENDIF.

ls_popup-infnr = <ls_eina>-infnr.

APPEND ls_popup TO li_popup.


ENDLOOP.

* Aufruf Universal-Popup
help_title = 'More than one info record (please select one)'(005).
PERFORM tab_fields_get USING 'zmms_alv_info_records'
CHANGING li_dfies.
PERFORM field_read USING 'MATNR'
li_dfies
CHANGING help_coltitle-matnr.
PERFORM field_read USING 'MAKTX'
li_dfies
CHANGING help_coltitle-maktx.
PERFORM field_read USING 'LIFNR'
li_dfies
CHANGING help_coltitle-lifnr.
PERFORM field_read USING 'NAME1'
li_dfies
CHANGING help_coltitle-name1.
PERFORM field_read USING 'EKORG'
li_dfies
CHANGING help_coltitle-ekorg.
PERFORM field_read USING 'WERKS'
li_dfies

Seite 92 / 120
ABAP/4 Basis Funktionsbausteine

CHANGING help_coltitle-werks.
PERFORM field_read USING 'INFNR'
li_dfies
CHANGING help_coltitle-infnr.
CALL FUNCTION 'G_DISPLAY_SELECTION_DYNPRO'
EXPORTING
dynp_title = help_title
sel_title1 = help_coltitle
first_index = 1
key_columns = 3
number_of_rows = 8
show_also_1 = 'X'
start_column = 20
start_row = 10
width_of_titles = 'X'
allow_sort = 'X'
IMPORTING
sel_index = l_index
TABLES
sel_table = li_popup
EXCEPTIONS
no_lines = 1
no_line_picked = 2
OTHERS = 3.

IF sy-subrc = 0.
READ TABLE fpi_eina INTO fps_eina INDEX l_index.
ELSEIF sy-subrc = 2.
MESSAGE e000 WITH 'Process canceled'(004).
ENDIF.

ENDFORM. " POPUP_INFO_RECORDS


*&---------------------------------------------------------------------*
*& Form tab_fields_get
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->FP_TABNAME text
* -->FPI_DFIES text
*----------------------------------------------------------------------*
FORM tab_fields_get USING fp_tabname TYPE ddobjname
CHANGING fpi_dfies TYPE dfies_tab.
CALL FUNCTION 'DDIF_FIELDINFO_GET'
EXPORTING
tabname = fp_tabname
TABLES
dfies_tab = fpi_dfies
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.

ENDFORM. "tab_fields_get
*&---------------------------------------------------------------------*
*& Form field_read
*&---------------------------------------------------------------------*

Seite 93 / 120
ABAP/4 Basis Funktionsbausteine

* text
*----------------------------------------------------------------------*
* -->FP_FIELDNAME text
* -->FP_REPTEXT text
*----------------------------------------------------------------------*
FORM field_read USING fp_fieldname TYPE fieldname
fpi_dfies TYPE dfies_tab
CHANGING fp_reptext TYPE any.
FIELD-SYMBOLS:
<ls_dfies> TYPE dfies.

READ TABLE fpi_dfies ASSIGNING <ls_dfies>


WITH KEY fieldname = fp_fieldname.
IF sy-subrc EQ 0.
fp_reptext = <ls_dfies>-reptext.
ELSE.
CLEAR fp_reptext.
ENDIF.
ENDFORM. "field_read

Seite 94 / 120
ABAP/4 Basis Funktionsbausteine

8.27 Application Log anzeigen

form errorlog_select using ps_auto type zmb_auto01 fp_flog type ldat


data li_messtab type standard table of bdcmsgcoll.
data l_ctumode type ctu_params.
data l_vbeln type balhdr-extnumber.
data l_flog_dat type balhdr-aldate.

if ps_auto-vbeln is initial.
l_vbeln = ps_auto-aufnr.
else.
l_vbeln = ps_auto-vbeln.
endif.

l_flog_dat = fp_flog.
call function 'APPL_LOG_DISPLAY'
exporting
external_number = l_vbeln
date_from = l_flog_dat
title_list_screen = 'Error Autom. processing'
suppress_selection_dialog = 'X'.

endform. " select_errorlog

Seite 95 / 120
ABAP/4 Basis Funktionsbausteine

8.28 Application Log schreiben

METHOD applog_create .
DATA:
ls_log TYPE bal_s_log.

IF im_extid IS INITIAL.
* set in constructor
ls_log-extnumber = get_extid( ).
ELSE.
ls_log-extnumber = im_extid.
ENDIF.
ls_log-object = get_object( ).
ls_log-subobject = get_subobject( ).
ls_log-alprog = get_progname( ).
ls_log-aldate_del = sy-datum + im_nrofdays. "keep no of days
ls_log-del_before = 'X'.
* CASE get_highest_error( ).
* WHEN 'E'
* OR 'A'.
* ls_log-alstate = '1'.
* WHEN 'W'.
* ls_log-alstate = '2'.
* WHEN OTHERS.
* ls_log-alstate = '3'.
* ENDCASE.
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = ls_log
IMPORTING
e_log_handle = g_handle
EXCEPTIONS
log_header_inconsistent = 1
OTHERS = 2.
IF sy-subrc <> 0.
* just stop it.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDMETHOD.

METHOD output_to_applog .
* Show messages in pop up
DATA:
* l_handle TYPE balloghndl,
l_tmstmp TYPE char20,
l_logged TYPE boolean,
ls_log TYPE bal_s_log,
ls_msg TYPE bal_s_msg,
li_handle TYPE bal_t_logh,
l_handle TYPE balloghndl.
FIELD-SYMBOLS:
<s_err> TYPE ts_error.

* fp_proglog_func:
* A Show All Messages
* E Show Errors Only (E & A)
* Check if the program log has to be written
CHECK fp_applog_func = 'A' "ALL
OR ( fp_applog_func = 'E' AND "ERRORS ONLY

Seite 96 / 120
ABAP/4 Basis Funktionsbausteine

( get_highest_error( ) = 'E' OR "errors


get_highest_error( ) = 'A' ) ). "Abend

IF get_handle( ) IS INITIAL.
CALL METHOD me->applog_create
EXPORTING
im_extid = fp_extid
im_nrofdays = fp_nrofdays.
l_handle = get_handle( ).
APPEND l_handle TO li_handle.
ELSE.
l_handle = get_handle( ).
APPEND l_handle TO li_handle.
* load the existing log from the database
CALL FUNCTION 'BAL_DB_LOAD'
EXPORTING
i_t_log_handle = li_handle
* i_do_not_load_messages = 'X'
EXCEPTIONS
no_logs_specified = 1
log_not_found = 2
log_already_loaded = 3
OTHERS = 4.
IF sy-subrc <> 0.
* we don't care about this. The first time the log is not found
ENDIF.
ENDIF.

* write errors to log


LOOP AT gi_error ASSIGNING <s_err>.
ls_msg-msgty = <s_err>-type.
ls_msg-msgid = <s_err>-id.
ls_msg-msgno = <s_err>-number.
ls_msg-msgv1 = <s_err>-message_v1.
ls_msg-msgv2 = <s_err>-message_v2.
ls_msg-msgv3 = <s_err>-message_v3.
ls_msg-msgv4 = <s_err>-message_v4.
* ls_msg-MSGV1_SRC =
* ls_msg-MSGV2_SRC =
* ls_msg-MSGV3_SRC =
* ls_msg-MSGV4_SRC =
* ls_msg-DETLEVEL =
* ls_msg-ALSORT =

* Problem class
CASE ls_msg-msgty.
WHEN 'A'.
ls_msg-probclass = '1'. "very important
WHEN 'E'.
ls_msg-probclass = '2'. "important
WHEN 'W'.
ls_msg-probclass = '3'. "medium
WHEN OTHERS.
ls_msg-probclass = '4'. "Additional information
ENDCASE.
* Timestamp
l_tmstmp = <s_err>-date.
l_tmstmp+8(6) = <s_err>-time.
ls_msg-time_stmp = l_tmstmp.
ls_msg-msg_count = <s_err>-row.

CALL FUNCTION 'BAL_LOG_MSG_ADD'


EXPORTING
i_log_handle = l_handle
i_s_msg = ls_msg

Seite 97 / 120
ABAP/4 Basis Funktionsbausteine

IMPORTING
* E_S_MSG_HANDLE =
e_msg_was_logged = l_logged
* E_MSG_WAS_DISPLAYED =
EXCEPTIONS
log_not_found = 1
msg_inconsistent = 2
log_is_full = 3
OTHERS = 4.
IF sy-subrc = 1
OR sy-subrc = 3.
EXIT. "no use to continue
ENDIF.
ENDLOOP.
CHECK sy-subrc = 0.

* save messages to database


CALL FUNCTION 'BAL_DB_SAVE'
EXPORTING
* I_CLIENT = SY-MANDT
* I_IN_UPDATE_TASK = ' '
* I_SAVE_ALL = ' '
i_t_log_handle = li_handle
* IMPORTING
* E_NEW_LOGNUMBERS =
EXCEPTIONS
log_not_found = 1
save_not_allowed = 2
numbering_error = 3
OTHERS = 4
.
IF sy-subrc <> 0.
* don't care
ENDIF.

* remove the log from memory


CALL FUNCTION 'BAL_LOG_REFRESH'
EXPORTING
i_log_handle = l_handle
EXCEPTIONS
log_not_found = 1
OTHERS = 2.
IF sy-subrc <> 0.
* don't care
ENDIF.
ENDMETHOD.

Seite 98 / 120
ABAP/4 Basis Funktionsbausteine

8.29 Texte anzeigen


Mit dem Fuba SD_TEXT_DISPLAY kann man Texte anzeigen.

Beispiel
Internal note for equipment.

LOOP AT fpi_stab ASSIGNING <ls_stab>


WHERE equnr IS NOT INITIAL.
* Interner Vermerk
l_tdname = <ls_stab>-equnr.
SELECT tdname tdspras
FROM stxh
INTO ls_stxh
UP TO 1 ROWS
WHERE tdobject = 'EQUI'
AND tdname = l_tdname
AND tdid = 'INTV'.
ENDSELECT.

CHECK sy-subrc = 0.

CALL FUNCTION 'SD_TEXT_DISPLAY'


EXPORTING
i_tdobject = 'EQUI'
i_tdid = 'INTV'
i_tdname = ls_stxh-tdname
i_tdspras = ls_stxh-tdspras
i_text_maintenance_allowed = ' '
EXCEPTIONS
text_not_found = 1
empty_text = 2
format_not_supported = 3
OTHERS = 4.

Seite 99 / 120
ABAP/4 Basis Funktionsbausteine

8.30 Belegfluss lesen


Fuba RV_ORDER_FLOW_INFORMATION

Dieser Fuba liest den Belegfluss. Je nach Einstiegsbeleg wird der Belegfluss zurckgeliefert.

Belegfluss zur Lieferung

Wenn man den Belegfluss via Lieferung liest bekommt man die gesamte bersicht.

Der Belegfluss wird je Position zurckgegeben. Der Belegfluss ist sortiert nach Datum/Uhrzeit.

Seite 100 / 120


ABAP/4 Basis Funktionsbausteine

Seite 101 / 120


ABAP/4 Basis Funktionsbausteine

8.31 Prfen ob ein Funktionsbaustein existiert

CALL FUNCTION 'FUNCTION_EXISTS'


EXPORTING
FUNCNAME = 'AS_API_READ'
EXCEPTIONS
FUNCTION_NOT_EXIST = 1
OTHERS = 2.

Seite 102 / 120


ABAP/4 Basis Funktionsbausteine

8.32 Prfziffer fr EAN ermitteln


Prfziffer fr EAN ermitteln.

*&---------------------------------------------------------------------*
*& Form EAN_CHECK_DIGIT_DETERMINE
*&---------------------------------------------------------------------*
* Determine check digit at position 13
* Note: Function module EAN_DETERMINE_CHECKDIGIT shift leading 0.
* In: 069876430701
* Out: 698764307017
*----------------------------------------------------------------------*
* -->FP_EAN11 EAN number from MARA
* <--FP_EAN11_OUT EAN number with check digit
*----------------------------------------------------------------------*
FORM ean_check_digit_determine USING fp_ean11 TYPE mara-ean11
CHANGING fp_ean11_out TYPE e1maram-ean11.
DATA:
l_len_in TYPE i,
l_len_out TYPE i,
l_ean11_in TYPE mara-ean11,
l_ean11_out TYPE e1maram-ean11.

CHECK fp_ean11 IS NOT INITIAL.

l_len_in = STRLEN( fp_ean11 ).


CHECK l_len_in < 13.

CALL FUNCTION 'CONVERSION_EXIT_EAN11_OUTPUT'


EXPORTING
input = fp_ean11
IMPORTING
output = l_ean11_in.

CALL FUNCTION 'EAN_DETERMINE_CHECKDIGIT'


EXPORTING
i_ean = l_ean11_in
IMPORTING
e_ean = l_ean11_out.

l_len_out = STRLEN( l_ean11_out ) - 1.


CONCATENATE l_ean11_in
l_ean11_out+l_len_out
INTO fp_ean11_out.

ENDFORM. " EAN_CHECK_DIGIT_DETERMINE

Seite 103 / 120


ABAP/4 Basis Funktionsbausteine

8.33 Read status line


Mit diesem Fuba wird die Statusinformationen zu einem Beleg gelesen.

Beispiel
Fr den Produktionsauftrag. Zuerst muss die Objektnummer ermittelt werden:

SELECT SINGLE aufnr objnr FROM aufk


INTO ls_aufk
WHERE aufnr = fp_aufnr.
IF sy-subrc EQ 0 AND
ls_aufk-objnr IS NOT INITIAL.
PERFORM status_text_read USING ls_aufk-objnr
CHANGING fp_sttxt.
ENDIF.
ENDIF.

FORM status_text_read USING fp_objnr TYPE jest-objnr


CHANGING fp_sttxt TYPE ts_output-sttxt.
CALL FUNCTION 'STATUS_TEXT_EDIT'
EXPORTING
flg_user_stat = 'X'
objnr = fp_objnr
only_active = 'X'
spras = sy-langu
IMPORTING
line = fp_sttxt
EXCEPTIONS
object_not_found = 01.
IF sy-subrc NE 0.
CLEAR fp_sttxt.
ENDIF.

ENDFORM. " STATUS_TEXT_READ

In dem Parameter LINE stehen dann die Statusinformationen, die z.B. in der CO03 angezeigt
werden.

Seite 104 / 120


ABAP/4 Basis Funktionsbausteine

8.34 Popup ausgeben


Bei einem Doppelklick auf eine Zeile (z.B. aus einer ALV Liste) soll eine Detailanzeige erfolgen.
Die Daten befinden sich in einer internen Tabelle.

FORM popup_xx_display USING fp_matnr TYPE plaf-matnr


fp_werks TYPE plaf-plwrk
fp_plnum TYPE plaf-plnum
fp_fieldname TYPE lvc_s_col-fieldname
fp_all TYPE flag.

DATA:
l_end_line TYPE i,
l_lines TYPE i,
ls_popup TYPE zpps_co41_reqcov,
ls_reqtype TYPE LINE OF tr_reqtype,
li_popup TYPE STANDARD TABLE OF zpps_co41_reqcov,
lr_reqtype TYPE tr_reqtype.

FIELD-SYMBOLS:
<ls_reqcov> TYPE zpps_co41_reqcov.

ls_reqtype-sign = 'I'.
ls_reqtype-option = 'EQ'.

IF fp_fieldname NE 'Others'.
ls_reqtype-low = fp_fieldname+5(2).
ENDIF.
APPEND ls_reqtype TO lr_reqtype.

IF fp_all EQ 'X'.
LOOP AT gis_reqcov ASSIGNING <ls_reqcov>
WHERE matnr EQ fp_matnr
AND werks EQ fp_werks.

ls_popup = <ls_reqcov>.
PERFORM alpha_conversion USING <ls_reqcov>-delnr_req
'OUT'
CHANGING ls_popup-delnr_req.
IF <ls_reqcov>-del12_cov IS INITIAL.
PERFORM alpha_conversion USING <ls_reqcov>-delnr_cov
'OUT'
CHANGING ls_popup-delnr_cov.
ELSE.
PERFORM alpha_conversion USING <ls_reqcov>-del12_cov
'OUT'
CHANGING ls_popup-del12_cov.
ENDIF.
APPEND ls_popup TO li_popup.
ENDLOOP.

Seite 105 / 120


ABAP/4 Basis Funktionsbausteine

ELSE.
LOOP AT gis_reqcov ASSIGNING <ls_reqcov>
WHERE matnr EQ fp_matnr
AND werks EQ fp_werks
AND delkz_cov EQ 'PA'
AND delnr_cov EQ fp_plnum
AND reqtype IN lr_reqtype.

ls_popup = <ls_reqcov>.
PERFORM alpha_conversion USING <ls_reqcov>-delnr_req
'OUT'
CHANGING ls_popup-delnr_req.
IF <ls_reqcov>-del12_cov IS INITIAL.
PERFORM alpha_conversion USING <ls_reqcov>-delnr_cov
'OUT'
CHANGING ls_popup-delnr_cov.
ELSE.
PERFORM alpha_conversion USING <ls_reqcov>-del12_cov
'OUT'
CHANGING ls_popup-del12_cov.
ENDIF.
APPEND ls_popup TO li_popup.
ENDLOOP.
ENDIF.
CHECK sy-subrc EQ 0.

DESCRIBE TABLE li_popup LINES l_lines.


l_end_line = 10 + l_lines.

CALL FUNCTION 'REUSE_ALV_POPUP_TO_SELECT'


EXPORTING
i_title = 'Requirements for the coverage'(019)
i_selection = ' '
i_allow_no_selection = 'X'
i_zebra = 'X'
i_screen_start_column = 5
i_screen_start_line = 5
i_screen_end_column = 145
i_screen_end_line = l_end_line
i_tabname = 'LI_POPUP'
i_structure_name = 'ZPPS_CO41_REQCOV'
TABLES
t_outtab = li_popup
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. " popup_xx_display

Seite 106 / 120


ABAP/4 Basis Funktionsbausteine

8.35 nderungsbelege lesen


nderungsbelege knnen ber den nachfolgenden Fuba gelesen werden.

Vorteil Kann auch aus dem Archiv lesen.

Parameter
OBJECTCLAS z.B. COND_A fr nderungsbelege Agreements (VBO3)
OBJECTID Nummer des Beleges (z.B. Konditionsnummern (lesen via KONH-
KNUMA_BO) zum Agreement).

FORM READ_CHANGEDOC USING CHANGENUMBER OBJECTID DATE TIME USERID TABLE.


CALL FUNCTION 'CHANGEDOCUMENT_READ'
EXPORTING
* ARCHIVE_HANDLE = 0
CHANGENUMBER = CHANGENUMBER
DATE_OF_CHANGE = DATE
OBJECTCLASS = CHGDOC-CLASS
OBJECTID = OBJECTID
* TABLEKEY = ' '
TABLENAME = TABLE
TIME_OF_CHANGE = TIME
USERNAME = USERID
TABLES
EDITPOS = I_EDITPOS
EXCEPTIONS
NO_POSITION_FOUND = 1
WRONG_ACCESS_TO_ARCHIVE = 2
OTHERS = 3.
ENDFORM.

Seite 107 / 120


ABAP/4 Basis Funktionsbausteine

8.36 IDOC Ausgabe

8.36.1 Ausgang
Mit den folgenden Funktionsbausteinen kann man IDOCs ausgeben.

CALL FUNCTION 'L_IDOC_HEADER_CREATE'


EXPORTING
i_mestyp = dyn_mestyp
i_mescod = p_varia
i_idoctp = 'WMMBID02'
i_rcvprn = dyn_partner.

CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'


EXPORTING
i_segnam = 'E1MBXYH'
i_sdata = edidd-sdata.

MOVE e1mbxyi TO edidd-sdata.


CALL FUNCTION 'L_IDOC_SEGMENT_CREATE'
EXPORTING
i_segnam = 'E1MBXYI'
i_sdata = edidd-sdata.

CALL FUNCTION 'L_IDOC_SEND'


TABLES
t_comm_idoc = comm_idoc_control
EXCEPTIONS
error_distribute_idoc = 01.

8.36.2 Eingang

CALL FUNCTION 'IDOC_WRITE_AND_START_INBOUND'


EXPORTING
i_edidc = edidc_k
* do_commit = 'X'
do_commit = ''
* IMPORTING
* DOCNUM =
* ERROR_BEFORE_CALL_APPLICATION =
TABLES
i_edidd = edid_d
EXCEPTIONS
idoc_not_saved = 1
OTHERS = 2.

IF sy-subrc <> 0.
$akt_fehler = 'X'.
ROLLBACK WORK. "z_lvravi zurcksetzen
ENDIF.

Seite 108 / 120


ABAP/4 Basis Funktionsbausteine

Beispiel

Seite 109 / 120


ABAP/4 Basis Funktionsbausteine

8.37 Excel Datei einlesen

if GV_FILENAME cs 'XLS'.
call function 'ALSM_EXCEL_TO_INTERNAL_TABLE'
exporting
FILENAME = P_ITFILE
I_BEGIN_COL = 1
I_BEGIN_ROW = 1
I_END_COL = 132
I_END_ROW = 9999
tables
INTERN = GT_MATPREISE_EXCEL
exceptions
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 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.
else.
loop at GT_MATPREISE_EXCEL.
case GT_MATPREISE_EXCEL-COL.
when 1.
GT_MATPREISE-MATNR = GT_MATPREISE_EXCEL-VALUE.
when 2.
GT_MATPREISE-WERKS = GT_MATPREISE_EXCEL-VALUE.
when 3.
GT_MATPREISE-PEINH = GT_MATPREISE_EXCEL-VALUE.
when 4.
GT_MATPREISE-PREIS = GT_MATPREISE_EXCEL-VALUE.
when 5.
GT_MATPREISE-BUKRS = GT_MATPREISE_EXCEL-VALUE.
append GT_MATPREISE.
endcase.
endloop.

Seite 110 / 120


ABAP/4 Basis Funktionsbausteine

8.38 Fehlermeldungen im Popup ausgeben

8.38.1 BAL Fubas


ber die BAL-Fubas knnen Fehlermeldungen (z.B. Meldungen aus einer Transaktion) im
Popup ausgegeben werden.

FORM meldung_ausgaben USING p_lt_ret TYPE STANDARD TABLE .

DATA: v_ret TYPE bapiret2.

DATA: gv_msg TYPE c,


g_s_log TYPE bal_s_log,
gv_log_handle TYPE balloghndl,
gv_log_level TYPE bal_s_msg-detlevel,
gv_log_error TYPE c,
l_s_msg TYPE bal_s_msg,
ls_display_profile TYPE bal_s_prof.

INCLUDE sbal_constants.

* (letztes Protokoll aus Memory)


CALL FUNCTION 'BAL_GLB_MEMORY_REFRESH'
* EXPORTING
* I_AUTHORIZATION =
* I_REFRESH_ALL = 'X'
* I_T_LOGS_TO_BE_REFRESHED =
EXCEPTIONS
not_authorized = 1
OTHERS = 2.

* DEFINE SOME HEADER DATA OF THIS LOG


g_s_log-extnumber = 'Meldungen AUS ZMB01N'. "#EC NOTEXT
g_s_log-aluser = sy-uname.
g_s_log-alprog = sy-repid.
* ... see structure BAL_S_LOG for further data ...

Seite 111 / 120


ABAP/4 Basis Funktionsbausteine

* ... which can be added to a log header ...


* create a log
CALL FUNCTION 'BAL_LOG_CREATE'
EXPORTING
i_s_log = g_s_log
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

*** Alle Meldungen anhngen


LOOP AT p_lt_ret INTO v_ret.
CLEAR l_s_msg.

l_s_msg-msgty = v_ret-type.
l_s_msg-msgid = v_ret-id.
l_s_msg-msgno = v_ret-number.
l_s_msg-msgv1 = v_ret-message_v1.
l_s_msg-msgv2 = v_ret-message_v2.
l_s_msg-msgv3 = v_ret-message_v3.
l_s_msg-msgv4 = v_ret-message_v4.

* Meldungen anhngen
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
i_s_msg = l_s_msg
i_log_handle = gv_log_handle
EXCEPTIONS
log_not_found = 0
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

ENDLOOP.

*** Profil besorgen


CALL FUNCTION 'BAL_DSP_PROFILE_POPUP_GET'
IMPORTING
e_s_display_profile = ls_display_profile.

*** Jetzt die Meldungen noch anzeigen


CALL FUNCTION 'BAL_DSP_LOG_DISPLAY'
EXPORTING
i_s_display_profile = ls_display_profile
EXCEPTIONS
OTHERS = 1.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.

Seite 112 / 120


ABAP/4 Basis Funktionsbausteine

ENDFORM. " MELDUNG_AUSGABEN

Seite 113 / 120


ABAP/4 Basis Funktionsbausteine

8.38.2 Show Popup

FUNCTION /SIE/AD_ZAM_MESSAGE_SHOW_POPUP.
*"----------------------------------------------------------------------
*"*"Lokale Schnittstelle:
*" IMPORTING
*" REFERENCE(I_MESSAGE_TAB) TYPE GM_TY_MESG
*" REFERENCE(I_TITLE) TYPE SYST-MSGV1
*"----------------------------------------------------------------------
* Ausgabe der Nachrichten in einem POPUP.
*
* Dies ist eine Kopie des FUBAs C14Z_MESSAGES_SHOW_AS_POPUP.
* Diesem FUBA kann man keinen Titel mitgeben, deshalb
* wurde der FUBA kopiert.
*
*-----------------------------------------------------------------------

perform message_show_popup using i_message_tab


i_title.

ENDFUNCTION.

Seite 114 / 120


ABAP/4 Basis Funktionsbausteine

FORM message_show_popup USING i_message_tab TYPE gm_ty_mesg


i_title TYPE syst-msgv1.
* Local data -------------------------------------------------------
DATA: flg_message_to_display TYPE boolean.
DATA: msgv1 LIKE sy-msgv1,
msgv2 LIKE sy-msgv2,
msgv3 LIKE sy-msgv3,
msgv4 LIKE sy-msgv4,
lineno LIKE mesg-zeile.

FIELD-SYMBOLS:
<ls_message> TYPE mesg.

CHECK i_message_tab IS NOT INITIAL.

* Function body ----------------------------------------------------


CALL FUNCTION 'MESSAGES_INITIALIZE'.

LOOP AT i_message_tab ASSIGNING <ls_message>.


CALL FUNCTION 'MESSAGE_STORE'
EXPORTING
arbgb = <ls_message>-arbgb
msgty = <ls_message>-msgty
msgv1 = <ls_message>-msgv1
msgv2 = <ls_message>-msgv2
msgv3 = <ls_message>-msgv3
msgv4 = <ls_message>-msgv4
txtnr = <ls_message>-txtnr
zeile = <ls_message>-zeile.
ENDLOOP.

CALL FUNCTION 'MESSAGES_STOP'


EXCEPTIONS
a_message = 1
e_message = 2
i_message = 3
w_message = 4.
IF sy-subrc <> 0.
* do nothing, because this is no error
ENDIF.

CALL FUNCTION 'MESSAGES_SHOW'


EXPORTING
object = i_title
EXCEPTIONS
no_messages = 1.
IF sy-subrc <> 0.
* do nothing, because this is no error
ENDIF.

ENDFORM. " MESSAGE_SHOW_POPUP

Seite 115 / 120


ABAP/4 Basis Funktionsbausteine

8.39 RFC Verbidnung testen

DATA:
Lv_ewm_destination type rfcdest.

Lv_ewm_destination = TEST.

CALL FUNCTION 'RFCPING'


DESTINATION lv_ewm_destination
EXCEPTIONS
communication_failure = 3
system_failure = 4.

CHECK sy-subrc = 0.

Seite 116 / 120


ABAP/4 Basis Funktionsbausteine

8.40 Lesen Texte


Die Texte stehen in den Tabellen

STXH Kopfdaten
STXL Textinformationen.

Das Lesen der Texte erfolgt ber den Fuba READ_TEXT.

FORM text_read USING i_id TYPE thead-tdid


i_object TYPE thead-tdobject
i_name TYPE thead-tdobject
CHANGING cht_lines TYPE ty_tline.
CALL FUNCTION 'READ_TEXT'
EXPORTING
id = i_id
language = sy-langu
name = i_name
object = i_object
TABLES
lines = cht_lines
EXCEPTIONS
id = 1
language = 2
name = 3
not_found = 4
object = 5
reference_check = 6
wrong_access_to_archive = 7
OTHERS = 8.
IF sy-subrc <> 0.
CLEAR cht_lines.
ENDIF.

ENDFORM. "text_read

Seite 117 / 120


ABAP/4 Basis Funktionsbausteine

8.41 Nachrichten
Mit den nachfolgenden Fubas knnen Sie Nachrichten aufbereitet in der Struktur BAPIRET2
zurckgeben lassen.

Seite 118 / 120


ABAP/4 Basis Funktionsbausteine

8.42 Web Link


Unter dem nachfolgenden Link findet man weitere Dokumente zu Funktionsbausteinen:

http://www.sap-basis-abap.com/sapabap01.htm

Seite 119 / 120

Potrebbero piacerti anche