SAP

SAP Malzeme Karakteristiklerini Toplu Görüntüleme Raporu

Uzun bir aradan sonra bir ABAP raporu ile tekrar buradayım. Bu raporumuzda malzeme ana verisinde malzeme sınıfı altında girilen karakteristik değerlerini bir rapor şeklinde kullanıcıya göstermeye çalışacağız.

Yukarıdaki ekranlarda da görüldüğü üzere malzeme ana verisinde girilen karakteristikleri malzemelerde toplu görmek için malzemeleri dolaşmak bir problemdir. Bu soruna çözüm olarak aşağıdaki girdiyi alan;

Sonuç olarak aşağıdaki şekilde çıktı veren raporu yazacağız.

İlk adım olarak raporumuzda kullanacağımız değişkenleri ve tanımlamaları yapalım.

TYPE-POOLS: SLIS.
TABLES: MARA, MAKT, CABNT, CABN, T006A, AUSP.

DATA: BEGIN OF GT_METADATAS OCCURS 0,
  MATNR LIKE MARA-MATNR, " Malzeme no
  MAKTX LIKE MAKT-MAKTX, " Malzeme tanımı
  atinn LIKE AUSP-ATINN, " karakteristik
  ATBEZ LIKE CABNT-ATBEZ, " Karakteristik tanımı
  MSEHI LIKE CABN-MSEHI, "Ölçü Birimi
  ATWRT LIKE AUSP-ATWRT, " Karakter karakteristik değeri
  ATFLV LIKE AUSP-ATFLV, " Sayısal Alt değer
  ATFLB LIKE AUSP-ATFLB, " Sayısal üst değer
  MSEH6 LIKE T006A-MSEH6, " Ölçü birimi teknik tanımı
  SPRAS LIKE T006A-SPRAS, " dil
  ATFOR LIKE CABN-ATFOR, " veri tipi
  ANZST LIKE CABN-ANZST, " Karakter uzunluğu
  ANZDZ LIKE CABN-ANZDZ, " ondalık karakter sayısı
  DEGER1 TYPE C LENGTH 10, " numerik değer alt
  DEGER2 TYPE C LENGTH 10, " numarik değer üst
  END OF GT_METADATAS.

DATA: FCAT TYPE SLIS_T_FIELDCAT_ALV.
DATA: LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA: VARYANT TYPE DISVARIANT.
VARYANT-REPORT = SY-REPID.
VARYANT-USERNAME = SY-UNAME.

Tanımlamaları yaptıktan sonra kullanıcıdan alacağımız parametre tanımlarını yapalım.

SELECTION-SCREEN BEGIN OF BLOCK PARAMETERS WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS:
P_MATNR FOR MARA-MATNR,
  P_MATKL FOR MARA-MATKL.
SELECTION-SCREEN END OF BLOCK PARAMETERS.

START-OF-SELECTION.
  IF P_MATNR[] IS INITIAL AND P_MATKL[] IS INITIAL.
    MESSAGE 'Malzeme numarası veya Mal Grubundan biri girilmeli'
    TYPE 'S' DISPLAY LIKE 'E'.
    CHECK 1 EQ 2.
  ENDIF.

Burada START-OF-SELECTION kısmında malzeme numarası veya mal gruplarından birinin doldurulması şartını sorguluyoruz. İkisi de boş ise CHECK ile işlem iptal edilmektedir.

Daha sonra aşağıdaki sorgu ile gerekli veriler sorgulanarak GT_METADATAS tablosuna aktarılıyor.

 SELECT
    MR~MATNR MT~MAKTX AP~ATWRT
    AP~ATFLV AP~ATFLB AP~ATINN
    CN~ATFOR CN~ANZST CN~ANZDZ
    CN~MSEHI CT~ATBEZ TA~MSEH6
    TA~SPRAS
    FROM MARA AS MR
    JOIN MAKT AS MT ON MR~MATNR EQ MT~MATNR
    JOIN AUSP AS AP ON MR~MATNR EQ AP~OBJEK
  JOIN CABN AS CN ON AP~ATINN EQ CN~ATINN
    JOIN CABNT AS CT ON CN~ATINN EQ CT~ATINN
  LEFT JOIN T006A AS TA ON CN~MSEHI EQ TA~MSEHI
  INTO CORRESPONDING FIELDS OF TABLE GT_METADATAS
  WHERE AP~OBJEK IN P_MATNR
  AND MR~MATKL IN P_MATKL.

  DELETE GT_METADATAS WHERE SPRAS IS NOT INITIAL AND SPRAS NE SY-LANGU.

Sorgulama sonucunda karakteristik değerin ölçü birimi tanımını almak için T006A tablosuna gidilmektedir. Ancak bütün karakteristik değerlerin ölçü birimi olmadığından LEFT JOIN ile bağlamak gerekiyor. LEFT JOIN kuralı gereği sadece bir dile ait tanımı getir dile şart verilemediğinden 17. satırda dil tanımı boş olmayan ve kullanıcının giriş yaptığı dil dışındaki tanımlamaları GT_METADATAS tablosundan siliyoruz.

Verileri aldıktan sonra numerik değer 1,2000000000000000E+00 şeklinde bilimsel gösterimde olduğundan öncelikle bu değerlerin kullanıcının okuyabileceği 12.,00 gibi değerlere dönüştürülmesi gerekmektedir. Bu işlem için FLTP_CHAR_CONVERSION fonksiyonunu kullanıyoruz. Fonksiyonda yer alan DECIM parametresi virgülden sonra kaç karakter olacağını belirtiyor.

LOOP AT GT_METADATAS WHERE ATFOR EQ 'NUM'.

    CALL FUNCTION 'FLTP_CHAR_CONVERSION'
      EXPORTING
      DECIM = GT_METADATAS-ANZDZ
        EXPON = 0
        INPUT = GT_METADATAS-ATFLV
        IVALU = 'X'
*       MASKN = ' '
      IMPORTING
        FLSTR = GT_METADATAS-DEGER1.

    " Değerleri tek kolonda görmek için atama yapıldı
    GT_METADATAS-ATWRT = GT_METADATAS-DEGER1.

    CALL FUNCTION 'FLTP_CHAR_CONVERSION'
      EXPORTING
        DECIM = GT_METADATAS-ANZDZ
        EXPON = 0
        INPUT = GT_METADATAS-ATFLB
        IVALU = 'X'
*       MASKN = ' '
      IMPORTING
        FLSTR = GT_METADATAS-DEGER2.

    MODIFY GT_METADATAS.

  ENDLOOP.

Bu işlemlerden sonra verileri ekrana gösteriyoruz. Bu işlem için aşağıdaki kodu kullanıyoruz.

FORM SHOWDATA .
  DATA: I_SORT TYPE SLIS_SORTINFO_ALV,
        IT_SORT TYPE  SLIS_T_SORTINFO_ALV.
  I_SORT-SPOS  = 1.
  I_SORT-FIELDNAME = 'MATNR'.
  APPEND I_SORT TO IT_SORT.

  I_SORT-SPOS  = 2.
  I_SORT-FIELDNAME = 'MAKTX'.
  APPEND I_SORT TO IT_SORT.

  CALL FUNCTION 'REUSE_ALV_FIELDCATALOG_MERGE'
    EXPORTING
      I_PROGRAM_NAME     = SY-REPID
      I_INTERNAL_TABNAME = 'GT_METADATAS'
      I_INCLNAME         = SY-REPID
    CHANGING
      CT_FIELDCAT        = FCAT[].

  PERFORM SET_FCAT.

  LAYOUT-COLWIDTH_OPTIMIZE = 'X'.

  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
      I_CALLBACK_PROGRAM = SY-REPID
      IS_LAYOUT          = LAYOUT
      IT_FIELDCAT        = FCAT[]
      I_SAVE             = 'A'
      IS_VARIANT         = VARYANT
      IT_SORT            = IT_SORT
    TABLES
      T_OUTTAB           = GT_METADATAS.

ENDFORM.                    " SHOWDATA


*&---------------------------------------------------------------------*
*&      Form  SET_FCAT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM SET_FCAT .
  DATA: FCATROW LIKE LINE OF FCAT.

  LOOP AT FCAT INTO FCATROW.
    CASE FCATROW-FIELDNAME.
      WHEN 'MSEHI'.
        FCATROW-TECH = 'X'.
      WHEN 'SPRAS'.
        FCATROW-TECH = 'X'.
      WHEN 'ATFOR'.
        FCATROW-TECH = 'X'.
      WHEN 'ANZST'.
        FCATROW-TECH = 'X'.
      WHEN 'ANZDZ'.
        FCATROW-TECH = 'X'.
      WHEN 'ATFLB'.
        FCATROW-TECH = 'X'.
      WHEN 'ATFLV'.
        FCATROW-TECH = 'X'.
      WHEN 'DEGER1'.
        FCATROW-SELTEXT_S = 'Alt Değer'.
        FCATROW-SELTEXT_M = 'Alt Değer'.
        FCATROW-SELTEXT_L = 'Alt Değer'.
        FCATROW-REPTEXT_DDIC = 'Alt Değer'.
        FCATROW-TECH = 'X'.

      WHEN 'DEGER2'.
        FCATROW-SELTEXT_S = 'Üst Değer'.
        FCATROW-SELTEXT_M = 'Üst Değer'.
        FCATROW-SELTEXT_L = 'Üst Değer'.
        FCATROW-REPTEXT_DDIC = 'Üst Değer'.
        FCATROW-TECH = 'X'.
    ENDCASE.

    MODIFY FCAT FROM FCATROW.

  ENDLOOP.

ENDFORM.                    " SET_FCAT

IT_SORT tablosuna eklenen alanlar ile gösterilecek ALV’de var sayılan olarak neye göre sıralanacağını söylüyoruz.

SET_FCAT fonksiyonunda kullandığımız FCATROW-TECH = ‘X’. satırı ile ilgili alanın gösterilmeyeceğini söylüyoruz.

Kodun tamamına aşağıdaki linkten ulaşabilirsiniz.

https://github.com/saitorhan/ABAPRapor/blob/main/ZMalzemeKarakteristik.abap

Ek olarak tek bir malzeme için sorgulama yapmak için CLAF_CLASSIFICATION_OF_OBJECTS fonksiyonu da kullanılabilir. Bizim burada direk tablolardan okuma sebebimiz birden fazla malzeme için hızlı dönüş sağlamaktır.


Udemy üzerinde yer alan ABAP eğitimime kaydolmak için aşağıdaki linki kullanabilirsiniz.

https://www.udemy.com/course/sapabapprogramlama/?referralCode=4D0F06C484A69E9AF3AA


İlgili Makaleler

3 Yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu