optymalizacja kodu

Jeśli programujesz, administrujesz, integrujesz i masz wątpliwość lub obawę, to właśnie najlepsze miejsce dla Ciebie. Pisz śmiało...
ODPOWIEDZ
firemaly
Posty: 17
Rejestracja: pn lip 23, 2007 12:51 pm
Been thanked: 5 times

optymalizacja kodu

Post autor: firemaly »

Witam,

Napisałem ostatnio raport który rozwija mi boma oraz wyświetla ilości z marszrut. Nie jestem programistą i optymalizacja kodu jest kiepska :P

Jak dam jeden indeks to ok, ale jak walnę zakres to już nie jest wesoło. Wkleję kod to może ktoś rzuciłby okiem i poprawił jego wydjaność?

Dzięki i pozdrawiam

REPORT Z_CONTROL2 no standard page heading
line-size 160
line-count 60.

*----------------------------------------------------------------------*
* Table definition *
*----------------------------------------------------------------------*

TABLES: mast, mapl, stpo, plas, plpo.



*----------------------------------------------------------------------*
* Internal Table Declaration *
*----------------------------------------------------------------------*

DATA: t_mast LIKE STANDARD TABLE OF mast WITH HEADER LINE.
DATA: t_mapl LIKE STANDARD TABLE OF mapl WITH HEADER LINE.
DATA: t_plas LIKE STANDARD TABLE OF plas WITH HEADER LINE.
DATA: t_plpo LIKE STANDARD TABLE OF plpo WITH HEADER LINE.

* BOM Function module Related
DATA: t_matcat LIKE cscmat OCCURS 0 WITH HEADER LINE.
DATA: t_stb LIKE stpox OCCURS 0 WITH HEADER LINE.


*-- BOM Line item
TYPES: BEGIN OF ty_stpo,
stlty TYPE stpo-stlty,
stlnr TYPE stpo-stlnr,
stlkn TYPE stpo-stlkn,
stpoz TYPE stpo-stpoz,
idnrk TYPE stpo-idnrk,
meins TYPE stpo-meins,
menge TYPE stpo-menge,
END OF ty_stpo.


DATA: t_stpo TYPE STANDARD TABLE OF ty_stpo WITH HEADER LINE.

*-- BOM Header
TYPES: BEGIN OF ty_stko,
stlty TYPE stko-stlty,
stlnr TYPE stko-stlnr,
stlal TYPE stko-stlal,
stkoz TYPE stko-stkoz,
bmein TYPE stko-bmein,
bmeng TYPE stko-bmeng,
END OF ty_stko.

DATA: t_stko TYPE STANDARD TABLE OF ty_stko WITH HEADER LINE .

data : t_makt like makt occurs 0 with header line.



* Variables
data : v_maktx like makt-maktx.
data wa_stko like stko.

*----------------------------------------------------------------------*
* Selection Screen *
*----------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001.

PARAMETERS: p_werks LIKE marc-werks DEFAULT '101' OBLIGATORY.
SELECT-OPTIONS s_stlal FOR mast-stlal .
SELECT-OPTIONS s_stlan FOR mast-stlan DEFAULT '1'.
SELECT-OPTIONS s_matnr FOR mast-matnr.
SELECTION-SCREEN END OF BLOCK b1.


************************************************************************
**************** S T A R T - O F - S E L E C T I O N *******************
************************************************************************

start-of-selection.

perform get_data.



*&---------------------------------------------------------------------*
*& Form get_data
*&---------------------------------------------------------------------*
* Get data from MAST and MAKT Table
*----------------------------------------------------------------------*
FORM get_data.

data : wa_lines type sy-index.

SELECT * from mast
INTO TABLE t_mast
WHERE matnr IN s_matnr AND
werks = p_werks AND
stlan IN s_stlan AND
stlal IN s_stlal.


describe table t_mast lines wa_lines.

if wa_lines is initial.
Write:/2 'List contains no data'.
stop.
endif.

loop at t_mast.

clear : v_maktx.
if sy-tabix ne 1.
uline.
endif.

select single maktx from makt into v_maktx
where matnr = t_mast-matnr
and spras = 'E'.

select single * from stko into wa_stko
where STLTY = 'M'
and STLNR = t_mast-stlnr
and STLAL = t_mast-stlal.

clear : t_mapl, t_plas, t_plpo.
select single * from mapl into t_mapl
where matnr = t_mast-matnr.

select single * from plas into t_plas
where plnnr = t_mapl-plnnr and
plnal = t_mapl-plnal.

select single * from plpo into t_plpo
where plnnr = t_plas-plnnr and
plnkn = t_plas-plnkn.


* Main Header for Each Material
write:/2 'Material',35 'Grupa Marszrut',50 'Licz.',
55 ' Ilosc pods.', 80 'Data waznosci',95 'Stan. robocze'.

write:/2 t_mast-matnr,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.


CALL FUNCTION 'CS_BOM_EXPL_MAT_V2'
EXPORTING
capid = 'PP01'
datuv = sy-datum
mktls = 'X'
mehrs = 'X'
mtnrv = t_mast-matnr
stlal = '01'
stlan = '1'
stpst = 0
svwvo = 'X'
werks = p_werks
vrsvo = 'X'
TABLES
stb = t_stb
matcat = t_matcat
EXCEPTIONS
alt_not_found = 1
call_invalid = 2
material_not_found = 3
missing_authorization = 4
no_bom_found = 5
no_plant_data = 6
no_suitable_bom_found = 7
conversion_error = 8
OTHERS = 9.

IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

loop at t_stb.

clear : t_mapl.
select single * from mapl into t_mapl
where matnr = t_stb-idnrk.

select single * from plas into t_plas
where plnnr = t_mapl-plnnr and
plnal = t_mapl-plnal.

select single * from plpo into t_plpo
where plnnr = t_plas-plnnr and
plnkn = t_plas-plnkn.


if sy-tabix = 1.
endif.


if t_stb-STUFE = '1'.

write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
elseif t_stb-STUFE = '2'.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
elseif t_stb-STUFE = '3'.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
elseif t_stb-STUFE = '4'.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
elseif t_stb-STUFE = '5'.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
elseif t_stb-STUFE = '6'.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
elseif t_stb-STUFE = '7'.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
else.
write:/2 t_stb-idnrk,35 t_mapl-plnnr,50 t_mapl-plnal,55
t_plpo-bmsch, 80 t_plpo-datuv,95 t_plpo-ltxa1.
endif.
endloop.
endloop.

ENDFORM. " get_data

*----------------------------------------------------------------------*
* Top of page *
*----------------------------------------------------------------------*
top-of-page.
abaper
Posty: 99
Rejestracja: sob kwie 28, 2007 8:34 am
Been thanked: 1 time

Post autor: abaper »

Hej

tak w kliku słowach to raport ten z założenia jest powolny

tak na szybko to 2 punkty spowalniają :

1

Kod: Zaznacz cały

  select single * from stko into wa_stko
where STLTY = 'M'
and STLNR = t_mast-stlnr
and STLAL = t_mast-stlal.

clear : t_mapl, t_plas, t_plpo.
select single * from mapl into t_mapl
where matnr = t_mast-matnr.

select single * from plas into t_plas
where plnnr = t_mapl-plnnr and
plnal = t_mapl-plnal.

select single * from plpo into t_plpo
where plnnr = t_plas-plnnr and
plnkn = t_plas-plnkn. 

drugi jest identyczny dla składników z bom


Najlepiej to poprawić tworząc nowy "View" dla tych tabel
i zastąpić ten kod lub napisać dla tych tabel "JOIN"a


Kolejne są zapytania do bazy danych później nie wykorzystywane np:

Kod: Zaznacz cały

select single * from stko into wa_stko
where STLTY = 'M'
and STLNR = t_mast-stlnr
and STLAL = t_mast-stlal.


to tak na bardzo szybko ale ...

ja bym go od początku przemodelował
(czytaj napisał od początku )


Pozdrawiam

Abaper
radek.kiela
Posty: 37
Rejestracja: pn sie 06, 2007 8:40 pm

Post autor: radek.kiela »

Na pierwszy rzut oka:
Uzyj FS oraz ASSIGNING dla LOOP oraz sprawdź dokładnie klauzule WHERE dla każdego z użytych zapytań SELECT: czy odpowiadają (konkretnemu) indeksowi źródłowych tabel SAP - jeśli nie, to i tak będze użyte sekewncyjne skanowanie tabel (możesz to sprawdzić w SM50).
Nie czyścisz itab t_stb, ani nie reagujesz na kod powrotu FM - jeśli moduł zwroci kod bledu - i tak robisz zbędną pętlę (pozostała po poprzedniej linii z t_mast) - wstaw REFRESH przed wywołaniem FM oraz CONTINUE w przypadku sy-subrc NE 0 po wywołaniu modułu.
Choć wydaje mi się, że kluczem do wydajności są użyte KLUCZE (nomen omen) w zapytaniach.

Radek
Radek
dominik.tylczynski
Posty: 8356
Rejestracja: wt kwie 03, 2007 4:05 pm
Has thanked: 1925 times
Been thanked: 1478 times
Kontakt:

Post autor: dominik.tylczynski »

Zamiast pisać własny program do odczytywania BOM'ów, które mają nietrywialną strukturę w tablicach bazy danych proponuję wykorzystać Logistic API udokumentowane tutaj:
http://help.sap.com/saphelp_erp2005/hel ... ontent.htm
Spójrz na funkcje, których nazwy zaczynają się od CSAP_*

HTH
Dominik Tylczyński, ICG
1adams1
Posty: 207
Rejestracja: śr gru 10, 2008 11:14 am
Lokalizacja: Jelenia Góra
Been thanked: 7 times
Kontakt:

odp

Post autor: 1adams1 »

Zgadzam się z Dominikiem....
Polecam SE30 do sprawdzenia momentów najbardziej obciążających system...

Generalnie należy unikać SELECT SINLGE w pętlach ..
Spróbuj zbudować kod tak by zrobić na początku blok wybierający dane z DB gdzie pobierzesz wszystkie dane potrzebne potem w programie...potem blok przetwarzający te dane...czyli mieszanie już w tabelach wewnętrznych itd...no i na końcu blok prezentujący dane...
Wojciech Adamski
ODPOWIEDZ