Zur Implementierung nehmen wir als erstes zwei Attribute in unserer ABAP-Klasse "customer" auf, nämlich den Betrag und die Währung des Saldos:
data: 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":
method 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:
<!-- 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:
<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:
* 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:
<button type="button" class="toolbarbutton" onclick="S10Apply('to_openitems');"> Offene Posten </button>
* 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.
data: openitems type table of ref to openitem.
methods: build_open_balance importing kunnr type kna1-kunnr exporting open_balance_amount type dmbtr open_balance_currency type waers openitems type table.
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | <!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> |
* display general attributes method to_display. s10nextscreen( 'display'). endmethod.