*&---------------------------------------------------------------------* *& Report ZSAP_SISTEM_PANOSU *&---------------------------------------------------------------------* *& SAP Sistem Panosu -- Sistem Sagligi + Custom Code Envanteri *& *& * Harici kutuphane, CDN, internet erisimi gerektirmez. *& * SMW0 / MIME repository gerektirmez. Tek program, tek dosya. *& * Grafikler saf SVG olarak ES5 JavaScript ile cizilir; boylece *& SAP GUI'nin hem eski IE tabanli hem yeni Edge/WebView2 tabanli *& HTML kontrolunde ayni sekilde calisir. *& * Grafik cubuklarina ve tablo satirlarina tiklandiginda sapevent *& ile ABAP'a donulur ve FILTRELENMIS detay listesi ALV popup *& olarak acilir. Program satirinda dogrudan SE38 acilir. *& * Klasik ABAP soz dizimi: ECC 6.0 -- S/4HANA arasinda calisir. *& *& KURULUM *& 1) SE38 : programi olustur, bu kodu yapistir, aktive et. *& 2) SE51 : Dynpro 0100 olustur (bos ekran, tip "Normal"). *& Element listesi > Ozel nitelikler > OK code alanina: *& OK_CODE *& Flow logic: *& PROCESS BEFORE OUTPUT. *& MODULE status_0100. *& PROCESS AFTER INPUT. *& MODULE user_command_0100. *& 3) SE41 : Status 'MAIN' olustur; BACK / EXIT / CANCEL fonksiyon *& kodlarini F3 / Shift+F3 / F12'ye bagla. *& 4) SE38 > Goto > Text Elements : metin sembolleri ve secim *& metinlerini gir. *& *& YETKI NOTU: dump bloklari SNAP tablosunu okur. Sisteminde bu tabloya *& erisim yoksa secim ekranindaki "Dump" kutusunu kapat -- rapor calisir. *&---------------------------------------------------------------------* REPORT zsap_sistem_panosu. *----------------------------------------------------------------------* * Tipler -- grafik / tablo / KPI *----------------------------------------------------------------------* TYPES: BEGIN OF ty_kv, " grafik: etiket + deger k TYPE string, v TYPE i, END OF ty_kv. TYPES: tt_kv TYPE STANDARD TABLE OF ty_kv WITH DEFAULT KEY. * COLLECT sadece FLAT yapilarla calisir; STRING yapiyi derin yapar. * Bu yuzden gruplama icin ayri, duz bir tip kullaniyoruz. TYPES: BEGIN OF ty_agg, k TYPE c LENGTH 60, v TYPE i, END OF ty_agg. TYPES: tt_agg TYPE STANDARD TABLE OF ty_agg WITH DEFAULT KEY. TYPES: BEGIN OF ty_row, " HTML tablo satiri (6 kolon) c1 TYPE string, c2 TYPE string, c3 TYPE string, c4 TYPE string, c5 TYPE string, c6 TYPE string, END OF ty_row. TYPES: tt_row TYPE STANDARD TABLE OF ty_row WITH DEFAULT KEY. TYPES: BEGIN OF ty_kpi, " KPI karti lbl TYPE string, val TYPE string, sub TYPE string, st TYPE string, " '' / 'good' / 'warn' / 'crit' stx TYPE string, END OF ty_kpi. TYPES: tt_kpi TYPE STANDARD TABLE OF ty_kpi WITH DEFAULT KEY. *----------------------------------------------------------------------* * Tipler -- ham veri (drill-down icin bellekte tutulur) *----------------------------------------------------------------------* TYPES: BEGIN OF ty_snp, datum TYPE snap-datum, uzeit TYPE snap-uzeit, uname TYPE snap-uname, END OF ty_snp. TYPES: tt_snp TYPE STANDARD TABLE OF ty_snp WITH DEFAULT KEY. TYPES: BEGIN OF ty_job, jobname TYPE tbtco-jobname, jobcount TYPE tbtco-jobcount, strtdate TYPE tbtco-strtdate, strttime TYPE tbtco-strttime, enddate TYPE tbtco-enddate, endtime TYPE tbtco-endtime, status TYPE tbtco-status, authcknam TYPE tbtco-authcknam, END OF ty_job. TYPES: tt_job TYPE STANDARD TABLE OF ty_job WITH DEFAULT KEY. TYPES: BEGIN OF ty_step, jobname TYPE tbtcp-jobname, jobcount TYPE tbtcp-jobcount, stepcount TYPE tbtcp-stepcount, progname TYPE tbtcp-progname, END OF ty_step. TYPES: tt_step TYPE SORTED TABLE OF ty_step WITH NON-UNIQUE KEY jobname jobcount stepcount. TYPES: BEGIN OF ty_obj, object TYPE tadir-object, obj_name TYPE tadir-obj_name, devclass TYPE tadir-devclass, author TYPE tadir-author, END OF ty_obj. TYPES: tt_obj TYPE STANDARD TABLE OF ty_obj WITH DEFAULT KEY. TYPES: BEGIN OF ty_prg, name TYPE trdir-name, tur TYPE c LENGTH 20, devclass TYPE tadir-devclass, unam TYPE trdir-unam, udat TYPE trdir-udat, cnam TYPE trdir-cnam, END OF ty_prg. TYPES: tt_prg TYPE STANDARD TABLE OF ty_prg WITH DEFAULT KEY. * ALV detay listesi icin gosterim tipi TYPES: BEGIN OF ty_djob, jobname TYPE tbtco-jobname, progname TYPE tbtcp-progname, uname TYPE tbtco-authcknam, sdat TYPE tbtco-strtdate, stim TYPE tbtco-strttime, edat TYPE tbtco-enddate, etim TYPE tbtco-endtime, dakika TYPE i, durum TYPE c LENGTH 12, END OF ty_djob. TYPES: tt_djob TYPE STANDARD TABLE OF ty_djob WITH DEFAULT KEY. * ALV kolon basligi tanimi TYPES: BEGIN OF ty_hdr, fname TYPE lvc_fname, text TYPE string, END OF ty_hdr. TYPES: tt_hdr TYPE STANDARD TABLE OF ty_hdr WITH DEFAULT KEY. *----------------------------------------------------------------------* * Global veri -- gosterim *----------------------------------------------------------------------* DATA: gt_trend TYPE tt_kv, " gunluk dump gt_user TYPE tt_kv, " kullanici bazinda dump gt_job TYPE tt_kv, " program bazinda kesilen job gt_dur TYPE tt_kv, " en uzun joblar (dakika) gt_type TYPE tt_kv, " Z obje turleri gt_pkg TYPE tt_kv, " Z paketleri gt_month TYPE tt_kv. " aylik custom kod degisimi DATA: gt_tjob TYPE tt_row, " HTML: son kesilen joblar gt_tprg TYPE tt_row. " HTML: son degisen Z programlar DATA: gt_kpi1 TYPE tt_kpi, gt_kpi2 TYPE tt_kpi. DATA: gv_note_trend TYPE string, gv_note_job TYPE string, gv_note_month TYPE string. *----------------------------------------------------------------------* * Global veri -- ham (drill-down kaynagi) *----------------------------------------------------------------------* DATA: gt_snp TYPE tt_snp, " ham dump kayitlari gt_tbtco TYPE tt_job, " ham job kayitlari gt_step TYPE tt_step, " kesilen joblarin program adimlari gt_obj TYPE tt_obj, " ham TADIR kayitlari gt_prg TYPE tt_prg. " zenginlestirilmis TRDIR kayitlari *----------------------------------------------------------------------* * Global veri -- teknik *----------------------------------------------------------------------* DATA: gt_tpl TYPE TABLE OF string, " HTML iskeleti gv_html TYPE string. DATA: go_dock TYPE REF TO cl_gui_docking_container, go_html TYPE REF TO cl_gui_html_viewer. DATA: ok_code TYPE sy-ucomm, gv_ok TYPE sy-ucomm. * sapevent'ten gelen istek (islem PAI icinde yapilir) DATA: gv_act TYPE string, gv_key TYPE string. *----------------------------------------------------------------------* * sapevent yakalayicisi ( JavaScript -> ABAP ) *----------------------------------------------------------------------* CLASS lcl_evt DEFINITION FINAL. PUBLIC SECTION. CLASS-METHODS on_sapevent FOR EVENT sapevent OF cl_gui_html_viewer IMPORTING action getdata. ENDCLASS. *----------------------------------------------------------------------* * Secim ekrani *----------------------------------------------------------------------* SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-001. PARAMETERS: p_gun TYPE i DEFAULT 14, " kac gunluk sistem verisi p_ay TYPE i DEFAULT 12, " kac aylik custom kod trendi p_top TYPE i DEFAULT 8. " grafiklerde ilk N kayit SELECTION-SCREEN END OF BLOCK b1. SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE text-002. PARAMETERS: p_dump AS CHECKBOX DEFAULT 'X', " SNAP okunsun mu p_job AS CHECKBOX DEFAULT 'X', " TBTCO/TBTCP okunsun mu p_cc AS CHECKBOX DEFAULT 'X'. " TADIR/TRDIR okunsun mu SELECTION-SCREEN END OF BLOCK b2. SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE text-003. PARAMETERS: p_esd TYPE i DEFAULT 20, " gunluk dump esigi p_esj TYPE i DEFAULT 10. " kesilen job esigi SELECTION-SCREEN END OF BLOCK b3. *----------------------------------------------------------------------* START-OF-SELECTION. PERFORM f_collect. PERFORM f_build_html. CALL SCREEN 0100. *&---------------------------------------------------------------------* *& Module STATUS_0100 OUTPUT *&---------------------------------------------------------------------* MODULE status_0100 OUTPUT. SET PF-STATUS 'MAIN'. IF go_dock IS INITIAL. PERFORM f_create_viewer. ENDIF. ENDMODULE. *&---------------------------------------------------------------------* *& Module USER_COMMAND_0100 INPUT *&---------------------------------------------------------------------* MODULE user_command_0100 INPUT. DATA: lv_rc TYPE i. gv_ok = ok_code. CLEAR ok_code. * Application event olarak kaydedilen kontrol olaylarini yakalayicilara * yonlendirmek icin dispatch SART. Bu satir olmadan sapevent handler'i * hic calismaz -- en sik yapilan hata budur. CALL METHOD cl_gui_cfw=>dispatch IMPORTING return_code = lv_rc. CASE gv_ok. WHEN 'BACK' OR 'EXIT' OR 'CANCEL'. PERFORM f_free. LEAVE TO SCREEN 0. WHEN 'REFRESH'. PERFORM f_refresh. ENDCASE. * sapevent'ten gelen istek varsa burada isle IF gv_act IS NOT INITIAL. PERFORM f_drill. ENDIF. ENDMODULE. *&---------------------------------------------------------------------* *& Form F_COLLECT *&---------------------------------------------------------------------* FORM f_collect. CLEAR: gt_trend, gt_user, gt_job, gt_dur, gt_type, gt_pkg, gt_month, gt_tjob, gt_tprg, gt_kpi1, gt_kpi2, gv_note_trend, gv_note_job, gv_note_month, gt_snp, gt_tbtco, gt_step, gt_obj, gt_prg. IF p_gun < 1. p_gun = 14. ENDIF. IF p_ay < 1. p_ay = 12. ENDIF. IF p_top < 1. p_top = 8. ENDIF. PERFORM f_health. PERFORM f_custom. ENDFORM. *&---------------------------------------------------------------------* *& Form F_HEALTH ( SNAP + TBTCO + TBTCP + ENQUEUE_READ ) *&---------------------------------------------------------------------* FORM f_health. DATA: lt_abo TYPE tt_job, lt_agg TYPE tt_agg, lt_dur TYPE tt_kv, ls_step TYPE ty_step, ls_agg TYPE ty_agg, ls_kv TYPE ty_kv, ls_kpi TYPE ty_kpi, ls_row TYPE ty_row, lv_from TYPE sy-datum, lv_day TYPE sy-datum, lv_i TYPE i, lv_dump1 TYPE i, lv_dump0 TYPE i, lv_tot TYPE i, lv_abo TYPE i, lv_zabo TYPE i, lv_enq TYPE i, lv_min TYPE i, lv_sec TYPE i, lv_max TYPE i, lv_avg TYPE i, lv_sum TYPE i, lv_cnt TYPE i, lv_pct TYPE p DECIMALS 1, lv_num TYPE string, lv_txt TYPE string. DATA: lt_enq TYPE STANDARD TABLE OF seqg3. FIELD-SYMBOLS: TYPE ty_snp, TYPE ty_job, TYPE ty_kv. lv_from = sy-datum - p_gun + 1. * ---------- 1) Dump'lar (ST22 / SNAP) ----------------------------- * * SNAP her dump icin cok satir tutar. Tek satira indirmek icin dump * anahtari uzerinden DISTINCT aliyoruz. SEQNO alan tipi surumler * arasinda degistigi icin bilerek SEQNO filtresi kullanmiyoruz. IF p_dump = 'X'. SELECT DISTINCT datum uzeit uname FROM snap INTO TABLE gt_snp WHERE datum BETWEEN lv_from AND sy-datum. SORT gt_snp BY datum DESCENDING uzeit DESCENDING. ENDIF. * gunluk trend -- bos gunler de eksende yer alsin DO p_gun TIMES. lv_i = sy-index - 1. lv_day = lv_from + lv_i. CLEAR ls_kv. PERFORM f_ddmm USING lv_day CHANGING ls_kv-k. LOOP AT gt_snp ASSIGNING WHERE datum = lv_day. ls_kv-v = ls_kv-v + 1. ENDLOOP. APPEND ls_kv TO gt_trend. ENDDO. * kullanici bazinda dump LOOP AT gt_snp ASSIGNING . CLEAR ls_agg. ls_agg-k = -uname. ls_agg-v = 1. COLLECT ls_agg INTO lt_agg. ENDLOOP. SORT lt_agg BY v DESCENDING. PERFORM f_agg2kv USING p_top CHANGING lt_agg gt_user. LOOP AT gt_snp ASSIGNING WHERE datum = sy-datum. lv_dump1 = lv_dump1 + 1. ENDLOOP. lv_day = sy-datum - 1. LOOP AT gt_snp ASSIGNING WHERE datum = lv_day. lv_dump0 = lv_dump0 + 1. ENDLOOP. * ---------- 2) Background job'lar (SM37 / TBTCO + TBTCP) ---------- * IF p_job = 'X'. SELECT jobname jobcount strtdate strttime enddate endtime status authcknam FROM tbtco INTO TABLE gt_tbtco WHERE enddate GE lv_from. ENDIF. lv_tot = lines( gt_tbtco ). LOOP AT gt_tbtco ASSIGNING WHERE status = 'A'. APPEND TO lt_abo. ENDLOOP. lv_abo = lines( lt_abo ). * TBTCP'yi SADECE kesilen joblar icin oku. Buraya tum joblari * verirsen (orn. 90.000 satir) FOR ALL ENTRIES sistemi zorlar. IF lt_abo IS NOT INITIAL. SELECT jobname jobcount stepcount progname FROM tbtcp INTO TABLE gt_step FOR ALL ENTRIES IN lt_abo WHERE jobname = lt_abo-jobname AND jobcount = lt_abo-jobcount. ENDIF. * program bazinda kesilen job + custom kod payi CLEAR lt_agg. LOOP AT lt_abo ASSIGNING . PERFORM f_prog USING -jobname -jobcount CHANGING ls_step-progname. CLEAR ls_agg. ls_agg-k = ls_step-progname. ls_agg-v = 1. COLLECT ls_agg INTO lt_agg. IF ls_step-progname CP 'Z*' OR ls_step-progname CP 'Y*'. lv_zabo = lv_zabo + 1. ENDIF. ENDLOOP. SORT lt_agg BY v DESCENDING. PERFORM f_agg2kv USING p_top CHANGING lt_agg gt_job. * en uzun suren job'lar LOOP AT gt_tbtco ASSIGNING . PERFORM f_dakika USING CHANGING lv_min. IF lv_min <= 0. CONTINUE. ENDIF. CLEAR ls_kv. ls_kv-k = -jobname. ls_kv-v = lv_min. APPEND ls_kv TO lt_dur. ENDLOOP. SORT lt_dur BY v DESCENDING. PERFORM f_top USING p_top CHANGING lt_dur. gt_dur = lt_dur. * HTML tablosu: en son kesilen 20 job SORT lt_abo BY enddate DESCENDING endtime DESCENDING. LOOP AT lt_abo ASSIGNING . IF sy-tabix > 20. EXIT. ENDIF. PERFORM f_prog USING -jobname -jobcount CHANGING ls_step-progname. PERFORM f_dakika USING CHANGING lv_min. CLEAR ls_row. ls_row-c1 = -jobname. ls_row-c2 = ls_step-progname. ls_row-c3 = -authcknam. PERFORM f_dtstr USING -enddate -endtime CHANGING ls_row-c4. lv_num = lv_min. CONDENSE lv_num. ls_row-c5 = lv_num. PERFORM f_stat USING -status CHANGING ls_row-c6. APPEND ls_row TO gt_tjob. ENDLOOP. * ---------- 3) Kilitler (SM12 / ENQUEUE_READ) --------------------- * CALL FUNCTION 'ENQUEUE_READ' EXPORTING gclient = sy-mandt gname = space garg = space guname = space IMPORTING number = lv_enq TABLES enq = lt_enq EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. lv_enq = 0. ENDIF. * ---------- 4) KPI kartlari ---------------------------------------- * CLEAR ls_kpi. ls_kpi-lbl = 'Dump (son 24 saat)'. PERFORM f_nfmt USING lv_dump1 CHANGING lv_num. ls_kpi-val = lv_num. PERFORM f_nfmt USING lv_dump0 CHANGING lv_num. CONCATENATE 'önceki gün' lv_num INTO ls_kpi-sub SEPARATED BY space. IF p_dump <> 'X'. ls_kpi-val = '-'. ls_kpi-sub = 'SNAP okuması kapalı'. ELSEIF lv_dump1 > p_esd. lv_num = p_esd. CONDENSE lv_num. ls_kpi-st = 'crit'. CONCATENATE 'Kritik · eşik' lv_num INTO ls_kpi-stx SEPARATED BY space. ELSE. ls_kpi-st = 'good'. ls_kpi-stx = 'Normal'. ENDIF. APPEND ls_kpi TO gt_kpi1. CLEAR ls_kpi. lv_num = p_gun. CONDENSE lv_num. CONCATENATE 'Kesilen job (' lv_num ' gün)' INTO ls_kpi-lbl. PERFORM f_nfmt USING lv_abo CHANGING lv_num. ls_kpi-val = lv_num. PERFORM f_nfmt USING lv_tot CHANGING lv_num. CONCATENATE 'toplam' lv_num 'job' INTO ls_kpi-sub SEPARATED BY space. IF p_job <> 'X'. ls_kpi-val = '-'. ls_kpi-sub = 'TBTCO okuması kapalı'. ELSEIF lv_abo > p_esj. lv_num = p_esj. CONDENSE lv_num. ls_kpi-st = 'warn'. CONCATENATE 'Dikkat · eşik' lv_num INTO ls_kpi-stx SEPARATED BY space. ELSE. ls_kpi-st = 'good'. ls_kpi-stx = 'Normal'. ENDIF. APPEND ls_kpi TO gt_kpi1. CLEAR ls_kpi. ls_kpi-lbl = 'Job hata oranı'. IF p_job <> 'X'. ls_kpi-val = '-'. ls_kpi-sub = 'TBTCO okuması kapalı'. ELSE. IF lv_tot > 0. lv_pct = lv_abo * 100 / lv_tot. ELSE. lv_pct = 0. ENDIF. lv_num = lv_pct. CONDENSE lv_num. REPLACE ALL OCCURRENCES OF '.' IN lv_num WITH ','. CONCATENATE '%' lv_num INTO ls_kpi-val. PERFORM f_nfmt USING lv_abo CHANGING lv_num. ls_kpi-sub = lv_num. PERFORM f_nfmt USING lv_tot CHANGING lv_num. CONCATENATE ls_kpi-sub '/' lv_num INTO ls_kpi-sub SEPARATED BY space. IF lv_pct > 5. ls_kpi-st = 'crit'. ls_kpi-stx = 'Yüksek'. ELSE. ls_kpi-st = 'good'. ls_kpi-stx = 'Normal'. ENDIF. ENDIF. APPEND ls_kpi TO gt_kpi1. CLEAR ls_kpi. ls_kpi-lbl = 'Kilit girişi (SM12)'. PERFORM f_nfmt USING lv_enq CHANGING lv_num. ls_kpi-val = lv_num. ls_kpi-sub = 'anlık ENQUEUE_READ'. ls_kpi-st = 'good'. ls_kpi-stx = 'Normal'. APPEND ls_kpi TO gt_kpi1. * ---------- 5) Grafik altindaki yorumlar --------------------------- * LOOP AT gt_trend ASSIGNING . lv_sum = lv_sum + -v. lv_cnt = lv_cnt + 1. IF -v > lv_max. lv_max = -v. lv_txt = -k. ENDIF. ENDLOOP. IF lv_cnt > 0. lv_avg = lv_sum / lv_cnt. ENDIF. IF lv_max > 0 AND lv_max > lv_avg * 2. PERFORM f_nfmt USING lv_max CHANGING lv_num. CONCATENATE 'En yüksek gün' lv_txt '·' lv_num 'dump · ortalamanın iki katından fazla.' INTO gv_note_trend SEPARATED BY space. ELSE. gv_note_trend = 'Ortalamayı belirgin şekilde aşan bir gün yok.'. ENDIF. IF lv_abo > 0. PERFORM f_nfmt USING lv_zabo CHANGING lv_num. CONCATENATE 'Kesilen job''ların' lv_num 'tanesi custom kod (Z*/Y*) kaynaklı.' INTO gv_note_job SEPARATED BY space. ELSE. gv_note_job = 'Seçilen dönemde kesilen job yok.'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form F_CUSTOM ( TADIR + TRDIR + USR02 ) *&---------------------------------------------------------------------* FORM f_custom. TYPES: BEGIN OF ty_usr, bname TYPE usr02-bname, END OF ty_usr. TYPES: BEGIN OF ty_trd, name TYPE trdir-name, subc TYPE trdir-subc, cnam TYPE trdir-cnam, unam TYPE trdir-unam, udat TYPE trdir-udat, END OF ty_trd. DATA: lt_trd TYPE STANDARD TABLE OF ty_trd, lt_pkg TYPE SORTED TABLE OF ty_obj WITH NON-UNIQUE KEY obj_name, lt_usr TYPE SORTED TABLE OF ty_usr WITH UNIQUE KEY bname, lt_type TYPE tt_agg, lt_dev TYPE tt_agg, ls_obj TYPE ty_obj, ls_agg TYPE ty_agg, ls_kv TYPE ty_kv, ls_kpi TYPE ty_kpi, ls_row TYPE ty_row, ls_prg TYPE ty_prg, lv_num TYPE string, lv_lbl TYPE string, lv_from TYPE sy-datum, lv_mon TYPE sy-datum, lv_ym TYPE c LENGTH 6, lv_tot TYPE i, lv_chg TYPE i, lv_orp TYPE i, lv_tmp TYPE i, lv_pak TYPE i, lv_i TYPE i, lv_mx TYPE i. FIELD-SYMBOLS: TYPE ty_obj, TYPE ty_trd,

TYPE ty_prg, TYPE ty_kv. IF p_cc <> 'X'. RETURN. ENDIF. SELECT object obj_name devclass author FROM tadir INTO TABLE gt_obj WHERE pgmid = 'R3TR' AND delflag = space AND ( obj_name LIKE 'Z%' OR obj_name LIKE 'Y%' ). SELECT bname FROM usr02 INTO TABLE lt_usr. SELECT name subc cnam unam udat FROM trdir INTO TABLE lt_trd WHERE name LIKE 'Z%' OR name LIKE 'Y%'. lv_tot = lines( gt_obj ). * obje turu / paket dagilimi, sahipsiz ve $TMP sayimi LOOP AT gt_obj ASSIGNING . CLEAR ls_agg. ls_agg-k = -object. ls_agg-v = 1. COLLECT ls_agg INTO lt_type. CLEAR ls_agg. ls_agg-k = -devclass. ls_agg-v = 1. COLLECT ls_agg INTO lt_dev. IF -devclass = '$TMP'. lv_tmp = lv_tmp + 1. ENDIF. IF -author IS NOT INITIAL. READ TABLE lt_usr TRANSPORTING NO FIELDS WITH TABLE KEY bname = -author. IF sy-subrc <> 0. lv_orp = lv_orp + 1. ENDIF. ENDIF. IF -object = 'PROG'. INSERT INTO TABLE lt_pkg. ENDIF. ENDLOOP. lv_pak = lines( lt_dev ). SORT lt_type BY v DESCENDING. PERFORM f_agg2kv USING 10 CHANGING lt_type gt_type. SORT lt_dev BY v DESCENDING. PERFORM f_agg2kv USING 10 CHANGING lt_dev gt_pkg. * TRDIR kayitlarini zenginlestir (tur metni + paket) ve sakla LOOP AT lt_trd ASSIGNING . CLEAR ls_prg. ls_prg-name = -name. PERFORM f_subc USING -subc CHANGING lv_lbl. ls_prg-tur = lv_lbl. CLEAR ls_obj. READ TABLE lt_pkg INTO ls_obj WITH KEY obj_name = -name. ls_prg-devclass = ls_obj-devclass. ls_prg-unam = -unam. ls_prg-udat = -udat. ls_prg-cnam = -cnam. APPEND ls_prg TO gt_prg. ENDLOOP. SORT gt_prg BY udat DESCENDING name ASCENDING. * aylik degisim trendi -- p_ay ay geriye git lv_mon = sy-datum. lv_mon+6(2) = '01'. lv_i = p_ay - 1. WHILE lv_i > 0. lv_mon = lv_mon - 1. lv_mon+6(2) = '01'. lv_i = lv_i - 1. ENDWHILE. DO p_ay TIMES. CLEAR ls_kv. CONCATENATE lv_mon+4(2) '.' lv_mon+2(2) INTO ls_kv-k. lv_ym = lv_mon+0(6). * Dikkat: LOOP AT ... WHERE icinde offset (udat+0(6)) KULLANILAMAZ. LOOP AT gt_prg ASSIGNING

. IF

-udat+0(6) = lv_ym. ls_kv-v = ls_kv-v + 1. ENDIF. ENDLOOP. APPEND ls_kv TO gt_month. lv_mon = lv_mon + 31. lv_mon+6(2) = '01'. ENDDO. * son 30 gunde degisen + HTML tablosu (ilk 20) lv_from = sy-datum - 30. LOOP AT gt_prg ASSIGNING

. IF

-udat >= lv_from. lv_chg = lv_chg + 1. ENDIF. IF sy-tabix <= 20. CLEAR ls_row. ls_row-c1 =

-name. ls_row-c2 =

-tur. ls_row-c3 =

-devclass. ls_row-c4 =

-unam. PERFORM f_dstr USING

-udat CHANGING ls_row-c5. ls_row-c6 =

-cnam. APPEND ls_row TO gt_tprg. ENDIF. ENDLOOP. * ---------- KPI kartlari ------------------------------------------- * CLEAR ls_kpi. ls_kpi-lbl = 'Toplam Z/Y objesi'. PERFORM f_nfmt USING lv_tot CHANGING lv_num. ls_kpi-val = lv_num. PERFORM f_nfmt USING lv_pak CHANGING lv_num. CONCATENATE 'TADIR ·' lv_num 'paket' INTO ls_kpi-sub SEPARATED BY space. APPEND ls_kpi TO gt_kpi2. CLEAR ls_kpi. ls_kpi-lbl = 'Son 30 günde değişen'. PERFORM f_nfmt USING lv_chg CHANGING lv_num. ls_kpi-val = lv_num. ls_kpi-sub = 'TRDIR-UDAT'. APPEND ls_kpi TO gt_kpi2. CLEAR ls_kpi. ls_kpi-lbl = 'Sahipsiz obje'. PERFORM f_nfmt USING lv_orp CHANGING lv_num. ls_kpi-val = lv_num. ls_kpi-sub = 'sahibi sistemde tanımlı değil'. IF lv_orp > 0. ls_kpi-st = 'warn'. ls_kpi-stx = 'Devir gerekiyor'. ELSE. ls_kpi-st = 'good'. ls_kpi-stx = 'Temiz'. ENDIF. APPEND ls_kpi TO gt_kpi2. CLEAR ls_kpi. ls_kpi-lbl = '$TMP''de kalan'. PERFORM f_nfmt USING lv_tmp CHANGING lv_num. ls_kpi-val = lv_num. ls_kpi-sub = 'transport edilemez'. IF lv_tmp > 0. ls_kpi-st = 'crit'. ls_kpi-stx = 'Riskli'. ELSE. ls_kpi-st = 'good'. ls_kpi-stx = 'Temiz'. ENDIF. APPEND ls_kpi TO gt_kpi2. * ---------- yorum -------------------------------------------------- * LOOP AT gt_month ASSIGNING . IF -v > lv_mx. lv_mx = -v. lv_lbl = -k. ENDIF. ENDLOOP. IF lv_mx > 0. PERFORM f_nfmt USING lv_mx CHANGING lv_num. CONCATENATE 'En yoğun ay' lv_lbl '·' lv_num 'program değişikliği.' INTO gv_note_month SEPARATED BY space. ELSE. gv_note_month = 'Seçilen dönemde Z program değişikliği kaydı yok.'. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form F_PROG ( job adiminin ABAP programi ) *&---------------------------------------------------------------------* FORM f_prog USING iv_job TYPE tbtco-jobname iv_cnt TYPE tbtco-jobcount CHANGING cv_prog TYPE tbtcp-progname. DATA: ls_step TYPE ty_step. CLEAR cv_prog. READ TABLE gt_step INTO ls_step WITH KEY jobname = iv_job jobcount = iv_cnt. IF sy-subrc = 0. cv_prog = ls_step-progname. ENDIF. IF cv_prog IS INITIAL. cv_prog = iv_job. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Form F_DAKIKA ( job suresi, dakika ) *& Baslamadan iptal edilen job'da STRTDATE bos kalir; '00000000' *& cikarma islemine girerse sure ~740.000 gun cikar ve grafigi ezer. *&---------------------------------------------------------------------* FORM f_dakika USING is_job TYPE ty_job CHANGING cv_min TYPE i. DATA: lv_sec TYPE i. CLEAR cv_min. IF is_job-strtdate IS INITIAL OR is_job-enddate IS INITIAL. RETURN. ENDIF. lv_sec = ( is_job-enddate - is_job-strtdate ) * 86400 + ( is_job-endtime - is_job-strttime ). IF lv_sec <= 0. RETURN. ENDIF. cv_min = lv_sec / 60. ENDFORM. *&---------------------------------------------------------------------* *& Form F_STAT ( TBTCO durum kodu -> metin ) *&---------------------------------------------------------------------* FORM f_stat USING iv_s TYPE tbtco-status CHANGING cv TYPE any. CASE iv_s. WHEN 'A'. cv = 'Kesildi'. WHEN 'F'. cv = 'Bitti'. WHEN 'R'. cv = 'Çalışıyor'. WHEN 'S'. cv = 'Planlı'. WHEN 'P'. cv = 'Serbest'. WHEN 'Y'. cv = 'Hazır'. WHEN 'Z'. cv = 'Devam ediyor'. WHEN OTHERS. cv = iv_s. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form F_BUILD_HTML ( iskelet + iki JSON ) *&---------------------------------------------------------------------* FORM f_build_html. DATA: lv_data TYPE string, lv_meta TYPE string, lv_s TYPE string, lv_num TYPE string. PERFORM f_template. CONCATENATE LINES OF gt_tpl INTO gv_html SEPARATED BY cl_abap_char_utilities=>newline. * ---- var D = { ... } --------------------------------------------- * lv_data = `var D = {`. PERFORM f_kv USING gt_trend `trend` CHANGING lv_data. PERFORM f_kv USING gt_user `user` CHANGING lv_data. PERFORM f_kv USING gt_job `job` CHANGING lv_data. PERFORM f_kv USING gt_dur `dur` CHANGING lv_data. PERFORM f_kv USING gt_type `type` CHANGING lv_data. PERFORM f_kv USING gt_pkg `pkg` CHANGING lv_data. PERFORM f_kv USING gt_month `month` CHANGING lv_data. PERFORM f_rows USING gt_tjob `tJob` CHANGING lv_data. PERFORM f_rows USING gt_tprg `tPrg` CHANGING lv_data. * son virgulu bozmamak icin zararsiz bir kapanis anahtari CONCATENATE lv_data `x:0};` INTO lv_data. * ---- var M = { ... } --------------------------------------------- * lv_meta = `var M = {sys:{`. PERFORM f_str USING `sid` sy-sysid CHANGING lv_meta. PERFORM f_str USING `cli` sy-mandt CHANGING lv_meta. PERFORM f_str USING `usr` sy-uname CHANGING lv_meta. PERFORM f_dtstr USING sy-datum sy-uzeit CHANGING lv_s. PERFORM f_str USING `ts` lv_s CHANGING lv_meta. lv_num = p_gun. CONDENSE lv_num. CONCATENATE lv_meta `days:` lv_num `},` INTO lv_meta. PERFORM f_kpi USING gt_kpi1 `kpi1` CHANGING lv_meta. PERFORM f_kpi USING gt_kpi2 `kpi2` CHANGING lv_meta. CONCATENATE lv_meta `notes:{` INTO lv_meta. PERFORM f_str USING `trend` gv_note_trend CHANGING lv_meta. PERFORM f_str USING `job` gv_note_job CHANGING lv_meta. PERFORM f_str USING `month` gv_note_month CHANGING lv_meta. CONCATENATE lv_meta `x:0}};` INTO lv_meta. REPLACE ALL OCCURRENCES OF `{{DATA}}` IN gv_html WITH lv_data. REPLACE ALL OCCURRENCES OF `{{META}}` IN gv_html WITH lv_meta. ENDFORM. *&---------------------------------------------------------------------* *& Form F_KV tt_kv -> ad:{l:[..],v:[..]}, *&---------------------------------------------------------------------* FORM f_kv USING it TYPE tt_kv iv_name TYPE string CHANGING cv TYPE string. DATA: lv_l TYPE string, lv_v TYPE string, lv_n TYPE string, lv_e TYPE string. FIELD-SYMBOLS TYPE ty_kv. LOOP AT it ASSIGNING . IF sy-tabix > 1. CONCATENATE lv_l `,` INTO lv_l. CONCATENATE lv_v `,` INTO lv_v. ENDIF. lv_e = -k. PERFORM f_esc CHANGING lv_e. CONCATENATE lv_l `"` lv_e `"` INTO lv_l. lv_n = -v. CONDENSE lv_n. CONCATENATE lv_v lv_n INTO lv_v. ENDLOOP. CONCATENATE cv iv_name `:{l:[` lv_l `],v:[` lv_v `]},` INTO cv. ENDFORM. *&---------------------------------------------------------------------* *& Form F_ROWS tt_row -> ad:[["a","b",..],..], *&---------------------------------------------------------------------* FORM f_rows USING it TYPE tt_row iv_name TYPE string CHANGING cv TYPE string. DATA: lv_all TYPE string, lv_one TYPE string, lv_e TYPE string, lv_i TYPE i. FIELD-SYMBOLS: TYPE ty_row, TYPE string. LOOP AT it ASSIGNING . IF sy-tabix > 1. CONCATENATE lv_all `,` INTO lv_all. ENDIF. CLEAR lv_one. DO 6 TIMES. lv_i = sy-index. ASSIGN COMPONENT lv_i OF STRUCTURE TO . IF sy-subrc <> 0. EXIT. ENDIF. IF lv_i > 1. CONCATENATE lv_one `,` INTO lv_one. ENDIF. lv_e = . PERFORM f_esc CHANGING lv_e. CONCATENATE lv_one `"` lv_e `"` INTO lv_one. ENDDO. CONCATENATE lv_all `[` lv_one `]` INTO lv_all. ENDLOOP. CONCATENATE cv iv_name `:[` lv_all `],` INTO cv. ENDFORM. *&---------------------------------------------------------------------* *& Form F_KPI tt_kpi -> ad:[{lbl:"..",..},..], *&---------------------------------------------------------------------* FORM f_kpi USING it TYPE tt_kpi iv_name TYPE string CHANGING cv TYPE string. DATA: lv_all TYPE string, lv_one TYPE string. FIELD-SYMBOLS TYPE ty_kpi. LOOP AT it ASSIGNING . IF sy-tabix > 1. CONCATENATE lv_all `,` INTO lv_all. ENDIF. lv_one = `{`. PERFORM f_str USING `lbl` -lbl CHANGING lv_one. PERFORM f_str USING `val` -val CHANGING lv_one. PERFORM f_str USING `sub` -sub CHANGING lv_one. PERFORM f_str USING `st` -st CHANGING lv_one. PERFORM f_str USING `stx` -stx CHANGING lv_one. CONCATENATE lv_one `x:0}` INTO lv_one. CONCATENATE lv_all lv_one INTO lv_all. ENDLOOP. CONCATENATE cv iv_name `:[` lv_all `],` INTO cv. ENDFORM. *&---------------------------------------------------------------------* *& Form F_STR / F_ESC *&---------------------------------------------------------------------* FORM f_str USING iv_key TYPE string iv_val TYPE any CHANGING cv TYPE string. DATA: lv_e TYPE string. lv_e = iv_val. PERFORM f_esc CHANGING lv_e. CONCATENATE cv iv_key `:"` lv_e `",` INTO cv. ENDFORM. FORM f_esc CHANGING cv TYPE string. REPLACE ALL OCCURRENCES OF `\` IN cv WITH `\\`. REPLACE ALL OCCURRENCES OF `"` IN cv WITH `\"`. REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>cr_lf IN cv WITH space. REPLACE ALL OCCURRENCES OF cl_abap_char_utilities=>newline IN cv WITH space. ENDFORM. *&---------------------------------------------------------------------* *& Form F_AGG2KV / F_TOP *&---------------------------------------------------------------------* FORM f_agg2kv USING iv_top TYPE i CHANGING ct_agg TYPE tt_agg ct_kv TYPE tt_kv. DATA: ls_kv TYPE ty_kv. FIELD-SYMBOLS TYPE ty_agg. CLEAR ct_kv. LOOP AT ct_agg ASSIGNING . IF sy-tabix > iv_top. EXIT. ENDIF. CLEAR ls_kv. ls_kv-k = -k. CONDENSE ls_kv-k. IF ls_kv-k IS INITIAL. ls_kv-k = '(bos)'. ENDIF. ls_kv-v = -v. APPEND ls_kv TO ct_kv. ENDLOOP. ENDFORM. *&---------------------------------------------------------------------* *& Form F_NFMT ( 90733 -> 90.733 ) *&---------------------------------------------------------------------* FORM f_nfmt USING iv_n TYPE i CHANGING cv TYPE string. DATA: lv_s TYPE string, lv_o TYPE string, lv_i TYPE i, lv_c TYPE i. lv_s = iv_n. CONDENSE lv_s. lv_i = strlen( lv_s ) - 1. WHILE lv_i >= 0. CONCATENATE lv_s+lv_i(1) lv_o INTO lv_o. lv_c = lv_c + 1. IF lv_c MOD 3 = 0 AND lv_i > 0. CONCATENATE '.' lv_o INTO lv_o. ENDIF. lv_i = lv_i - 1. ENDWHILE. cv = lv_o. ENDFORM. FORM f_top USING iv_n TYPE i CHANGING ct TYPE tt_kv. DATA: lv_n TYPE i. lv_n = iv_n + 1. IF lines( ct ) >= lv_n. DELETE ct FROM lv_n. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& Formatlama yardimcilari *&---------------------------------------------------------------------* FORM f_ddmm USING iv_d TYPE sy-datum CHANGING cv TYPE string. CONCATENATE iv_d+6(2) '.' iv_d+4(2) INTO cv. ENDFORM. FORM f_dstr USING iv_d TYPE sy-datum CHANGING cv TYPE string. IF iv_d IS INITIAL. CLEAR cv. RETURN. ENDIF. CONCATENATE iv_d+6(2) '.' iv_d+4(2) '.' iv_d+0(4) INTO cv. ENDFORM. FORM f_dtstr USING iv_d TYPE sy-datum iv_t TYPE sy-uzeit CHANGING cv TYPE any. DATA: lv_d TYPE string, lv_t TYPE string. PERFORM f_dstr USING iv_d CHANGING lv_d. IF lv_d IS INITIAL. CLEAR cv. RETURN. ENDIF. CONCATENATE iv_t+0(2) ':' iv_t+2(2) INTO lv_t. CONCATENATE lv_d lv_t INTO cv SEPARATED BY space. ENDFORM. FORM f_subc USING iv_s TYPE trdir-subc CHANGING cv TYPE string. CASE iv_s. WHEN '1'. cv = 'Rapor'. WHEN 'I'. cv = 'Include'. WHEN 'M'. cv = 'Modül havuzu'. WHEN 'F'. cv = 'Fonksiyon grubu'. WHEN 'K'. cv = 'Sınıf havuzu'. WHEN 'J'. cv = 'Arayüz havuzu'. WHEN 'S'. cv = 'Subroutine pool'. WHEN 'T'. cv = 'Tip havuzu'. WHEN OTHERS. cv = iv_s. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form F_CREATE_VIEWER *&---------------------------------------------------------------------* FORM f_create_viewer. DATA: lt_ev TYPE cntl_simple_events, ls_ev TYPE cntl_simple_event. CREATE OBJECT go_dock EXPORTING repid = sy-repid dynnr = '0100' side = cl_gui_docking_container=>dock_at_left extension = 99999 EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE 'Container oluşturulamadı' TYPE 'A'. ENDIF. CREATE OBJECT go_html EXPORTING parent = go_dock EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE 'HTML Viewer oluşturulamadı' TYPE 'A'. ENDIF. * JavaScript -> ABAP geri cagrisi icin sapevent'i kaydet ls_ev-eventid = go_html->m_id_sapevent. ls_ev-appl_event = 'X'. APPEND ls_ev TO lt_ev. go_html->set_registered_events( events = lt_ev ). SET HANDLER lcl_evt=>on_sapevent FOR go_html. PERFORM f_show. ENDFORM. *&---------------------------------------------------------------------* *& Form F_SHOW *& KRITIK: string'i 1000 karakterlik parcalara BOLMEYIN. *& Parcalama JS token'ini ortadan keser ve type C dolgu bosluklari *& ekler -> grafik sessizce kaybolur. Dogrusu: UTF-8 xstring + *& binary tablo + BOM. *&---------------------------------------------------------------------* FORM f_show. DATA: lo_conv TYPE REF TO cl_abap_conv_out_ce, lv_x TYPE xstring, lt_bin TYPE solix_tab, lv_len TYPE i, lv_url TYPE c LENGTH 500. lo_conv = cl_abap_conv_out_ce=>create( encoding = 'UTF-8' ). CALL METHOD lo_conv->convert EXPORTING data = gv_html IMPORTING buffer = lv_x. * BOM: eski IE tabanli kontrolun kod sayfasini dogru secmesi icin CONCATENATE cl_abap_char_utilities=>byte_order_mark_utf8 lv_x INTO lv_x IN BYTE MODE. lv_len = xstrlen( lv_x ). lt_bin = cl_bcs_convert=>xstring_to_solix( lv_x ). * Cok eski surumlerde alternatif: FM 'SCMS_XSTRING_TO_BINARY' CALL METHOD go_html->load_data EXPORTING url = 'panel.html' type = 'text' subtype = 'html' size = lv_len IMPORTING assigned_url = lv_url CHANGING data_table = lt_bin EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE 'HTML yüklenemedi' TYPE 'A'. ENDIF. CALL METHOD go_html->show_url EXPORTING url = lv_url EXCEPTIONS OTHERS = 1. ENDFORM. *&---------------------------------------------------------------------* *& Form F_DRILL *& Tiklanan ogeye gore FILTRELENMIS detay listesini acar. *& Transaction'i bos secim ekraniyla acmak yerine, kullanicinin *& tikladigi kritere gore hazirlanmis ALV popup gosterilir. *&---------------------------------------------------------------------* FORM f_drill. DATA: lv_act TYPE string, lv_key TYPE string, lv_prog TYPE progname. lv_act = gv_act. lv_key = gv_key. CLEAR: gv_act, gv_key. CASE lv_act. WHEN 'DMPD'. " dump trendi: gun PERFORM f_alv_dump USING 'D' lv_key. WHEN 'DMPU'. " dump: kullanici PERFORM f_alv_dump USING 'U' lv_key. WHEN 'JOBP'. " kesilen job: program PERFORM f_alv_job USING 'P' lv_key. WHEN 'JOBN'. " job adi (sure grafigi / tablo) PERFORM f_alv_job USING 'N' lv_key. WHEN 'OBJT'. " Z obje turu PERFORM f_alv_obj USING 'T' lv_key. WHEN 'OBJP'. " Z paketi PERFORM f_alv_obj USING 'P' lv_key. WHEN 'MNTH'. " ay PERFORM f_alv_prg USING lv_key. WHEN 'SE38'. " programi dogrudan ac IF lv_key IS NOT INITIAL. lv_prog = lv_key. CALL FUNCTION 'RS_TOOL_ACCESS' EXPORTING operation = 'SHOW' object_name = lv_prog object_type = 'PROG' EXCEPTIONS OTHERS = 1. ENDIF. WHEN 'REFRESH'. PERFORM f_refresh. ENDCASE. ENDFORM. *&---------------------------------------------------------------------* *& Form F_ALV_DUMP ( ST22 detayi ) *&---------------------------------------------------------------------* FORM f_alv_dump USING iv_mode TYPE c iv_key TYPE string. DATA: lt_out TYPE tt_snp, lt_hdr TYPE tt_hdr, ls_hdr TYPE ty_hdr, lv_ddmm TYPE string, lv_ttl TYPE string. FIELD-SYMBOLS TYPE ty_snp. LOOP AT gt_snp ASSIGNING . IF iv_mode = 'U'. IF -uname <> iv_key. CONTINUE. ENDIF. ELSE. PERFORM f_ddmm USING -datum CHANGING lv_ddmm. IF lv_ddmm <> iv_key. CONTINUE. ENDIF. ENDIF. APPEND TO lt_out. ENDLOOP. IF iv_mode = 'U'. CONCATENATE 'Dump kayıtları - kullanıcı' iv_key INTO lv_ttl SEPARATED BY space. ELSE. CONCATENATE 'Dump kayıtları -' iv_key INTO lv_ttl SEPARATED BY space. ENDIF. ls_hdr-fname = 'DATUM'. ls_hdr-text = 'Tarih'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'UZEIT'. ls_hdr-text = 'Saat'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'UNAME'. ls_hdr-text = 'Kullanıcı'. APPEND ls_hdr TO lt_hdr. PERFORM f_alv USING lv_ttl lt_hdr CHANGING lt_out. ENDFORM. *&---------------------------------------------------------------------* *& Form F_ALV_JOB ( SM37 detayi ) *&---------------------------------------------------------------------* FORM f_alv_job USING iv_mode TYPE c iv_key TYPE string. DATA: lt_out TYPE tt_djob, ls_out TYPE ty_djob, lt_hdr TYPE tt_hdr, ls_hdr TYPE ty_hdr, lv_prog TYPE tbtcp-progname, lv_min TYPE i, lv_ttl TYPE string. FIELD-SYMBOLS TYPE ty_job. LOOP AT gt_tbtco ASSIGNING . IF iv_mode = 'N'. IF -jobname <> iv_key. CONTINUE. ENDIF. ELSE. * program bazinda: sadece kesilen joblarda program adi bilinir IF -status <> 'A'. CONTINUE. ENDIF. PERFORM f_prog USING -jobname -jobcount CHANGING lv_prog. IF lv_prog <> iv_key. CONTINUE. ENDIF. ENDIF. CLEAR ls_out. ls_out-jobname = -jobname. IF -status = 'A'. PERFORM f_prog USING -jobname -jobcount CHANGING lv_prog. ls_out-progname = lv_prog. ENDIF. ls_out-uname = -authcknam. ls_out-sdat = -strtdate. ls_out-stim = -strttime. ls_out-edat = -enddate. ls_out-etim = -endtime. PERFORM f_dakika USING CHANGING lv_min. ls_out-dakika = lv_min. PERFORM f_stat USING -status CHANGING ls_out-durum. APPEND ls_out TO lt_out. ENDLOOP. SORT lt_out BY edat DESCENDING etim DESCENDING. IF iv_mode = 'N'. CONCATENATE 'Job çalışmaları -' iv_key INTO lv_ttl SEPARATED BY space. ELSE. CONCATENATE 'Kesilen job''lar - program' iv_key INTO lv_ttl SEPARATED BY space. ENDIF. ls_hdr-fname = 'JOBNAME'. ls_hdr-text = 'Job adı'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'PROGNAME'. ls_hdr-text = 'Program'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'UNAME'. ls_hdr-text = 'Kullanıcı'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'SDAT'. ls_hdr-text = 'Başl.tarih'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'STIM'. ls_hdr-text = 'Başl.saat'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'EDAT'. ls_hdr-text = 'Bitiş tarih'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'ETIM'. ls_hdr-text = 'Bitiş saat'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'DAKIKA'. ls_hdr-text = 'Süre (dk)'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'DURUM'. ls_hdr-text = 'Durum'. APPEND ls_hdr TO lt_hdr. PERFORM f_alv USING lv_ttl lt_hdr CHANGING lt_out. ENDFORM. *&---------------------------------------------------------------------* *& Form F_ALV_OBJ ( TADIR detayi ) *&---------------------------------------------------------------------* FORM f_alv_obj USING iv_mode TYPE c iv_key TYPE string. DATA: lt_out TYPE tt_obj, lt_hdr TYPE tt_hdr, ls_hdr TYPE ty_hdr, lv_ttl TYPE string. FIELD-SYMBOLS TYPE ty_obj. LOOP AT gt_obj ASSIGNING . IF iv_mode = 'T'. IF -object <> iv_key. CONTINUE. ENDIF. ELSE. IF -devclass <> iv_key. CONTINUE. ENDIF. ENDIF. APPEND TO lt_out. ENDLOOP. SORT lt_out BY obj_name. IF iv_mode = 'T'. CONCATENATE 'Z/Y objeleri - tür' iv_key INTO lv_ttl SEPARATED BY space. ELSE. CONCATENATE 'Z/Y objeleri - paket' iv_key INTO lv_ttl SEPARATED BY space. ENDIF. ls_hdr-fname = 'OBJECT'. ls_hdr-text = 'Tür'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'OBJ_NAME'. ls_hdr-text = 'Obje'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'DEVCLASS'. ls_hdr-text = 'Paket'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'AUTHOR'. ls_hdr-text = 'Sahibi'. APPEND ls_hdr TO lt_hdr. PERFORM f_alv USING lv_ttl lt_hdr CHANGING lt_out. ENDFORM. *&---------------------------------------------------------------------* *& Form F_ALV_PRG ( bir ayda degisen Z programlar ) *&---------------------------------------------------------------------* FORM f_alv_prg USING iv_key TYPE string. DATA: lt_out TYPE tt_prg, lt_hdr TYPE tt_hdr, ls_hdr TYPE ty_hdr, lv_mm TYPE string, lv_ttl TYPE string. FIELD-SYMBOLS

TYPE ty_prg. LOOP AT gt_prg ASSIGNING

. IF

-udat IS INITIAL. CONTINUE. ENDIF. CONCATENATE

-udat+4(2) '.'

-udat+2(2) INTO lv_mm. IF lv_mm <> iv_key. CONTINUE. ENDIF. APPEND

TO lt_out. ENDLOOP. SORT lt_out BY udat DESCENDING name ASCENDING. CONCATENATE 'Değişen Z programlar -' iv_key INTO lv_ttl SEPARATED BY space. ls_hdr-fname = 'NAME'. ls_hdr-text = 'Program'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'TUR'. ls_hdr-text = 'Tür'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'DEVCLASS'. ls_hdr-text = 'Paket'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'UNAM'. ls_hdr-text = 'Değiştiren'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'UDAT'. ls_hdr-text = 'Tarih'. APPEND ls_hdr TO lt_hdr. ls_hdr-fname = 'CNAM'. ls_hdr-text = 'Oluşturan'. APPEND ls_hdr TO lt_hdr. PERFORM f_alv USING lv_ttl lt_hdr CHANGING lt_out. ENDFORM. *&---------------------------------------------------------------------* *& Form F_ALV ( ortak ALV popup ) *&---------------------------------------------------------------------* FORM f_alv USING iv_title TYPE string it_hdr TYPE tt_hdr CHANGING ct TYPE STANDARD TABLE. DATA: lo_alv TYPE REF TO cl_salv_table, lo_cols TYPE REF TO cl_salv_columns_table, lo_col TYPE REF TO cl_salv_column, lo_disp TYPE REF TO cl_salv_display_settings, lo_fun TYPE REF TO cl_salv_functions_list, lv_hd TYPE lvc_title, lv_l TYPE scrtext_l, lv_m TYPE scrtext_m, lv_s TYPE scrtext_s. FIELD-SYMBOLS TYPE ty_hdr. IF ct IS INITIAL. MESSAGE 'Seçime uyan kayıt bulunamadı' TYPE 'S' DISPLAY LIKE 'W'. RETURN. ENDIF. TRY. CALL METHOD cl_salv_table=>factory IMPORTING r_salv_table = lo_alv CHANGING t_table = ct. CATCH cx_salv_msg. MESSAGE 'Detay listesi oluşturulamadı' TYPE 'S' DISPLAY LIKE 'E'. RETURN. ENDTRY. lo_alv->set_screen_popup( start_column = 5 end_column = 145 start_line = 3 end_line = 25 ). lv_hd = iv_title. lo_disp = lo_alv->get_display_settings( ). lo_disp->set_list_header( lv_hd ). lo_disp->set_striped_pattern( 'X' ). lo_fun = lo_alv->get_functions( ). lo_fun->set_all( 'X' ). lo_cols = lo_alv->get_columns( ). lo_cols->set_optimize( 'X' ). LOOP AT it_hdr ASSIGNING . TRY. lo_col = lo_cols->get_column( -fname ). lv_l = -text. lv_m = -text. lv_s = -text. lo_col->set_long_text( lv_l ). lo_col->set_medium_text( lv_m ). lo_col->set_short_text( lv_s ). CATCH cx_salv_not_found. ENDTRY. ENDLOOP. lo_alv->display( ). ENDFORM. *&---------------------------------------------------------------------* *& Form F_REFRESH / F_FREE *&---------------------------------------------------------------------* FORM f_refresh. PERFORM f_collect. PERFORM f_build_html. PERFORM f_show. ENDFORM. FORM f_free. IF go_html IS NOT INITIAL. CALL METHOD go_html->free EXCEPTIONS OTHERS = 1. FREE go_html. ENDIF. IF go_dock IS NOT INITIAL. CALL METHOD go_dock->free EXCEPTIONS OTHERS = 1. FREE go_dock. ENDIF. ENDFORM. *&---------------------------------------------------------------------* *& CLASS LCL_EVT IMPLEMENTATION *& Handler is yapmaz, sadece istegi kaydeder. Asil is PAI icinde *& (F_DRILL) yapilir -- ekran akisi acisindan dogrusu budur. *&---------------------------------------------------------------------* CLASS lcl_evt IMPLEMENTATION. METHOD on_sapevent. DATA: lv_dum TYPE string, lv_get TYPE string, lv_key TYPE string. gv_act = action. lv_get = getdata. * getdata ornegi: key=ZMM_INV_POST IF lv_get CS '='. SPLIT lv_get AT '=' INTO lv_dum lv_key. gv_key = lv_key. ELSE. CLEAR gv_key. ENDIF. ENDMETHOD. ENDCLASS. *&---------------------------------------------------------------------* *& Form F_TEMPLATE ( HTML iskeleti -- tek yerde durur ) *& Yeni bir grafik/kolon eklemek icin sadece burayi ve *& F_BUILD_HTML icindeki JSON uretimini degistirmek yeterli. *&---------------------------------------------------------------------* FORM f_template. CLEAR gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `SAP Sistem Panosu` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `

` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `

SAP Sistem Panosu

` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND ` Sistem ` TO gt_tpl. APPEND ` Mandant ` TO gt_tpl. APPEND ` Kullanıcı ` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
Grafik çubuklarına ve tablo satırlarına tıklayarak filtrelenmiş detay listesini açabilirsiniz.
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `

Dump trendi

` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `

Dump — kullanıcı bazında

` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `

Kesilen job — program bazında

` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `

En uzun süren job'lar

` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `

En son kesilen job'lar

` TO gt_tpl. APPEND `
Bitiş zamanına göre sıralı
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND ` ` TO gt_tpl. APPEND `
Job adıProgramKullanıcıBitişSüre (dk)Durum
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `
` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. APPEND `` TO gt_tpl. ENDFORM.