Skutečný report v abapu

Pohráli jsme si s tabulkou SFLIGHT a poznali základní schema napsání prvního reportu (programu) v ABAPu. Přeskočili jsme též “populární” report “Hello world” ….a nyní si napíšeme skutečný prográmek. Tento program postupně vybere data ze 4 různých tabulek a zobrazí seznam materiálů s parametry v oblíbeném formátu ALV. Kod programu:

1. Deklarace reportu, použitých tabulek, proměnných a parametrů

REPORT ZTEST001.
 
tables: marc, makt, mbew, mara.
 
data: begin of report occurs 0,
matnr like marc-matnr,
werks like marc-werks,
ekgrp like marc-ekgrp,
dispo like marc-dispo,
dismm like marc-dismm,
 
maktx like makt-maktx,
 
bklas like mbew-bklas,
verpr like mbew-verpr,
stprs like mbew-stprs,
peinh like mbew-peinh,
 
mtart like mara-mtart,
meins like mara-meins,
 
END OF report.
 
***************ALV***************************************
TYPE-POOLS: slis.
DATA: gt_fieldcat_wa TYPE slis_fieldcat_alv.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
 
*data int_fcat type SLIS_T_FIELDCAT_ALV.
 
* field to store report name
DATA g_repid LIKE sy-repid.
* field to check table length
DATA i_lines LIKE sy-tabix.
DATA: gs_layout TYPE slis_layout_alv,
g_exit_caused_by_caller,
gs_exit_caused_by_user TYPE slis_exit_by_user.
*************ALV****************************************
 
parameters: pwerks like marc-werks memory id wrk obligatory.
SELECT-OPTIONS: pmatnr for marc-matnr. 
                


Všimněte si deklarace tabulky REPORT. jednotlivá pole se skládají z polí několika tabulek. A to marc, makt, mbew, mara. Tyto tabulky obsahují data materiálu závodu, texty, základní data a data ocenění.

2. Výběr dat

select * from marc where
matnr in pmatnr and
werks eq pwerks.
 
MOVE-CORRESPONDING marc to report.
 
 
*výběr z tabulky makt
select single * from makt where
matnr eq report-matnr and
spras eq 'C'.
if sy-subrc eq 0. "byl nalezen záznam v makt
report-maktx = makt-maktx.
endif.
 
*výběr z tabulky mbew
select single * from mbew where
matnr eq report-matnr and
bwkey eq pwerks.
if sy-subrc eq 0.
report-bklas = mbew-bklas.
report-verpr = mbew-verpr.
report-stprs = mbew-stprs.
report-peinh = mbew-peinh.
endif.
 
*výběr z tabulky mara
select single * from mara where
matnr eq report-matnr.
if sy-subrc eq 0.
report-mtart = mara-mtart.
report-meins = mara-meins.
endif.
 
append report.
clear report.
endselect. 
              


Všimněte si jakým způsobem jsou do tabulky report načtena data tabulky MARC a jak jsou následně načítána data ostatních tabulek. Tabulku MARC načteme pomocí SELECT a data ostatních, kde očekáváme pouze 1 možný záznam pomocí SELECT SINGLE. Po příkazu SELECT-SINGLE ověřujeme, zda data byla nalezena pomocí vazby IF SY-SUBRC eq 0. SY-SUBRC je systémové pole, které mění svou hodnotu v závislosti na předchozím příkazu tedy SELECT-SINGLE. Nově jsme použili i strukturu IF / ENDIF. To co je mezi IF a ENDIF se provede, pokud je splněna podmínka IF. Příkaz je párový, IF kodnčí ENDIF stejně jako SELECT končí ENDSELECT. Pouze SELECT-SINGL nemá ENDSELECT. Podívejte se, kde ža je párový tag ENDSELECT v našem případě.

3. Přidáme rutinu ALV

****************** A L V *********************************************
 
 
* Store report name
g_repid = sy-repid.
 
* Create Fieldcatalogue from internal table
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = g_repid
i_internal_tabname = 'REPORT' "capital letters!
"tabulka pro výstup ALV
 
i_inclname = g_repid
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
 
IF sy-subrc <> 0.
WRITE: /
'Returncode',
sy-subrc,
'from FUNCTION REUSE_ALV_FIELDCATALOG_MERGE'.
ENDIF.
 
 
PERFORM katalog.
 
 
 
DATA g_status TYPE slis_formname .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_BACKGROUND_ID = 'ALV_BACKGROUND'
* i_buffer_active = 'X'
i_callback_program = g_repid
* I_STRUCTURE_NAME = 'SFLIGHT'
it_fieldcat = gt_fieldcat[]
* IS_LAYOUT = GS_LAYOUT
* I_CALLBACK_PF_STATUS_SET = G_STATUS
i_save = 'A' "G_SAVE
* IS_VARIANT = GS_VARIANT
* IT_EVENTS = GT_EVENTS[]
* I_SCREEN_START_COLUMN = 0 "Use coordinates for
* I_SCREEN_START_LINE = 0 "display as dialog box
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER = G_EXIT_CAUSED_BY_CALLER
* ES_EXIT_CAUSED_BY_USER = GS_EXIT_CAUSED_BY_USER
TABLES
t_outtab = report "tabulka pro zobrazení ALV
EXCEPTIONS
program_error = 1
OTHERS = 2.
 
 
IF sy-subrc <> 0.
WRITE: /
'Returncode',
sy-subrc,
'from FUNCTION REUSE_ALV_GRID_DISPLAY'.
ENDIF.
 
 
*************KATALOG***************************
FORM katalog.
*
LOOP AT gt_fieldcat INTO gt_fieldcat_wa.
CASE gt_fieldcat_wa-fieldname.
 
 
 
WHEN 'CARRID'. "definuje se text hlavičky alv dle pole
MOVE:
'L' TO gt_fieldcat_wa-ddictxt,
text-100 TO gt_fieldcat_wa-seltext_l,
* text-100 TO gt_fieldcat_wa-reptext_ddic.
* 'X' TO gt_fieldcat_wa-fix_column.
* SPACE TO gt_fieldcat_wa-key.
'10' TO gt_fieldcat_wa-outputlen.
 
 
 
 
 
ENDCASE.
 
MODIFY gt_fieldcat FROM gt_fieldcat_wa.
 
ENDLOOP.
 
 
ENDFORM. " katalog
 
*******************************A L V ********************************** 
                      


nyní program uložíme a aktivujeme. Aktivace programu se provede pomocí kláves Ctrl+F3. Bez aktivace se změny programu nepojeví a program nebude fungovat.

Spustíme program klávesou F8.
Nyní už vidítem jakým způsobem můžete spojovat data různých tabulek.
Je vždy potřeba mít jedno, případně více polí, které jsou společné pro všechny tabulky.
V našem případě byl ve všech tabulkách společný parametr MATNR – číslo materiálu.
V některém případě byl ještě doplněn o další:

*výběr z tabulky mbew
select single * from mbew where
matnr eq report-matnr and
bwkey eq pwerks. 
          


Pozor!! V tabulce MBEW může být materiál zapsán několikrát a mít různé parametry závislosti na závodu.
MBEW-WERKS.

celý kod programu:

REPORT ZTEST001.
 
tables: marc, makt, mbew, mara.
 
data: begin of report occurs 0,
matnr like marc-matnr,
werks like marc-werks,
ekgrp like marc-ekgrp,
dispo like marc-dispo,
dismm like marc-dismm,
 
maktx like makt-maktx,
 
bklas like mbew-bklas,
verpr like mbew-verpr,
stprs like mbew-stprs,
peinh like mbew-peinh,
 
mtart like mara-mtart,
meins like mara-meins,
 
END OF report.
 
***************ALV***************************************
TYPE-POOLS: slis.
DATA: gt_fieldcat_wa TYPE slis_fieldcat_alv.
DATA: gt_fieldcat TYPE slis_t_fieldcat_alv.
DATA: ls_fieldcat TYPE slis_fieldcat_alv.
 
*data int_fcat type SLIS_T_FIELDCAT_ALV.
 
* field to store report name
DATA g_repid LIKE sy-repid.
* field to check table length
DATA i_lines LIKE sy-tabix.
DATA: gs_layout TYPE slis_layout_alv,
g_exit_caused_by_caller,
gs_exit_caused_by_user TYPE slis_exit_by_user.
*************ALV****************************************
 
parameters: pwerks like marc-werks memory id wrk obligatory.
SELECT-OPTIONS: pmatnr for marc-matnr.
 
 
START-OF-SELECTION.
 
 
select * from marc where
matnr in pmatnr and
werks eq pwerks.
 
MOVE-CORRESPONDING marc to report.
 
 
*výběr z tabulky makt
select single * from makt where
matnr eq report-matnr and
spras eq 'C'.
if sy-subrc eq 0. "byl nalezen záznam v makt
report-maktx = makt-maktx.
endif.
 
*výběr z tabulky mbew
select single * from mbew where
matnr eq report-matnr and
bwkey eq pwerks.
if sy-subrc eq 0.
report-bklas = mbew-bklas.
report-verpr = mbew-verpr.
report-stprs = mbew-stprs.
report-peinh = mbew-peinh.
endif.
 
*výběr z tabulky mara
select single * from mara where
matnr eq report-matnr.
if sy-subrc eq 0.
report-mtart = mara-mtart.
report-meins = mara-meins.
endif.
 
append report.
clear report.
endselect.
 
****************** A L V *********************************************
 
 
* Store report name
g_repid = sy-repid.
 
* Create Fieldcatalogue from internal table
CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
EXPORTING
i_program_name = g_repid
i_internal_tabname = 'REPORT' "capital letters!
"tabulka pro výstup ALV
 
i_inclname = g_repid
CHANGING
ct_fieldcat = gt_fieldcat
EXCEPTIONS
inconsistent_interface = 1
program_error = 2
OTHERS = 3.
 
IF sy-subrc <> 0.
WRITE: /
'Returncode',
sy-subrc,
'from FUNCTION REUSE_ALV_FIELDCATALOG_MERGE'.
ENDIF.
 
 
PERFORM katalog.
 
 
 
DATA g_status TYPE slis_formname .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_BACKGROUND_ID = 'ALV_BACKGROUND'
* i_buffer_active = 'X'
i_callback_program = g_repid
* I_STRUCTURE_NAME = 'SFLIGHT'
it_fieldcat = gt_fieldcat[]
* IS_LAYOUT = GS_LAYOUT
* I_CALLBACK_PF_STATUS_SET = G_STATUS
i_save = 'A' "G_SAVE
* IS_VARIANT = GS_VARIANT
* IT_EVENTS = GT_EVENTS[]
* I_SCREEN_START_COLUMN = 0 "Use coordinates for
* I_SCREEN_START_LINE = 0 "display as dialog box
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER = G_EXIT_CAUSED_BY_CALLER
* ES_EXIT_CAUSED_BY_USER = GS_EXIT_CAUSED_BY_USER
TABLES
t_outtab = report "tabulka pro zobrazení ALV
EXCEPTIONS
program_error = 1
OTHERS = 2.
 
 
IF sy-subrc <> 0.
WRITE: /
'Returncode',
sy-subrc,
'from FUNCTION REUSE_ALV_GRID_DISPLAY'.
ENDIF.
 
 
*************KATALOG***************************
FORM katalog.
*
LOOP AT gt_fieldcat INTO gt_fieldcat_wa.
CASE gt_fieldcat_wa-fieldname.
 
 
 
WHEN 'CARRID'. "definuje se text hlavičky alv dle pole
MOVE:
'L' TO gt_fieldcat_wa-ddictxt,
text-100 TO gt_fieldcat_wa-seltext_l,
* text-100 TO gt_fieldcat_wa-reptext_ddic.
* 'X' TO gt_fieldcat_wa-fix_column.
* SPACE TO gt_fieldcat_wa-key.
'10' TO gt_fieldcat_wa-outputlen.
 
 
 
 
 
 
 
 
 
ENDCASE.
 
MODIFY gt_fieldcat FROM gt_fieldcat_wa.
 
ENDLOOP.
 
 
ENDFORM. " katalog
 
*******************************A L V ********************************** 
                      


a na konec tedy i kod programu Hello World

REPORT ZHB00001.
*Hello world in ABAP/4 *
 
DO 5 TIMES.
WRITE: 'Hello world'.
 
ENDDO.
    

vidíte sami, že pokud jste úspěšně napsali výše uvedený kod do editoru ABAP a spustili jej, jste již mnohem dále než u Hello World. I když připouštím, vazbu DO a ENDDO jsme zde ještě neprobírali. Zkuste změnit hodnotu 5 TIMES na 10 TIMES…

Napsat komentář

Vaše emailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *

*

„Když už člověk jednou je, tak má koukat aby byl. A když kouká, aby byl a je, tak má být to, co je a nemá být to, co není, jak tomu v mnoha případech je.“ Jan Werich