Zur Implementierung nehmen wir als erstes zwei Attribute in unserer ABAP-Klasse "customer" auf, nämlich den Betrag und die Währung des Saldos:
ABAPdata:
open_balance_amount type dmbtr,
open_balance_currency type waers.
Als nächstes implementieren wir eine ABAP-Methode, welche den Saldo berechnet. Dazu nutzen wir den Standard-Funktionsbaustein "BAPI_AR_ACC_GETOPENITEMS":
ABAPmethod build_open_balance.
clear:
open_balance_amount,
open_balance_currency.
data:
items type table of bapi3007_2.
call function 'BAPI_AR_ACC_GETOPENITEMS'
exporting
customer = kunnr
companycode = '1010'
keydate = sy-datum
tables
lineitems = items.
loop at items assigning field-symbol(<item>)
* add debit/credit
if <item>-db_cr_ind = 'S'.
open_balance_amount = open_balance_amount + <item>-lc_amount.
else.
open_balance_amount = open_balance_amount - <item>-lc_amount.
endif.
* set company currency
open_balance_currency = <item>-loc_currcy.
endloop.
endmethod.
In der HTML-Datei geben wir den Saldo aus:
HTML<!-- Saldo -->
<div class="infoblock">
<label class='label'>Saldo</label>
<br />
<span class='output'
name='open_balance_amount'></span>
<span class='output'
name='open_balance_currency'></span>
</div>
* display customer data
method display.
if not s10databaseread( ).
s10errormessage( 'Bitte eine gültige Kundennummer eingeben' ).
endif.
* Buchhaltungs-Saldo berechnen
build_open_balance( ).
s10nextscreen( 'display').
endmethod.
methods:
build_open_balance
importing
kunnr type kna1-kunnr
exporting
open_balance_amount type dmbtr
open_balance_currency type waers.
Das funktioniert genau wie der "Anzeigen" Button aus Tutorial 1:
HTML<button type="button" class="toolbarbutton"
onclick="S10Apply('start');">
Zurück
</button>
In unserer ABAP-Klasse dann noch die Methode "start", die zum Screen "start" navigiert:
ABAP* start again with customer number input
method start.
s10nextscreen( 'start').
endmethod.
Jetzt können wir innerhalb der Anwendung den Kunden wechseln. Die build-Methode "build_open_balance" wird durch das S10 Framework automatisch zur Anzeige des Saldos neu aufgerufen, falls sich die Kundennummer geändert hat:

Man könnte nun pro Attribut eine eigene build-Methode schreiben. Das ist aber nicht sinnvoll, da sehr oft Attribute gemeinsam ohne grossen Zusatzaufwand besorgt werden können, zum Beispiel durch Aufruf eines BAPI oder mit einem Datenbankzugriff. Deshalb fassen Sie in einer "build"-Methode besser diese Attribute zusammen und geben bei "exporting" alle Attribute an, die gemeinsam berechnet werden.
Auch Tabellen können bei einer "build"-Methode unter "exporting" genannt werden. Als Beispiel geben wir in einem separaten Screen eine Tabelle aller offenen Posten des Kunden aus. Als Resultat wollen wir folgendes erreichen:


Zur generellen Technik der Tabellenausgabe finden Sie alle Details in der Anleitung Tabellen. Für unser Beispiel sieht es wie folgt aus:
In dem "display" Screen fügen wir einen weiteren Button "Offene Posten" hinzu:
HTML<button type="button" class="toolbarbutton"
onclick="S10Apply('to_openitems');">
Offene Posten
</button>
Der Button führt die ABAP-Methode "to_openitems" aus, mit der wir auf den neuen Screen "openitems" verzweigen:* display open items
method to_openitems.
s10nextscreen( 'openitems').
endmethod.
In unserem ABAP Programm definieren wir eine Klasse "openitem", welche die anzuzeigenden Felder der offenen Buchhaltungsposten enthält, also einen Ausschnitt aus der BAPI-Struktur:
class openitem definition inheriting from /s10/any.
public section.
data:
doc_no type bapi3007_2-doc_no, " Document Number
item_num type bapi3007_2-item_num, " Line item
pstng_date type bapi3007_2-pstng_date, " Posting Date
doc_type type bapi3007_2-doc_type, " Document type
lc_amount type dmbtr, " Amount in LC with 2 decimals
pmnttrms type bapi3007_2-pmnttrms, " Payment Terms
loc_currcy type bapi3007_2-loc_currcy. "Currency
endclass.
Sie können sich diese Klasse in Transaktion /s10/util generieren lassen, indem Sie aus der BAPI-Struktur "bapi3007_2" die gewünschten Felder ankreuzen.data:
openitems type table of ref to openitem.
Wir füllen die Tabelle in der Methode "build_open_balance", die jetzt wie folgt deklariert ist:methods:
build_open_balance
importing
kunnr type kna1-kunnr
exporting
open_balance_amount type dmbtr
open_balance_currency type waers
openitems type table.
Das heisst, es ist jetzt ein weiterer exporting-Parameter hinzugekommen, die Tabelle "openitems". Hierbei bitte beachten, dass sie nur mit "type table" deklariert wird.method build_open_balance.
clear:
open_balance_amount,
open_balance_currency,
openitems.
data:
items type table of bapi3007_2.
call function 'BAPI_AR_ACC_GETOPENITEMS'
exporting
customer = kunnr
companycode = '1010'
keydate = sy-datum
tables
lineitems = items.
* sort items
sort items by doc_no item_num.
loop at items assigning field-symbol(<item>).
* correct sign
if <item>-db_cr_ind = 'H'.
<item>-lc_amount = - <item>-lc_amount.
endif.
* add to total amount
open_balance_amount = open_balance_amount + <item>-lc_amount.
* append to open items table
data(oi) = new openitem( ).
oi->s10copy( <item> ).
append oi to openitems.
* set company currency
open_balance_currency = <item>-loc_currcy.
endloop.
endmethod.
Damit ist das ABAP-Programm fertig und es fehlt uns nur noch die HTML-Datei zum Screen "openitems". Wer sich Schreibarbeit sparen möchte, kann hierzu wieder Transaktion /s10/util nutzen, sich eine Listanzeige für die BAPI-Struktur "bapi3007_2" generieren lassen und diese Anzeige dann in die HTML-Datei "openitems" übernehmen.<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type"
content="text/html; charset=utf-8">
<meta name="viewport"
content="width=400">
<link rel='stylesheet' type='text/css'
href='../../../style/s10.style.css'>
<link rel='stylesheet' type='text/css'
href='../../../style/custom.style.css'>
<script
src='../../synactiveS10/synactiveS10.java.js'>
</script>
<title>Kundendaten</title>
</head>
<body style="width: 100%; margin: 0px; padding: 0px;"
onload='init();'
class="colorscheme9">
<div class="headerarea"
style="width: 100%; padding: 10px;">
<b>
Offene Posten
<span class='output'
type="text"
name='name1'>
</span>
</b>
<br />
<br />
<button type="button"
class="toolbarbutton"
onclick="S10Apply('to_display');">
Übersicht
</button>
<button type="button"
class="toolbarbutton"
onclick="S10Logoff();">
Beenden
</button>
</div>
<!-- column headers -->
<div class="colheaders">
<!-- Belegnummer -->
<div class='colhead colheadup output'
style="width: 90px;"
name="doc_no">
</div>
<!-- Position -->
<div class='colhead output'
style="width: 36px;"
name="item_num">
</div>
<!-- Buchungsdatum -->
<div class='colhead output'
style="width: 80px;"
name="pstng_date">
</div>
<!-- Zahlungsbedingung -->
<div class='colhead output'
style="width: 48px;"
name="pmnttrms">
</div>
<!-- Betrag -->
<div class='colhead output totals'
style="width: 200px;
--portrait-width: 90px;
text-align: right;"
name="lc_amount">
</div>
<div class="colhead"
style="width: 20px;
float: right;
margin-right: 4px;"
onclick="S10FilterTable(this);">
<img src="../../../icons/filter.png"
style="width: 18px;
height: 18px;">
</div>
</div>
<!-- list rows -->
<form class='table'
name='openitems'>
<div class="tablerow">
<!-- Belegnummer -->
<div class='outputcelldiv'
style="width: 90px;"
name="doc_no">
</div>
<!-- Position -->
<div class='outputcelldiv'
style="width: 36px;"
name="item_num">
</div>
<!-- Buchungsdatum -->
<div class='outputcelldiv'
style="width: 80px;"
name="pstng_date">
</div>
<!-- Zahlungsbedingung -->
<div class='outputcelldiv'
style="width: 48px;"
name="pmnttrms">
</div>
<!-- Betrag -->
<div class='outputcelldiv'
style="width: 200px;
--portrait-width: 90px;
text-align: right;"
name="lc_amount">
</div>
</div>
</form>
<!-- nothing selected -->
<div class="tablenocontent"
style="display: block;">
Es wurde nichts selektiert
</div>
</body>
</html>
Für die Navigation zurück zur Übersicht haben wir hier den Button "Übersicht" definiert, der wie bei den vorherigen Navigations-Buttons eine kleine ABAP-Methode aufruft:* display general attributes
method to_display.
s10nextscreen( 'display').
endmethod.
Damit ist die Listanzeige der offenen Posten fertig und in unsere Anwendung integriert.