ALV opzetten SUPERP

40
VNSG Magazine – maart 2009 CRM/SRM Programmeren met ALV (de standaard ABAP List Viewer) - Superp Introductie Standaard beschikt SAP over een technisch gereedschap voor het fraai en georganiseerd weergeven van lijst gegevens. Dit is de standaard ABAP List Viewer, kortweg ALV genoemd. In de huidige releases van SAP worden voor vrijwel alle functies waarbij gegevens in een lijst worden gepresenteerd, de ALV techniek gebruikt. Deze zeer uitgebreide tip laat u zien hoe u op eenvoudige wijze uw eigen ALV lijst programma kunt maken. Hiervoor bestaan een aantal technieken, waarvan er twee wat meer worden verduidelijkt. De werking van de ABAP List Viewer De ALV werkt op een eenvoudige wijze op basis van een structuur (uit de SAP data-dictionary of eigen gestructureerd type) en een gestandaardiseerde lay-out, waarbij gegevens uit een dataset worden gepresenteerd in de vorm van rijen en kolommen. De dataset met gegevens is een interne tabel die met behulp van een stukje programma code wordt gevuld. De gegevens worden gepresenteerd in de vorm van een “data-grid”, die lijkt op de presentatie in een spreadsheet programma. Binnen de ALV zijn veel functies al gestandaardiseerd aanwezig, zoals de “sorteer en afdruk” functies. Bij de aanmaak van een programma worden dus altijd drie stappen uitgevoerd om een ALV op het scherm zichtbaar te maken. 1. Opbouwen van een veld catalogus. Deze stap kan worden overgeslagen, indien de veldcatalogus is gebaseerd op een in de data dictionary aanwezige structuur. Die structuur kan dan direct in stap 3 worden opgegeven. Opbouwen van de veldcatalogus kan met bouwsteen LVC_FIELDCATALOG_MERGE. 2. Selectie van gegevens. Hierbij dient een interne tabel te zijn gedefinieerd waarin de geselecteerde gegevens worden opgeslagen. De structuur van deze interne tabel moet precies gelijk zijn aan de structuur waarmee de veld catalogus wordt opgebouwd. Natuurlijk kunt u de gegevens nog bewerken en filteren voordat deze worden gebruikt. 3. Presenteren gegevens in ALV. In deze stap worden de gegevens van de interne tabel op het scherm gepresenteerd. Hierbij wordt de veldcatalogus aangeboden aan de bouwsteen of wordt de data dictionary structuur opgegeven. Dit kan met behulp van de bouwsteen REUSE_ALV_GRID_DISPLAY_LVC. De klassieke ALV techniek De meest eenvoudige oplossing om bijvoorbeeld de inhoud van een database view zichtbaar te maken is de (eventuele) aanroep van de functiebouwsteen LVC_FIELDCATALOG_MERGE met de naam van de structuur en daarna de eigenlijke ALV zichtbaar maken met behulp van de functiebouwsteen REUSE_ALV_GRID_DISPLAY_LVC. De eerste bouwsteen bouwt de veld catalogus gescheiden op en de tweede bouwsteen gebruikt de veld catalogus plus een interne tabel met de gegevens (structuur dient gelijk te zijn aan de veld catalogus structuur) om de ALV voor u te presenteren. Zoals al eerder aangegeven is het mogelijk om met de standaard SAP bouwsteen REUSE_ALV_GRID_DISPLAY_LVC direct de veldcatalogus intern te genereren, waardoor alleen de selectie nodig is en de presentatie. Dit kan alleen met bestaande data dictionary structuren (waaronder ook tabellen en database views). Eenvoudig voorbeeld met de database view SFLVIEW Pagina 1 van 40

Transcript of ALV opzetten SUPERP

Page 1: ALV opzetten SUPERP

VNSG Magazine – maart 2009

CRM/SRM Programmeren met ALV (de standaard ABAP List Viewer) - Superp

Introductie Standaard beschikt SAP over een technisch gereedschap voor het fraai en georganiseerd weergeven van lijst gegevens. Dit is de standaard ABAP List Viewer, kortweg ALV genoemd.

In de huidige releases van SAP worden voor vrijwel alle functies waarbij gegevens in een lijst worden gepresenteerd, de ALV techniek gebruikt. Deze zeer uitgebreide tip laat u zien hoe u op eenvoudige wijze uw eigen ALV lijst programma kunt maken. Hiervoor bestaan een aantal technieken, waarvan er twee wat meer worden verduidelijkt.

De werking van de ABAP List Viewer De ALV werkt op een eenvoudige wijze op basis van een structuur (uit de SAP data-dictionary of eigen gestructureerd type) en een gestandaardiseerde lay-out, waarbij gegevens uit een dataset worden gepresenteerd in de vorm van rijen en kolommen. De dataset met gegevens is een interne tabel die met behulp van een stukje programma code wordt gevuld.

De gegevens worden gepresenteerd in de vorm van een “data-grid”, die lijkt op de presentatie in een spreadsheet programma. Binnen de ALV zijn veel functies al gestandaardiseerd aanwezig, zoals de “sorteer en afdruk” functies.

Bij de aanmaak van een programma worden dus altijd drie stappen uitgevoerd om een ALV op het scherm zichtbaar te maken.

1. Opbouwen van een veld catalogus. Deze stap kan worden overgeslagen, indien de veldcatalogus is gebaseerd op een in de data dictionary aanwezige structuur. Die structuur kan dan direct in stap 3 worden opgegeven. Opbouwen van de veldcatalogus kan met bouwsteen LVC_FIELDCATALOG_MERGE.

2. Selectie van gegevens. Hierbij dient een interne tabel te zijn gedefinieerd waarin de geselecteerde gegevens worden opgeslagen. De structuur van deze interne tabel moet precies gelijk zijn aan de structuur waarmee de veld catalogus wordt opgebouwd. Natuurlijk kunt u de gegevens nog bewerken en filteren voordat deze worden gebruikt.

3. Presenteren gegevens in ALV. In deze stap worden de gegevens van de interne tabel op het scherm gepresenteerd. Hierbij wordt de veldcatalogus aangeboden aan de bouwsteen of wordt de data dictionary structuur opgegeven. Dit kan met behulp van de bouwsteen REUSE_ALV_GRID_DISPLAY_LVC.

De klassieke ALV techniek De meest eenvoudige oplossing om bijvoorbeeld de inhoud van een database view zichtbaar te maken is de (eventuele) aanroep van de functiebouwsteen LVC_FIELDCATALOG_MERGE met de naam van de structuur en daarna de eigenlijke ALV zichtbaar maken met behulp van de functiebouwsteen REUSE_ALV_GRID_DISPLAY_LVC. De eerste bouwsteen bouwt de veld catalogus gescheiden op en de tweede bouwsteen gebruikt de veld catalogus plus een interne tabel met de gegevens (structuur dient gelijk te zijn aan de veld catalogus structuur) om de ALV voor u te presenteren.

Zoals al eerder aangegeven is het mogelijk om met de standaard SAP bouwsteen REUSE_ALV_GRID_DISPLAY_LVC direct de veldcatalogus intern te genereren, waardoor alleen de selectie nodig is en de presentatie. Dit kan alleen met bestaande data dictionary structuren (waaronder ook tabellen en database views).

Eenvoudig voorbeeld met de database view SFLVIEW

Pagina 1 van 40

Page 2: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& Report  ZDEMO_ALV_CLASSIC                                           * *&         Demonstratie ALV voor VNSG Tips & Tricks                    * *&         Eenvoudig voorbeeld                                         * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* REPORT  zdemo_alv_classic . * Eigen definitie van view naam en de bijbehorende interne tabel DATA:   dd_name  TYPE tabname  VALUE 'SFLVIEW',   tb_data  TYPE STANDARD TABLE OF sflview.  * ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ START‐OF‐SELECTION . * Stap 1: Opbouwen van de veld catalogus (zie stap 3) * Stap 2: Selecteren van gegevens   SELECT *     FROM (dd_name)     INTO TABLE tb_data    ORDER BY PRIMARY KEY.   IF sy‐subrc NE 0.     MESSAGE e398(00)         WITH 'Fout:’ sy‐subrc ‘met database object' dd_name.   ENDIF.  * ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ END‐OF‐SELECTION . * Controle van de gegevens   DESCRIBE TABLE tb_data.   IF sy‐tfill EQ 0.     MESSAGE s398(00)         WITH 'Melding:’ ‘Database object' dd_name 'is leeg’.   ENDIF.  * Stap 3: Presentatie van de gegevens   CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'     EXPORTING       i_structure_name = dd_name                 “ Dit vervangt stap 1     TABLES       t_outtab         = tb_data     EXCEPTIONS       OTHERS           = 2.   IF sy‐subrc NE 0.     MESSAGE ID     sy‐msgid             TYPE   sy‐msgty             NUMBER sy‐msgno             WITH   sy‐msgv1 sy‐msgv2 sy‐msgv3 sy‐msgv4.   ENDIF. 

In het bovenstaande voorbeeld is stap 1 niet nodig, omdat de data dictionary van SAP de database view SFLVIEW bevat. Daarom kan deze direct worden meegegeven als structuur naam bij bouwsteen REUSE_ALV_GRID_DISPLAY_LVC.

Het voorbeeld is te gebruiken voor ieder database object, waarbij men gegevens in een interne tabel kan plaatsen, zoals tabellen en database views. Ook dictionary structuren en tabeltypen zijn te gebruiken, maar daarvoor dient u wel zelf de gegevens voor samen te stellen. In feite lijkt het veel op de standaard SAP data browser (transactie SE16) voor wat betreft het presenteren van gegevens in rijen en kolommen. De ABAP Objects techniek Voor de SAP Enjoy systemen en voor de SAP Netweaver systemen heeft SAP een standaard object gemaakt, waarmee men zelf een ALV kan opbouwen. Dit standaard SAP object heet CL_GUI_ALV_GRID. Gegevens in een ALV weergeven kan op een zeer eenvoudige wijze. SAP demonstreert dit met behulp van het standaard demonstratie programma BCALV_GRID_DEMO.

Pagina 2 van 40

Page 3: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Wat opvalt aan dat demonstratie programma is het feit, dat er een scherm (“DynPro” met scherm ID 100) is aangemaakt en dat de ALV op dit scherm wordt gepresenteerd.

Ook voor deze ALV techniek bestaan standaard stappen om gegevens in een ALV weer te geven. Echter hierbij komt een extra stap.

1. Opbouwen van een veld catalogus. Deze stap kan worden overgeslagen, indien de veldcatalogus is gebaseerd op een in de data dictionary aanwezige structuur. Die structuur kan dan direct in stap 4 worden opgegeven. Opbouwen van de veldcatalogus kan met bouwsteen LVC_FIELDCATALOG_MERGE.

2. Selectie van gegevens. Hierbij dient een interne tabel te zijn gedefinieerd waarin de geselecteerde gegevens worden opgeslagen. De structuur van deze interne tabel moet precies gelijk zijn aan de structuur waarmee de veld catalogus wordt opgebouwd. Natuurlijk kunt u de gegevens nog bewerken en filteren voordat deze worden gebruikt.

3. Opbouw van het “data-grid” object. In deze stap wordt een “data-grid” object opgebouwd met behulp van het standaard SAP object CL_GUI_ALV_GRID. Dit object dient altijd aan een container te worden gekoppeld en de container wordt aan een scherm gekoppeld (of aan een container op het scherm).

4. Presenteren gegevens in ALV. In deze stap worden de gegevens van de interne tabel op het scherm gepresenteerd. Hierbij wordt de veldcatalogus aangeboden aan de bouwsteen of wordt de data dictionary structuur opgegeven. Dit gaat bij de eerste keer genereren van de ALV met behulp van de standaard methode SET_TABLE_FOR_FIRST_DISPLAY van object CL_GUI_ALV_GRID.

Toch willen we meer controle hebben over de ALV. Om die reden zal deze tip & trick u stapsgewijs meenemen bij de bouw van een ALV programma, waarbij we telkens iets toevoegen aan het programma om onze doelstelling te bereiken; Een bestuurbare ALV.

Stap 1: Aanleggen van een hoofd programma

Met transactie SE38 leggen we programma ZDEMO_ALV aan.

We zetten het programma dusdanig op, dat het eenvoudig is om aanpassingen aan te brengen. Het programma wordt daarom modulair met een paar include bestanden opgezet.

Dit leidt tot de volgende programma code.

Pagina 3 van 40

Page 4: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& Report  ZDEMO_ALV                                                   * *&         Demonstratie ALV voor VNSG Tips & Tricks                    * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& Programma container voor een demonstratie van ALV in ABAP OO        * *& Hierbij worden de volgende standaard SAP objecten gebruikt:         * *& ‐ Objectklasse     CL_GUI_ALV_GRID                                  * *& ‐ Objectklasse     CL_GUI_DOCKING_CONTAINER                         * *& ‐ Objectklasse     CL_GUI_CFW                                       * *& ‐ Type pool        ICON                                             * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* REPORT  zdemo_alv.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ INCLUDE: *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   zdemo_alv_top,   zdemo_alv_class,   zdemo_alv_screen,   zdemo_alv_sub.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ * ALV Demonstratie: Programma container (logica) *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ INITIALIZATION.                                        " Initiëel event *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   PERFORM init.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ START‐OF‐SELECTION.                      " Aanroep van programma logica *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   PERFORM sos.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ * Einde van programma ZDEMO_ALV *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐

Sla dit programma op maar activeer het programma nog niet. Aangezien we nog een aantal zaken moeten regelen, waaronder onze eigen ALV structuur en de subroutines (methoden), die nu al zijn aangegeven in de broncode van het programma ZDEMO_ALV.

De opgegeven include bestanden in het programma zijn bedoeld voor de volgende typen broncode:

- ZDEMO_ALV_TOP Deze include bevat alle gebruikte globale definities van het programma.

- ZDEMO_ALV_CLASS Deze include bevat onze eigen gedefinieerde object klasse.

- ZDEMO_ALV_SCREEN Deze include bevat alle scherm modules.

- ZDEMO_ALV_SUB Deze include bevat alle (FORM) subroutines

Stap 2: Aanleggen van onze eigen structuur en gerelateerde objecten Wij willen in de ALV een paar knoppen opnemen, die we voorzien van onze eigen code. De code moet worden uitgevoerd, zodra op een knop wordt gedrukt. Elke knop heeft zijn eigen functie.

Als uitgangspunt kiezen we de database view SFLVIEW waarbij we een paar velden niet meenemen, een tweetal knoppen toevoegen en twee extra velden (CITYFROM en CITYTO) toevoegen. Hiermee is duidelijk, dat we een eigen structuur moeten hebben. Omdat we in ons programma intern gegevens moeten opslaan in een interne tabel en omdat die tabel in de ALV gebruikt gaat worden, kiezen we er voor om van de nieuwe structuur een tabeltype te maken.

Pagina 4 van 40

Page 5: ALV opzetten SUPERP

VNSG Magazine – maart 2009

We leggen de structuur ZDEMO_ALV_STRUCTUUR aan:

Hierin wordt gebruik gemaakt van onze eigen definitie voor een knop. De reden dat we dit doen ligt in het feit, dat wij de knop willen voorzien van zowel een icoontje evenals van een “quick info” tekst (tooltip die zichtbaar wordt als de muis over het icoontje gaat). Hiervoor definiëren we een gegevenselement (zie kolom Type component) met de naam ZDEMO_ALV_BUTTON. Dit gegevenselement heeft een domein met dezelfde naam (type CHAR lengte 24):

Belangrijk hier is dat het domein van ZDEMO_ALV_BUTTON kleine letters toestaat. In de aangelegde structuur ZDEMO_ALV_STRUCTUUR kwam u ook het “gestructureerde” veld HANDLE_STYLE tegen met als component type LVC_T_STYL. Dat is zelf een standaard SAP tabeltype. Met behulp hiervan zijn we in staat om voor elke regel en voor elke cel in die regel een aparte stijl op te geven. De gekozen naam HANDLE_STYLE is vrij te kiezen, maar wordt wel in de programmatuur gebruikt om de ALV grid generator aan te sturen. Tot slot moeten we in deze stap nog ons eigen tabeltype aanleggen:

In de programmatuur worden de gegevens van de ALV ondergebracht in een interne tabel van het type ZDEMO_ALV_TABELTYPE en kunnen dus per regel worden uitgelezen met de structuur ZDEMO_ALV_STRUCTUUR, die hier als regeltype is opgegeven. Verderop in stap 4 zullen we deze aangelegde typen gaan vastleggen in de programma definities (in include ZDEMO_ALV_TOP).

Stap 3: Het aanleggen van een scherm en gerelateerde objecten

Pagina 5 van 40

Page 6: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Omdat we een ALV niet zomaar willekeurig kunnen oproepen, moeten we deze ergens aan kunnen koppelen. Daarvoor is in eerste instantie een scherm nodig. Dit kan niet een selectie scherm zijn (die worden namelijk dynamisch gegenereerd) en ook niet het rapportscherm (dat verschijnt pas nadat de verwerking gereed is).

Daarom creëren we een nieuw scherm via transactie SE80 in het programma ZDEMO_ALV. Het scherm krijgt in ons demonstratie programma nummer 9000 als scherm id.

Op dit scherm hoeft u geen componenten te plaatsen. Het is voldoende om het scherm aan te leggen, de naam voor de OK code op te geven (tabblad Elementen lijst) en de verwerkingslogica te vullen.

Wij gaan via het programma de componenten dynamisch aanleggen.

Wij geven tevens de naam voor het OK code veld veld op in de elementenlijst (de gekozen naam is OK_CODE):

De naam OK_CODE dient ook als variabele te worden gedefinieerd.

Vervolgens moet de verwerkingslogica worden opgegeven. Hierbij is van belang, dat voor een scherm meerdere zaken meedoen.

Het scherm heeft een titel nodig, dus leggen we een GUI-Titel aan met titelcode 9000:

Pagina 6 van 40

Page 7: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Het scherm heeft tevens acties nodig in de vorm van knoppen en/of menu onderdelen. Omdat we de zaak niet nodeloos ingewikkeld willen maken, wordt maar één extra functie gemaakt naast de standaard “exit” functies, namelijk een knop om de gehele ALV te verversen. Hiervoor leggen we een GUI-Status met de ID 9000 aan.

De knop “Verversen” wordt als aparte knop aangelegd in de GUI-Status.

De knop details zijn:

In de GUI-Status 9000 worden ook de standaard knoppen voor Terug, Beëindigen en Afbreken voorzien van hun standaard waarden, respectievelijk BACK, %EX en %RW:

Tot slot in deze stap dient u bij deze 3 standaard knoppen aan te geven, dat het knoppen zijn van type Exit-commando (dubbelklikken om de dialoog daarvoor te openen):

Nu kunnen we de scherm logica (modules) voor ons scherm 9000 aangeven:

Hiermee zijn de scherm onderdelen allemaal vastgelegd.

Stap 4: De definities voor ons demonstratie programma De definities worden in de include ZDEMO_ALV_TOP vastgelegd en zijn globaal door alle onderdelen van het programma te gebruiken.

Pagina 7 van 40

Page 8: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include           ZDEMO_ALV_TOP                                    * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  TOP include voor programma ZDEMO_ALV                               * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ TYPE‐POOLS:                                             " Standaard SAP *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   icon.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ DATA:                                        " Referentie naar objecten *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   container     TYPE REF TO            cl_gui_docking_container,   grid          TYPE REF TO            cl_gui_alv_grid.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ DATA:                                          " Scherm 9000 definities *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   ok_code       TYPE                   syucomm.  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ DATA:                                                " Eigen definities *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   git_data      TYPE STANDARD TABLE OF sflview,   git_alv_data  TYPE                   zdemo_alv_tabeltype,   gwa_data      TYPE                   sflview,   gwa_alv_data  TYPE                   zdemo_alv_structuur. 

Omdat we icoontjes gaan gebruiken op onze knoppen maken we gebruik van de standaard type pool van SAP voor icoontjes: ICON. Zoals al eerder aangegeven, heeft een grid van de klasse CL_GUI_ALV_GRID een container nodig om de ALV aan te koppelen. Om die reden moeten we een eigen container definiëren. Wij kiezen ervoor om direct een koppelbare container te gebruiken van het standaard type CL_GUI_DOCKING_CONTAINER. We moeten onze eigen ALV grid vastleggen met als type referentie de standaard SAP klasse CL_GUI_ALV_GRID. De variabele OK_CODE is nodig voor het gedefinieerde scherm 9000. Om de gegevens te kunnen selecteren en vast te kunnen houden, definiëren we een interne tabel en een werkgebied voor de database view SFLVIEW. Tot slot in deze stap definiëren we een interne tabel voor gebruik met de ALV en een werkgebied om de tabel te kunnen lezen en/of schrijven. Alle in deze include opgegeven definities zijn globaal. Dat wil zeggen, dat alle subroutines deze definities kunnen gebruiken en dat de waarden die ze bevatten bewaard blijven tijdens alle operaties.

Stap 5: De subroutines van het hoofdprogramma ZDEMO_ALV De twee (FORM) subroutines van het hoofdprogramma worden aangemaakt in de include ZDEMO_ALV_SUB (zie ook pagina 4). Als eerste subroutine wordt een initialisatie routine gemaakt, die ook wordt gebruikt bij het verversen van de gehele ALV (en ook bij het “rapport-event” INITIALIZATION).

Pagina 8 van 40

Page 9: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&      Form  INIT                                                     * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *       Uitvoering bij INITIALIZATION event en bij verversen           * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* FORM init . * We maken simpelweg alles schoon en bevrijden de objecten   CLEAR:     ok_code,     gwa_data,     gwa_alv_data.    REFRESH:     git_data,     git_alv_data.    FREE:     application,     container,     grid.  ENDFORM.                    " INIT

Om duidelijk te maken, dat we hier initialiseren, roepen we deze routine ook aan in het “rapport-event” INITIALIZATION in het hoofdprogramma ZDEMO_ALV. Later zal deze routine worden aangeroepen bij de invulling van de logica voor de knop “Verversen” (op pagina 12), die wij in de GUI-Status hebben aangelegd (zie pagina 7). Omdat we in feite geen klassiek rapport maken, bestaat in het hoofdprogramma geen “rapport-event” END-OF-SELECTION. Wij moeten in ons programma alleen nog het scherm 9000 aanroepen, die daarna de gehele verwerking overneemt. Dit doen we door een kleine (FORM) subroutine, die in het “rapport-event” START-OF-SELECTION wordt aangeroepen.

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&      Form  SOS                                                      * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *       Uitvoering na het START‐OF‐SELECTION event                     * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* FORM sos . * We hebben een eigen scherm 9000 aangemaakt en daarin vindt alle * verwerking plaats.   CALL SCREEN '9000'.  ENDFORM.                    " SOS

Stap 6: De PBO en PAI modules van het scherm 9000

Alle PBO en PAI modules van scherm 9000 worden aangemaakt in de include ZDEMO_ALV_SCREEN. Het scherm 9000 heeft een PBO module voor het zetten van de GUI-Titel en de GUI-Status, een PBO module voor de dynamische opbouw van ons eigen scherm, een PAI module voor het verwerken van de EXIT opdrachten en tot slot een module voor de verwerking van onze enige knop “Verversen”. Scherm 9000 verwerkingslogica (zie pagina 8):

Pagina 9 van 40

Page 10: ALV opzetten SUPERP

VNSG Magazine – maart 2009

* PBO ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ PROCESS BEFORE OUTPUT.   MODULE status_9000.   MODULE scherm_9000_opbouw. * * PAI ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ PROCESS AFTER INPUT.   MODULE exit_command_9000 AT EXIT‐COMMAND.   MODULE user_command_9000. 

De PBO module voor het zetten van de titel en de GUI-Status:

Voor de feitelijke opbouw van ons eigen ALV scherm moeten we een paar stappen doorlopen.

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&      Module  STATUS_9000  OUTPUT                                    * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *       Zetten van de Status (knoppen en menu) en de Titel             * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* MODULE status_9000 OUTPUT. T

  SETT:     PF‐STATUS '9000',                                      “ GUI‐Status     TITLEBAR '9000'.                                       “ GUI‐Titel   CLEAR:     ok_code.  ENDMODULE.                 " STATUS_9000  OUTPUTT

1. Selecteren van gegevens uit de database 2. Verwerken van de geselecteerde gegevens tot ALV presentatie gegevens 3. Opbouwen van de ALV met de presentatie gegevens

Dus in de PBO module voor de schermopbouw laten we deze stappen zien door de aanroep van drie methoden. In Stap 9 komen we terug op de logica in deze methoden.

De PBO module voor de dynamische opbouw van ons eigen scherm:

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&      Module  SCHERM_9000_OPBOUW  OUTPUT                             * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *       Het dynamisch opbouwen van het ALV scherm                      * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* MODULE scherm_9000_opbouw OUTPUT. * Omdat we methoden van ons eigen object nodig hebben, moeten we * nagaan of ons applicatie object al aanwezig is en anders aanleggen   IF application IS INITIAL.     CREATE OBJECT application.   ENDIF.  * We hebben gegevens nodig om in de ALV te laten zien en bouwen * daarmee onze eigen ALV grid op   CALL METHOD:     application‐>ververs_gegevens,     application‐>verwerk_gegevens,     application‐>opbouwen_scherm_9000.  ENDMODULE.                 " SCHERM 9000 OPBOUW  OUTPUT

Zoals zichtbaar in bovenstaande broncode van module SCHERM_9000_OPBOUW wordt een Object met de naam APPLICATION aangelegd (indien nog niet beschikbaar). Dit applicatie object moet in ons programma worden gedefinieerd en geïmplementeerd.

De verwerking in de PBO module gebruikt dan methoden van onze eigen object klasse APPLICATION. De opbouw van dit object wordt in de stappen 7 en 8 verder ingevuld.

Pagina 10 van 40

Page 11: ALV opzetten SUPERP

VNSG Magazine – maart 2009

De methoden volgen de drie genoemde stappen en nadat deze zijn doorlopen hebben we de globale gegevens uit de database view SFLVIEW opgehaald, de gegevens omgezet naar de ALV data structuur (zoals we die willen hebben) en is de ALV zelf opgebouwd.

Hierna is het scherm met de ALV zichtbaar. Echter wij zijn nog niet gereed met de definities en broncode voor dit demonstratie programma.

Nadat een gebruiker een actie uitvoert op het scherm, wordt de scherm verwerking via de PAI modules doorlopen.

De scherm verwerking is in twee delen te splitsen. - De EXIT opdrachten - De GUI-Status opdrachten (tot nu toe alleen “Verversen”)

Voor de EXIT opdrachten Terug, Beëindigen en Afbreken wordt de PAI module uitgevoerd bij alleen EXIT opdrachten ([MODULE exit_command_9000 AT EXIT‐COMMAND.]).

De PAI module voor het verwerken van de EXIT opdrachten:

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&      Module  EXIT_COMMAND_9000  INPUT                               * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *       Verwerken van Exit opdrachten                                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* MODULE exit_command_9000 INPUT.   CASE ok_code.     WHEN 'BACK'.                           “ Terug ‐ naar vorige scherm       SET T SCREEN 0.      WHEN '%EX'.                            “ Beëindigen ‐ programma       LEAVE PROGRAM.      WHEN '%RW'.                            “ Afbreken ‐ programma       LEAVE PROGRAM.    ENDCASE.  ENDMODULE.                 " EXIT_COMMAND_9000  INPUTT

Voor de overige opdrachten en in ons geval is dat alleen de “Verversen” knop wordt de module USER_COMMAND_9000 uitgevoerd.

De PAI module voor de verwerking van onze enige knop “Verversen”:

Pagina 11 van 40

Page 12: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&      Module  USER_COMMAND_9000  INPUT                               * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *       Verwerken van Exit opdrachten                                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* MODULE user_command_9000 INPUT. * Oproepen standaard scherm event handlers   CALL METHOD cl_gui_cfw=>dispatch.  * Onze eigen GUI‐Status verwerkingen   CASE ok_code.     WHEN 'REFR'.                                  “ De knop “Verversen” *     De gegevens worden ververst door deze opnieuw op te halen *     en aan te bieden aan de ALV waarbij het verversen gebeurd *     doordat we het scherm opnieuw laden       PERFORM init.       LEAVE TO SCREEN '9000'.      WHEN OTHERS. *     Wij laten de verwerking hier uitsterven       CLEAR:         ok_code.    ENDCASE.  ENDMODULE.                 " USER_COMMAND_9000  INPUTT

Aan het begin van de PAI module USER_COMMAND_9000 roepen we de methode DISPATCH op van het standaard SAP Object CL_GUI_CFW. Dit heeft een bijzondere reden. Zodra de ALV is opgebouwd, koppelt SAP deze via de container aan het “front-end” scherm en daarmee worden dus ook de “scherm-events” gekoppeld. Deze events hebben vrijwel allemaal een standaard handler en door deze dispatch methode aan te roepen, worden eventuele events door een standaard handler verwerkt. Dit bespaart een grote berg aan code.

Stap 7: Onze eigen object klasse (basis opzet) In een ABAP OO programma wordt onze eigen object klasse gedefinieerd en geïmplementeerd. We hebben zowel publieke methoden als private methoden nodig. De publieke methoden zijn voor twee doelen. Enerzijds voor het implementeren van eigen event handlers en anderzijds voor methoden die worden gebruikt met een directe aanroep vanuit PBO dan wel PAI modules. De private methoden worden geïmplementeerd voor logica verwerking binnen de methoden in onze eigen object klasse. Wij noemen onze eigen klasse LCL_APPLICATION en definiëren als objectnaam APPLICATION hiervoor. Omdat we nu al weten, dat we 3 methoden nodig hebben (opgeroepen vanuit de scherm 9000 PBO module SCHERM_9000_OPBOUW) kunnen we deze alvast definiëren. We bouwen onze eigen object klasse op in de include ZDEMO_ALV_CLASS. Basis definitie (en lege methode implementatie) van onze object klasse:

Pagina 12 van 40

Page 13: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Zoals zichtbaar, is de logica voor de methoden in onze eigen object klasse nog niet weergegeven. Dit zal in stap 9 verder worden ingevuld.

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include           ZDEMO_ALV_CLASS                                  * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include met lokale klasse type LCL_APPLICATION                     * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& CLASS lcl_application DEFINITION                                    * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *  Applicatie klasse definiëert de publieke methoden                   * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* CLASS lcl_application DEFINITION.   PUBLIC SECTION.     METHODS:       ververs_gegevens,       verwerk_gegevens,       opbouwen_scherm_9000.  ENDCLASS.                    "LCL_APPLICATION DEFINITION  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ DATA: *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   application TYPE REF TO lcl_application.  *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& CLASS lcl_application IMPLEMENTATION                                * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *  Applicatie klasse implementeert de methoden                         * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* CLASS lcl_application IMPLEMENTATION. *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD ververs_gegevens.   ENDMETHOD.                    "ververs_gegevens*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD verwerk_gegevens.   ENDMETHOD.                    "verwerkers_gegevens*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD opbouwen_scherm_9000.   ENDMETHOD.                    "opbouwen_scherm_9000  ENDCLASS                     " LCL APPLICATION IMPLEMENTATION

Stap 8: Onze eigen event handlers

Nu we een eigen object klasse hebben gemaakt, hebben we ook de mogelijkheid om onze eigen event handlers te implementeren. In de ALV komen knoppen voor, waarop kan worden gedrukt en die dan een door ons gewenste actie moeten uitvoeren, dus een eigen event. Ook zijn er andere events mogelijk (zoals dubbelklikken op een regel van de ALV een event genereert). Om deze reden dienen we het standaard SAP object CL_GUI_ALV_GRID te onderzoeken (via transactie SE24). Op het tabblad “Events” staan de events waar we een eigen handler voor zouden kunnen implementeren. Het event BUTTON_CLICK wordt geïnitieerd zodra er op een knop in de ALV wordt gedrukt. Het event DOUBLE_CLICK wordt geïnitieerd zodra er op een lijn in de ALV een dubbelklik met de muis plaatsvindt. De genoemde events gaan wij gebruiken in ons programma. Klik (1x) in het tabblad “Events” op het event BUTTON_CLICK, om deze te selecteren en klik daarna op de knop om de parameters van dit event te bekijken. Deze informatie is nodig om de event handler in onze eigen object klasse te kunnen definiëren.

Pagina 13 van 40

Page 14: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Bekijk op dezelfde wijze de parameters van event DOUBLE_CLICK. Optionele parameters kunnen worden weggelaten (als ze niet worden gebruikt). Hiermee kunnen we de definitie voor onze event handlers aanleggen.

Uitbreiding definitie sectie van onze object klasse met event handler definities:

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include           ZDEMO_ALV_CLASS                                  * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include met lokale klasse type LCL_APPLICATION                     * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& CLASS lcl_application DEFINITION                                    * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *  Applicatie klasse definieert de event handlers en onze eigen        * *  publieke methoden                                                   *  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* CLASS lcl_application DEFINITION.   PUBLIC SECTION.     METHODS:       handle_buttonclick FOR EVENT button_click                                 OF cl_gui_alv_grid                          IMPORTING es_col_id                                    es_row_no,               "#EC NEEDED        handle_doubleclick FOR EVENT double_click                                 OF cl_gui_alv_grid                          IMPORTING e_row                                    e_column,                "#EC NEEDED       ververs_gegevens,       verwerk_gegevens,       opbouwen_scherm_9000.  ENDCLASS.                    "LCL_APPLICATION DEFINITION 

Uitbreiding implementatie sectie van onze object klasse met event handler methoden:

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& CLASS lcl_application IMPLEMENTATION                                * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *  Applicatie klasse implementeert de methoden                         * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* CLASS lcl_application IMPLEMENTATION. *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD handle_buttonclick.   ENDMETHOD.                    "handle_buttonclick*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD handle_doubleclick.   ENDMETHOD.                    "handle_doubleclick*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD ververs_gegevens.   ENDMETHOD.                    "ververs_gegevens*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD verwerk_gegevens.   ENDMETHOD.                    "verwerkers_gegevens*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  METHOD opbouwen_scherm_9000.   ENDMETHOD.                    "opbouwen_scherm_9000  ENDCLASS.                    " LCL_APPLICATION IMPLEMENTATION

De verwerkingslogica voor deze methoden wordt verder in stap 9 behandeld. Belangrijk: Op dit ogenblik is alles opgegeven om het programma ZDEMO_ALV voor de

eerste keer te compileren en activeren. Doe dit dan ook nu en verbeter eventuele fouten in lijn met de stappen in deze tip & trick.

Pagina 14 van 40

Page 15: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Bedenk wel, dat op dit moment er nog geen echte ABAP logica is opgenomen in het programma. Het activeren is dus alleen om na te gaan of tot nu toe alles in orde is qua code en aangemaakte componenten.

Stap 9: De invulling van publieke methoden van onze object klasse. Zoals al eerder aangegeven in stap 7, bestaat de scherm opbouw uit drie onderdelen:

1. Selecteren van gegevens 2. Verwerken van de geselecteerde gegevens 3. Opbouwen van de ALV

Voor ieder onderdeel hebben we een aparte (publieke) methode aangegeven in ons eigen APPLICATION object. Deze methoden worden in PBO module SCHERM_9000_OPBOUW opgeroepen. Wij moeten nu dus de implementatie van deze methoden verder invullen met verwerkingslogica. Ook voor de in stap 8 gedefinieerde event handlers moeten we de implementatie van die methoden ook uitbreiden met verwerkingslogica. Omdat we de verwerking van de event handlers nodig hebben in de publieke methoden, gaan we eerst de event handlers voorzien van ABAP logica. Een klik op een knop in de ALV zal het event BUTTON_CLICK van het standaard SAP object CL_GUI_ALV_GRID aansturen. Bij de opbouw van het scherm (verderop in deze stap) wordt de standaard event handler vervangen door die van ons zelf. Dat neemt niet weg, dat we dan nog een klein probleem hebben. Namelijk er zijn twee knoppen en er is maar één event. Hier komen de parameters van het event van pas. Het BUTTON_CLICK event heeft twee parameters:

- ES_COL_ID (Kolom ID structuur) - ES_ROW_NO (Numerieke Rij ID structuur)

Met behulp van de structuur ES_ROW_ID (en daarin het veld ROW_ID) kunnen we de interne tabel (gebruikt bij de opbouw van de ALV: GIT_ALV_DATA) lezen en een specifieke regel in een apart werkgebied (GWA_ALV_DATA) te plaatsen. Met behulp van de structuur ES_COL_ID (en daarin het veld FIELDNAME) kunnen we nagaan, welke knop precies is ingedrukt (‘BUTTON_INFO’ of ‘BUTTON_CHECK’). Implementatie invulling van publieke methode HANDLE_BUTTONCLICK:

Pagina 15 van 40

Page 16: ALV opzetten SUPERP

VNSG Magazine – maart 2009

* ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   METHOD handle_buttonclick. *   Haal event details op     READ TABLE git_alv_data INTO gwa_alv_data INDEX es_row_no‐row_id.  *   Verwerken     IF sy‐subrc EQ 0.       CASE es_col_id.         WHEN 'BUTTON_INFO'. *         Geef informatie over deze vlucht weer           CALL METHOD me‐>vlucht_informatie             EXPORTING               i_alv_data = gwa_alv_data.          WHEN 'BUTTON_CHECK'. *         Geef het aantal plaatsen vrij weer van deze vlucht           CALL METHOD me‐>vrije_plaatsen             EXPORTING               i_alv_data = gwa_alv_data.          WHEN OTHERS. *         Doe niets           CLEAR:             gwa_alv_data.        ENDCASE.     ELSE. *     Doe niets       CLEAR:         sy‐subrc.     ENDIF.    ENDMETHOD.                    " handle buttonclick

Er worden twee nieuwe methoden geïntroduceerd:

- Methode VLUCHT_INFORMATIE - Methode VRIJE_PLAATSEN

Dit worden nieuwe private methode in ons object (intern in ons eigen object mogen we ons APPLICATION object refereren door gebruik te maken van me-> in plaats van application->), omdat ze nergens anders gebruikt worden als alleen binnen ons eigen object. Zie verder in stap 10. Implementatie invulling van publieke methode HANDLE_DOUBLECLICK:

Pagina 16 van 40

Page 17: ALV opzetten SUPERP

VNSG Magazine – maart 2009

* ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   METHOD handle_doubleclick. *   Haal event details op     READ TABLE git_alv_data INTO gwa_alv_data INDEX e_row‐index.  *   Verwerken     IF sy‐subrc EQ 0. *     Indien interessant kunnen we het veld identificeren en daarop *     een specifieke verwerking plaatsen. Momenteel is er geen  *     extra verwerking hier toegevoegd alleen een dummy actie       CASE e_column‐fieldname.         WHEN 'CARRNAME'           OR 'CARRID'           OR 'CONNID'           OR 'FLDATE'           OR 'DEPTIME'           OR 'ARRTIME'           OR 'CITYFROM'           OR 'CITYTO'           OR 'PRICE'           OR 'CURRENCY'. *         Hier wordt tijdelijk een dummy activiteit uitgevoerd           MESSAGE i398(00)              WITH 'Dubbelklik op veld'                   e_column‐fieldname                   'geconstateerd'                   space.         WHEN OTHERS. *         Doe niets           CLEAR:             gwa_alv_data.       ENDCASE.     ELSE. *     Doe niets       CLEAR:         sy‐subrc.     ENDIF.    ENDMETHOD.                    " handle doubleclick

Het is een demonstratie programma, dus we geven alleen een informatie melding weer met de naam van het veld waarop de dubbelklik werd uitgevoerd. Natuurlijk kunt u andere logica overwegen. Hiermee zijn de publieke methoden voor onze eigen event handlers qua logica ingevuld. We gaan verder met de logica voor de drie publieke methoden, die vanuit de PAI module scherm_9000_opbouw van scherm 9000 worden aangeroepen. Voor de selectie van gegevens uit de database was methode VERVERS_GEGEVENS voorzien. Hierbij is van belang dat we de interne tabel NIET direct overschrijven met een nieuwe selectie, maar dat we het overschrijven pas doen, nadat onze selectie (en zo u wilt eventuele filtering) gereed is en wel degelijk gegevens bevat. Ook willen we dat in onze uiteindelijke ALV de gegevens gesorteerd beschikbaar komen. Implementatie invulling van publieke methode VERVERS_GEGEVENS:

Pagina 17 van 40

Page 18: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee worden de gegevens geselecteerd en in interne tabel GIT_DATA * * geplaatst.                                                           * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD ververs_gegevens. *   We gebruiken lokale definitie om de globale pas te overschrijven *   zodra het ophalen van de gegevens correct is verlopen     DATA:       lit_data TYPE STANDARD TABLE OF sflview.  *   Selecteren via databaseview over tabellen SCARR, SPFLI en SFLIGHT     SELECT *       FROM sflview       INTO TABLE lit_data      WHERE fldate GE sy‐datum.     IF sy‐subrc NE 0. *     Geen gegevens gevonden dus we doen verder niets       CLEAR:         sy‐subrc.     ELSE. *     Controleer of de interne tabel is gevuld       DESCRIBE TABLE lit_data.       IF sy‐tfill GT 0. *       We hebben de gegevens dus kunnen we nu deze gegevens globaal *       maken door ze in de globale structuur te plaatsen         REFRESH:           git_data. *       We brengen tevens onze standaard sortering aan         SORT lit_data T BY fldate carrid connid deptime arrtime.         git_data = lit_data.       ENDIF.     ENDIF.    ENDMETHOD.                    "ververs_gegevens

Na verwerking van deze methode is de globale interne tabel GIT_DATA gevuld met de door ons gewenste informatie. Natuurlijk is het mogelijk om in deze methode extra filtering aan te brengen. Bijvoorbeeld alle vluchten met een vluchtdatum, die al voorbij is, zou je kunnen verwijderen. Wij laten ze echter staan om de dynamische toekenning van knop definities zichtbaar te maken. Het is ook van belang om te weten, dat we werken met twee interne tabellen:

- GIT_DATA waarin de echte geselecteerde gegevens uit de database view SFLVIEW worden opgeslagen. Deze wordt in methode VERVERS_GEGEVENS gevuld.

- GIT_ALV_DATA waarin de gegevens zoals deze zichtbaar worden in de ALV worden opgeslagen. Deze zal in methode VERWERK_GEGEVENS worden gevuld. Naast reguliere velden bevat deze tabel natuurlijk ook de knoppen definitie (die per regel kan verschillen).

Nu we de gegevens hebben, wordt het tijd om deze te verwerken tot voor de ALV grid geschikte gegevens. Daarbij willen we wel invloed uitoefenen op de knoppen. Voor de overige cellen wordt geen lay-out meegegeven (hoewel dat wel zou kunnen). Dit is omdat we op globaal niveau bij de generatie van de ALV enige lay-out zaken zullen regelen. Het verwerken van de gegevens is vrij uitgebreid en zal in delen worden verduidelijkt. In ons ontwerp zijn er twee knoppen in de ALV voorzien.

- BUTTON_INFO De knop is bedoeld om wat extra gegevens zichtbaar te maken voor de vlucht (specifiek voor de regel). Als een vlucht al is vertrokken, wordt geen informatie verschaft en is de knop uitgeschakeld.

- BUTTON_CHECK

Pagina 18 van 40

Page 19: ALV opzetten SUPERP

VNSG Magazine – maart 2009

De knop is bedoeld om te controleren of er nog plaatsen vrij zijn op de vlucht (specifiek voor de regel in de ALV). Als er geen plaatsen beschikbaar zijn, is deze controle niet meer nodig en is de knop uitgeschakeld.

Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 1):

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee worden de geselecteerde gegevens van interne tabel GIT_DATA  * * omgezet naar de voor de ALV geschikte interne tabel GIT_ALV_DATA     * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD verwerk_gegevens. *   We gebruiken lokale definitie om de globale pas te overschrijven *   zodra het verwerken van de gegevens correct is verlopen     DATA:       lit_alv_data        TYPE zdemo_alv_tabeltype,       lit_styles          TYPE lvc_t_styl,       loc_field           TYPE lvc_s_styl,       loc_button          TYPE lvc_s_styl. *   Voor functionele zaken hebben we ook wat definities nodig     DATA:       loc_seatsfree       TYPE int4,       loc_active_button   TYPE lvc_style,       loc_inactive_button TYPE lvc_style.  *   Voorbereiden van de standaard stijl van de knoppen     IF grid IS INITIAL.       CLEAR:         loc_field.       loc_active_button   = cl_gui_alv_grid=>mc_style_button +                             cl_gui_alv_grid=>mc_style_f4_no +                             cl_gui_alv_grid=>mc_style4_link_no +                             cl_gui_alv_grid=>mc_style_hotspot.       loc_inactive_button = cl_gui_alv_grid=>mc_style_disabled +                             cl_gui_alv_grid=>mc_style_f4_no +                             cl_gui_alv_grid=>mc_style4_link_no +                             cl_gui_alv_grid=>mc_style_hotspot_no.     ELSE.       loc_active_button   = grid‐>mc_style_button +                             grid‐>mc_style_f4_no +                             grid‐>mc_style4_link_no +                             grid‐>mc_style_hotspot.       loc_inactive_button = grid‐>mc_style_disabled +                             grid‐>mc_style_f4_no +                             grid‐>mc_style4_link_no +                             grid‐>mc_style_hotspot_no.     ENDIF.  

" Vervolg in deel 2

Zodra we object gegevens nodig hebben van ons GRID object (referentie van de object klasse CL_GUI_ALV_GRID) moeten we testen of ons GRID object al is aangelegd. Indien aangelegd, kunnen we de waarden van ons eigen object gebruiken. Indien nog niet aangelegd, gebruiken we de statische klasse component selector (=>) om waarden van het object CL_GUI_ALV_GRID te selecteren. Voor onze velden gebruiken we geen eigen stijl, wat betekent, dat we de standaard van SAP zullen volgen en mogelijk de globale stijl, die we bij de aanleg van de ALV opgeven. Voor de knoppen maken we wel een stijl aan. Omdat we hiervoor wel een stijl aanleggen, dienen de overige velden eveneens te worden genoemd (dat is efficiënter in de verwerking). De eerste stap in methode VERWERK_GEGEVENS is dan ook het bepalen van de standaard stijl waarden voor de knoppen in actieve dan wel in inactieve staat. De waarden onthouden we in lokale variabelen. Alle waarden voor één enkele stijl worden telkens bij elkaar opgeteld.

Pagina 19 van 40

Page 20: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Stijlwaarde Betekenis grid->mc_style_button Het ALV veld wordt als knop weergegeven grid->mc_style_disabled Het ALV veld is inactief grid->mc_style_f4_no Het ALV veld staat géén F4 (zoekhulp) toe 1

grid->mc_style_hotspot Het ALV veld is een klikbare “hotspot” 2

grid->mc_style_hotspot_no Het ALV veld is géén klikbare “hotspot” 1

grid->mc_style4_link_no Het ALV veld bevat géén (internet/document) link 1

1 Deze waarde overschrijft een globale setting 2 Hierbij wordt de veld inhoud niet meer onderstreept als een “link” veld

Bij het samenstellen van de gegevens voor de ALV wordt een onderscheid gemaakt tussen de feitelijke veldwaarden en de stijl gegevens. Voor de stijl gegevens is in de structuur een aparte interne tabel toegevoegd (naam is HANDLE_STYLE en type is LVC_T_STYL). Aangezien we per regel de knoppen kunnen variëren (knop beschikbaar of niet beschikbaar) zullen we ook per regel de stijl voor die regel moeten opgeven. Om die reden wordt in de methode VERWERK_GEGEVENS een lus doorlopen over de interne tabel GIT_DATA, die de geselecteerde gegevens bevat.

Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 2):

" Vervolg van deel 1  *   Verwerken van de gevonden gegevens     LOOP AT git_data INTO gwa_data. *     Schoonmaken werkgebied, velden en stijl structuur       CLEAR:         gwa_alv_data,         loc_field,         loc_button,         loc_seatsfree.       REFRESH:         lit_styles.  *     We zetten eerst de selectie gegevens om, die in de ALV komen       MOVE‐CORRESPONDING gwa_data TO gwa_alv_data.  

" Vervolg in deel 3 

Als eerste stap in de lus worden het werkgebied, de variabelen en lokale interne tabel voor de veld stijlen leeg gemaakt. De tweede stap in de lus is het overzetten van de waarden uit de velden van het werkgebied GWA_DATA (van de interne tabel GIT_DATA) naar het werkgebied GWA_ALV_DATA. Allen de velden met een identieke naam worden qua gegevens aan elkaar gelijk gemaakt. Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 3):

" Vervolg van deel 2  *     Additionele gegevens       SELECT T SINGLE cityfrom cityto         FROM spfli         INTO (gwa_alv_data‐cityfrom, gwa_alv_data‐cityto)        WHERE carrid EQ gwa_data‐carrid          AND connid EQ gwa_data‐connid.       IF sy‐subrc NE 0. *       Indien niet gevonden gebruiken we de luchthaven als stad         CLEAR:           sy‐subrc.         gwa_alv_data‐cityfrom = gwa_data‐airpfrom.         gwa_alv_data‐cityto   = gwa_data‐airpto.       ENDIF. 

" Vervolg in deel 4 

Pagina 20 van 40

Page 21: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Wij selecteren de stad van vertrek en de stad van aankomst om deze in het werkgebied voor de ALV op te slaan. Als we de steden niet kunnen vinden, vallen we terug op de luchthavens. Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 4):

" Vervolg van deel 3  *     Nu bepalen we de stijl van de individuele velden (kolomsgewijs) *     en bepalen we hoe we de twee knoppen laten zien. De informatie *     knop BUTTON_INFO is zichtbaar als de vlucht nog niet is vertrokken. *     De check knop is alleen actief als er nog plaatsen op de  *     betreffende vlucht beschikbaar zijn of waren.       loc_seatsfree = gwa_data‐seatsmax ‐ gwa_data‐seatsocc.  *     De velden (kolommen vóór de knoppen) krijgen geen enkele stijl       loc_field‐fieldname = 'CARRNAME'.       INSERT loc_field T INTO TABLE lit_styles.       loc_field‐fieldname = 'CARRID'.       INSERTT loc_field INTO TABLE lit_styles.       loc_field‐fieldname = 'CONNID'.       INSERT loc_field T INTO TABLE lit_styles.       loc_field‐fieldname = 'FLDATE'.       INSERTT loc_field INTO TABLE lit_styles.       loc_field‐fieldname = 'CITYFROM'.       INSERT loc_field T INTO TABLE lit_styles.       loc_field‐fieldname = 'CITYTO'.       INSERTT loc_field INTO TABLE lit_styles. 

" Vervolg in deel 5 

Wij berekenen het aantal plaatsen, dat nog beschikbaar is op een specifieke vlucht. Ook geven we de velden op voor de standaard stijl van die velden. Door alleen de naam op te geven, wordt de standaard stijl voor die velden ingeschakeld. Voor de knoppen, die na deze eerste velden volgen in de ALV, geldt dat we de stijl dynamisch moeten bepalen. Ter herinnering zijn de regels als volgt:

- De informatieknop (BUTTON_INFO) is alleen actief als een vlucht niet is vertrokken. - De controleknop (BUTTON_CHECK) is alleen actief als er nog plaatsen beschikbaar zijn

op de betreffende vlucht. Indien een vlucht al is vertrokken, dan worden vrije plaatsen weergegeven als Niet verkochte plaatsen.

Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 5):

Pagina 21 van 40

Page 22: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 4  *     De knoppen krijgen wel een specifieke stijl *     De informatie knop wordt uitgeschakeld als de vluchtdatum *     en de vlucht vertrektijd vóór vandaag en nu ligt       IF gwa_data‐fldate LT sy‐datum. *       Vlucht heeft al plaatsgevonden         gwa_alv_data‐button_info = icon_dummy.         CALL METHOD me‐>add_quickinfo           EXPORTING             i_infotext = 'Vlucht is voorbij'           CHANGING             c_button   = gwa_alv_data‐button_info.         loc_button‐fieldname = 'BUTTON_INFO'.         loc_button‐style     = loc_inactive_button.       ELSEIF gwa_data‐fldate EQ sy‐datum. *       Vlucht is vandaag         IF gwa_data‐deptime LT sy‐uzeit. *         Vlucht is vertrrokken           gwa_alv_data‐button_info = icon_dummy.           CALL METHOD me‐>add_quickinfo             EXPORTING               i_infotext = 'Vlucht vertrokken'             CHANGING               c_button   = gwa_alv_data‐button_info.           loc_button‐fieldname = 'BUTTON_INFO'.           loc_button‐style     = loc_inactive_button.         ELSE. *         Vlucht nog niet vertrokken           gwa_alv_data‐button_info = icon_information.           CALL METHOD me‐>add_quickinfo             EXPORTING               i_infotext = 'Details vandaag'             CHANGING               c_button   = gwa_alv_data‐button_info.           loc_button‐fieldname = 'BUTTON_INFO'.           loc_button‐style     = loc_active_button.         ENDIF.       ELSE. *       Vlucht is ná vandaag of vandaag ná nu         gwa_alv_data‐button_info = icon_information.         CALL METHOD me‐>add_quickinfo           EXPORTING             i_infotext = 'Vlucht informatie'           CHANGING             c_button   = gwa_alv_data‐button_info.         loc_button‐fieldname = 'BUTTON_INFO'.         loc_button‐style     = loc_active_button.       ENDIF.       INSERT loc_button T INTO TABLE lit_styles. 

" l i d l Hierin is nu de logica voor de stijl van knop BUTTON_INFO weergegeven. Dus NIET de logica van de knop als deze wordt ingedrukt. Dat zit in de event handler HANDLER_BUTTONCLICK. De knop zelf bevat een icoontje (uit de standaard SAP type bibliotheek ICON). Tevens ziet u de extra methode ADD_QUICKINFO in deze logica opgenomen. Deze methode voegt een quick info toe aan hetzelfde veld, dat het icoontje bevat. Dit is een private methode, waarvan de logica in stap 10 verder wordt toegelicht. Vervolgens is de knop BUTTON_CHECK aan de beurt in de lus. Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 6):

Pagina 22 van 40

Page 23: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 5  *     De controle knop en deze wordt uitgeschakeld indien er *     géén vrije stoelen meer beschikbaar zijn       IF loc_seatsfree GT 0. *       Er zijn plaatsen vrij op deze vlucht         gwa_alv_data‐button_check = icon_checked.         CALL METHOD me‐>add_quickinfo           EXPORTING             i_infotext = 'Check bezetting'           CHANGING             c_button   = gwa_alv_data‐button_check.         loc_button‐fieldname = 'BUTTON_CHECK'.         loc_button‐style     = loc_active_button.       ELSE. *       Er zijn geen plaatsen vrij op deze vlucht         gwa_alv_data‐button_check = icon_dummy.         CALL METHOD me‐>add_quickinfo           EXPORTING             i_infotext = 'Geen plaatsen vrij'           CHANGING             c_button   = gwa_alv_data‐button_check.         loc_button‐fieldname = 'BUTTON_CHECK'.         loc_button‐style     = loc_inactive_button.       ENDIF.       INSERT loc_button T INTO TABLE lit_styles. 

" Vervolg in deel 7 

Ook hier is de private methode ADD_QUICKINFO aan te roepen. Er komen nog twee velden na de knoppen in de ALV. En tot slot in de lus moeten de stijl gegevens (lokale interne tabel LIT_STYLES) worden toegevoegd aan het werkgebied GWA_ALV_DATA en deze moet aan de interne tabel LIT_ALV_DATA worden doorgegeven. Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 7):

" Vervolg van deel 6  *     De velden (kolommen ná de knoppen) krijgen geen enkele stijl       loc_field‐fieldname = 'PRICE'.       INSERT loc_field T INTO TABLE lit_styles.       loc_field‐fieldname = 'CURRENCY'.       INSERTT loc_field INTO TABLE lit_styles.        INSERT T LINES OF lit_styles INTO TABLE gwa_alv_data‐handle_style.       APPEND gwa_alv_data TO lit_alv_data.      ENDLOOP. 

" Vervolg in deel 8 

Hier wordt de lus (geopend in deel 2, pagina 20) gesloten. Elke regel van GIT_DATA wordt daarmee omgezet naar een regel in de lokale interne tabel LIT_ALV_DATA en daarbij is voor elke regel de specifieke stijl voor de velden en knoppen aangegeven. De laatste stap in de methode VERWERK_GEGEVENS is het omzetten van de lokale interne tabel LIT_ALV_DATA naar de globale interne tabel GIT_ALV_DATA, maar alleen indien er regels in aanwezig zijn. Anders wordt GIT_ALV_DATA niet overschreven. Implementatie invulling van publieke methode VERWERK_GEGEVENS (deel 8):

Pagina 23 van 40

Page 24: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 7  *   Checks     DESCRIBE TABLE lit_alv_data.     IF sy‐tfill GT 0.       git_alv_data = lit_alv_data.     ENDIF.  *   Housekeeping     REFRESH:       lit_alv_data.    ENDMETHOD.                    "verwerk_gegevens  

" Einde methode VERWERK GEGEVENS 

Nadat de methode VERWERK_GEGEVENS is doorlopen, hebben we de beschikking over de gegevens, die we aan de ALV kunnen aanbieden. We willen echter de controle over de ALV zelf niet verliezen en dienen dus een aantal zaken te regelen, voordat de feitelijke ALV kan worden opgeroepen. Dit doen we in de volgende methode OPBOUWEN_SCHERM_9000, die als laatste methode in de module SCHERM_9000_OPBOUW van scherm 9000 wordt aangeroepen. Zoals al eerder in deze tip & trick aangegeven, dient de ALV te worden gekoppeld met het scherm zelf en dat kan via een container object. Wij kiezen voor het object type CL_GUI_DOCKING_CONTAINER omdat deze direct aan het scherm is te koppelen en waarbij een beperkt aantal parameters voldoende zijn. De ALV zelf is van het type object CL_GUI_ALV_GRID. De genoemde objecten moeten worden aangelegd. Vervolgens willen we een specifieke standaard lay-out gebruiken (bijvoorbeeld de regels als ZEBRA, afwisselend lichter en donkerder, weergeven). We willen dat een aantal standaard functies van de ALV niet beschikbaar komen. Standaard staan namelijk alle functies ingeschakeld en die zijn niet altijd nodig. Natuurlijk moeten we nu wel onze eigen veld catalogus opbouwen, waarbij we per kolom een aantal gegevens kunnen leveren en de lay-out kunnen besturen (bijvoorbeeld voor onze eigen kolomnaam). We willen dat we een eigen “sortering en groepering” kunnen aanbrengen en daarmee gegevens automatisch groeperen. Tot slot moeten we onze eigen event handlers koppelen aan de ALV. Als al deze stappen zijn uitgevoerd, is de ALV gereed om op het scherm te worden geplaatst. Dit gebeurt natuurlijk eenmalig, omdat daarna de controle qua events door de ALV zelf wordt overgenomen en natuurlijk door onze eigen gekoppelde event handlers en de enige GUI-Status knop “Verversen”. Implementatie invulling van publieke methode OPBOUWEN_SCHERM_9000 (deel 1):

Pagina 24 van 40

Page 25: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee worden de gegevens van ZDEMO_ALV_TABELTYPE in de ALV         * * geplaatst en worden extra handelingen verricht om de knoppen in te   * * richten en de stijl van de ALV op te geven.                          * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD opbouwen_scherm_9000. *   Lokaal     DATA:       lit_exclude  TYPE ui_functions,       " ALV functie uitsluitingen       lit_fieldcat TYPE lvc_t_fcat,         " De veld catalogus       lit_sort     TYPE lvc_t_sort,         " Onze sortering/groepering       lwa_layout   TYPE lvc_s_layo,         " Onze lay‐out       lwa_variant  TYPE disvariant.         " Lege variant  *   Omdat we geen eigen container op scherm 9000 hebben geplaatst, *   en een ALV alleen binnen een container kan werken, moeten we een *   eigen container aanmaken     IF container IS INITIAL.       CREATE OBJECT container         EXPORTING           repid     = sy‐cprog                         " Programmanaam           dynnr     = '9000'                           " Ons eigen scherm           side      = 1                                " Dock Control links           extension = 3500                             " Screen width         EXCEPTIONS           OTHERS    = 6.       CHECK:         sy‐subrc EQ 0.     ENDIF.  *   De ALV wordt als grid object in de container geplaatst en daarom moet *   deze grid worden aangelegd     IF grid IS INITIAL.       CREATE OBJECT grid         EXPORTING           i_parent = container         EXCEPTIONS           OTHERS   = 5.       CHECK:         sy‐subrc EQ 0.     ENDIF.  

" Vervolg in deel 2  De lokale data definities zijn bedoeld voor het vastleggen van de gewenste informatie voor de opbouw en besturing informatie van de ALV Grid. Als eerste wordt de container zelf aangelegd (indien deze nog niet bestaat). En als tweede stap wordt het grid object voor onze ALV aangelegd. Hierbij zijn de objecten en daarmee hun methoden en gegevens benaderbaar, maar staat de ALV nog niet op het scherm. In het volgende deel van de methode OPBOUWEN_SCHERM_9000 gaan we onze lay-out en besturing informatie verzamelen, zodat we deze kunnen gebruiken bij het zichtbaar maken van de ALV zelf. Implementatie invulling van publieke methode OPBOUWEN_SCHERM_9000 (deel 2):

Pagina 25 van 40

Page 26: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 1  *   Voordat de ALV wordt gevuld willen invloed uitoefenen op de layout     CALL METHOD me‐>initial_layout       CHANGING         cw_layout = lwa_layout.  *   Er zijn ALV functies (knoppen) die we niet willen hebben     CALL METHOD me‐>exclude_functions       CHANGING         ct_exclude = lit_exclude.  *   Iedere ALV gebruikt een veld catalogus voor de opbouw van de *   kolommen en dus dient die catalogus te worden opgebouwd     CALL METHOD me‐>field_catalog       CHANGING         ct_fieldcat = lit_fieldcat.  *   We willen een specifieke sortering     CALL METHOD me‐>set_alv_sort       CHANGING         ct_sort = lit_sort.  *   Omdat we eigen knoppen hebben gedefinieerd in de structuur en *   daarmee ook voor de ALV, moeten we ervoor zorgen, dat als er op *   een van de knoppen wordt gedrukt er ook een gebeurtenis wordt *   gezien en verder wordt verwerkt. Ook een dubbele klik op een *   regel wordt als gebeurtenis gevangen. Om die reden worden onze *   eigen "handlers" ingeschakeld hiervoor.     SET HANDLER me‐>handle_buttonclick                 me‐>handle_doubleclick FOR grid.  *   Na al deze voorbereidingen kunnen we nu eindelijk de ALV zichtbaar *   maken met de gegevens erin.     CALL METHOD grid‐>set_table_for_first_display       EXPORTING         is_variant           = lwa_variant     " Lege variant         i_save               = 'U'             " Opslaan variant mogelijk         is_layout            = lwa_layout      " Onze eigen lay‐out         it_toolbar_excluding = lit_exclude     " Onze functie uitsluiting       CHANGING         it_outtab            = git_alv_data    " Onze ALV gegevens         it_fieldcatalog      = lit_fieldcat    " De veld catalogus         it_sort              = lit_sort        " Onze sorteringen       EXCEPTIONS         OTHERS               = 0.              " Geen fout afhandeling    ENDMETHOD.                    "opbouwen_scherm_9000 

Zoals zichtbaar voeren we voor ieder onderdeel een methode uit. Dit zijn dan ook nieuwe private methoden, die in ons object worden opgenomen. In stap 10 wordt de invulling van deze methoden doorgenomen. Het koppelen van onze eigen event handlers aan de standaard events van de ALV is toegevoegd. Tot slot wordt de ALV zichtbaar gemaakt met alle verzamelde instellingen en de gegevens (van interne tabel GIT_ALV_DATA).

Stap 10: De invulling van private methoden van onze object klasse. In stap 9 zijn op diverse plaatsen private methoden aangeroepen, die we nog moeten definiëren in ons eigen LCL_APPLICATION object type. Uitbreiding definitie sectie van onze object klasse met private methoden definities:

Pagina 26 van 40

Page 27: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include           ZDEMO_ALV_CLASS                                  * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *&  Include met lokale klasse type LCL_APPLICATION                     * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*  *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& CLASS lcl_application DEFINITION                                    * *&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *  Applicatie klasse definieert de event handlers en onze eigen        * *  publieke methoden                                                   *  *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* CLASS lcl_application DEFINITION.   PUBLIC SECTION.     METHODS:       handle_buttonclick FOR EVENT button_click                                 OF cl_gui_alv_grid                          IMPORTING es_col_id                                    es_row_no,               "#EC NEEDED        handle_doubleclick FOR EVENT double_click                                 OF cl_gui_alv_grid                          IMPORTING e_row                                    e_column,                "#EC NEEDED       ververs_gegevens,       verwerk_gegevens,       opbouwen_scherm_9000.   PRIVATE SECTION.     METHODS:       vlucht_informatie IMPORTING                           i_alv_data        TYPE zdemo_alv_structuur,       vrije_plaatsen    IMPORTING                           i_alv_data        TYPE zdemo_alv_structuur,       add_quickinfo     IMPORTING                           value(i_infotext) TYPE string                         CHANGING                           c_button          TYPE zdemo_alv_button,       initial_layout    CHANGING                           cw_layout         TYPE lvc_s_layo,       exclude_functions CHANGING                           ct_exclude        TYPE ui_functions,       field_catalog     CHANGING                           ct_fieldcat       TYPE lvc_t_fcat,       set_alv_sort      CHANGING                           ct_sort           TYPE lvc_t_sort.  ENDCLASS                     "LCL APPLICATION DEFINITION 

Met deze uitbreiding is de volledige definitie van ons eigen object gereed. De 7 private methoden hebben allemaal een eigen interface, waarin de specifieke gegevens worden ontvangen en/of worden gewijzigd. Natuurlijk kunt u de interface naar eigen inzicht aanpassen, maar voor dit demonstratie programma heeft dat weinig toegevoegde waarde. Uitbreiding implementatie sectie van onze object klasse met private methoden:

Pagina 27 van 40

Page 28: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*&‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *& CLASS lcl_application IMPLEMENTATION                                * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* *  Applicatie klasse implementeert de event verwerking                 * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* CLASS lcl_application IMPLEMENTATION. * ‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐   . . . *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Weergeven van detail vlucht informatie                               * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * ‐‐>I_ALV_DATA  Geselecteerde vlucht                                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD vlucht_informatie.   ENDMETHOD.                    "vlucht_informatie *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Geef het aantal vrije plaatsen weer van de vlucht                    * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * ‐‐>I_ALV_DATA  Geselecteerde vlucht                                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD vrije_plaatsen.   ENDMETHOD.                    "vrije_plaatsen *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Voorzie de Icon van een knop van een quick info tip                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * ‐‐>I_INFOTEXT   De quickinfo (tooltip) tekst                         * * <‐‐C_BUTTON     Knop met icon voor plaatsen quickinfo                * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD add_quickinfo.   ENDMETHOD.                    "add_quickinfo *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee wordt de initiële layout van de ALV gezet                    * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐CW_LAYOUT  Layout structuur                                       * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD initial_layout.   ENDMETHOD.                    "initial_layout *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee worden bepaalde functies van de ALV onderdrukt               * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐CT_EXCLUDE  ALV uitgesloten functie tabel                         * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD exclude_functions.   ENDMETHOD.                    "exclude_functions *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee wordt de veld catalogus opgebouwd                            * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐CT_FIELDCAT  Veld catalogus                                       * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD field_catalog.   ENDMETHOD.                    "field_catalog *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee wordt de sortering van de ALV gezet                          * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐Ct_SORT   Sorteer structuur                                       * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD set_alv_sort.   ENDMETHOD.                    "set_alv_sort  ENDCLASS                     " LCL APPLICATION IMPLEMENTATION

De aangegeven private methoden zijn nog leeg. Deze worden nu een voor een behandeld en dus voorzien van een verwerkingsinhoud. De broncode inhoud van de private methoden VLUCHT_INFORMATIE en VRIJE_PLAATSEN is een functionele invulling en kunt u natuurlijk aan de eigen smaak aanpassen. Wij gebruiken de standaard functiebouwsteen CCMS_POPUP_INFOTEXT in beide methoden om een klein scherm met extra gegevens weer te geven. Dit is natuurlijk fraaier te maken, maar voor demonstratie doeleinden werkt het goed.

Pagina 28 van 40

Page 29: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Bekijk de broncode (er wordt verder geen toelichting op gegeven).

Implementatie invulling van private methode VLUCHT_INFORMATIE (deel 1):

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Weergeven van detail vlucht informatie                               * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * ‐‐>I_ALV_DATA  Geselecteerde vlucht                                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD vlucht_informatie. *   Lokaal     DATA:       loc_d(10) TYPE c,       loc_t(8)  TYPE c,       loc_lines TYPE STANDARD TABLE OF popuptext,       loc_line  TYPE popuptext.  *   Lezen gegevens     READ TABLE git_data WITH KEY carrid = i_alv_data‐carrid                                  connid = i_alv_data‐connid                                  fldate = i_alv_data‐fldate                             INTO gwa_data.     CHECK:       sy‐subrc EQ 0.     REFRESH:       loc_lines.  *   Opbouwen informatie regels     CLEAR:       loc_line.     loc_line‐hell    = 'X'.     loc_line‐text+00 = 'Vlucht'.     loc_line‐text+10 = gwa_data‐carrid.     loc_line‐text+13 = gwa_data‐connid.     CONDENSE loc_line‐text+10 NO‐GAPS.     APPEND loc_line TO loc_lines.      CLEAR:       loc_line.     loc_line‐text = '‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐'.     APPEND loc_line TO loc_lines.  

" Vervolg in deel 2 

Implementatie invulling van private methode VLUCHT_INFORMATIE (deel 2):

Pagina 29 van 40

Page 30: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 1      WRITE:       gwa_data‐fldate  DD/MM/YYYY TO loc_d,       gwa_data‐deptime USING EDIT MASK '__:__:__' TO loc_t.     CLEAR:       loc_line.     loc_line‐text+00 = 'Vertrek'.     loc_line‐text+10 = loc_d.     loc_line‐text+21 = loc_t.     APPEND loc_line TO loc_lines.      IF gwa_data‐arrtime LT gwa_data‐deptime.       gwa_data‐fldate = gwa_data‐fldate + 1.     ENDIF.     WRITE:       gwa_data‐fldate  DD/MM/YYYY TO loc_d,       gwa_data‐arrtime USING EDIT MASK '__:__:__' TO loc_t.     CLEAR:       loc_line.     loc_line‐text+00 = 'Aankomst'.     loc_line‐text+10 = loc_d.     loc_line‐text+21 = loc_t.     APPEND loc_line TO loc_lines.      CLEAR:       loc_line.     loc_line‐text = '‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐'.     APPEND loc_line TO loc_lines.  *   Popup     CALL FUNCTION 'CCMS_POPUP_INFOTEXT'       EXPORTING         titel        = 'Vlucht informatie'         start_column = 7         start_row    = 7         end_column   = 37         end_row      = 11         infoflags    = 'CR'       TABLES         lines        = loc_lines.    ENDMETHOD.                    "vlucht_informatie  

" Einde van methode VLUCHT INFORMATIE 

Implementatie invulling van private methode VRIJE_PLAATSEN (deel 1):

Pagina 30 van 40

Page 31: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Geef het aantal vrije plaatsen weer van de vlucht                    * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * ‐‐>I_ALV_DATA  Geselecteerde vlucht                                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD vrije_plaatsen. *   Lokaal     DATA:       lwa_sflight   TYPE sflight,       loc_seat_i    TYPE i,       loc_seat(11)  TYPE c,       loc_title(20) TYPE c,       loc_lines     TYPE STANDARD TABLE OF popuptext,       loc_line      TYPE popuptext.  *   Vlucht al vertrokken     IF ( ( i_alv_data‐fldate  LT sy‐datum )     OR   ( i_alv_data‐fldate  EQ sy‐datum     AND    i_alv_data‐deptime LT sy‐uzeit ) ).       loc_title = 'Onverkochte stoelen:'.     ELSE.       loc_title = 'Beschikbare stoelen:'.     ENDIF.  *   Lezen gegevens     SELECT SINGLE *       FROM sflight       INTO lwa_sflight      WHERE carrid EQ i_alv_data‐carrid        AND connid EQ i_alv_data‐connid        AND fldate EQ i_alv_data‐fldate.     CHECK:       sy‐subrc EQ 0.     REFRESH:       loc_lines.  *   Opbouwen vrije stoelen regels     CLEAR:       loc_line.     loc_line‐hell    = 'X'.     loc_line‐text+00 = 'Vlucht'.     loc_line‐text+10 = gwa_data‐carrid.     loc_line‐text+13 = gwa_data‐connid.     CONDENSE loc_line‐text+10 NO‐GAPS.     APPEND loc_line TO loc_lines.      CLEAR:       loc_line.     loc_line‐text = '‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐'.     APPEND loc_line TO loc_lines.  

" l i d l

Implementatie invulling van private methode VRIJE_PLAATSEN (deel 2):

Pagina 31 van 40

Page 32: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 1  *   Totaal     loc_seat_i = lwa_sflight‐seatsmax ‐ lwa_sflight‐seatsocc.     IF loc_seat_i GT 0.       WRITE loc_seat_i DECIMALS 0 NO‐ZERO NO‐SIGN          TO loc_seat RIGHT‐JUSTIFIED.       CLEAR:         loc_line.       loc_line‐text+00 = loc_title.       loc_line‐text+21 = loc_seat.       APPEND loc_line TO loc_lines.        loc_seat_i = lwa_sflight‐seatsmax_b ‐ lwa_sflight‐seatsocc_b.       IF loc_seat_i GT 0.         WRITE loc_seat_i DECIMALS 0 NO‐ZERO NO‐SIGN            TO loc_seat RIGHT‐JUSTIFIED.         CLEAR:           loc_line.         loc_line‐text+00 = '‐ Business Class   :'.         loc_line‐text+21 = loc_seat.         APPEND loc_line TO loc_lines.       ENDIF.        loc_seat_i = lwa_sflight‐seatsmax_f ‐ lwa_sflight‐seatsocc_f.       IF loc_seat_i GT 0.         WRITE loc_seat_i DECIMALS 0 NO‐ZERO NO‐SIGN            TO loc_seat RIGHT‐JUSTIFIED.         CLEAR:           loc_line.         loc_line‐text+00 = '‐ First Class      :'.         loc_line‐text+21 = loc_seat.         APPEND loc_line TO loc_lines.       ENDIF.        loc_seat_i = ( lwa_sflight‐seatsmax   ‐ lwa_sflight‐seatsocc   )                  ‐ ( lwa_sflight‐seatsmax_b ‐ lwa_sflight‐seatsocc_b )                  ‐ ( lwa_sflight‐seatsmax_f ‐ lwa_sflight‐seatsocc_f ).       IF loc_seat_i GT 0.         WRITE loc_seat_i DECIMALS 0 NO‐ZERO NO‐SIGN            TO loc_seat RIGHT‐JUSTIFIED.         CLEAR:           loc_line.         loc_line‐text+00 = '‐ Tourist Class    :'.         loc_line‐text+21 = loc_seat.         APPEND loc_line TO loc_lines.       ENDIF.      ELSE.       CLEAR:         loc_line.       loc_line‐text = 'Er zijn geen stoelen meer beschikbaar'.       APPEND loc_line TO loc_lines.     ENDIF.   

" V l  i  d l 3 

Implementatie invulling van private methode VRIJE_PLAATSEN (deel 3):

Pagina 32 van 40

Page 33: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 2      CLEAR:       loc_line.     loc_line‐text = '‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐'.     APPEND loc_line TO loc_lines.  *   Popup     CALL FUNCTION 'CCMS_POPUP_INFOTEXT'       EXPORTING         titel        = loc_title         start_column = 9         start_row    = 8         end_column   = 41         end_row      = 13         infoflags    = 'CR'       TABLES         lines        = loc_lines.    ENDMETHOD.                    "vrije_plaatsen 

" Einde van methode VRIJE_PLAATSEN 

Voor de methode ADD_QUICKINFO is een toelichting op zijn plaats. SAP heeft een standaard constructie om een icoontje zichtbaar te maken op het scherm. Met behulp van transactie ICON kunt u zien welke verschillende icoontjes beschikbaar zijn in uw systeem. Als u de transactie ICON opent ziet u naast het icoontje de naam ervan staan, altijd beginnend met de letters ICON_ gevolgd door een naam. Deze naam verwijst in feite naar de type bibliotheek ICON van standaard SAP en daarmee kunnen we altijd een specifiek icoontje benoemen in programma’s. Zo dus ook in ons programma wordt type bibliotheek (TYPE GROUP) ICON gebruikt en wij putten uit die lijst met icoontjes. Intern worden icoontjes echter als een reeks van tekens opgeslagen, waarbij altijd het formaat gelijk is:

- 1e teken = @ - 2e en 3e teken identificeren een specifiek icoontje - 4e teken = @

Op het moment, dat een tekenreeks wordt ontvangen en zichtbaar wordt gemaakt op het scherm, dan verschijnt er een icoontje. Bijvoorbeeld ICON_CHECKED = @01@ en levert icoontje op. Dit is dus ook het geval, in de ALV velden (cellen) en op de ALV knoppen, zoals wij die in ons programma gebruiken. Een speciaal trucje is om aan een dergelijk icoontje een quick info tekst toe te voegen.

Voorbeeld:

Om dit te doen wordt gebruik gemaakt van de “escape-sequence” \Q<tekst>, die direct in de definitie van het icoontje wordt ingebracht en wel direct voor het laatste @ teken (dus vanaf positie 3. Het laatste @ teken komt dan direct na de tekst. Hiervoor is een private methode ADD_QUICKINFO aangemaakt. Implementatie invulling van private methode ADD_QUICKINFO:

Pagina 33 van 40

Page 34: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Voorzie de Icon van een knop van een quick info tip                  * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * ‐‐>I_INFOTEXT   De quickinfo (tooltip) tekst                         * * <‐‐C_BUTTON     Knop met icon voor plaatsen quickinfo                * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD add_quickinfo. *   Lokaal     CONSTANTS:       lco_marker(2) TYPE c VALUE '\Q'.  *   Alleen uitvoeren als er echt een icon op staat     IF  c_button+0(1) = '@'     AND c_button+3(1) = '@'.       CONCATENATE c_button+0(3)                   lco_marker                   i_infotext                   c_button+3(1)              INTO c_button.     ENDIF.    ENDMETHOD.                    "add_quickinfo

Wij willen de globale lay-out van de ALV beïnvloeden. Hiervoor is private methode INITIAL_LAYOUT aangemaakt. In de titel heb ik een persoonlijk tintje meegegeven. Belangrijk hier is de naam van het structuurveld, waarin de individuele veld lay-out wordt opgeslagen. In ons geval is dat het veld HANDLE_STYLE van de structuur ZDEMO_ALV_STRUCTUUR. De naam moet in hoofdletters worden weergegeven. Implementatie invulling van private methode INITIAL_LAYOUT:

We willen specifieke functies van de ALV uitsluiten, zodat alleen de door ons gewenste functies overblijven.

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee wordt de initiële layout van de ALV gezet                    * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐CW_LAYOUT  Layout structuur                                       * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD initial_layout. *   Lokaal     CONSTANTS:       loc_title TYPE lvc_title                VALUE 'Demonstratie ALV door Rob Veenstra (Superp)'.     CLEAR:       cw_layout.     cw_layout‐zebra      = 'X'.       " Weergeven in ZEBRA stijl     cw_layout‐sel_mode   = 'A'.       " Meervoudig selecteren mogelijk     cw_layout‐cwidth_opt = 'X'.       " Optimaliseer kolombreedte     cw_layout‐no_rowmove = 'X'.       " Verplaatsen rijen niet mogelijk     cw_layout‐no_rowins  = 'X'.       " Invoegen rijen niet mogelijk     cw_layout‐no_f4      = 'X'.       " F4 invoerhulp niet mogelijk     cw_layout‐grid_title = loc_title. " ALV grid titel     cw_layout‐stylefname = 'HANDLE_STYLE'. " Stijlveldnaam in de tabel    ENDMETHOD.                    "initial_layout

De gewenste functies zijn:

- Details - Oplopend sorteren - Aflopend sorteren - Zoeken … - Filter instellen … - Afdrukken - Exporteren

De overige functies worden onderdrukt via private methode EXCLUDE_FUNCTIONS.

Pagina 34 van 40

Page 35: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Implementatie invulling van private methode EXCLUDE_FUNCTIONS:

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee worden bepaalde functies van de ALV onderdrukt               * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐CT_EXCLUDE  ALV uitgesloten functie tabel                         * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD exclude_functions.     REFRESH:       ct_exclude.     IF grid IS INITIAL.       APPEND:         cl_gui_alv_grid=>mc_mb_sum               TO ct_exclude,         cl_gui_alv_grid=>mc_mb_view              TO ct_exclude,         cl_gui_alv_grid=>mc_mb_variant           TO ct_exclude,         cl_gui_alv_grid=>mc_mb_paste             TO ct_exclude,         cl_gui_alv_grid=>mc_fc_graph             TO ct_exclude,         cl_gui_alv_grid=>mc_fc_check             TO ct_exclude,         cl_gui_alv_grid=>mc_fc_loc_paste         TO ct_exclude,         cl_gui_alv_grid=>mc_fc_loc_paste_new_row TO ct_exclude,         cl_gui_alv_grid=>mc_fc_loc_insert_row    TO ct_exclude,         cl_gui_alv_grid=>mc_fc_loc_delete_row    TO ct_exclude,         cl_gui_alv_grid=>mc_fc_loc_append_row    TO ct_exclude,         cl_gui_alv_grid=>mc_fc_loc_copy_row      TO ct_exclude,         cl_gui_alv_grid=>mc_fc_help              TO ct_exclude,         cl_gui_alv_grid=>mc_fc_info              TO ct_exclude.     ELSE.       APPEND:         grid‐>mc_mb_sum               TO ct_exclude,         grid‐>mc_mb_view              TO ct_exclude,         grid‐>mc_mb_variant           TO ct_exclude,         grid‐>mc_mb_paste             TO ct_exclude,         grid‐>mc_fc_graph             TO ct_exclude,         grid‐>mc_fc_check             TO ct_exclude,         grid‐>mc_fc_loc_paste         TO ct_exclude,         grid‐>mc_fc_loc_paste_new_row TO ct_exclude,         grid‐>mc_fc_loc_insert_row    TO ct_exclude,         grid‐>mc_fc_loc_delete_row    TO ct_exclude,         grid‐>mc_fc_loc_append_row    TO ct_exclude,         grid‐>mc_fc_loc_copy_row      TO ct_exclude,         grid‐>mc_fc_help              TO ct_exclude,         grid‐>mc_fc_info              TO ct_exclude.     ENDIF.    ENDMETHOD                     " l d f ti

We gaan ook onze eigen veld catalogus opbouwen, waarbij we onze eigen kolomnamen gaan gebruiken, aangeven hoe de gegevens in een kolom moeten worden aangelijnd (L= Links, C=Centreren en R=Rechts). Ook geven we aan welke velden sleutel velden zijn (deze krijgen een andere kleur). We geven aan, dat numerieke velden NIET getotaliseerd worden. Voor het vluchtnummer geven we aan, dat de vier cijfers altijd met voorloopnullen zichtbaar moeten worden. Voor een aantal velden in de ALV wordt aangegeven, dat ze NIET worden uitgevoerd naar het scherm (en dus niet zichtbaar worden). Tot slot krijgen alle kolomnamen ook een quick info (ofwel tooltip) mee. Als eerste stap wordt hier de standaard veld catalogus opgehaald van onze eigen ALV structuur (ZDEMO_ALV_STRUCTUUR). Implementatie invulling van private methode FIELD_CATALOG (deel 1):

Pagina 35 van 40

Page 36: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee wordt de veld catalogus opgebouwd                            * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐CT_FIELDCAT  Veld catalogus                                       * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD field_catalog. *   Lokaal     FIELD‐SYMBOLS:       <fcat> TYPE lvc_s_fcat.  *   We gebruiken de standaard SAP functie voor de veld catalogus     CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'       EXPORTING         i_structure_name       = 'ZDEMO_ALV_STRUCTUUR'       CHANGING         ct_fieldcat            = ct_fieldcat       EXCEPTIONS         inconsistent_interface = 1         program_error          = 2         OTHERS                 = 3.     CHECK:       sy‐subrc EQ 0.  

*   Nu kunnen we veld voor veld de kolomnamen beïnvloeden en het *   gebruik van field‐symbol <fcat> zorgt voor een directe aanpassing     LOOP AT ct_fieldcat ASSIGNING <fcat>.       CASE <fcat>‐fieldname.         WHEN 'CARRNAME'.           <fcat>‐tooltip  = 'Maatschappij van deze vlucht'.           <fcat>‐coltext  = 'Vliegmaatschappij'.           <fcat>‐just     = 'L'.           <fcat>‐key      = 'X'.          WHEN 'CARRID'.           <fcat>‐tooltip  = 'Vliegmaatschappij ID'.           <fcat>‐coltext  = 'ID'.           <fcat>‐just     = 'C'.           <fcat>‐key      = 'X'.  

" Vervolg in deel 2 

Implementatie invulling van private methode FIELD_CATALOG (deel 2):

Pagina 36 van 40

Page 37: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 1          WHEN 'CONNID'.           <fcat>‐tooltip  = 'Nummer van deze vlucht'.           <fcat>‐coltext  = 'Vluchtnummer'.           <fcat>‐just     = 'C'.           <fcat>‐lzero    = 'X'.           <fcat>‐no_sum   = 'X'.           <fcat>‐key      = 'X'.          WHEN 'FLDATE'.           <fcat>‐tooltip  = 'Datum van deze vlucht'.           <fcat>‐coltext  = 'Datum'.           <fcat>‐just     = 'C'.           <fcat>‐key      = space.          WHEN 'DEPTIME'.           <fcat>‐no_out   = 'X'.               " Niet zichtbaar in ALV           <fcat>‐key      = space.          WHEN 'ARRTIME'.           <fcat>‐no_out   = 'X'.               " Niet zichtbaar in ALV           <fcat>‐key      = space.          WHEN 'CITYFROM'.           <fcat>‐tooltip  = 'Van plaats'.           <fcat>‐coltext  = 'Van'.           <fcat>‐just     = 'L'.           <fcat>‐key      = space.          WHEN 'CITYTO'.           <fcat>‐tooltip  = 'Naar plaats'.           <fcat>‐coltext  = 'Naar'.           <fcat>‐just     = 'L'.           <fcat>‐key      = space.          WHEN 'BUTTON_INFO'.           <fcat>‐tooltip  = 'Geef vlucht details weer'.           <fcat>‐coltext  = 'Informatie'.           <fcat>‐just     = 'C'.           <fcat>‐key      = space.          WHEN 'BUTTON_CHECK'.           <fcat>‐tooltip  = 'Controleer of er plaasten zijn'.           <fcat>‐coltext  = 'Controleer'.           <fcat>‐just     = 'C'.           <fcat>‐key      = space.   

" V l  i  d l 3  De velden DEPTIME (vertrektijd) en ARRTIME (aankomsttijd) worden niet zichtbaar gemaakt. Echter voor de sortering zijn ze van wezenlijk belang (zodat de juiste gegevens gegroepeerd kunnen worden). Om die reden bestaan ze wel in onze ZDEMO_ALV_STRUCTUUR, worden ze als sleutelvelden gemarkeerd maar hoeven ze niet zichtbaar te worden. De tijden worden zichtbaar als men op de knop “Informatie” van een regel drukt. Implementatie invulling van private methode FIELD_CATALOG (deel 3):

Pagina 37 van 40

Page 38: ALV opzetten SUPERP

VNSG Magazine – maart 2009

" Vervolg van deel 2          WHEN 'PRICE'.           <fcat>‐tooltip  = 'Prijs voor deze vlucht'.           <fcat>‐coltext  = 'Prijs'.           <fcat>‐just     = 'R'.           <fcat>‐no_sign  = 'X'.           <fcat>‐no_sum   = 'X'.           <fcat>‐key      = space.          WHEN 'CURRENCY'.           <fcat>‐tooltip  = 'Valuta van de prijs'.           <fcat>‐coltext  = 'Valuta'.           <fcat>‐just     = 'L'.           <fcat>‐key      = space.        ENDCASE.     ENDLOOP.  *   Housekeeping     IF <fcat> IS ASSIGNED. UNASSIGN <fcat>. ENDIF.    ENDMETHOD.                    "field_catalog  

" Einde van methode FIELD_CATALOG 

Wellicht is het u opgevallen, dat we in deze methode een field-symbol hebben gebruikt. Dit field-symbol (<fcat>) is vooral handig, omdat we door de tabel met de veld catalogus gegevens voor ieder veld lopen en we deze informatie moeten bijwerken. Met behulp van dit field-symbol besparen we de MODIFY instructie en wijzigen we de gegevens rechtstreeks in de interne tabel van de veld catalogus. Tot slot willen we de private methode voor sorteren en groeperen invullen. De methode SET_ALV_SORT levert in feite een interne tabel met de sorteer regels terug. Onze oorspronkelijke sortering bij het selecteren van de gegevens wordt in deze methode gevolgd, waarbij we de sorteervolgorde en sorteerniveau besturen. De sorteervolgorde (het veld SPOS bevat een NUMC waarde) wordt gebruikt om de groepering aan te geven. Het is dus mogelijk om velden te combineren in één groep. Het sorteerniveau (het veld LEVEL bevat een INT4 waarde) wordt gebruikt om de exacte volgorde van de velden bij het sorteren aan te geven. Door de waarden in de genoemde velden te variëren, beïnvloed men de sortering en de groepering van de gegevens in de ALV.

Implementatie invulling van private methode SET_ALV_SORT:

Pagina 38 van 40

Page 39: ALV opzetten SUPERP

VNSG Magazine – maart 2009

*‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * Hiermee wordt de sortering van de ALV gezet                          * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐* * <‐‐Ct_SORT   Sorteer structuur                                       * *‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐*   METHOD set_alv_sort. *   Lokaal     DATA:       lwa_sort TYPE lvc_s_sort.      REFRESH:       ct_sort.     lwa_sort‐spos      = '01'.     lwa_sort‐fieldname = 'FLDATE'.     lwa_sort‐up        = 'X'.     lwa_sort‐level     = 1.     APPEND lwa_sort TO ct_sort.     lwa_sort‐spos      = '02'.     lwa_sort‐fieldname = 'CARRNAME'.     lwa_sort‐up        = 'X'.     lwa_sort‐level     = 2.     APPEND lwa_sort TO ct_sort.     lwa_sort‐spos      = '02'.     lwa_sort‐fieldname = 'CONNID'.     lwa_sort‐up        = 'X'.     lwa_sort‐level     = 3.     APPEND lwa_sort TO ct_sort.     lwa_sort‐spos      = '03'.     lwa_sort‐fieldname = 'DEPTIME'.     lwa_sort‐up        = 'X'.     lwa_sort‐level     = 4.     APPEND lwa_sort TO ct_sort.     lwa_sort‐spos      = '03'.     lwa_sort‐fieldname = 'ARRTIME'.     lwa_sort‐up        = 'X'.     lwa_sort‐level     = 5.     APPEND lwa_sort TO ct_sort.    ENDMETHOD.                    "set_alv_sort

En hiermee is ons gehele demonstratie programma ZDEMO_ALV gereed. Controleer, compileer en activeer het programma (vergeet eventuele additionele componenten, zoals scherm onderdelen en data dictionary onderdelen, niet). Het is een uitgebreide tip & trick geworden, die een ABAP OO benadering van de ALV laat zien en waarbij er voldoende mogelijkheden bestaan om uw eigen inbreng en sturing toe te voegen. Veel succes.

Deze tip is aangeleverd door Superp bv (http://www.superp.nl/). Voor vragen of informatie over dit onderwerp kunt u contact opnemen met Rob Veenstra (mailto:[email protected]).

Pagina 39 van 40

Page 40: ALV opzetten SUPERP

VNSG Magazine – maart 2009

Pagina 40 van 40